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