d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright 2014 QLogic Corporation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic End User License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the License at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_PRODUCT_BANNER "QLogic NetXtreme II 10 Gigabit Ethernet Driver v" STRINGIFY(MAJVERSION) "." STRINGIFY(MINVERSION) "." STRINGIFY(REVVERSION)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_PRODUCT_INFO "QLogic NXII 10 GbE v" STRINGIFY(MAJVERSION) "." STRINGIFY(MINVERSION) "." STRINGIFY(REVVERSION)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_L2_MEMORY_WINDOW_SIZE 0x40000 /* 256K for PCI Config Registers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (pUM == NULL) ? 0xf : pUM->instance;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* pass in pointer to either lm_device_t or um_device_t */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ((pUM == NULL) || (*pUM->devName == 0)) ? "(bnxe)" : pUM->devName;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default: return "UNKNOWN";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeProtoSupport(um_device_t * pUM, int proto)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.mf_proto_support_flags &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.mf_proto_support_flags &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* mcp is not present so allow enumeration */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else /* SF */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check per port storage personality config from NVRAM */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port_feature_config_sf = (pUM->lm_dev.hw_info.port_feature_config &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEAT_CFG_STORAGE_PERSONALITY_ISCSI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEAT_CFG_STORAGE_PERSONALITY_FCOE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEAT_CFG_STORAGE_PERSONALITY_BOTH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEAT_CFG_STORAGE_PERSONALITY_DEFAULT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.max_func_fcoe_cons == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (((proto == LM_PROTO_SUPPORT_ETHERNET) && do_eth) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((proto == LM_PROTO_SUPPORT_FCOE) && do_fcoe));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeProtoFcoeAfex(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ((pUM->lm_dev.params.mf_mode == MULTI_FUNCTION_AFEX) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeProtoSupport(pUM, LM_PROTO_SUPPORT_FCOE)) ? B_TRUE : B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxePciInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* setup resources needed for accessing the PCI configuration space */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pci_config_setup(pUM->pDev, &pUM->pPciCfg) != DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to setup PCI config");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxePciDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeBarMemDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* free the BAR mappings */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (!d_list_is_empty(&pUM->memRegionList))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMutexInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < (MAX_RSS_CHAINS + 1); idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->txq[idx].freeTxDescMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->rxq[idx].doneRxMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < USER_OPTION_RX_RING_GROUPS_MAX; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rw_init(&pUM->gldTxMutex, NULL, RW_DRIVER, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMutexDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < (MAX_RSS_CHAINS + 1); idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->txq[idx].freeTxDescMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->memMutex); /* not until all mem deleted */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* FMA support */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint BnxeCheckAccHandle(ddi_acc_handle_t handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint BnxeCheckDmaHandle(ddi_dma_handle_t handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* The IO fault service error handling callback function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * As the driver can always deal with an error in any dma or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * access handle, we can just return the fme_status value.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Only register with IO Fault Services if we have some capability */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities & DDI_FM_ACCCHK_CAPABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeAccessAttribBAR.devacc_attr_version = DDI_DEVICE_ATTR_V1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeAccessAttribBAR.devacc_attr_access = DDI_FLAGERR_ACC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities & DDI_FM_DMACHK_CAPABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeDmaPageAttrib.dma_attr_flags = DDI_DMA_FLAGERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeRxDmaAttrib.dma_attr_flags = DDI_DMA_FLAGERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeTxDmaAttrib.dma_attr_flags = DDI_DMA_FLAGERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeTxCbDmaAttrib.dma_attr_flags = DDI_DMA_FLAGERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register capabilities with IO Fault Services */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_init(pUM->pDev, &pUM->fmCapabilities, &iblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize pci ereport capabilities if ereport capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register error callback if error callback capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_handler_register(pUM->pDev, BnxeFmErrorCb, (void *)pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Only unregister FMA capabilities if we registered some */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release any resources allocated by pci_ereport_setup() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Un-register error callback if error callback capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Unregister from IO Fault Services */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_ereport_post(pUM->pDev, buf, ena, DDI_NOSLEEP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeAttachDevice(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fm-capable in bnxe.conf can be used to set fmCapabilities. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fmCapabilities = ddi_prop_get_int(DDI_DEV_T_ANY,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "fm-capable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register capabilities with IO Fault Services. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeCheckAccHandle(pUM->pPciCfg) != DDI_FM_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeCheckAccHandle(pUM->lm_dev.vars.reg_handle[BAR_0]) != DDI_FM_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmErrorReport(pUM, DDI_FM_DEVICE_INVAL_STATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to get device information");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(&pUM->lm_dev) && lm_check_if_pf_assigned_to_vm(&pUM->lm_dev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_virt_mode(&pUM->lm_dev, DEVICE_TYPE_PF, VT_ASSIGNED_TO_VM_PF);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if FCoE is enabled on this function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((CHIP_IS_E2(&pUM->lm_dev) || CHIP_IS_E3(&pUM->lm_dev)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeProtoSupport(pUM, LM_PROTO_SUPPORT_FCOE)) ? B_TRUE :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_get_iscsi_boot_info_block(&pUM->lm_dev, &pUM->iscsiInfo);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "MBA FCoE boot occurred on this interface.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* No support for L2 on FCoE enabled AFEX function! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE AFEX function, not registering with GLD.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The following is wonky. Doing a CLONE_DEV makes it visible to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * various L2 networking commands even though the instance was
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * not registered with GLDv3 via mac_register().
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Create a style-2 DLPI device */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to create device minor node.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Create a style-1 DLPI device */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to create device instance minor node.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_remove_minor_node(pUM->pDev, (char *)ddi_driver_name(pUM->pDev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* register with the GLDv3 MAC layer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%d.%d.%d.%d",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((pUM->lm_dev.hw_info.bc_rev >> 24) & 0xff),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((pUM->lm_dev.hw_info.bc_rev >> 16) & 0xff),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((pUM->lm_dev.hw_info.bc_rev >> 8) & 0xff));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%04x:%02x:%02x",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_FIXED) ? 1 : (pUM->defIntr.intrCount +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_MSIX) ? "MSIX" :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_MSI) ? "MSI" :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "(0x%p) %s %s - v%s - FW v%s - BC v%s - %s (%s)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeDetachDevice(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc != 0) && (rc != ENOTSUP) && (rc != ENODEV))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* No support for L2 on FCoE enabled AFEX function! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_remove_minor_node(pUM->pDev, pUM->devName);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_remove_minor_node(pUM->pDev, (char *)ddi_driver_name(pUM->pDev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeAttach(dev_info_t * pDev, ddi_attach_cmd_t cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM = kmem_zalloc(sizeof(um_device_t), KM_SLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "failed to allocate device structure");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* set magic number for identification */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* default for debug logging is dump everything */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.debug_level = (CP_ALL | LV_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save dev_info_t in the driver structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* obtain a human-readable device name log messages with */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->devName, sizeof(pUM->devName),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BNXE_FCOE(pUM) && pUM->devParams.fcoeEnable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Fail to resume this device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeDetach(dev_info_t * pDev, ddi_detach_cmd_t cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Detaching a device that is currently running!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Can't detach it now, please try again later!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Fail to suspend this device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to quiesce the device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t *pUM = (um_device_t *) ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed ", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_set_name_addr(cDip, ddi_get_name_addr(pUM->pDev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeInitChild(pDev, (dev_info_t *) pArg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeUninitChild(pDev, (dev_info_t *) pArg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (ddi_ctlops(pDev, pRDev, op, pArg, pResult));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBinding * pBinding = (BnxeBinding *)arg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "Invalid binding arg to ioctl %d", cmd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pBinding->pPrvDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity checks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pBinding->version != BNXE_BINDING_VERSION)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: Invalid binding version (0x%08x)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* copy the binding struct and fill in the provider callback */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE BIND when DEVI is offline!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE BIND when alread bound!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvCtl = pBinding->prvCtl = BnxeFcoePrvCtl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvTx = pBinding->prvTx = BnxeFcoePrvTx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvPoll = pBinding->prvPoll = BnxeFcoePrvPoll;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvSendWqes = pBinding->prvSendWqes = BnxeFcoePrvSendWqes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvMapMailboxq = pBinding->prvMapMailboxq = BnxeFcoePrvMapMailboxq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind.prvUnmapMailboxq = pBinding->prvUnmapMailboxq = BnxeFcoePrvUnmapMailboxq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numRxDesc[LM_CLI_IDX_FCOE] = pBinding->numRxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numTxDesc[LM_CLI_IDX_FCOE] = pBinding->numTxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.l2_rx_desc_cnt[LM_CLI_IDX_FCOE] = pBinding->numRxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mcp_indicate_client_bind(&pUM->lm_dev, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* clear the binding struct and stats */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE UNBIND when DEVI is online!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE UNBIND when not bound!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We must not detach until all packets held by fcoe are retrieved. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeWaitForPacketsFromClient(pUM, LM_CLI_IDX_FCOE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mcp_indicate_client_unbind(&pUM->lm_dev, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memset(&pUM->fcoe.bind, 0, sizeof(pUM->fcoe.bind));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memset(&pUM->fcoe.stats, 0, sizeof(pUM->fcoe.stats));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* ILLUMOS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* devo_refcnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* devo_refcnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &mod_driverops, /* drv_modops (must be mod_driverops for drivers) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_PRODUCT_INFO, /* drv_linkinfo (string displayed by modinfo) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Install module information with O/S */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc = mod_install(&bnxe_modlinkage)) != DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "mod_install returned 0x%x", rc);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&bnxeLoaderMutex, NULL, MUTEX_DRIVER, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(NULL, "%s", BNXE_PRODUCT_BANNER);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc = mod_remove(&bnxe_modlinkage)) == DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This shouldn't be possible since modunload must only call _fini
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * when no instances are currently plumbed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%d instances have not been unplumbed", bnxeNumPlumbed);