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#include <sys/mac.h>
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include <sys/mac_ether.h>
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include <sys/dlpi.h>
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !(defined(__S11) || defined(__S12))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_driver mr_driver
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_start mr_start
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_stop mr_stop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_intr mr_intr
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_poll mr_poll
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mri_tx mr_send
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_driver mrg_driver
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_start mrg_start
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_stop mrg_stop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_count mrg_count
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_addmac mrg_addmac
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mgi_remmac mrg_addmac
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mr_gaddring mr_gadd_ring
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define mr_gremring mr_grem_ring
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* not __S11 or __S12 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Reconfiguring the network devices parameters require net_config
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * privilege starting Solaris 10. Only root user is allowed to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * update device parameter in Solaris 9 and earlier version. Following
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * declaration allows single binary image to run on all OS versions.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern int secpolicy_net_config(const cred_t *, boolean_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern int drv_priv(cred_t *);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#pragma weak secpolicy_net_config
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#pragma weak drv_priv
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchichar * bnxeLink_priv_props[] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_adv_2500fdx_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_en_2500fdx_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_adv_txpause_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_en_txpause_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_txpause",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_adv_rxpause_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_en_rxpause_cap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_rxpause",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_autoneg_flow",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_checksum",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_num_rings",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_rx_descs",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_rx_free_reclaim",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_rx_copy_threshold",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_tx_descs",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_tx_free_reclaim",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_tx_copy_threshold",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_tx_ring_policy",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_interrupt_coalesce",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_rx_interrupt_coalesce_usec",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_tx_interrupt_coalesce_usec",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_disable_msix",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_l2_fw_flow_ctrl",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_autogreeen_enable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_lso_enable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_log_enable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_fcoe_enable",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* MC_SETPROP */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacStats(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t stat,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint64_t * pVal)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pLM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_l2_chip_statistics_t b10_l2_stats;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int idx, rc = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pUM == NULL) || (pVal == NULL))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pLM = &pUM->lm_dev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EAGAIN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (stat)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_IFSPEED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = (pUM->props.link_speed * 1000000ULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_MULTIRCV:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCInMulticastPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_BRDCSTRCV:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCInBroadcastPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_MULTIXMT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCOutMulticastPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_BRDCSTXMT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCOutBroadcastPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_NORCVBUF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_get_stats(pLM, LM_STATS_RCV_NO_BUFFER_DROP, (u64_t *)pVal);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_NOXMTBUF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FOREACH_TSS_IDX(pLM, idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal += pUM->txq[idx].txRecycle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_IERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_MACRCV_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfInErrors;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX not available */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_COLLISIONS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.EtherStatsCollisions;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_RBYTES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCInOctets;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_IPACKETS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCInPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OBYTES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCOutOctets;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OPACKETS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.IfHCOutPkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ALIGN_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsAlignmentErrors;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_FCS_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsFCSErrors;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_FIRST_COLLISIONS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsSingleCollisionFrames;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_MULTI_COLLISIONS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsMultipleCollisionFrames;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_DEFER_XMTS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsDeferredTransmissions;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_TX_LATE_COLLISIONS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsLateCollisions;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_EX_COLLISIONS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsExcessiveCollisions;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_MACXMT_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsInternalMacTransmitErrors;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CARRIER_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsCarrierSenseErrors;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_TOOLONG_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.EtherStatsOverrsizePkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_TOOSHORT_ERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = b10_l2_stats.EtherStatsUndersizePkts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_XCVR_ADDR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pLM->vars.phy_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_XCVR_ID:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_XCVR_INUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pUM->props.link_speed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0: /* no speed then status is down */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = XCVR_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 1000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = XCVR_1000X;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 100:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = XCVR_100X;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 10:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = XCVR_10;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* catches 2500/10000 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = XCVR_UNDEFINED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_10GFDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_1000FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_1000HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = linkconf->param_1000hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_100FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = linkconf->param_100fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_100HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = linkconf->param_100hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_10FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = linkconf->param_10fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_10HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = linkconf->param_10hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_ASMPAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_PAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_CAP_REMFAULT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_10GFDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_1000FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_1000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_1000HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = pUM->curcfg.lnkcfg.param_1000hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_100FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_100HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_10FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_10HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_ASMPAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_PAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_CAP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_ADV_REMFAULT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0 /* LP caps not supported */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (MAC_VERSION > 1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_10GFDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_10000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_1000FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_1000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_1000HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //*pVal = pUM->remote.param_1000hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_100FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_100fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_100HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_100hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_10FDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_10fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_10HDX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.param_10hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_ASMPAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX implement LP_ASYM_PAUSE stat */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_PAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX implement LP_PAUSE stat */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_CAP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->remote.link_autoneg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LP_REMFAULT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX implement LP_REMFAULT stat */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* LP caps not supported */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LINK_ASMPAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX implement ASMPAUSE stat */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LINK_PAUSE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX implement PAUSE stat */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LINK_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ETHER_STAT_LINK_DUPLEX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pVal = (pUM->props.link_duplex == B_TRUE) ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This routine is called by GLD to enable device for packet reception and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * enable interrupts.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacStart(void * pArg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* already started */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EAGAIN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Always report the initial link state as unknown. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeHwStartL2(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EIO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_enter(&bnxeLoaderMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeNumPlumbed++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_exit(&bnxeLoaderMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This routine stops packet reception by clearing RX MASK register. Also
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * interrupts are disabled for this device.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMacStop(void * pArg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeHwStopL2(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Report the link state back to unknown. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_enter(&bnxeLoaderMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxeNumPlumbed--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mutex_exit(&bnxeLoaderMutex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* (flag) TRUE = on, FALSE = off */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacPromiscuous(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t flag)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EAGAIN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (flag)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] |=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_RX_MASK_PROMISCUOUS_MODE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] &=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ~LM_RX_MASK_PROMISCUOUS_MODE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BnxeRxMask(pUM, LM_CLI_IDX_NDIS,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS]) < 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ECANCELED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This function is used to enable or disable multicast packet reception for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * particular multicast addresses.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (flag) TRUE = add, FALSE = remove
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacMulticast(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t flag,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const uint8_t * pMcastAddr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EAGAIN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeMulticast(pUM, LM_CLI_IDX_NDIS, flag, pMcastAddr, B_TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef BNXE_RINGS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingGroupAddMac(void * groupHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const uint8_t * pMacAddr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint64_t flags)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingGroupAddMac(void * groupHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const uint8_t * pMacAddr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u32_t idx = pRxQGroup->idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _NOTE(ARGUNUSED(flags))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ECANCELED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Validate MAC address */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->ucastTableLen == LM_MAX_UC_TABLE_SIZE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ENOMEM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.mac_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc < 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ECANCELED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->ucastTableLen++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingGroupRemMac(void * groupHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const uint8_t * pMacAddr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u32_t idx = pRxQGroup->idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ECANCELED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->ucastTableLen == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!IS_ETH_ADDRESS_EQUAL(pMacAddr, pUM->lm_dev.params.mac_addr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Deleting MAC address that doesn't match default");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_FALSE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.mac_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memset(pUM->lm_dev.params.mac_addr, 0, sizeof(pUM->lm_dev.params.mac_addr));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc < 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ECANCELED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->ucastTableLen--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic mblk_t * BnxeTxRingSend(void * ringHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pMblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TxQueue * pTxQ = (TxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pTxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t idx = pTxQ->idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pMblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pNextMblk = pMblk->b_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk->b_next = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeTxSendMblk(pUM, idx, pMblk, 0, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc == BNXE_TX_GOODXMIT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi continue;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk->b_next = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return pMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* BNXE_RINGS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacUnicast(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const uint8_t * pMacAddr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memcpy(pUM->gldMac, pMacAddr, ETHERNET_ADDRESS_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Validate MAC address */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address.");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.mac_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc < 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EAGAIN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic mblk_t * BnxeMacTx(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pMblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int ring, rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLDTX(pUM, RW_READER);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi freemsgchain(pMblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pMblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ring = BnxeRouteTxRing(pUM, pMblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pNextMblk = pMblk->b_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk->b_next = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //rc = BnxeTxSendMblk(pUM, NDIS_CID(&pUM->lm_dev), pMblk, 0, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = BnxeTxSendMblk(pUM, ring, pMblk, 0, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc == BNXE_TX_GOODXMIT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi continue;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMblk->b_next = pNextMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return pMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_RESOURCES
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeBlank(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi time_t tick_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t pkt_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Need to dynamically reconfigure the hw with new interrupt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * coalescing params...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMacResources(void * pArg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_rx_fifo_t mrf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mrf.mrf_type = MAC_RX_FIFO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mrf.mrf_blank = BnxeBlank;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mrf.mrf_arg = (void *)pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mrf.mrf_normal_blank_time = 25;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mrf.mrf_normal_pkt_count = 8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FOREACH_RSS_IDX(&pUM->lm_dev, idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->macRxResourceHandles[idx] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_resource_add(pUM->pMac, (mac_resource_t *)&mrf);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* MC_RESOURCES */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeReadReg(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct bnxe_reg_data * pData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pData->offset & 0x3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXEREG ioctl");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_BAR_RD32_OFFSET(&pUM->lm_dev, 0, pData->offset, &pData->value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeWriteReg(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct bnxe_reg_data * pData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pData->offset & 0x3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXEREG ioctl");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_BAR_WR32_OFFSET(&pUM->lm_dev, 0, pData->offset, pData->value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeReadNvm(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct bnxe_nvram_data * pData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pData->offset & 0x3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXENVRM ioctl");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_nvram_read(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pData->offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pData->value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeWriteNvm(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct bnxe_nvram_data * pData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pData->offset & 0x3)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXENVRM ioctl");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_nvram_write(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pData->offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pData->value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeReadPciCfg(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct bnxe_reg_data * pData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pData->value = pci_config_get32(pUM->pPciCfg, (off_t)pData->offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi STATS_SHOW_TYPE_NUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi STATS_SHOW_TYPE_STR,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi STATS_SHOW_TYPE_CNT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi STATS_SHOW_TYPE_MAX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} stats_show_type_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef union _b10_stats_show_data_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t op; /* ioctl sub-commond */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t num; /* return number of stats */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t len; /* length of each string item */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } desc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* variable length... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi char str[1]; /* holds names of desc.num stats, each desc.len in length */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_l2_chip_statistics_v2_t l2_chip_stats;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_l4_chip_statistics_t l4_chip_stats;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_l2_driver_statistics_t l2_drv_stats;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_l4_driver_statistics_t l4_drv_stats;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} b10_stats_show_data_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeStatsShow(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b10_stats_show_data_t * pStats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t statsLen)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi stats_show_type_t op;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const size_t stats_size = sizeof(pStats->cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * All stats names MUST conform to STATS_STR_LEN length!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #define STATS_STR_LEN 39
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Note: these strings must be updated whenever any of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * b10_l2_chip_statistics_t, b10_l4_chip_statistics_t,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * b10_l2_driver_statistics_t or b10_l4_driver_statistics_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * are changed, or additional statistics are required.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char p_stat_str[] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // b10_l2_chip_statistics_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "l2_chip_stats_ver_num\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInBadOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutBadOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInUcastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInMulticastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInBroadcastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutUcastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutMulticastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutBroadcastPkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInUcastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInMulticastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInBroadcastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutUcastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutMulticastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutBroadcastOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCOutDiscards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfHCInFalseCarrierErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsInternalMacTransmitErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsCarrierSenseErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsFCSErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsAlignmentErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsSingleCollisionFrames\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsMultipleCollisionFrames\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsDeferredTransmissions\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsExcessiveCollisions\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Dot3StatsLateCollisions\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsCollisions\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsFragments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsJabbers\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsUndersizePkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsOverrsizePkts\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx64Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx65Octetsto127Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx128Octetsto255Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx256Octetsto511Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx512Octetsto1023Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTx1024Octetsto1522Octets\0"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "EtherStatsPktsTxOver1522Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "XonPauseFramesReceived\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "XoffPauseFramesReceived\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutXonSent\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutXoffSent\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "FlowControlDone\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "MacControlFramesReceived\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "XoffStateEntered\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInFramesL2FilterDiscards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInTTL0Discards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInxxOverflowDiscards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInMBUFDiscards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInErrorsOctets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IfInNoBrbBuffer\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_brb_packet\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_brb_truncate\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_flow_ctrl_discard\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_flow_ctrl_octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_flow_ctrl_packet\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_mng_discard\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_mng_octet_inp\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_mng_octet_out\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_mng_packet_inp\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_mng_packet_out\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_pbf_octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_pbf_packet\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Nig_safc_inp\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Tx_Lpi_Count\0 " // This counter counts the number of timers the debounced version of EEE link idle is asserted
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // b10_l4_chip_statistics_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "l4_chip_stats_ver_num\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "NoTxCqes\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InTCP4Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutTCP4Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RetransmittedTCP4Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InTCP4Errors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4Receives\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4HeaderErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4Discards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4Delivers\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIP4Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP4TruncatedPackets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InTCP6Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutTCP6Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RetransmittedTCP6Segments\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InTCP6Errors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6Receives\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6HeaderErrors\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6Discards\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6Delivers\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIP6Octets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIP6TruncatedPackets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // b10_l2_driver_statistics_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "l2_driver_stats_ver_num\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxIPv4FragCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxIpCsErrorCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxTcpCsErrorCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxLlcSnapCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxPhyErrorCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxIpv6ExtCount\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "TxNoL2Bd\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "TxNoSqWqe\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "TxL2AssemblyBufUse\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // b10_l4_driver_statistics_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "l4_driver_stats_ver_num\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "CurrentlyIpv4Established\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIpv4Resets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIpv4Fin\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIpv4Reset\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIpv4Fin\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "CurrentlyIpv6Established\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIpv6Resets\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OutIpv6Fin\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIpv6Reset\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "InIpv6Fin\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxIndicateReturnPendingCnt\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxIndicateReturnDoneCnt\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "RxActiveGenBufCnt\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "TxNoL4Bd\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "TxL4AssemblyBufUse\0 "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC((sizeof(p_stat_str) / STATS_STR_LEN) ==
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (stats_size / sizeof(u64_t)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi op = *((stats_show_type_t *)pStats);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (op)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATS_SHOW_TYPE_NUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (statsLen < sizeof(pStats->desc))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pStats->desc.num = (stats_size / sizeof(u64_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pStats->desc.len = STATS_STR_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATS_SHOW_TYPE_STR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (statsLen != sizeof(p_stat_str))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi memcpy(pStats->str, p_stat_str, sizeof(p_stat_str));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATS_SHOW_TYPE_CNT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (statsLen != stats_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_chip_stats(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pStats->cnt.l2_chip_stats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l4_chip_stats(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pStats->cnt.l4_chip_stats);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l2_driver_stats(&pUM->lm_dev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ,&pStats->cnt.l2_drv_stats);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_get_l4_driver_stats(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pStats->cnt.l4_drv_stats);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMacIoctl(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi queue_t * pQ,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pMblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct iocblk * pIoctl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pQ == NULL) || (pMblk == NULL))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pMblk->b_datap->db_type != M_IOCTL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pIoctl = (struct iocblk *)pMblk->b_rptr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pIoctl->ioc_cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXELLDP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_lldp_params_get_t)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, sizeof(b10_lldp_params_get_t)) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (((b10_lldp_params_get_t *)pMblk->b_cont->b_rptr)->ver_num !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LLDP_PARAMS_VER_NUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_dcbx_lldp_read_params(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (b10_lldp_params_get_t *)pMblk->b_cont->b_rptr) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXEDCBX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_dcbx_params_get_t)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, sizeof(b10_dcbx_params_get_t)) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (((b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr)->ver_num !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DCBX_PARAMS_VER_NUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_dcbx_read_params(&pUM->lm_dev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SIOCBNXEDCBX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* XXX */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXEREG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeReadReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SIOCBNXEREG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeWriteReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXENVRM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeReadNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SIOCBNXENVRM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeWriteNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXEPCI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeReadPciCfg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case GIOCBNXESTATS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* min size = sizeof(op) in b10_stats_show_data_t */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pIoctl->ioc_count < sizeof(u32_t)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeStatsShow(pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (b10_stats_show_data_t *)pMblk->b_cont->b_rptr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pIoctl->ioc_count))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef BNXE_RINGS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic mblk_t * BnxeRxRingPoll(void * ringHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int numBytes,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int numPkts)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic mblk_t * BnxeRxRingPoll(void * ringHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int numBytes)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t idx = pRxQ->idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk_t * pMblk = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t pktsRxed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t pktsTxed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _NOTE(ARGUNUSED(numPkts))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (numBytes <= 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pRxQ->inPollMode == B_FALSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Polling on ring %d when NOT in poll mode!", idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_INTR(pUM, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->pollCnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxePollRxRing(pUM, idx, &pktsRxed, &pktsTxed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pktsTxed) BnxeTxRingProcess(pUM, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pktsRxed) pMblk = BnxeRxRingProcess(pUM, idx, TRUE, numBytes);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This is here for the off chance that all rings are in polling
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * mode and the default interrupt hasn't fired recently to handle
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the sq.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_post_pending(&pUM->lm_dev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_INTR(pUM, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return pMblk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingStart(mac_ring_driver_t ringHandle
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi , uint64_t genNumber
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t idx = pRxQ->idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogDbg(pUM, "Starting Rx Ring %d", idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_RX(pUM, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->genNumber = genNumber;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->inPollMode = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->intrDisableCnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->intrEnableCnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->pollCnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_RX(pUM, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRingStat(mac_ring_driver_t ringHandle,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t stat,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint64_t * val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (stat)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OBYTES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_OPACKETS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_IERRORS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_RBYTES: /* MAC_STAT_IBYTES */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_STAT_IPACKETS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* __S11 or __S12 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingIntrEnable(mac_ring_driver_t ringHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingIntrEnable(mac_intr_handle_t ringHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogDbg(pUM, "Enabling Interrupt for Rx Ring %d", pRxQ->idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0; /* ok, already enabled */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrIguSbEnable(pUM, pRxQ->idx, B_FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingIntrDisable(mac_ring_driver_t ringHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeRxRingIntrDisable(mac_intr_handle_t ringHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogDbg(pUM, "Disabling Interrupt for Rx Ring %d", pRxQ->idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return -1; /* NO, keep enabled! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeIntrIguSbDisable(pUM, pRxQ->idx, B_FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* callback function for MAC layer to register rings */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeFillRing(void * arg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_ring_type_t ringType,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const int ringGroupIndex,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const int ringIndex,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_ring_info_t * pRingInfo,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_ring_handle_t ringHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)arg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueue * pRxQ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TxQueue * pTxQ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (ringType)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_RX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Ring %d (Ring Group %d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ringIndex, ringGroupIndex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(ringGroupIndex == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ = &pUM->rxq[ringIndex];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQ->ringHandle = ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pRxQ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_start = BnxeRxRingStart;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_stop = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_poll = BnxeRxRingPoll;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !(defined(__S11) || defined(__S12))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_intr.mi_handle = (mac_intr_handle_t)pRxQ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_intr.mi_enable = (mac_intr_enable_t)BnxeRxRingIntrEnable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_intr.mi_disable = (mac_intr_disable_t)BnxeRxRingIntrDisable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_TX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "Initializing Tx Ring %d (Ring Group %d)",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ringIndex, ringGroupIndex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(ringGroupIndex == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pTxQ = &pUM->txq[ringIndex];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pTxQ->ringHandle = ringHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pTxQ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_start = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_stop = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(__S11) || defined(__S12)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRingInfo->mri_tx = (mac_ring_send_t)BnxeTxRingSend;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* callback function for MAC layer to register groups */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeFillGroup(void * arg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_ring_type_t ringType,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const int ringGroupIndex,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_group_info_t * pGroupInfo,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_group_handle_t groupHandle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)arg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RxQueueGroup * pRxQGroup;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (ringType)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_RX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Group %d", ringGroupIndex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQGroup = &pUM->rxqGroup[ringGroupIndex];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pRxQGroup->groupHandle = groupHandle;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_driver = (mac_group_driver_t)pRxQGroup;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_start = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_stop = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_addmac = BnxeRxRingGroupAddMac;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_remmac = BnxeRxRingGroupRemMac;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_count = (pUM->devParams.numRings /
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi USER_OPTION_RX_RING_GROUPS_DEFAULT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pGroupInfo->mgi_flags = MAC_GROUP_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_TX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* BNXE_RINGS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic boolean_t BnxeMacGetCapability(void * pArg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_capab_t capability,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * pCapabilityData)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_capab_lso_t * pCapLSO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_capab_rings_t * pCapRings;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (capability)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_CAPAB_HCKSUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *((u32_t *)pCapabilityData) = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->devParams.enabled_oflds &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_OFFLOAD_TX_IP_CKSUM | LM_OFFLOAD_RX_IP_CKSUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_IPHDRCKSUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->devParams.enabled_oflds &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_OFFLOAD_TX_TCP_CKSUM | LM_OFFLOAD_TX_UDP_CKSUM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_OFFLOAD_RX_TCP_CKSUM | LM_OFFLOAD_RX_UDP_CKSUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_INET_PARTIAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_CAPAB_LSO:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapLSO = (mac_capab_lso_t *)pCapabilityData;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->devParams.lsoEnable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapLSO->lso_flags = LSO_TX_BASIC_TCP_IPV4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapLSO->lso_basic_tcp_ipv4.lso_max = BNXE_LSO_MAXLEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef BNXE_RINGS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_CAPAB_RINGS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pUM->devParams.numRings)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings = (mac_capab_rings_t *)pCapabilityData;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_version = MAC_RINGS_VERSION_1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_flags = MAC_RINGS_FLAGS_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_group_type = MAC_GROUP_TYPE_STATIC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_rnum = pUM->devParams.numRings;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_rget = BnxeFillRing;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gaddring = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gremring = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_ggetringtc = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pCapRings->mr_type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_RX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gnum = USER_OPTION_RX_RING_GROUPS_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gget = BnxeFillGroup;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_RING_TYPE_TX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gnum = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gnum = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pCapRings->mr_gget = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* BNXE_RINGS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !(defined(__S11) || defined(__S12))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_CAPAB_POLL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * There's nothing for us to fill in, simply returning B_TRUE stating
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that we support polling is sufficient.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* not __S11 or __S12 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeSetPrivateProperty(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t pr_valsize,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const void * pr_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int err = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi long result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strcmp(pr_name, "_en_2500fdx_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_2500fdx = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_2500fdx = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.flow_autoneg = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.flow_autoneg = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (result)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case USER_OPTION_CKSUM_NONE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.enabled_oflds = LM_OFFLOAD_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case USER_OPTION_CKSUM_L3:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.enabled_oflds = (LM_OFFLOAD_TX_IP_CKSUM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_OFFLOAD_RX_IP_CKSUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case USER_OPTION_CKSUM_L3_L4:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.enabled_oflds = (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_UDP_CKSUM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_OFFLOAD_RX_UDP_CKSUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.checksum = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (result)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_ROUTE_RING_NONE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_ROUTE_RING_TCPUDP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_ROUTE_RING_DEST_MAC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case BNXE_ROUTE_RING_MSG_PRIO:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.routeTxRingPolicy = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_NUM_RINGS_MIN) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (result > USER_OPTION_NUM_RINGS_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numRings = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.maxRxFree = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.maxTxFree = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.rxCopyThreshold = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.txCopyThreshold = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.intrCoalesce = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.intrRxPerSec = (uint32_t)(1000000 / result);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.intrTxPerSec = (uint32_t)(1000000 / result);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.disableMsix = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.l2_fw_flow_ctrl = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.autogreeenEnable = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.lsoEnable = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.logEnable = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((result > 1) || (result < 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.fcoeEnable = (uint32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (BNXE_FCOE(pUM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeFcoeStartStop(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return err;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacSetProperty(void * barg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_id_t pr_num,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t pr_valsize,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const void * pr_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = barg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t reprogram = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi boolean_t txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint32_t mtu;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl_t fl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int err = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pr_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* read-only props */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_STATUS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_SPEED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_DUPLEX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_10000fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_10000fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_1000fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_1000fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_100fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_100fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_100hdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_100hdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_10fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_10fdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_10hdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_10hdx = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.link_autoneg = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.link_autoneg = *(uint8_t *)pr_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_FLOWCTRL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(pr_val, &fl, sizeof(fl));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (fl)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LINK_FLOWCTRL_NONE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxpause = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi txpause = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LINK_FLOWCTRL_RX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxpause = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi txpause = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LINK_FLOWCTRL_TX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxpause = B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi txpause = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LINK_FLOWCTRL_BI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxpause = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi txpause = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (err == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reprogram = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_MTU:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = EBUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(pr_val, &mtu, sizeof (mtu));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((mtu < USER_OPTION_MTU_MIN) || (mtu > USER_OPTION_MTU_MAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = EINVAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->devParams.mtu[LM_CLI_IDX_NDIS] == mtu)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->devParams.mtu[LM_CLI_IDX_NDIS] = mtu;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = mac_maxsdu_update(pUM->pMac, pUM->devParams.mtu[LM_CLI_IDX_NDIS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pUM->lm_dev.params.mtu[LM_CLI_IDX_NDIS] = pUM->devParams.mtu[LM_CLI_IDX_NDIS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_PRIVATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = BnxeSetPrivateProperty(pUM, pr_name, pr_valsize, pr_val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!err && reprogram)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return err;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* MC_SETPROP */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_GETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeGetPrivateProperty(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t pr_valsize,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * pr_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int err = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strcmp(pr_name, "_adv_2500fdx_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = lnk_cfg->param_2500fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_en_2500fdx_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = hw_cfg->param_2500fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_adv_txpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = lnk_cfg->param_txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = hw_cfg->param_txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_txpause") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->props.link_txpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_adv_rxpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = lnk_cfg->param_rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = hw_cfg->param_rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rxpause") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->props.link_rxpause;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->hwinit.flow_autoneg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.checksum;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.routeTxRingPolicy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.numRings;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.maxRxFree;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.maxTxFree;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.rxCopyThreshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.txCopyThreshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.intrCoalesce;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.intrRxPerSec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.intrTxPerSec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.disableMsix;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.l2_fw_flow_ctrl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.autogreeenEnable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.lsoEnable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.logEnable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = pUM->devParams.fcoeEnable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!err)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void)snprintf(pr_val, pr_valsize, "%d", value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return err;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int BnxeMacGetProperty(void * barg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_id_t pr_num,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint_t pr_valsize,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * pr_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = barg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl_t link_flowctrl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_state_t link_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_duplex_t link_duplex;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uint64_t link_speed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pr_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_MTU:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(pr_valsize >= sizeof(u32_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(&pUM->devParams.mtu[LM_CLI_IDX_NDIS], pr_val, sizeof(u32_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_DUPLEX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_duplex_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_duplex = pUM->props.link_duplex ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(&link_duplex, pr_val, sizeof(link_duplex_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_SPEED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_speed));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_speed = (pUM->props.link_speed * 1000000ULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(&link_speed, pr_val, sizeof(link_speed));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_STATUS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_state_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_state = pUM->props.link_speed ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LINK_STATE_UP : LINK_STATE_DOWN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(&link_state, pr_val, sizeof(link_state_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->link_autoneg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_FLOWCTRL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_flowctrl_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lnk_cfg->param_rxpause && !lnk_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lnk_cfg->param_rxpause && !lnk_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lnk_cfg->param_rxpause && lnk_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lnk_cfg->param_rxpause && lnk_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bcopy(&link_flowctrl, pr_val, sizeof(link_flowctrl_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_1000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_1000fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10fdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10hdx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_PRIVATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return BnxeGetPrivateProperty(pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pr_valsize,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pr_val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ENOTSUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* MC_GETPROP */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_PROPINFO
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMacPrivatePropertyInfo(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_handle_t prh)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi char valstr[64];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int default_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bzero(valstr, sizeof (valstr));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((strcmp(pr_name, "_adv_2500fdx_cap") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_adv_txpause_cap") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_txpause") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_adv_rxpause_cap") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_rxpause") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_checksum") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_num_rings") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_rx_descs") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_tx_descs") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_interrupt_coalesce") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_disable_msix") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (strcmp(pr_name, "_lso_enable") == 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strcmp(pr_name, "_autoneg_flow") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = BNXE_ROUTE_RING_TCPUDP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = USER_OPTION_RX_MAX_FREE_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = USER_OPTION_TX_MAX_FREE_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = USER_OPTION_RX_DCOPY_THRESH_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = USER_OPTION_TX_DCOPY_THRESH_DEFAULT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_val = B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snprintf(valstr, sizeof (valstr), "%d", default_val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_str(prh, valstr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void BnxeMacPropertyInfo(void * barg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const char * pr_name,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_id_t pr_num,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_handle_t prh)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi um_device_t * pUM = barg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl_t link_flowctrl;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pr_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_STATUS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_SPEED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_DUPLEX:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10000fdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_1000fdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100fdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100hdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10fdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10hdx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_MTU:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_range_uint32(prh,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi USER_OPTION_MTU_MIN,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi USER_OPTION_MTU_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->link_autoneg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_FLOWCTRL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!default_cfg->param_rxpause && !default_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (default_cfg->param_rxpause && !default_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!default_cfg->param_rxpause && default_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (default_cfg->param_rxpause && default_cfg->param_txpause)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_prop_info_set_default_link_flowctrl(prh, link_flowctrl);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case MAC_PROP_PRIVATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacPrivatePropertyInfo(pUM, pr_name, prh);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* MC_PROPINFO */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic mac_callbacks_t bnxe_callbacks =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MC_IOCTL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_RESOURCES
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | MC_RESOURCES
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_GETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | MC_GETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_PROPINFO
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | MC_PROPINFO
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | MC_GETCAPAB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacStats,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacStart,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacStop,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacPromiscuous,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacMulticast,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacTx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_RESOURCES
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacResources,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacIoctl,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacGetCapability,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_OPEN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NULL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacSetProperty,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_GETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacGetProperty,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_PROPINFO
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeMacPropertyInfo
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeGldInit(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_register_t * pMac;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int rc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pMac = mac_alloc(MAC_VERSION)) == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to allocate GLD MAC memory");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_driver = pUM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_dip = pUM->pDev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_callbacks = &bnxe_callbacks;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_min_sdu = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_max_sdu = pUM->devParams.mtu[LM_CLI_IDX_NDIS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_src_addr = &(pUM->lm_dev.params.mac_addr[0]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_OPEN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_margin = VLAN_TAGSZ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef MC_SETPROP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pMac->m_priv_props = bnxeLink_priv_props;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxe_callbacks.mc_unicst =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!pUM->devParams.numRings) ? BnxeMacUnicast : NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bnxe_callbacks.mc_unicst = BnxeMacUnicast;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = mac_register(pMac, &pUM->pMac);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_free(pMac);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rc != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to register with GLD (%d)", rc);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Always report the initial link state as unknown. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiboolean_t BnxeGldFini(um_device_t * pUM)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->plumbed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Detaching device from GLD that is started!");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We must not detach until all packets held by stack are retrieved. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!BnxeWaitForPacketsFromClient(pUM, LM_CLI_IDX_NDIS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pUM->pMac)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mac_unregister(pUM->pMac))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BnxeLogWarn(pUM, "Failed to unregister with the GLD");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return B_TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid BnxeGldLink(um_device_t * pUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi link_state_t state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_link_update(pUM->pMac, state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi