d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
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 *
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 *
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 *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
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 *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the License at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic_End_User_Software_License.txt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "bnxe.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef STRINGIFY
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define XSTRINGIFY(x) #x
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define STRINGIFY(x) XSTRINGIFY(x)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_REGISTER_BAR_NUM 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_REGS_MAP_OFFSET 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define BNXE_L2_MEMORY_WINDOW_SIZE 0x40000 /* 256K for PCI Config Registers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t dbg_code_path = CP_ALL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t dbg_trace_level = LV_VERBOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t g_dbg_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchikmutex_t bnxeLoaderMutex;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t bnxeNumPlumbed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern ddi_dma_attr_t bnxeDmaPageAttrib;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern ddi_dma_attr_t bnxeRxDmaAttrib;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern ddi_dma_attr_t bnxeTxDmaAttrib;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern ddi_dma_attr_t bnxeTxCbDmaAttrib;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t BnxeInstance(void * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pDev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (pUM == NULL) ? 0xf : pUM->instance;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* pass in pointer to either lm_device_t or um_device_t */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchichar * BnxeDevName(void * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pDev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ((pUM == NULL) || (*pUM->devName == 0)) ? "(bnxe)" : pUM->devName;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchichar * BnxeChipName(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (CHIP_NUM(&pUM->lm_dev) >> 16)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x164e: return "BCM57710";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x164f: return "BCM57711";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x1650: return "BCM57711E";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x1662: return "BCM57712";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x1663: return "BCM57712NP";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x16a1: return "BCM57840";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x168d: return "BCM57840";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x16a4: return "BCM57840NP";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x16ab: return "BCM57840NP";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x168e: return "BCM57810";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x16ae: return "BCM57810NP";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x168a: return "BCM57800";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x16a5: return "BCM57800NP";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default: return "UNKNOWN";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeProtoSupport(um_device_t * pUM, int proto)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t do_eth;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t do_fcoe;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint32_t port_feature_config_sf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MULTI_VNIC(&pUM->lm_dev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_eth = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.hw_info.mcp_detected == 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.mf_proto_support_flags &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTO_SUPPORT_ETHERNET)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_eth = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.mf_proto_support_flags &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTO_SUPPORT_FCOE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* mcp is not present so allow enumeration */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_eth = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else /* SF */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_eth = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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 PORT_FEAT_CFG_STORAGE_PERSONALITY_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (port_feature_config_sf)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEAT_CFG_STORAGE_PERSONALITY_ISCSI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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 default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.params.max_func_fcoe_cons == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do_fcoe = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (((proto == LM_PROTO_SUPPORT_ETHERNET) && do_eth) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((proto == LM_PROTO_SUPPORT_FCOE) && do_fcoe));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeProtoFcoeAfex(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
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 Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxePciInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
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 {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to setup PCI config");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxePciDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->pPciCfg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pci_config_teardown(&pUM->pPciCfg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->pPciCfg = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeBarMemDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMemRegion * pMemRegion;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* free the BAR mappings */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (!d_list_is_empty(&pUM->memRegionList))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_unmap_io_space(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion->pRegAddr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion->size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMutexInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pLM = &pUM->lm_dev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < (MAX_RSS_CHAINS + 1); idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->intrMutex[idx], NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->intrFlipMutex[idx], NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->sbMutex[idx], NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < MAX_ETH_CONS; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->txq[idx].txMutex, NULL,
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 pUM->txq[idx].pUM = pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->txq[idx].idx = idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < MAX_ETH_CONS; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->rxq[idx].rxMutex, NULL,
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 pUM->rxq[idx].pUM = pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->rxq[idx].idx = idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < USER_OPTION_RX_RING_GROUPS_MAX; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->rxqGroup[idx].pUM = pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->rxqGroup[idx].idx = idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->ethConMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->mcpMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->phyMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->indMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->cidMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->spqMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->spReqMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->rrReqMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->islesCtrlMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->toeMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->memMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->offloadMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->hwInitMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->gldMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rw_init(&pUM->gldTxMutex, NULL, RW_DRIVER, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->timerMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&pUM->kstatMutex, NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMutexDestroy(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pLM = &pUM->lm_dev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < (MAX_RSS_CHAINS + 1); idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->intrMutex[idx]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->intrFlipMutex[idx]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->sbMutex[idx]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < MAX_ETH_CONS; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->txq[idx].txMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->txq[idx].freeTxDescMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < MAX_ETH_CONS; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->rxq[idx].rxMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->rxq[idx].doneRxMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->ethConMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->mcpMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->phyMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->indMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->cidMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->spqMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->spReqMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->rrReqMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->islesCtrlMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->toeMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->memMutex); /* not until all mem deleted */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->offloadMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->hwInitMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->gldMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rw_destroy(&pUM->gldTxMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->timerMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&pUM->kstatMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* FMA support */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint BnxeCheckAccHandle(ddi_acc_handle_t handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_error_t de;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (de.fme_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint BnxeCheckDmaHandle(ddi_dma_handle_t handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_error_t de;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (de.fme_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* The IO fault service error handling callback function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeFmErrorCb(dev_info_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_error_t * err,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const void * impl_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
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 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pci_ereport_post(pDev, err, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (err->fme_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeFmInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_iblock_cookie_t iblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int fma_acc_flag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int fma_dma_flag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Only register with IO Fault Services if we have some capability */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities & DDI_FM_ACCCHK_CAPABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeAccessAttribBAR.devacc_attr_version = DDI_DEVICE_ATTR_V1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeAccessAttribBAR.devacc_attr_access = DDI_FLAGERR_ACC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities & DDI_FM_DMACHK_CAPABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
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 }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register capabilities with IO Fault Services */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_init(pUM->pDev, &pUM->fmCapabilities, &iblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize pci ereport capabilities if ereport capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_FM_ERRCB_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pci_ereport_setup(pUM->pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register error callback if error callback capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_ERRCB_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_handler_register(pUM->pDev, BnxeFmErrorCb, (void *)pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeFmFini(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Only unregister FMA capabilities if we registered some */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release any resources allocated by pci_ereport_setup() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_FM_ERRCB_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pci_ereport_teardown(pUM->pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Un-register error callback if error callback capable */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_ERRCB_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_handler_unregister(pUM->pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Unregister from IO Fault Services */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_fini(pUM->pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid BnxeFmErrorReport(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi char * detail)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint64_t ena;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi char buf[FM_MAX_CLASS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ena = fm_ena_generate(0, FM_ENA_FMT1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (DDI_FM_EREPORT_CAP(pUM->fmCapabilities))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_ereport_post(pUM->pDev, buf, ena, DDI_NOSLEEP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FM_VERSION, DATA_TYPE_UINT8,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FM_EREPORT_VERS0, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeAttachDevice(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int * props = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t numProps;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t vendor_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t device_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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 pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_PROP_DONTPASS,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "fm-capable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (DDI_FM_EREPORT_CAPABLE |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_FM_ACCCHK_CAPABLE |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_FM_DMACHK_CAPABLE |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_FM_ERRCB_CAPABLE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register capabilities with IO Fault Services. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmInit(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxePciInit(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexInit(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeWorkQueueInit(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = lm_get_dev_info(&pUM->lm_dev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeCheckAccHandle(pUM->pPciCfg) != DDI_FM_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->fmCapabilities &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeCheckAccHandle(pUM->lm_dev.vars.reg_handle[BAR_0]) != DDI_FM_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmErrorReport(pUM, DDI_FM_DEVICE_INVAL_STATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_fm_service_impact(pUM->pDev, DDI_SERVICE_LOST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to get device information");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(&pUM->lm_dev) && lm_check_if_pf_assigned_to_vm(&pUM->lm_dev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_virt_mode(&pUM->lm_dev, DEVICE_TYPE_PF, VT_ASSIGNED_TO_VM_PF);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if FCoE is enabled on this function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->do_fcoe =
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 B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->do_fcoe = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_get_iscsi_boot_info_block(&pUM->lm_dev, &pUM->iscsiInfo);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->iscsiInfo.signature != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "MBA FCoE boot occurred on this interface.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeIntrInit(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeKstatInit(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeProtoFcoeAfex(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* No support for L2 on FCoE enabled AFEX function! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE AFEX function, not registering with GLD.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
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 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Create a style-2 DLPI device */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_create_minor_node(pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (char *)ddi_driver_name(pUM->pDev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi S_IFCHR,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_PSEUDO, //DDI_NT_NET,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CLONE_DEV) != DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to create device minor node.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeKstatFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Create a style-1 DLPI device */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_create_minor_node(pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devName,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi S_IFCHR,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->instance,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_PSEUDO, //DDI_NT_NET,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0) != DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
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 BnxeKstatFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* register with the GLDv3 MAC layer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeGldInit(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeKstatFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->version,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->version),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%d.%d.%d",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MAJVERSION,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MINVERSION,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REVVERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->versionLM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->versionLM),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%d.%d.%d",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DRIVER_MAJOR_VER,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DRIVER_MINOR_VER,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DRIVER_FIX_NUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->versionFW,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->versionFW),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%d.%d.%d.%d",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BCM_5710_FW_MAJOR_VERSION,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BCM_5710_FW_MINOR_VERSION,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BCM_5710_FW_REVISION_VERSION,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BCM_5710_FW_ENGINEERING_VERSION);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->versionBC,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->versionBC),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%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
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->chipName,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->chipName),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%s",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeChipName(pUM));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->chipID,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->chipID),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "0x%x",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.hw_info.chip_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pUM->bus_dev_func = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, "reg", &props, &numProps);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->bus_dev_func,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->bus_dev_func),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%04x:%02x:%02x",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PCI_REG_BUS_G(props[0]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PCI_REG_DEV_G(props[0]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PCI_REG_FUNC_G(props[0]));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_prop_free(props);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vendor_id = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, "vendor-id", &props, &numProps);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vendor_id = props[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_prop_free(props);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi device_id = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pUM->pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, "device-id", &props, &numProps);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc == DDI_PROP_SUCCESS) && (numProps > 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi device_id = props[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_prop_free(props);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->vendor_device,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->vendor_device),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%04x:%04x",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vendor_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi device_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->intrAlloc,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(pUM->intrAlloc),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%d %s",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_FIXED) ? 1 : (pUM->defIntr.intrCount +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoeIntr.intrCount +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->rssIntr.intrCount),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_MSIX) ? "MSIX" :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->intrType == DDI_INTR_TYPE_MSI) ? "MSI" :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Fixed");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "(0x%p) %s %s - v%s - FW v%s - BC v%s - %s (%s)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->chipName,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->chipID,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->version,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->versionFW,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->versionBC,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IS_MULTI_VNIC(&pUM->lm_dev) ? "MF" : "SF",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->intrAlloc);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeDetachDevice(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeFcoeFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc != 0) && (rc != ENOTSUP) && (rc != ENODEV))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeProtoFcoeAfex(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* No support for L2 on FCoE enabled AFEX function! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
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 Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeGldFini(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeKstatFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBarMemDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueWaitAndDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMutexDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePciDestroy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFmFini(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeAttach(dev_info_t * pDev, ddi_attach_cmd_t cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_ATTACH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM = kmem_zalloc(sizeof(um_device_t), KM_SLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "failed to allocate device structure");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_set_driver_private(pDev, pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* set magic number for identification */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->magic = BNXE_MAGIC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* default for debug logging is dump everything */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.debug_level = (CP_ALL | LV_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save dev_info_t in the driver structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->pDev = pDev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&pUM->memBlockList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&pUM->memDmaList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&pUM->memRegionList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef BNXE_DEBUG_DMA_LIST
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&pUM->memDmaListSaved);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* obtain a human-readable device name log messages with */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->instance = ddi_get_instance(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pUM->devName, sizeof(pUM->devName),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "bnxe%d", pUM->instance);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeAttachDevice(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi kmem_free(pUM, sizeof(um_device_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BNXE_FCOE(pUM) && pUM->devParams.fcoeEnable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeStartStop(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_RESUME:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !(defined(__S11) || defined(__S12))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_PM_RESUME:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM == NULL || pUM->pDev != pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeHwResume(pUM) != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Fail to resume this device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeDetach(dev_info_t * pDev, ddi_detach_cmd_t cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_DETACH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM == NULL || pUM->pDev != pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->intrEnabled != B_FALSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Detaching a device that is currently running!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeDetachDevice(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Can't detach it now, please try again later!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi kmem_free(pUM, sizeof(um_device_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_SUSPEND:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !(defined(__S11) || defined(__S12))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_PM_SUSPEND:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM == NULL || pUM->pDev != pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeHwSuspend(pUM) != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Fail to suspend this device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (DEVO_REV > 3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeQuiesce(dev_info_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM == NULL || pUM->pDev != pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeHwQuiesce(pUM) != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to quiesce the device!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid BnxeFcoeInitChild(dev_info_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dev_info_t * cDip)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t *pUM = (um_device_t *) ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM == NULL) || (pUM->pDev != pDev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed ", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_set_name_addr(cDip, ddi_get_name_addr(pUM->pDev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid BnxeFcoeUninitChild(dev_info_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dev_info_t * cDip)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_set_name_addr(cDip, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeBusCtl(dev_info_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dev_info_t * pRDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_ctl_enum_t op,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * pResult)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)ddi_get_driver_private(pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM == NULL || pUM->pDev != pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogDbg(pUM, "BnxeBusCtl (%d)", op);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (op)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_CTLOPS_REPORTDEV:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_CTLOPS_IOMIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_CTLOPS_INITCHILD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeInitChild(pDev, (dev_info_t *) pArg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case DDI_CTLOPS_UNINITCHILD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeUninitChild(pDev, (dev_info_t *) pArg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (ddi_ctlops(pDev, pRDev, op, pArg, pResult));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeCbIoctl(dev_t dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int cmd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi intptr_t arg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int mode,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cred_t * credp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int * rvalp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBinding * pBinding = (BnxeBinding *)arg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void)dev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void)mode;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void)credp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void)rvalp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pBinding == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pBinding->pCliDev == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pBinding->pPrvDev == NULL))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "Invalid binding arg to ioctl %d", cmd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM = (um_device_t *)ddi_get_driver_private(pBinding->pPrvDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sanity checks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pBinding->version != BNXE_BINDING_VERSION)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: Invalid binding version (0x%08x)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __func__, pBinding->version);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->fcoe.pDev != pBinding->pCliDev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->pDev != pBinding->pPrvDev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%s: dev_info_t match failed", __func__);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_BIND_FCOE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* copy the binding struct and fill in the provider callback */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE BIND start");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CLIENT_DEVI(pUM, LM_CLI_IDX_FCOE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE BIND when DEVI is offline!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE BIND when alread bound!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.bind = *pBinding;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numRxDesc[LM_CLI_IDX_FCOE] = pBinding->numRxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numTxDesc[LM_CLI_IDX_FCOE] = pBinding->numTxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.l2_rx_desc_cnt[LM_CLI_IDX_FCOE] = pBinding->numRxDescs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeInitBdCnts(pUM, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeHwStartFCOE(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CLIENT_BIND_SET(pUM, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mcp_indicate_client_bind(&pUM->lm_dev, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE BIND done");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_UNBIND_FCOE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* clear the binding struct and stats */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE UNBIND start");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CLIENT_DEVI(pUM, LM_CLI_IDX_FCOE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE UNBIND when DEVI is online!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE UNBIND when not bound!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
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 {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mcp_indicate_client_unbind(&pUM->lm_dev, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CLIENT_BIND_RESET(pUM, LM_CLI_IDX_FCOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeHwStopFCOE(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memset(&pUM->fcoe.bind, 0, sizeof(pUM->fcoe.bind));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memset(&pUM->fcoe.stats, 0, sizeof(pUM->fcoe.stats));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvCtl = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvTx = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvPoll = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvSendWqes = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvMapMailboxq = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBinding->prvUnmapMailboxq = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->fcoe.pDev = NULL; /* sketchy? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "FCoE UNBIND done");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Unknown ioctl %d", cmd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return DDI_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef ILLUMOS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct bus_ops bnxe_bus_ops =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BUSO_REV,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nullbusmap, /* bus_map */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_get_intrspec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_add_intrspec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_remove_intrspec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i_ddi_map_fault, /* bus_map_fault */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_map, /* bus_dma_map */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_allochdl, /* bus_dma_allochdl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_freehdl, /* bus_dma_freehdl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_bindhdl, /* bus_dma_bindhdl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_unbindhdl, /* bus_unbindhdl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_flush, /* bus_dma_flush */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_win, /* bus_dma_win */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_mctl, /* bus_dma_ctl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeBusCtl, /* bus_ctl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_bus_prop_op, /* bus_prop_op */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_get_eventcookie */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_add_eventcall */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_remove_event */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_post_event */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_intr_ctl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_config */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_unconfig */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_fm_init */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_fm_fini */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_fm_access_enter */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_fm_access_exit */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* bus_power */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* ILLUMOS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct cb_ops bnxe_cb_ops =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* cb_open */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* cb_close */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_strategy */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_print */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_dump */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_read */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_write */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeCbIoctl, /* cb_ioctl */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_devmap */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_mmap */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_segmap */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nochpoll, /* cb_chpoll */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_prop_op, /* cb_prop_op */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* cb_stream */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (int)(D_MP | D_64BIT), /* cb_flag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CB_REV, /* cb_rev */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_aread */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* cb_awrite */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (DEVO_REV > 3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct dev_ops bnxe_dev_ops =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DEVO_REV, /* devo_rev */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* devo_refcnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* devo_getinfo */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* devo_identify */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* devo_probe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeAttach, /* devo_attach */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeDetach, /* devo_detach */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* devo_reset */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bnxe_cb_ops, /* devo_cb_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef ILLUMOS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bnxe_bus_ops, /* devo_bus_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* devo_bus_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* devo_power */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeQuiesce /* devo_quiesce */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct dev_ops bnxe_dev_ops =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DEVO_REV, /* devo_rev */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* devo_refcnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL, /* devo_getinfo */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* devo_identify */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nulldev, /* devo_probe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeAttach, /* devo_attach */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeDetach, /* devo_detach */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nodev, /* devo_reset */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bnxe_cb_ops, /* devo_cb_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bnxe_bus_ops, /* devo_bus_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL /* devo_power */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct modldrv bnxe_modldrv =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
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 &bnxe_dev_ops /* drv_dev_ops */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct modlinkage bnxe_modlinkage =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MODREV_1, /* ml_rev */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bnxe_modldrv, /* ml_linkage */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL /* NULL termination */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint _init(void)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_init_ops(&bnxe_dev_ops, "bnxe");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Install module information with O/S */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc = mod_install(&bnxe_modlinkage)) != DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "mod_install returned 0x%x", rc);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_fini_ops(&bnxe_dev_ops);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_init(&bnxeLoaderMutex, NULL, MUTEX_DRIVER, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeNumPlumbed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(NULL, "%s", BNXE_PRODUCT_BANNER);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint _fini(void)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc = mod_remove(&bnxe_modlinkage)) == DDI_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_fini_ops(&bnxe_dev_ops);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_destroy(&bnxeLoaderMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bnxeNumPlumbed > 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This shouldn't be possible since modunload must only call _fini
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * when no instances are currently plumbed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(NULL, "%d instances have not been unplumbed", bnxeNumPlumbed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint _info(struct modinfo * pModinfo)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mod_info(&bnxe_modlinkage, pModinfo);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi