bnxe_mm.c revision d14abf155341d55053c76eeec58b787a456b753b
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright 2014 QLogic Corporation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic End User License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the License at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic BnxeHwPageConfig bnxeHwPageConfigs[] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Buffers TX BD Pages TX Coalesce Bufs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_DEVICE_ATTR_V0, /* devacc_attr_version */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_STRUCTURE_LE_ACC, /* devacc_attr_endian_flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_STRICTORDER_ACC, /* devacc_attr_dataorder */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_DEVICE_ATTR_V0, /* devacc_attr_version */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_NEVERSWAP_ACC, /* devacc_attr_endian_flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DDI_STRICTORDER_ACC, /* devacc_attr_dataorder */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* dma_attr_addr_lo */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0xffffffffffffffff, /* dma_attr_count_max */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* dma_attr_align */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, /* dma_attr_flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pRegValue = pci_config_get32(pUM->pPciCfg, (off_t)pciReg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_write_pci(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pci_config_put32(pUM->pPciCfg, (off_t)pciReg, regValue);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[cli_idx] = BNXE_DEF_TX_BD_PAGE_CNT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[cli_idx] = BNXE_DEF_TX_COAL_BUF_CNT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pLM->params.l2_rx_desc_cnt[cli_idx] <= pPageCfg->bufCnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[cli_idx] = pPageCfg->txBdPageCnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[cli_idx] = pPageCfg->txCoalBufCnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiunsigned long log2_align(unsigned long n);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_get_user_config(lm_device_t * pLM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.ofld_cap = (LM_OFFLOAD_TX_IP_CKSUM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX Wake on LAN? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //pLM->params.wol_cap = (LM_WAKE_UP_MODE_MAGIC_PACKET | LM_WAKE_UP_MODE_NWUF);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* keep the VLAN tag in the mac header when receiving */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* set in BnxeIntrInit based on the allocated number of MSIX interrupts */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //pLM->params.rss_chain_cnt = pUM->devParams.numRings;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //pLM->params.tss_chain_cnt = pUM->devParams.numRings;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_NDIS] = pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_NDIS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_NDIS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_FWD] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_FWD] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_FWD] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_ISCSI] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_ISCSI] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_ISCSI] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_FCOE] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_FCOE] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_FCOE] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.max_func_fcoe_cons = pUM->lm_dev.hw_info.max_port_fcoe_conn;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* determine: 1. itl_client_page_size, #context in page*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* based on PCIe block INIT document */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We now need to calculate the page size based on the maximum number of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * connections supported. Since this property is identical to all ports, and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is configured in COMMON registers, we need to use the maximum number of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * connections in all ports. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The L2P table is used to map logical addresses to physical ones. There
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * are four clients that use this table. We want to use only the ILT
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (Internal), we need to calculate the total size required for all clients,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * divide it by the number of entries in the ILT table and that will give us
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the page size we want. The following table describes the needs of each of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * these clients:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * HW block(L2P client) Area name Size [B]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Searcher T1 ROUNDUP(LOG2(N)) * 64
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Timers Linear Array N * 8
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QM Queues N * 32 * 4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDU Context N * S + W * ROUNDUP (N/m) (W=0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * N: Number of connections
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * S: Context Size
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * W: Block Waste (not really interesting) we configure the context size to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be a power of 2.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * m: Number of cids in a block (not really interesting, since W will always
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi total_size = (pLM->hw_info.max_common_conns *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi required_page_size = (total_size / ILT_NUM_PAGE_ENTRIES_PER_FUNC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi required_page_size = (2 << LOG2(required_page_size));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.ilt_client_page_size = required_page_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.num_context_in_page = (pLM->params.ilt_client_page_size /
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.int_coalesing_mode = LM_INT_COAL_PERIODIC_SYNC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.int_per_sec_rx_override = pUM->devParams.intrRxPerSec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.int_per_sec_tx_override = pUM->devParams.intrTxPerSec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.int_coalesing_mode = LM_INT_COAL_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * l2_fw_flow_ctrl is read from the shmem in MF mode in E2 and above. In
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * all other cases this parameter is read from the driver conf. We also
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * read this parameter from the driver conf in E1.5 MF mode since 57711
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * boot code does not have the struct func_ext_cfg.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (((pLM->hw_info.mf_info.mf_mode != MULTI_FUNCTION_SI) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pLM->hw_info.mf_info.mf_mode != MULTI_FUNCTION_AFEX)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.l2_fw_flow_ctrl = (pUM->devParams.l2_fw_flow_ctrl) ? 1 : 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.rcv_buffer_offset = BNXE_DMA_RX_OFFSET;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.debug_cap_flags = DEFAULT_DEBUG_CAP_FLAGS_VAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->params.max_fcoe_task = lm_fc_max_fcoe_task_sup(pLM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* enable rate shaping */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeIsBarUsed(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemRegion *)d_list_next_entry(D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //int numRegs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Solaris identifies:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * BAR 0 - size 0 (pci config regs?)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * BAR 1 - size 0x800000 (Everest 1/2 LM BAR 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * BAR 2 - size 0x4000000 (Everest 1 LM BAR 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 0x800000 (Everest 2 LM BAR 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * BAR 3 - size 0x10000 (Everest 2 LM BAR 2)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //ddi_dev_nregs(pUM->pDev, &numRegs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((size > regSize) || BnxeIsBarUsed(pUM, bar, 0, size))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "BAR %d at offset %d and size %d is already being used!",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pMem = kmem_zalloc(sizeof(BnxeMemRegion), KM_NOSLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Memory allocation for BAR %d at offset %d and size %d failed!",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, // region map offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to memory map device (BAR=%d, offset=%d, size=%d) (%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pUM->memRegionList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM->vars.reg_handle[bar] = pMem->regAccess;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid * mm_map_io_space_solaris(lm_device_t * pLM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* see bar mapping described in mm_map_io_base above */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((size > regSize) || BnxeIsBarUsed(pUM, bar, offset, size))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "BAR %d at offset %d and size %d is already being used!",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pMem = kmem_zalloc(sizeof(BnxeMemRegion), KM_NOSLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Memory allocation for BAR %d at offset %d and size %d failed!",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to memory map device (BAR=%d, offset=%d, size=%d) (%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pUM->memRegionList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&pUM->memRegionList, D_LINK_CAST(pMemRegion));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi kmem_free(pMemRegion, sizeof(BnxeMemRegion));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMemRegion = (BnxeMemRegion *)d_list_next_entry(D_LINK_CAST(pMemRegion));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const unsigned long line,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pMem = kmem_zalloc(sizeof(BnxeMemBlock), KM_NOSLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocated space for header/trailer checks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pBuf = kmem_zalloc(memSize, KM_NOSLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to allocate memory");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fill in the header check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fill in the trailer check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0, pTmp = (u32_t *)((char *)pBuf + memSize - BNXE_MEM_CHECK_LEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pMem->fileName, sizeof(pMem->fileName), "%s", sz_file);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pUM->memBlockList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MEM_LOG(pUM, "Allocated %d byte block virt:%p",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memSize, ((char *)pBuf + BNXE_MEM_CHECK_LEN));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ((char *)pBuf + BNXE_MEM_CHECK_LEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid * mm_alloc_phys_mem_align_imp(lm_device_t * pLM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const unsigned long line,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pMem = kmem_zalloc(sizeof(BnxeMemDma), KM_NOSLEEP)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MEM_LOG(pUM, "*** DMA: %8u (%4d) - %8u", memSize, alignment, size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to alloc DMA handle");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to alloc DMA memory");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rc = ddi_dma_addr_bind_handle(*pDmaHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to bind DMA address");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save the virtual memory address so we can get the dma_handle later */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(pMem->fileName, sizeof(pMem->fileName), "%s", sz_file);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MEM_LOG(pUM, "*** DMA: virt %p / phys 0x%0llx (%d/%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!((u32_t)pBuf % (u32_t)alignment)) ? 1 : 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!((u32_t)pPhysAddr->as_ptr % (u32_t)alignment) ? 1 : 0));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pUM->memDmaList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MEM_LOG(pUM, "Allocated %d sized DMA block phys:%p virt:%p",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memSize, pMem->physAddr.as_ptr, pMem->pDmaVirt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Zero memory! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* make sure the new contents are flushed back to main memory */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ddi_dma_sync(*pDmaHandle, 0, length, DDI_DMA_SYNC_FORDEV);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid * mm_alloc_phys_mem_imp(lm_device_t * pLM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const unsigned long line,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mm_alloc_phys_mem_align_imp(pLM, memSize, pPhysAddr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid * mm_rt_alloc_mem_imp(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const unsigned long line,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mm_alloc_mem_imp(pDev, memSize, sz_file, line, cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid * mm_rt_alloc_phys_mem_imp(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const unsigned long line,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mm_alloc_phys_mem_imp(pDev, memSize, pPhysAddr, flushType,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu64_t mm_get_current_time(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeDbgBreakMsg(pUM, "MM_GET_CURRENT_TIME");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemBlock *)d_list_peek_head(&pUM->memBlockList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* adjuest for header/trailer checks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pBuf = ((char *)pBuf - BNXE_MEM_CHECK_LEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* verify header check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Header overflow! (%p/%u)", pBuf, memSize);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* verify trailer check */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0, pTmp = (u32_t *)((char *)pBuf + memSize - BNXE_MEM_CHECK_LEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Trailer overflow! (%p/%u)", pBuf, memSize);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Attempt to free memory block with invalid size (%d/%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&pUM->memBlockList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemBlock *)d_list_next_entry(D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_rt_free_phys_mem(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemDma *)d_list_peek_head(&pUM->memDmaList);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Attempt to free DMA memory with invalid size (%d/%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&pUM->memDmaList, D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMem = (BnxeMemDma *)d_list_next_entry(D_LINK_CAST(pMem));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const void * pSrc,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (memcmp(pBuf1, pBuf2, count) == 0) ? 1 : 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeTxPktsReclaim((um_device_t *)pLM, idx, packet_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "RAMROD on cid %d cmd is done", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_return_sq_pending_command(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX probably need a memory pool to pull from... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_rt_free_mem(pDev, pPending, sizeof(struct sq_pending_command),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistruct sq_pending_command * mm_get_sq_pending_command(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX probably need a memory pool to pull from... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mm_rt_alloc_mem(pDev, sizeof(struct sq_pending_command),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_copy_packet_buf(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //um_device_t * pUM = (um_device_t *)pDev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_txpacket_t * pTxPkt = (um_txpacket_t *)pLMPkt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblkDataLen = (pMblk->b_wptr - pMblk->b_rptr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toCopy = (mblkDataLen <= size) ? mblkDataLen : size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_fan_failure(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeLinkStatus(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* reset the link status */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* reset the link partner status */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_MEDIUM_DUPLEX(medium) == LM_MEDIUM_HALF_DUPLEX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.vars.flow_control & LM_FLOW_CONTROL_RECEIVE_PAUSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->lm_dev.vars.flow_control & LM_FLOW_CONTROL_TRANSMIT_PAUSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->curcfg.lnkcfg.link_autoneg == B_TRUE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((GET_MEDIUM_SPEED(medium) >= LM_MEDIUM_SPEED_SEQ_START) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (GET_MEDIUM_SPEED(medium) <= LM_MEDIUM_SPEED_SEQ_END))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->props.link_speed = (((GET_MEDIUM_SPEED(medium) >> 8) -
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(tbuf, TBUF_SIZE, "%u", pUM->props.link_speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "%s Duplex Rx Flow %s Tx Flow %s Link Up",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "%s %s Duplex Rx Flow %s Tx Flow %s Link Up",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ignore link status if it has not changed since the last indicate */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM->devParams.lastIndLink == link) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeGldLink(pUM, (link == LM_STATUS_LINK_ACTIVE) ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE Client bound and pDev is NULL (LINK STATUS failed!) %s@%s",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "FCoE Client bound and cliCtl is NULL (LINK STATUS failed!) %s@%s",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_schedule_task(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueAddDelayNoCopy(pUM, (void (*)(um_device_t *, void *))task, param, delay_ms);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_register_lpme(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeWorkQueueAddGeneric(pUM, (void (*)(um_device_t *))func);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_SPQ_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_SPQ_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_SPQ_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_SPQ_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_CID_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_CID_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_REQUEST_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_RRREQ((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_REQUEST_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_PHY_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_PHY_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_PHY_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_PHY_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_acquire_lock(mm_spin_lock_t * spinlock)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_release_lock(mm_spin_lock_t * spinlock)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_MCP_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_MCP_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_ISLES_CONTROL_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_ISLES_CONTROL((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_ISLES_CONTROL_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_ISLES_CONTROL((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_ISLES_CONTROL_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_ISLES_CONTROL((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_ISLES_CONTROL_LOCK_DPC_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_ISLES_CONTROL((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_IND_REG_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_IND_REG_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_SP_REQ_MGR_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_SPREQ((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_SP_REQ_MGR_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_SB_LOCK_IMP(lm_device_t * pDev, u8_t sb_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_SB((um_device_t *)pDev, sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_SB_LOCK_IMP(lm_device_t * pDev, u8_t sb_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_SB((um_device_t *)pDev, sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_ACQUIRE_ETH_CON_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_ETH_CON((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid MM_RELEASE_ETH_CON_LOCK_IMP(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_ETH_CON((um_device_t *)pDev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiunsigned int mm_crc32(unsigned char * address,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned int size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned int crc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiunsigned short mm_crc16(unsigned char * address,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned int size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned short crc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_event_log_generic_arg_fwd(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_LOG_ID_FAN_FAILURE: // fan failure detected
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_LOG_ID_UNQUAL_IO_MODULE: // SFP+ unqualified io module
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * expected parameters:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * u8 port, const char * vendor_name, const char * vendor_pn
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "Unqualified IO Module: %s %s (port=%d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_LOG_ID_OVER_CURRENT: // SFP+ over current power
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * expected parametrs:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "SFP+ over current, power failure! (port=%d)", port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_LOG_ID_NO_10G_SUPPORT: // 10g speed is requested but not supported
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * expected parametrs:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "10Gb speed not supported! (port=%d)", port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * expected parametrs:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "PHY uninitialized! (port=%d)", port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (CHIP_PORT_MODE(pdev) == LM_CHIP_PORT_MODE_4) ? \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "MDIO access timeout! (port=%d)", port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Unknown MM event log! (type=%d)", lm_log_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t mm_event_log_generic(lm_device_t * pDev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = mm_event_log_generic_arg_fwd(pDev, lm_log_id, argp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_build_ver_string(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return min(strlen((char *)pDev->ver_str), strlen(pUM->version));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_indicate_hw_failure(lm_device_t * pDev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_read_byte(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret = ddi_get8(pdev->vars.reg_handle[bar],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint8_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_read_word(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret = ddi_get16(pdev->vars.reg_handle[bar],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint16_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_read_dword(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret = ddi_get32(pdev->vars.reg_handle[bar],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_read_ddword(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret = ddi_get64(pdev->vars.reg_handle[bar],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint64_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_write_byte(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint8_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_write_word(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint16_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_write_dword(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_write_ddword(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint64_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid mm_bar_copy_buffer(struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < size; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_get_cap_offset(struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cap_offset = PCI_CAPABILITY_LIST; //CapPtr ofset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = mm_read_pci(pdev, cap_offset, ®_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((lm_status == LM_STATUS_SUCCESS) && (reg_value != 0xFFFFFFFF)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cap_offset = (u8_t)(reg_value & 0x000000FF);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((cap_offset == 0) || (cap_offset >= 0x100)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = mm_read_pci(pdev, cap_offset, ®_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((lm_status == LM_STATUS_SUCCESS) && (reg_value != 0xFFFFFFFF)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cap_offset = (reg_value & 0x0000FF00) >> 8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } while ((lm_status == LM_STATUS_SUCCESS));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_get_wol_flags(struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_get_feature_flags(struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t mm_get_vmq_cnt(struct _lm_device_t * pdev)