fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante/*
beb562835cfbfcc73ae96a39ad1ef3e0446d299cShampavman * Copyright 2014 QLogic Corporation
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * QLogic End User License (the "License").
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante * You may not use this file except in compliance with the License.
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the License at
fa9e4066f08beec538e775443c5be79dd423fcabahrens * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
fa9e4066f08beec538e775443c5be79dd423fcabahrens * QLogic_End_User_Software_License.txt
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "bnxe.h"
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens#define BNXE_DEF_TX_BD_PAGE_CNT 12
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens#define BNXE_DEF_TX_COAL_BUF_CNT 10
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumtypedef struct
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int bufCnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int txBdPageCnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int txCoalBufCnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} BnxeHwPageConfig;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic BnxeHwPageConfig bnxeHwPageConfigs[] =
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin{
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin /* Buffers TX BD Pages TX Coalesce Bufs */
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin { 1000, 4, 10 },
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin { 1500, 6, 10 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 3000, 12, 10 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 0, 0, 0 }
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if 0
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define MEM_LOG BnxeLogInfo
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define MEM_LOG
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensddi_device_acc_attr_t bnxeAccessAttribBAR =
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_DEVICE_ATTR_V0, /* devacc_attr_version */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_STRUCTURE_LE_ACC, /* devacc_attr_endian_flags */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_STRICTORDER_ACC, /* devacc_attr_dataorder */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_DEFAULT_ACC /* devacc_attr_access */
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensddi_device_acc_attr_t bnxeAccessAttribBUF =
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_DEVICE_ATTR_V0, /* devacc_attr_version */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_NEVERSWAP_ACC, /* devacc_attr_endian_flags */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_STRICTORDER_ACC, /* devacc_attr_dataorder */
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_DEFAULT_ACC /* devacc_attr_access */
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensddi_dma_attr_t bnxeDmaPageAttrib =
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens DMA_ATTR_V0, /* dma_attr_version */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0, /* dma_attr_addr_lo */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0xffffffffffffffff, /* dma_attr_addr_hi */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0xffffffffffffffff, /* dma_attr_count_max */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0, /* dma_attr_align */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0xffffffff, /* dma_attr_burstsizes */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 1, /* dma_attr_minxfer */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0xffffffffffffffff, /* dma_attr_maxxfer */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0xffffffffffffffff, /* dma_attr_seg */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 1, /* dma_attr_sgllen */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 1, /* dma_attr_granular */
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0, /* dma_attr_flags */
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_wait(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t delayUs)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens drv_usecwait(delayUs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_read_pci(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t pciReg,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t * pRegValue)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens *pRegValue = pci_config_get32(pUM->pPciCfg, (off_t)pciReg);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_write_pci(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t pciReg,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t regValue)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pci_config_put32(pUM->pPciCfg, (off_t)pciReg, regValue);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid BnxeInitBdCnts(um_device_t * pUM,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling int cli_idx)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling lm_device_t * pLM = (lm_device_t *)pUM;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BnxeHwPageConfig * pPageCfg;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pLM->params.l2_tx_bd_page_cnt[cli_idx] = BNXE_DEF_TX_BD_PAGE_CNT;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pLM->params.l2_tx_coal_buf_cnt[cli_idx] = BNXE_DEF_TX_COAL_BUF_CNT;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pPageCfg = &bnxeHwPageConfigs[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (pPageCfg->bufCnt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pLM->params.l2_rx_desc_cnt[cli_idx] <= pPageCfg->bufCnt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_bd_page_cnt[cli_idx] = pPageCfg->txBdPageCnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_coal_buf_cnt[cli_idx] = pPageCfg->txCoalBufCnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pPageCfg++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern u32_t LOG2(u32_t v);
fa9e4066f08beec538e775443c5be79dd423fcabahrensunsigned long log2_align(unsigned long n);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8053a26377fa80614ba5221e12b86aab4e8a675ecklm_status_t mm_get_user_config(lm_device_t * pLM)
8053a26377fa80614ba5221e12b86aab4e8a675eck{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pLM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t total_size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t required_page_size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeCfgInit(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.sw_config = LM_SWCFG_10G;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.ofld_cap = (LM_OFFLOAD_TX_IP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_RX_IP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_TX_TCP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_RX_TCP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_TX_TCP6_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_RX_TCP6_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_TX_UDP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_RX_UDP_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_TX_UDP6_CKSUM |
fa9e4066f08beec538e775443c5be79dd423fcabahrens LM_OFFLOAD_RX_UDP6_CKSUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* XXX Wake on LAN? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens //pLM->params.wol_cap = (LM_WAKE_UP_MODE_MAGIC_PACKET | LM_WAKE_UP_MODE_NWUF);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* keep the VLAN tag in the mac header when receiving */
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.keep_vlan_tag = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* set in BnxeIntrInit based on the allocated number of MSIX interrupts */
fa9e4066f08beec538e775443c5be79dd423fcabahrens //pLM->params.rss_chain_cnt = pUM->devParams.numRings;
fa9e4066f08beec538e775443c5be79dd423fcabahrens //pLM->params.tss_chain_cnt = pUM->devParams.numRings;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_NDIS] = pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS];
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_NDIS] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_NDIS] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeInitBdCnts(pUM, LM_CLI_IDX_NDIS);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_FWD] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_FWD] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_FWD] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_ISCSI] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_ISCSI] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_ISCSI] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_rx_desc_cnt[LM_CLI_IDX_FCOE] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_bd_page_cnt[LM_CLI_IDX_FCOE] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.l2_tx_coal_buf_cnt[LM_CLI_IDX_FCOE] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_toe_cons = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_iscsi_cons = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_rdma_cons = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_fcoe_cons = pUM->lm_dev.hw_info.max_port_fcoe_conn;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_connections =
fa9e4066f08beec538e775443c5be79dd423fcabahrens log2_align(pLM->params.max_func_toe_cons +
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_rdma_cons +
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_iscsi_cons +
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.max_func_fcoe_cons +
fa9e4066f08beec538e775443c5be79dd423fcabahrens MAX_ETH_CONS);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* determine: 1. itl_client_page_size, #context in page*/
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* based on PCIe block INIT document */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* We now need to calculate the page size based on the maximum number of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * connections supported. Since this property is identical to all ports, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is configured in COMMON registers, we need to use the maximum number of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * connections in all ports. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* The L2P table is used to map logical addresses to physical ones. There
fa9e4066f08beec538e775443c5be79dd423fcabahrens * are four clients that use this table. We want to use only the ILT
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (Internal), we need to calculate the total size required for all clients,
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum * divide it by the number of entries in the ILT table and that will give us
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the page size we want. The following table describes the needs of each of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * these clients:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * HW block(L2P client) Area name Size [B]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Searcher T1 ROUNDUP(LOG2(N)) * 64
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Timers Linear Array N * 8
fa9e4066f08beec538e775443c5be79dd423fcabahrens * QM Queues N * 32 * 4
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum * CDU Context N * S + W * ROUNDUP (N/m) (W=0)
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum *
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum * N: Number of connections
fa9e4066f08beec538e775443c5be79dd423fcabahrens * S: Context Size
fa9e4066f08beec538e775443c5be79dd423fcabahrens * W: Block Waste (not really interesting) we configure the context size to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * be a power of 2.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * m: Number of cids in a block (not really interesting, since W will always
fa9e4066f08beec538e775443c5be79dd423fcabahrens * be 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens total_size = (pLM->hw_info.max_common_conns *
fa9e4066f08beec538e775443c5be79dd423fcabahrens (SEARCHER_TOTAL_MEM_REQUIRED_PER_CON +
fa9e4066f08beec538e775443c5be79dd423fcabahrens TIMERS_TOTAL_MEM_REQUIRED_PER_CON +
fa9e4066f08beec538e775443c5be79dd423fcabahrens QM_TOTAL_MEM_REQUIRED_PER_CON +
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.context_line_size));
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum
fa9e4066f08beec538e775443c5be79dd423fcabahrens required_page_size = (total_size / ILT_NUM_PAGE_ENTRIES_PER_FUNC);
fa9e4066f08beec538e775443c5be79dd423fcabahrens required_page_size = (2 << LOG2(required_page_size));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (required_page_size < LM_PAGE_SIZE)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens required_page_size = LM_PAGE_SIZE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.ilt_client_page_size = required_page_size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.num_context_in_page = (pLM->params.ilt_client_page_size /
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.context_line_size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pUM->devParams.intrCoalesce)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.int_coalesing_mode = LM_INT_COAL_PERIODIC_SYNC;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.int_per_sec_rx_override = pUM->devParams.intrRxPerSec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.int_per_sec_tx_override = pUM->devParams.intrTxPerSec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.int_coalesing_mode = LM_INT_COAL_NONE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.enable_dynamic_hc[0] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.enable_dynamic_hc[1] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.enable_dynamic_hc[2] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->params.enable_dynamic_hc[3] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * l2_fw_flow_ctrl is read from the shmem in MF mode in E2 and above. In
fa9e4066f08beec538e775443c5be79dd423fcabahrens * all other cases this parameter is read from the driver conf. We also
fa9e4066f08beec538e775443c5be79dd423fcabahrens * read this parameter from the driver conf in E1.5 MF mode since 57711
fa9e4066f08beec538e775443c5be79dd423fcabahrens * boot code does not have the struct func_ext_cfg.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (((pLM->hw_info.mf_info.mf_mode != MULTI_FUNCTION_SI) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (pLM->hw_info.mf_info.mf_mode != MULTI_FUNCTION_AFEX)) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (CHIP_IS_E1x(pLM)))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pLM->params.l2_fw_flow_ctrl = (pUM->devParams.l2_fw_flow_ctrl) ? 1 : 0;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pLM->params.rcv_buffer_offset = BNXE_DMA_RX_OFFSET;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pLM->params.debug_cap_flags = DEFAULT_DEBUG_CAP_FLAGS_VAL;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pLM->params.max_fcoe_task = lm_fc_max_fcoe_task_sup(pLM);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens /* enable rate shaping */
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pLM->params.cmng_enable = 1;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
49e3519a3f3d730d3bd8870c05aaed24d89cf272maybee pLM->params.validate_sq_complete = 1;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens return LM_STATUS_SUCCESS;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens}
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrensstatic boolean_t BnxeIsBarUsed(um_device_t * pUM,
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens int regNumber,
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens offset_t offset,
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens u32_t size)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens{
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens BnxeMemRegion * pMem;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick BNXE_LOCK_ENTER_MEM(pUM);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
beb562835cfbfcc73ae96a39ad1ef3e0446d299cShampavman pMem = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee while (pMem)
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee {
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee if ((pMem->regNumber == regNumber) &&
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee (pMem->offset == offset) &&
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee (pMem->size == size))
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens BNXE_LOCK_EXIT_MEM(pUM);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens return B_TRUE;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens pMem = (BnxeMemRegion *)d_list_next_entry(D_LINK_CAST(pMem));
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
b16da2e29e074fb6eaeadc4fd7d17ae7340ba240George Wilson
b16da2e29e074fb6eaeadc4fd7d17ae7340ba240George Wilson BNXE_LOCK_EXIT_MEM(pUM);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens return B_FALSE;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens}
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrensvoid * mm_map_io_base(lm_device_t * pLM,
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens lm_address_t baseAddr,
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens u32_t size,
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante u8_t bar)
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee{
d6e555bdd793b8bc8fe57d5f12c3d69c813d0661George Wilson um_device_t * pUM = (um_device_t *)pLM;
d6e555bdd793b8bc8fe57d5f12c3d69c813d0661George Wilson BnxeMemRegion * pMem;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens //int numRegs;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens off_t regSize;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens int rc;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick /*
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * Solaris identifies:
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * BAR 0 - size 0 (pci config regs?)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * BAR 1 - size 0x800000 (Everest 1/2 LM BAR 0)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * BAR 2 - size 0x4000000 (Everest 1 LM BAR 1)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * 0x800000 (Everest 2 LM BAR 1)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * BAR 3 - size 0x10000 (Everest 2 LM BAR 2)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens */
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens bar++;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens //ddi_dev_nregs(pUM->pDev, &numRegs);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens ddi_dev_regsize(pUM->pDev, bar, &regSize);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens if ((size > regSize) || BnxeIsBarUsed(pUM, bar, 0, size))
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens BnxeLogWarn(pUM, "BAR %d at offset %d and size %d is already being used!",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens bar, 0, (int)regSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pMem = kmem_zalloc(sizeof(BnxeMemRegion), KM_NOSLEEP)) == NULL)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick BnxeLogWarn(pUM, "Memory allocation for BAR %d at offset %d and size %d failed!",
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick bar, 0, (int)regSize);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((rc = ddi_regs_map_setup(pUM->pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, // bar number
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pMem->pRegAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0, // region map offset,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick size, // region memory window size (0=all)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick &bnxeAccessAttribBAR,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick &pMem->regAccess)) != DDI_SUCCESS)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Failed to memory map device (BAR=%d, offset=%d, size=%d) (%d)",
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, 0, size, rc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pMem, sizeof(BnxeMemRegion));
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick return NULL;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick pMem->baseAddr = baseAddr;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick pMem->regNumber = bar;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick pMem->offset = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->size = size;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick d_list_push_head(&pUM->memRegionList, D_LINK_CAST(pMem));
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pLM->vars.reg_handle[bar] = pMem->regAccess;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return pMem->pRegAddr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid * mm_map_io_space_solaris(lm_device_t * pLM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_address_t physAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t size,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_acc_handle_t * pRegAccHandle)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pLM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeMemRegion * pMem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens off_t regSize;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* see bar mapping described in mm_map_io_base above */
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_dev_regsize(pUM->pDev, bar, &regSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((size > regSize) || BnxeIsBarUsed(pUM, bar, offset, size))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "BAR %d at offset %d and size %d is already being used!",
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, offset, (int)regSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pMem = kmem_zalloc(sizeof(BnxeMemRegion), KM_NOSLEEP)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Memory allocation for BAR %d at offset %d and size %d failed!",
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, offset, (int)regSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((rc = ddi_regs_map_setup(pUM->pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, // bar number
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pMem->pRegAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset, // region map offset,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum size, // region memory window size (0=all)
fa9e4066f08beec538e775443c5be79dd423fcabahrens &bnxeAccessAttribBAR,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pRegAccHandle)) != DDI_SUCCESS)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Failed to memory map device (BAR=%d, offset=%d, size=%d) (%d)",
fa9e4066f08beec538e775443c5be79dd423fcabahrens bar, offset, size, rc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pMem, sizeof(BnxeMemRegion));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->baseAddr = physAddr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->regNumber = bar;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->offset = offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->size = size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem->regAccess = *pRegAccHandle;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens d_list_push_head(&pUM->memRegionList, D_LINK_CAST(pMem));
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return pMem->pRegAddr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_unmap_io_space(lm_device_t * pLM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void * pVirtAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t size)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pLM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeMemRegion * pMemRegion;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMemRegion = (BnxeMemRegion *)d_list_peek_head(&pUM->memRegionList);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (pMemRegion)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pMemRegion->pRegAddr == pVirtAddr) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (pMemRegion->size == size))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens d_list_remove_entry(&pUM->memRegionList, D_LINK_CAST(pMemRegion));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_regs_map_free(&pMemRegion->regAccess);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pMemRegion, sizeof(BnxeMemRegion));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMemRegion = (BnxeMemRegion *)d_list_next_entry(D_LINK_CAST(pMemRegion));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid * mm_alloc_mem_imp(lm_device_t * pLM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char * sz_file,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const unsigned long line,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pLM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeMemBlock * pMem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens void * pBuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t * pTmp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void)cli_idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pMem = kmem_zalloc(sizeof(BnxeMemBlock), KM_NOSLEEP)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocated space for header/trailer checks */
fa9e4066f08beec538e775443c5be79dd423fcabahrens memSize += (BNXE_MEM_CHECK_LEN * 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens MEM_LOG(pUM, "*** MEM: %8u", memSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pBuf = kmem_zalloc(memSize, KM_NOSLEEP)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Failed to allocate memory");
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pMem, sizeof(BnxeMemBlock));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* fill in the header check */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0, pTmp = (u32_t *)pBuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i < BNXE_MEM_CHECK_LEN;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i += 4, pTmp++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens *pTmp = BNXE_MAGIC;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* fill in the trailer check */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0, pTmp = (u32_t *)((char *)pBuf + memSize - BNXE_MEM_CHECK_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens i < BNXE_MEM_CHECK_LEN;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i += 4, pTmp++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens *pTmp = BNXE_MAGIC;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->size = memSize;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->pBuf = pBuf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens snprintf(pMem->fileName, sizeof(pMem->fileName), "%s", sz_file);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->fileLine = line;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BNXE_LOCK_ENTER_MEM(pUM);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens d_list_push_head(&pUM->memBlockList, D_LINK_CAST(pMem));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BNXE_LOCK_EXIT_MEM(pUM);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens MEM_LOG(pUM, "Allocated %d byte block virt:%p",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens memSize, ((char *)pBuf + BNXE_MEM_CHECK_LEN));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return ((char *)pBuf + BNXE_MEM_CHECK_LEN);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens}
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrensvoid * mm_alloc_phys_mem_align_imp(lm_device_t * pLM,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens u32_t memSize,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens lm_address_t * pPhysAddr,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens u32_t alignment,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens u8_t memType,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens const char * sz_file,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens const unsigned long line,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens u8_t cli_idx)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens{
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens um_device_t * pUM = (um_device_t *)pLM;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens int rc;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens caddr_t pBuf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size_t length;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens unsigned int count;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_attr_t dmaAttrib;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_handle_t * pDmaHandle;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_acc_handle_t * pDmaAccHandle;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_cookie_t cookie;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BnxeMemDma * pMem;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size_t size;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (void)memType;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (void)cli_idx;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (memSize == 0)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return NULL;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if ((pMem = kmem_zalloc(sizeof(BnxeMemDma), KM_NOSLEEP)) == NULL)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return NULL;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens dmaAttrib = bnxeDmaPageAttrib;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens dmaAttrib.dma_attr_align = alignment;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pDmaHandle = &pMem->dmaHandle;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pDmaAccHandle = &pMem->dmaAccHandle;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size = memSize;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size += (alignment - 1);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size &= ~((u32_t)(alignment - 1));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens MEM_LOG(pUM, "*** DMA: %8u (%4d) - %8u", memSize, alignment, size);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if ((rc = ddi_dma_alloc_handle(pUM->pDev,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &dmaAttrib,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens DDI_DMA_DONTWAIT,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (void *)0,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pDmaHandle)) != DDI_SUCCESS)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BnxeLogWarn(pUM, "Failed to alloc DMA handle");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens kmem_free(pMem, sizeof(BnxeMemDma));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return NULL;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if ((rc = ddi_dma_mem_alloc(*pDmaHandle,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens size,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &bnxeAccessAttribBUF,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens DDI_DMA_CONSISTENT,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens DDI_DMA_DONTWAIT,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (void *)0,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &pBuf,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &length,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pDmaAccHandle)) != DDI_SUCCESS)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BnxeLogWarn(pUM, "Failed to alloc DMA memory");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_free_handle(pDmaHandle);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens kmem_free(pMem, sizeof(BnxeMemDma));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return NULL;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if ((rc = ddi_dma_addr_bind_handle(*pDmaHandle,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (struct as *)0,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pBuf,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling length,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling DDI_DMA_DONTWAIT,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void *)0,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &cookie,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens &count)) != DDI_DMA_MAPPED)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens BnxeLogWarn(pUM, "Failed to bind DMA address");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_mem_free(pDmaAccHandle);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens ddi_dma_free_handle(pDmaHandle);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens kmem_free(pMem, sizeof(BnxeMemDma));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return NULL;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pPhysAddr->as_u64 = cookie.dmac_laddress;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens /* save the virtual memory address so we can get the dma_handle later */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->size = memSize;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->pDmaVirt = pBuf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->physAddr = *pPhysAddr;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens snprintf(pMem->fileName, sizeof(pMem->fileName), "%s", sz_file);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pMem->fileLine = line;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens#if 0
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens MEM_LOG(pUM, "*** DMA: virt %p / phys 0x%0llx (%d/%d)",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens pBuf, pPhysAddr->as_u64,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens (!((u32_t)pBuf % (u32_t)alignment)) ? 1 : 0,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (!((u32_t)pPhysAddr->as_ptr % (u32_t)alignment) ? 1 : 0));
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens d_list_push_head(&pUM->memDmaList, D_LINK_CAST(pMem));
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens MEM_LOG(pUM, "Allocated %d sized DMA block phys:%p virt:%p",
fa9e4066f08beec538e775443c5be79dd423fcabahrens memSize, pMem->physAddr.as_ptr, pMem->pDmaVirt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Zero memory! */
fa9e4066f08beec538e775443c5be79dd423fcabahrens bzero(pBuf, length);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* make sure the new contents are flushed back to main memory */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_dma_sync(*pDmaHandle, 0, length, DDI_DMA_SYNC_FORDEV);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return pBuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid * mm_alloc_phys_mem_imp(lm_device_t * pLM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_address_t * pPhysAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t memType,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char * sz_file,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const unsigned long line,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return mm_alloc_phys_mem_align_imp(pLM, memSize, pPhysAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_DMA_ALIGNMENT, memType,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sz_file, line, cli_idx);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid * mm_rt_alloc_mem_imp(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char * sz_file,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const unsigned long line,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return mm_alloc_mem_imp(pDev, memSize, sz_file, line, cli_idx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid * mm_rt_alloc_phys_mem_imp(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_address_t * pPhysAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t flushType,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char * sz_file,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const unsigned long line,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return mm_alloc_phys_mem_imp(pDev, memSize, pPhysAddr, flushType,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sz_file, line, cli_idx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensu64_t mm_get_current_time(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeDbgBreakMsg(pUM, "MM_GET_CURRENT_TIME");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_rt_free_mem(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void * pBuf,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeMemBlock * pMem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t * pTmp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void)cli_idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem = (BnxeMemBlock *)d_list_peek_head(&pUM->memBlockList);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens /* adjuest for header/trailer checks */
fa9e4066f08beec538e775443c5be79dd423fcabahrens pBuf = ((char *)pBuf - BNXE_MEM_CHECK_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens memSize += (BNXE_MEM_CHECK_LEN * 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* verify header check */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0, pTmp = (u32_t *)pBuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i < BNXE_MEM_CHECK_LEN;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i += 4, pTmp++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (*pTmp != BNXE_MAGIC)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Header overflow! (%p/%u)", pBuf, memSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeDbgBreak(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* verify trailer check */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0, pTmp = (u32_t *)((char *)pBuf + memSize - BNXE_MEM_CHECK_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens i < BNXE_MEM_CHECK_LEN;
fa9e4066f08beec538e775443c5be79dd423fcabahrens i += 4, pTmp++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (*pTmp != BNXE_MAGIC)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Trailer overflow! (%p/%u)", pBuf, memSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeDbgBreak(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (pMem)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pBuf == pMem->pBuf)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (memSize != pMem->size)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Uh-Oh! */
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Attempt to free memory block with invalid size (%d/%d)",
fa9e4066f08beec538e775443c5be79dd423fcabahrens memSize, pMem->size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeDbgBreak(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens BNXE_LOCK_EXIT_MEM(pUM);
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens return;
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens }
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens d_list_remove_entry(&pUM->memBlockList, D_LINK_CAST(pMem));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pBuf, memSize);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pMem, sizeof(BnxeMemBlock));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem = (BnxeMemBlock *)d_list_next_entry(D_LINK_CAST(pMem));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_rt_free_phys_mem(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t memSize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void * pBuf,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_address_t pPhysAddr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cli_idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeMemDma * pMem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void)pPhysAddr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void)cli_idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MEM(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pMem = (BnxeMemDma *)d_list_peek_head(&pUM->memDmaList);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (pMem)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pBuf == pMem->pDmaVirt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (memSize != pMem->size)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* Uh-Oh! */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BnxeLogWarn(pUM, "Attempt to free DMA memory with invalid size (%d/%d)",
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling memSize, pMem->size);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BnxeDbgBreak(pUM);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BNXE_LOCK_EXIT_MEM(pUM);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling d_list_remove_entry(&pUM->memDmaList, D_LINK_CAST(pMem));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ddi_dma_unbind_handle(pMem->dmaHandle);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ddi_dma_mem_free(&pMem->dmaAccHandle);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ddi_dma_free_handle(&pMem->dmaHandle);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling kmem_free(pMem, sizeof(BnxeMemDma));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BNXE_LOCK_EXIT_MEM(pUM);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pMem = (BnxeMemDma *)d_list_next_entry(D_LINK_CAST(pMem));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BNXE_LOCK_EXIT_MEM(pUM);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid mm_memset(void * pBuf,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u8_t val,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u32_t memSize)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling memset(pBuf, val, memSize);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid mm_memcpy(void * pDest,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling const void * pSrc,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u32_t memSize)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling memcpy(pDest, pSrc, memSize);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingu8_t mm_memcmp(void * pBuf1,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling void * pBuf2,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u32_t count)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (memcmp(pBuf1, pBuf2, count) == 0) ? 1 : 0;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid mm_indicate_tx(lm_device_t * pLM,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u32_t idx,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling s_list_t * packet_list)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BnxeTxPktsReclaim((um_device_t *)pLM, idx, packet_list);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid mm_set_done(lm_device_t * pDev,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling u32_t cid,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling void * cookie)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling#if 0
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling um_device_t * pUM = (um_device_t *)pDev;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling BnxeLogInfo(pUM, "RAMROD on cid %d cmd is done", cid);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling#else
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void)pDev;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void)cid;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling#endif
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmcvoid mm_return_sq_pending_command(lm_device_t * pDev,
44cb6abc89aa591c23f5e58296c6d2a29302344abmc struct sq_pending_command * pPending)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc{
44cb6abc89aa591c23f5e58296c6d2a29302344abmc /* XXX probably need a memory pool to pull from... */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mm_rt_free_mem(pDev, pPending, sizeof(struct sq_pending_command),
44cb6abc89aa591c23f5e58296c6d2a29302344abmc LM_CLI_IDX_NDIS);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens}
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
44cb6abc89aa591c23f5e58296c6d2a29302344abmcstruct sq_pending_command * mm_get_sq_pending_command(lm_device_t * pDev)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens{
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* XXX probably need a memory pool to pull from... */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return mm_rt_alloc_mem(pDev, sizeof(struct sq_pending_command),
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens LM_CLI_IDX_NDIS);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens}
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrensu32_t mm_copy_packet_buf(lm_device_t * pDev,
44cb6abc89aa591c23f5e58296c6d2a29302344abmc lm_packet_t * pLMPkt,
44cb6abc89aa591c23f5e58296c6d2a29302344abmc u8_t * pMemBuf,
44cb6abc89aa591c23f5e58296c6d2a29302344abmc u32_t size)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc{
44cb6abc89aa591c23f5e58296c6d2a29302344abmc //um_device_t * pUM = (um_device_t *)pDev;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc um_txpacket_t * pTxPkt = (um_txpacket_t *)pLMPkt;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc mblk_t * pMblk;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc u32_t copied;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc u32_t mblkDataLen;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc u32_t toCopy;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pMblk = pTxPkt->pMblk;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc copied = 0;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc while (size && pMblk)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mblkDataLen = (pMblk->b_wptr - pMblk->b_rptr);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens toCopy = (mblkDataLen <= size) ? mblkDataLen : size;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens bcopy(pMblk->b_rptr, pMemBuf, toCopy);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pMemBuf += toCopy;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens copied += toCopy;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens size -= toCopy;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pMblk = pMblk->b_cont;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return copied;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens}
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrenslm_status_t mm_fan_failure(lm_device_t * pDev)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens{
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens um_device_t * pUM = (um_device_t *)pDev;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens BnxeLogWarn(pUM, "FAN FAILURE!");
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return LM_STATUS_SUCCESS;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens}
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrensstatic void BnxeLinkStatus(um_device_t * pUM,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens lm_status_t link,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens lm_medium_t medium)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens{
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens #define TBUF_SIZE 64
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char tbuf[TBUF_SIZE];
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char * pDuplex;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char * pRxFlow;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char * pTxFlow;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char * pSpeed;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (link != LM_STATUS_LINK_ACTIVE)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* reset the link status */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_speed = 0;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_duplex = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->props.link_txpause = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_rxpause = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.uptime = 0;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* reset the link partner status */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.link_autoneg = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->remote.param_20000fdx = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->remote.param_10000fdx = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->remote.param_2500fdx = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->remote.param_1000fdx = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.param_100fdx = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.param_100hdx = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pUM->remote.param_10fdx = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.param_10hdx = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.param_txpause = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->remote.param_rxpause = B_FALSE;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc BnxeLogInfo(pUM, "Link Down");
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.uptime = ddi_get_time();
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
44cb6abc89aa591c23f5e58296c6d2a29302344abmc if (GET_MEDIUM_DUPLEX(medium) == LM_MEDIUM_HALF_DUPLEX)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pDuplex = "Half";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_duplex = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc else
44cb6abc89aa591c23f5e58296c6d2a29302344abmc {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pDuplex = "Full";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_duplex = B_TRUE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (pUM->lm_dev.vars.flow_control & LM_FLOW_CONTROL_RECEIVE_PAUSE)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pRxFlow = "ON";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens pUM->props.link_rxpause = B_TRUE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc else
44cb6abc89aa591c23f5e58296c6d2a29302344abmc {
44cb6abc89aa591c23f5e58296c6d2a29302344abmc pRxFlow = "OFF";
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_rxpause = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pUM->lm_dev.vars.flow_control & LM_FLOW_CONTROL_TRANSMIT_PAUSE)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pTxFlow = "ON";
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_txpause = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pTxFlow = "OFF";
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_txpause = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if 0
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pUM->curcfg.lnkcfg.link_autoneg == B_TRUE)
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeUpdateLpCap(pUM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (GET_MEDIUM_SPEED(medium))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_10MBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 10;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "10Mb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_100MBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 100;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "100Mb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_1000MBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 1000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "1Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_2500MBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 2500;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "2.5Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_10GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 10000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "10Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case LM_MEDIUM_SPEED_12GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 12000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "12Gb";
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_12_5GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 12500;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "12.5Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_13GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 13000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "13Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_15GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 15000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "15Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_16GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 16000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "16Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_MEDIUM_SPEED_20GBPS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 20000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "20Gb";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((GET_MEDIUM_SPEED(medium) >= LM_MEDIUM_SPEED_SEQ_START) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (GET_MEDIUM_SPEED(medium) <= LM_MEDIUM_SPEED_SEQ_END))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = (((GET_MEDIUM_SPEED(medium) >> 8) -
fa9e4066f08beec538e775443c5be79dd423fcabahrens (LM_MEDIUM_SPEED_SEQ_START >> 8) +
fa9e4066f08beec538e775443c5be79dd423fcabahrens 1) * 100);
fa9e4066f08beec538e775443c5be79dd423fcabahrens snprintf(tbuf, TBUF_SIZE, "%u", pUM->props.link_speed);
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = tbuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->props.link_speed = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed = "";
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (*pSpeed == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogInfo(pUM, "%s Duplex Rx Flow %s Tx Flow %s Link Up",
fa9e4066f08beec538e775443c5be79dd423fcabahrens pDuplex, pRxFlow, pTxFlow);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogInfo(pUM, "%s %s Duplex Rx Flow %s Tx Flow %s Link Up",
fa9e4066f08beec538e775443c5be79dd423fcabahrens pSpeed, pDuplex, pRxFlow, pTxFlow);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_indicate_link(lm_device_t * pLM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_status_t link,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_medium_t medium)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pLM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ignore link status if it has not changed since the last indicate */
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens if ((pUM->devParams.lastIndLink == link) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (pUM->devParams.lastIndMedium == medium))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->devParams.lastIndLink = link;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->devParams.lastIndMedium = medium;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLinkStatus(pUM, link, medium);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (CLIENT_BOUND(pUM, LM_CLI_IDX_NDIS))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeGldLink(pUM, (link == LM_STATUS_LINK_ACTIVE) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens LINK_STATE_UP : LINK_STATE_DOWN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE))
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pUM->fcoe.pDev == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "FCoE Client bound and pDev is NULL (LINK STATUS failed!) %s@%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXEF_NAME, ddi_get_name_addr(pUM->pDev));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (pUM->fcoe.bind.cliCtl == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "FCoE Client bound and cliCtl is NULL (LINK STATUS failed!) %s@%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXEF_NAME, ddi_get_name_addr(pUM->pDev));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->fcoe.bind.cliCtl(pUM->fcoe.pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (link == LM_STATUS_LINK_ACTIVE) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens CLI_CTL_LINK_UP : CLI_CTL_LINK_DOWN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_schedule_task(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t delay_ms,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_task_cb_t task,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void * param)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock BnxeWorkQueueAddDelayNoCopy(pUM, (void (*)(um_device_t *, void *))task, param, delay_ms);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return LM_STATUS_SUCCESS;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrocklm_status_t mm_register_lpme(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_generic_workitem_function * func,
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock u8_t b_fw_access,
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock u8_t b_queue_for_fw)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock um_device_t * pUM = (um_device_t *)pDev;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void)b_fw_access;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void)b_queue_for_fw;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock BnxeWorkQueueAddGeneric(pUM, (void (*)(um_device_t *))func);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_SPQ_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_SPQ((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_SPQ_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_SPQ((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_SPQ_LOCK_DPC_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_SPQ((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_SPQ_LOCK_DPC_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_SPQ((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b87f3af36bb994656da117319f5129ddfd05ed21perrinvoid MM_ACQUIRE_CID_LOCK_IMP(lm_device_t * pDev)
b87f3af36bb994656da117319f5129ddfd05ed21perrin{
b87f3af36bb994656da117319f5129ddfd05ed21perrin BNXE_LOCK_ENTER_CID((um_device_t *)pDev);
b87f3af36bb994656da117319f5129ddfd05ed21perrin}
b87f3af36bb994656da117319f5129ddfd05ed21perrin
b87f3af36bb994656da117319f5129ddfd05ed21perrin
b87f3af36bb994656da117319f5129ddfd05ed21perrinvoid MM_RELEASE_CID_LOCK_IMP(lm_device_t * pDev)
b87f3af36bb994656da117319f5129ddfd05ed21perrin{
b87f3af36bb994656da117319f5129ddfd05ed21perrin BNXE_LOCK_EXIT_CID((um_device_t *)pDev);
b87f3af36bb994656da117319f5129ddfd05ed21perrin}
b87f3af36bb994656da117319f5129ddfd05ed21perrin
b87f3af36bb994656da117319f5129ddfd05ed21perrin
b87f3af36bb994656da117319f5129ddfd05ed21perrinvoid MM_ACQUIRE_REQUEST_LOCK_IMP(lm_device_t * pDev)
b87f3af36bb994656da117319f5129ddfd05ed21perrin{
b87f3af36bb994656da117319f5129ddfd05ed21perrin BNXE_LOCK_ENTER_RRREQ((um_device_t *)pDev);
b87f3af36bb994656da117319f5129ddfd05ed21perrin}
b87f3af36bb994656da117319f5129ddfd05ed21perrin
b87f3af36bb994656da117319f5129ddfd05ed21perrin
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musantevoid MM_RELEASE_REQUEST_LOCK_IMP(lm_device_t * pDev)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante{
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante BNXE_LOCK_EXIT_RRREQ((um_device_t *)pDev);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante}
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_PHY_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_PHY((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_PHY_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_PHY((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_PHY_LOCK_DPC_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_PHY((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_PHY_LOCK_DPC_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_PHY((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_init_lock(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens mm_spin_lock_t * spinlock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_init(spinlock, NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_acquire_lock(mm_spin_lock_t * spinlock)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (spinlock == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_INVALID_PARAMETER;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(spinlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_release_lock(mm_spin_lock_t * spinlock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (spinlock == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_INVALID_PARAMETER;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(spinlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_MCP_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_MCP((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_MCP_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_MCP((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_ACQUIRE_ISLES_CONTROL_LOCK_IMP(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_ENTER_ISLES_CONTROL((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid MM_RELEASE_ISLES_CONTROL_LOCK_IMP(lm_device_t * pDev)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens BNXE_LOCK_EXIT_ISLES_CONTROL((um_device_t *)pDev);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_ISLES_CONTROL_LOCK_DPC_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_ENTER_ISLES_CONTROL((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_ISLES_CONTROL_LOCK_DPC_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_EXIT_ISLES_CONTROL((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_IND_REG_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_ENTER_IND((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_IND_REG_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_EXIT_IND((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_LOADER_LOCK_IMP()
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mutex_enter(&bnxeLoaderMutex);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_LOADER_LOCK_IMP()
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mutex_exit(&bnxeLoaderMutex);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_SP_REQ_MGR_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_ENTER_SPREQ((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_SP_REQ_MGR_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_EXIT_SPREQ((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_SB_LOCK_IMP(lm_device_t * pDev, u8_t sb_idx)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_ENTER_SB((um_device_t *)pDev, sb_idx);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_SB_LOCK_IMP(lm_device_t * pDev, u8_t sb_idx)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_EXIT_SB((um_device_t *)pDev, sb_idx);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_ACQUIRE_ETH_CON_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_ENTER_ETH_CON((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid MM_RELEASE_ETH_CON_LOCK_IMP(lm_device_t * pDev)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BNXE_LOCK_EXIT_ETH_CON((um_device_t *)pDev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensunsigned int mm_crc32(unsigned char * address,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens unsigned int size,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens unsigned int crc)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return 0;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensunsigned short mm_crc16(unsigned char * address,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens unsigned int size,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens unsigned short crc)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return 0;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenslm_status_t mm_event_log_generic_arg_fwd(lm_device_t * pDev,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens const lm_log_id_t lm_log_id,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens va_list argp)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t port = 0 ;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char * sz_vendor_name = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char * sz_vendor_pn = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (lm_log_id)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_LOG_ID_FAN_FAILURE: // fan failure detected
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "FAN FAILURE!");
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_LOG_ID_UNQUAL_IO_MODULE: // SFP+ unqualified io module
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * expected parameters:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * u8 port, const char * vendor_name, const char * vendor_pn
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens port = va_arg(argp, int);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sz_vendor_name = va_arg(argp, char*);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sz_vendor_pn = va_arg(argp, char*);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogInfo(pUM, "Unqualified IO Module: %s %s (port=%d)",
fa9e4066f08beec538e775443c5be79dd423fcabahrens sz_vendor_name, sz_vendor_pn, port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case LM_LOG_ID_OVER_CURRENT: // SFP+ over current power
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
ecc2d604e885a75cc75e647b5641af99d5a6f4a6bonwick * expected parametrs:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens * u8 port
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens port = va_arg(argp, int);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BnxeLogWarn(pUM, "SFP+ over current, power failure! (port=%d)", port);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens break;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens case LM_LOG_ID_NO_10G_SUPPORT: // 10g speed is requested but not supported
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens /*
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens * expected parametrs:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens * u8 port
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens port = va_arg(argp, int);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BnxeLogWarn(pUM, "10Gb speed not supported! (port=%d)", port);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens break;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens case LM_LOG_ID_PHY_UNINITIALIZED:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens /*
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens * expected parametrs:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens * u8 port
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens port = va_arg(argp, int);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BnxeLogWarn(pUM, "PHY uninitialized! (port=%d)", port);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens break;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens case LM_LOG_ID_MDIO_ACCESS_TIMEOUT:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens#define MM_PORT_NUM(pdev) \
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens (CHIP_PORT_MODE(pdev) == LM_CHIP_PORT_MODE_4) ? \
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens (PATH_ID(pdev) + (2 * PORT_ID(pdev))) : \
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens (PATH_ID(pdev) + PORT_ID(pdev))
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens port = MM_PORT_NUM(&pUM->lm_dev);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens BnxeLogWarn(pUM, "MDIO access timeout! (port=%d)", port);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens break;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens default:
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "Unknown MM event log! (type=%d)", lm_log_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslm_status_t mm_event_log_generic(lm_device_t * pDev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const lm_log_id_t lm_log_id,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_status_t lm_status = LM_STATUS_SUCCESS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_list argp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_start(argp, lm_log_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_status = mm_event_log_generic_arg_fwd(pDev, lm_log_id, argp);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens va_end(argp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return lm_status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensu32_t mm_build_ver_string(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens snprintf((char *)pDev->ver_str,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof(pDev->ver_str),
fa9e4066f08beec538e775443c5be79dd423fcabahrens "%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens pUM->version);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return min(strlen((char *)pDev->ver_str), strlen(pUM->version));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_indicate_hw_failure(lm_device_t * pDev)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens um_device_t * pUM = (um_device_t *)pDev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens BnxeLogWarn(pUM, "HW failure indicated!");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid mm_bar_read_byte(struct _lm_device_t *pdev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t *ret)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens mm_read_barrier();
fa9e4066f08beec538e775443c5be79dd423fcabahrens *ret = ddi_get8(pdev->vars.reg_handle[bar],
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint8_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_bar_read_word(struct _lm_device_t *pdev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens u16_t *ret)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mm_read_barrier();
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens *ret = ddi_get16(pdev->vars.reg_handle[bar],
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens (uint16_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens offset));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_bar_read_dword(struct _lm_device_t *pdev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens u32_t *ret)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mm_read_barrier();
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens *ret = ddi_get32(pdev->vars.reg_handle[bar],
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens offset));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensvoid mm_bar_read_ddword(struct _lm_device_t *pdev,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens u8_t bar,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens u32_t offset,
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens u64_t *ret)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens mm_read_barrier();
fa9e4066f08beec538e775443c5be79dd423fcabahrens *ret = ddi_get64(pdev->vars.reg_handle[bar],
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
fa9e4066f08beec538e775443c5be79dd423fcabahrens offset));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_bar_write_byte(struct _lm_device_t *pdev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t val)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_put8(pdev->vars.reg_handle[bar],
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint8_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
fa9e4066f08beec538e775443c5be79dd423fcabahrens val);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mm_write_barrier();
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid mm_bar_write_word(struct _lm_device_t *pdev,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t bar,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t offset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens u16_t val)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_put16(pdev->vars.reg_handle[bar],
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint16_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
fa9e4066f08beec538e775443c5be79dd423fcabahrens val);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mm_write_barrier();
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrockvoid mm_bar_write_dword(struct _lm_device_t *pdev,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u8_t bar,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t offset,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t val)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock ddi_put32(pdev->vars.reg_handle[bar],
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock val);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mm_write_barrier();
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock}
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrockvoid mm_bar_write_ddword(struct _lm_device_t *pdev,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u8_t bar,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t offset,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u64_t val)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock ddi_put64(pdev->vars.reg_handle[bar],
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock (uint64_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] + offset),
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock val);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mm_write_barrier();
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock}
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrockvoid mm_bar_copy_buffer(struct _lm_device_t * pdev,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u8_t bar,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t offset,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t size,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t *buf_ptr)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t i;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock for (i = 0; i < size; i++)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock ddi_put32(pdev->vars.reg_handle[bar],
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock (uint32_t *)((caddr_t)pdev->vars.mapped_bar_addr[bar] +
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock offset + (i * 4)),
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock *(buf_ptr + i));
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock }
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock}
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrocku32_t mm_get_cap_offset(struct _lm_device_t * pdev,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t capabilityID)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock u32_t cap_offset = PCI_CAPABILITY_LIST; //CapPtr ofset
fa9e4066f08beec538e775443c5be79dd423fcabahrens u8_t cap_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens u32_t reg_value = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lm_status_t lm_status = mm_read_pci(pdev, cap_offset, &reg_value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((lm_status == LM_STATUS_SUCCESS) && (reg_value != 0xFFFFFFFF)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cap_offset = (u8_t)(reg_value & 0x000000FF);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock if ((cap_offset == 0) || (cap_offset >= 0x100)) {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return 0xFFFFFFFF;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return 0xFFFFFFFF;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
fa9e4066f08beec538e775443c5be79dd423fcabahrens reg_value = 0;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock lm_status = mm_read_pci(pdev, cap_offset, &reg_value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((lm_status == LM_STATUS_SUCCESS) && (reg_value != 0xFFFFFFFF)) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock cap_id = (u8_t)(reg_value & 0x000000FF);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cap_id == capabilityID) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens cap_offset = (reg_value & 0x0000FF00) >> 8;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cap_offset == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cap_offset = 0xFFFFFFFF;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while ((lm_status == LM_STATUS_SUCCESS));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return cap_offset;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrocku32_t mm_get_wol_flags(struct _lm_device_t * pdev)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock{
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return LM_WAKE_UP_MODE_NONE;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrocku32_t mm_get_feature_flags(struct _lm_device_t * pdev)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrocku32_t mm_get_vmq_cnt(struct _lm_device_t * pdev)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return 0;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock}
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrocklm_status_t mm_i2c_update(struct _lm_device_t * pdev)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return LM_STATUS_SUCCESS;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensu64_t mm_query_system_time(void)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return 0;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock