1*d14abf15SRobert Mustacchi /* 2*d14abf15SRobert Mustacchi * CDDL HEADER START 3*d14abf15SRobert Mustacchi * 4*d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the 5*d14abf15SRobert Mustacchi * Common Development and Distribution License (the "License"). 6*d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License. 7*d14abf15SRobert Mustacchi * 8*d14abf15SRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*d14abf15SRobert Mustacchi * or http://www.opensolaris.org/os/licensing. 10*d14abf15SRobert Mustacchi * See the License for the specific language governing permissions 11*d14abf15SRobert Mustacchi * and limitations under the License. 12*d14abf15SRobert Mustacchi * 13*d14abf15SRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each 14*d14abf15SRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*d14abf15SRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the 16*d14abf15SRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying 17*d14abf15SRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner] 18*d14abf15SRobert Mustacchi * 19*d14abf15SRobert Mustacchi * CDDL HEADER END 20*d14abf15SRobert Mustacchi */ 21*d14abf15SRobert Mustacchi 22*d14abf15SRobert Mustacchi /* 23*d14abf15SRobert Mustacchi * Copyright 2014 QLogic Corporation 24*d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the 25*d14abf15SRobert Mustacchi * QLogic End User License (the "License"). 26*d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License. 27*d14abf15SRobert Mustacchi * 28*d14abf15SRobert Mustacchi * You can obtain a copy of the License at 29*d14abf15SRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/ 30*d14abf15SRobert Mustacchi * QLogic_End_User_Software_License.txt 31*d14abf15SRobert Mustacchi * See the License for the specific language governing permissions 32*d14abf15SRobert Mustacchi * and limitations under the License. 33*d14abf15SRobert Mustacchi */ 34*d14abf15SRobert Mustacchi 35*d14abf15SRobert Mustacchi /* 36*d14abf15SRobert Mustacchi * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. 37*d14abf15SRobert Mustacchi */ 38*d14abf15SRobert Mustacchi 39*d14abf15SRobert Mustacchi #include "bnxe.h" 40*d14abf15SRobert Mustacchi 41*d14abf15SRobert Mustacchi #include <sys/mac.h> 42*d14abf15SRobert Mustacchi #include <sys/mac_ether.h> 43*d14abf15SRobert Mustacchi #include <sys/dlpi.h> 44*d14abf15SRobert Mustacchi 45*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12)) 46*d14abf15SRobert Mustacchi #define mri_driver mr_driver 47*d14abf15SRobert Mustacchi #define mri_start mr_start 48*d14abf15SRobert Mustacchi #define mri_stop mr_stop 49*d14abf15SRobert Mustacchi #define mri_intr mr_intr 50*d14abf15SRobert Mustacchi #define mri_poll mr_poll 51*d14abf15SRobert Mustacchi #define mri_tx mr_send 52*d14abf15SRobert Mustacchi #define mgi_driver mrg_driver 53*d14abf15SRobert Mustacchi #define mgi_start mrg_start 54*d14abf15SRobert Mustacchi #define mgi_stop mrg_stop 55*d14abf15SRobert Mustacchi #define mgi_count mrg_count 56*d14abf15SRobert Mustacchi #define mgi_addmac mrg_addmac 57*d14abf15SRobert Mustacchi #define mgi_remmac mrg_addmac 58*d14abf15SRobert Mustacchi #define mr_gaddring mr_gadd_ring 59*d14abf15SRobert Mustacchi #define mr_gremring mr_grem_ring 60*d14abf15SRobert Mustacchi #endif /* not __S11 or __S12 */ 61*d14abf15SRobert Mustacchi 62*d14abf15SRobert Mustacchi /* 63*d14abf15SRobert Mustacchi * Reconfiguring the network devices parameters require net_config 64*d14abf15SRobert Mustacchi * privilege starting Solaris 10. Only root user is allowed to 65*d14abf15SRobert Mustacchi * update device parameter in Solaris 9 and earlier version. Following 66*d14abf15SRobert Mustacchi * declaration allows single binary image to run on all OS versions. 67*d14abf15SRobert Mustacchi */ 68*d14abf15SRobert Mustacchi extern int secpolicy_net_config(const cred_t *, boolean_t); 69*d14abf15SRobert Mustacchi extern int drv_priv(cred_t *); 70*d14abf15SRobert Mustacchi #pragma weak secpolicy_net_config 71*d14abf15SRobert Mustacchi #pragma weak drv_priv 72*d14abf15SRobert Mustacchi 73*d14abf15SRobert Mustacchi #ifdef MC_SETPROP 74*d14abf15SRobert Mustacchi 75*d14abf15SRobert Mustacchi char * bnxeLink_priv_props[] = 76*d14abf15SRobert Mustacchi { 77*d14abf15SRobert Mustacchi "_adv_2500fdx_cap", 78*d14abf15SRobert Mustacchi "_en_2500fdx_cap", 79*d14abf15SRobert Mustacchi "_adv_txpause_cap", 80*d14abf15SRobert Mustacchi "_en_txpause_cap", 81*d14abf15SRobert Mustacchi "_txpause", 82*d14abf15SRobert Mustacchi "_adv_rxpause_cap", 83*d14abf15SRobert Mustacchi "_en_rxpause_cap", 84*d14abf15SRobert Mustacchi "_rxpause", 85*d14abf15SRobert Mustacchi "_autoneg_flow", 86*d14abf15SRobert Mustacchi "_checksum", 87*d14abf15SRobert Mustacchi "_num_rings", 88*d14abf15SRobert Mustacchi "_rx_descs", 89*d14abf15SRobert Mustacchi "_rx_free_reclaim", 90*d14abf15SRobert Mustacchi "_rx_copy_threshold", 91*d14abf15SRobert Mustacchi "_tx_descs", 92*d14abf15SRobert Mustacchi "_tx_free_reclaim", 93*d14abf15SRobert Mustacchi "_tx_copy_threshold", 94*d14abf15SRobert Mustacchi "_tx_ring_policy", 95*d14abf15SRobert Mustacchi "_interrupt_coalesce", 96*d14abf15SRobert Mustacchi "_rx_interrupt_coalesce_usec", 97*d14abf15SRobert Mustacchi "_tx_interrupt_coalesce_usec", 98*d14abf15SRobert Mustacchi "_disable_msix", 99*d14abf15SRobert Mustacchi "_l2_fw_flow_ctrl", 100*d14abf15SRobert Mustacchi "_autogreeen_enable", 101*d14abf15SRobert Mustacchi "_lso_enable", 102*d14abf15SRobert Mustacchi "_log_enable", 103*d14abf15SRobert Mustacchi "_fcoe_enable", 104*d14abf15SRobert Mustacchi NULL 105*d14abf15SRobert Mustacchi }; 106*d14abf15SRobert Mustacchi 107*d14abf15SRobert Mustacchi #endif /* MC_SETPROP */ 108*d14abf15SRobert Mustacchi 109*d14abf15SRobert Mustacchi 110*d14abf15SRobert Mustacchi static int BnxeMacStats(void * pArg, 111*d14abf15SRobert Mustacchi uint_t stat, 112*d14abf15SRobert Mustacchi uint64_t * pVal) 113*d14abf15SRobert Mustacchi { 114*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 115*d14abf15SRobert Mustacchi lm_device_t * pLM; 116*d14abf15SRobert Mustacchi b10_l2_chip_statistics_t b10_l2_stats; 117*d14abf15SRobert Mustacchi int idx, rc = 0; 118*d14abf15SRobert Mustacchi 119*d14abf15SRobert Mustacchi if ((pUM == NULL) || (pVal == NULL)) 120*d14abf15SRobert Mustacchi { 121*d14abf15SRobert Mustacchi return EINVAL; 122*d14abf15SRobert Mustacchi } 123*d14abf15SRobert Mustacchi 124*d14abf15SRobert Mustacchi pLM = &pUM->lm_dev; 125*d14abf15SRobert Mustacchi 126*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 127*d14abf15SRobert Mustacchi 128*d14abf15SRobert Mustacchi if (!pUM->plumbed) 129*d14abf15SRobert Mustacchi { 130*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 131*d14abf15SRobert Mustacchi return EAGAIN; 132*d14abf15SRobert Mustacchi } 133*d14abf15SRobert Mustacchi 134*d14abf15SRobert Mustacchi *pVal = 0; 135*d14abf15SRobert Mustacchi 136*d14abf15SRobert Mustacchi switch (stat) 137*d14abf15SRobert Mustacchi { 138*d14abf15SRobert Mustacchi case MAC_STAT_IFSPEED: 139*d14abf15SRobert Mustacchi *pVal = (pUM->props.link_speed * 1000000ULL); 140*d14abf15SRobert Mustacchi break; 141*d14abf15SRobert Mustacchi 142*d14abf15SRobert Mustacchi case MAC_STAT_MULTIRCV: 143*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 144*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 145*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInMulticastPkts; 146*d14abf15SRobert Mustacchi break; 147*d14abf15SRobert Mustacchi 148*d14abf15SRobert Mustacchi case MAC_STAT_BRDCSTRCV: 149*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 150*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 151*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInBroadcastPkts; 152*d14abf15SRobert Mustacchi break; 153*d14abf15SRobert Mustacchi 154*d14abf15SRobert Mustacchi case MAC_STAT_MULTIXMT: 155*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 156*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 157*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutMulticastPkts; 158*d14abf15SRobert Mustacchi break; 159*d14abf15SRobert Mustacchi 160*d14abf15SRobert Mustacchi case MAC_STAT_BRDCSTXMT: 161*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 162*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 163*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutBroadcastPkts; 164*d14abf15SRobert Mustacchi break; 165*d14abf15SRobert Mustacchi 166*d14abf15SRobert Mustacchi case MAC_STAT_NORCVBUF: 167*d14abf15SRobert Mustacchi lm_get_stats(pLM, LM_STATS_RCV_NO_BUFFER_DROP, (u64_t *)pVal); 168*d14abf15SRobert Mustacchi break; 169*d14abf15SRobert Mustacchi 170*d14abf15SRobert Mustacchi case MAC_STAT_NOXMTBUF: 171*d14abf15SRobert Mustacchi *pVal = 0; 172*d14abf15SRobert Mustacchi LM_FOREACH_TSS_IDX(pLM, idx) 173*d14abf15SRobert Mustacchi { 174*d14abf15SRobert Mustacchi *pVal += pUM->txq[idx].txRecycle; 175*d14abf15SRobert Mustacchi } 176*d14abf15SRobert Mustacchi break; 177*d14abf15SRobert Mustacchi 178*d14abf15SRobert Mustacchi case MAC_STAT_IERRORS: 179*d14abf15SRobert Mustacchi case ETHER_STAT_MACRCV_ERRORS: 180*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 181*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 182*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfInErrors; 183*d14abf15SRobert Mustacchi break; 184*d14abf15SRobert Mustacchi 185*d14abf15SRobert Mustacchi case MAC_STAT_OERRORS: 186*d14abf15SRobert Mustacchi /* XXX not available */ 187*d14abf15SRobert Mustacchi break; 188*d14abf15SRobert Mustacchi 189*d14abf15SRobert Mustacchi case MAC_STAT_COLLISIONS: 190*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 191*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 192*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsCollisions; 193*d14abf15SRobert Mustacchi break; 194*d14abf15SRobert Mustacchi 195*d14abf15SRobert Mustacchi case MAC_STAT_RBYTES: 196*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 197*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 198*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInOctets; 199*d14abf15SRobert Mustacchi break; 200*d14abf15SRobert Mustacchi 201*d14abf15SRobert Mustacchi case MAC_STAT_IPACKETS: 202*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 203*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 204*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInPkts; 205*d14abf15SRobert Mustacchi break; 206*d14abf15SRobert Mustacchi 207*d14abf15SRobert Mustacchi case MAC_STAT_OBYTES: 208*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 209*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 210*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutOctets; 211*d14abf15SRobert Mustacchi break; 212*d14abf15SRobert Mustacchi 213*d14abf15SRobert Mustacchi case MAC_STAT_OPACKETS: 214*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 215*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 216*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutPkts; 217*d14abf15SRobert Mustacchi break; 218*d14abf15SRobert Mustacchi 219*d14abf15SRobert Mustacchi case ETHER_STAT_ALIGN_ERRORS: 220*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 221*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 222*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsAlignmentErrors; 223*d14abf15SRobert Mustacchi break; 224*d14abf15SRobert Mustacchi 225*d14abf15SRobert Mustacchi case ETHER_STAT_FCS_ERRORS: 226*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 227*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 228*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsFCSErrors; 229*d14abf15SRobert Mustacchi break; 230*d14abf15SRobert Mustacchi 231*d14abf15SRobert Mustacchi case ETHER_STAT_FIRST_COLLISIONS: 232*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 233*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 234*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsSingleCollisionFrames; 235*d14abf15SRobert Mustacchi break; 236*d14abf15SRobert Mustacchi 237*d14abf15SRobert Mustacchi case ETHER_STAT_MULTI_COLLISIONS: 238*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 239*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 240*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsMultipleCollisionFrames; 241*d14abf15SRobert Mustacchi break; 242*d14abf15SRobert Mustacchi 243*d14abf15SRobert Mustacchi case ETHER_STAT_DEFER_XMTS: 244*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 245*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 246*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsDeferredTransmissions; 247*d14abf15SRobert Mustacchi break; 248*d14abf15SRobert Mustacchi 249*d14abf15SRobert Mustacchi case ETHER_STAT_TX_LATE_COLLISIONS: 250*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 251*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 252*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsLateCollisions; 253*d14abf15SRobert Mustacchi break; 254*d14abf15SRobert Mustacchi 255*d14abf15SRobert Mustacchi case ETHER_STAT_EX_COLLISIONS: 256*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 257*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 258*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsExcessiveCollisions; 259*d14abf15SRobert Mustacchi break; 260*d14abf15SRobert Mustacchi 261*d14abf15SRobert Mustacchi case ETHER_STAT_MACXMT_ERRORS: 262*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 263*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 264*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsInternalMacTransmitErrors; 265*d14abf15SRobert Mustacchi break; 266*d14abf15SRobert Mustacchi 267*d14abf15SRobert Mustacchi case ETHER_STAT_CARRIER_ERRORS: 268*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 269*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 270*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsCarrierSenseErrors; 271*d14abf15SRobert Mustacchi break; 272*d14abf15SRobert Mustacchi 273*d14abf15SRobert Mustacchi case ETHER_STAT_TOOLONG_ERRORS: 274*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 275*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 276*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsOverrsizePkts; 277*d14abf15SRobert Mustacchi break; 278*d14abf15SRobert Mustacchi 279*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 280*d14abf15SRobert Mustacchi case ETHER_STAT_TOOSHORT_ERRORS: 281*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats, 282*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1); 283*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsUndersizePkts; 284*d14abf15SRobert Mustacchi break; 285*d14abf15SRobert Mustacchi #endif 286*d14abf15SRobert Mustacchi 287*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_ADDR: 288*d14abf15SRobert Mustacchi *pVal = pLM->vars.phy_addr; 289*d14abf15SRobert Mustacchi break; 290*d14abf15SRobert Mustacchi 291*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_ID: 292*d14abf15SRobert Mustacchi *pVal = 0; 293*d14abf15SRobert Mustacchi break; 294*d14abf15SRobert Mustacchi 295*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_INUSE: 296*d14abf15SRobert Mustacchi switch (pUM->props.link_speed) 297*d14abf15SRobert Mustacchi { 298*d14abf15SRobert Mustacchi case 0: /* no speed then status is down */ 299*d14abf15SRobert Mustacchi *pVal = XCVR_NONE; 300*d14abf15SRobert Mustacchi break; 301*d14abf15SRobert Mustacchi 302*d14abf15SRobert Mustacchi case 1000: 303*d14abf15SRobert Mustacchi *pVal = XCVR_1000X; 304*d14abf15SRobert Mustacchi break; 305*d14abf15SRobert Mustacchi 306*d14abf15SRobert Mustacchi case 100: 307*d14abf15SRobert Mustacchi *pVal = XCVR_100X; 308*d14abf15SRobert Mustacchi break; 309*d14abf15SRobert Mustacchi 310*d14abf15SRobert Mustacchi case 10: 311*d14abf15SRobert Mustacchi *pVal = XCVR_10; 312*d14abf15SRobert Mustacchi break; 313*d14abf15SRobert Mustacchi 314*d14abf15SRobert Mustacchi default: 315*d14abf15SRobert Mustacchi /* catches 2500/10000 */ 316*d14abf15SRobert Mustacchi *pVal = XCVR_UNDEFINED; 317*d14abf15SRobert Mustacchi } 318*d14abf15SRobert Mustacchi break; 319*d14abf15SRobert Mustacchi 320*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 321*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10GFDX: 322*d14abf15SRobert Mustacchi *pVal = 1; 323*d14abf15SRobert Mustacchi break; 324*d14abf15SRobert Mustacchi #endif 325*d14abf15SRobert Mustacchi 326*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_1000FDX: 327*d14abf15SRobert Mustacchi *pVal = 1; 328*d14abf15SRobert Mustacchi break; 329*d14abf15SRobert Mustacchi 330*d14abf15SRobert Mustacchi #if 0 331*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_1000HDX: 332*d14abf15SRobert Mustacchi //*pVal = linkconf->param_1000hdx; 333*d14abf15SRobert Mustacchi *pVal = 0; 334*d14abf15SRobert Mustacchi break; 335*d14abf15SRobert Mustacchi #endif 336*d14abf15SRobert Mustacchi 337*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_100FDX: 338*d14abf15SRobert Mustacchi //*pVal = linkconf->param_100fdx; 339*d14abf15SRobert Mustacchi *pVal = 1; 340*d14abf15SRobert Mustacchi break; 341*d14abf15SRobert Mustacchi 342*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_100HDX: 343*d14abf15SRobert Mustacchi //*pVal = linkconf->param_100hdx; 344*d14abf15SRobert Mustacchi *pVal = 1; 345*d14abf15SRobert Mustacchi break; 346*d14abf15SRobert Mustacchi 347*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10FDX: 348*d14abf15SRobert Mustacchi //*pVal = linkconf->param_10fdx; 349*d14abf15SRobert Mustacchi *pVal = 1; 350*d14abf15SRobert Mustacchi break; 351*d14abf15SRobert Mustacchi 352*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10HDX: 353*d14abf15SRobert Mustacchi //*pVal = linkconf->param_10hdx; 354*d14abf15SRobert Mustacchi *pVal = 1; 355*d14abf15SRobert Mustacchi break; 356*d14abf15SRobert Mustacchi 357*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_ASMPAUSE: 358*d14abf15SRobert Mustacchi *pVal = 1; 359*d14abf15SRobert Mustacchi break; 360*d14abf15SRobert Mustacchi 361*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_PAUSE: 362*d14abf15SRobert Mustacchi *pVal = 1; 363*d14abf15SRobert Mustacchi break; 364*d14abf15SRobert Mustacchi 365*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_AUTONEG: 366*d14abf15SRobert Mustacchi *pVal = 1; 367*d14abf15SRobert Mustacchi break; 368*d14abf15SRobert Mustacchi 369*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 370*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_REMFAULT: 371*d14abf15SRobert Mustacchi *pVal = 1; 372*d14abf15SRobert Mustacchi break; 373*d14abf15SRobert Mustacchi #endif 374*d14abf15SRobert Mustacchi 375*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 376*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10GFDX: 377*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10000fdx; 378*d14abf15SRobert Mustacchi break; 379*d14abf15SRobert Mustacchi #endif 380*d14abf15SRobert Mustacchi 381*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_1000FDX: 382*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_1000fdx; 383*d14abf15SRobert Mustacchi break; 384*d14abf15SRobert Mustacchi 385*d14abf15SRobert Mustacchi #if 0 386*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_1000HDX: 387*d14abf15SRobert Mustacchi //*pVal = pUM->curcfg.lnkcfg.param_1000hdx; 388*d14abf15SRobert Mustacchi *pVal = 0; 389*d14abf15SRobert Mustacchi break; 390*d14abf15SRobert Mustacchi #endif 391*d14abf15SRobert Mustacchi 392*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_100FDX: 393*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100fdx; 394*d14abf15SRobert Mustacchi break; 395*d14abf15SRobert Mustacchi 396*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_100HDX: 397*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100hdx; 398*d14abf15SRobert Mustacchi break; 399*d14abf15SRobert Mustacchi 400*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10FDX: 401*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10fdx; 402*d14abf15SRobert Mustacchi break; 403*d14abf15SRobert Mustacchi 404*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10HDX: 405*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10hdx; 406*d14abf15SRobert Mustacchi break; 407*d14abf15SRobert Mustacchi 408*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_ASMPAUSE: 409*d14abf15SRobert Mustacchi *pVal = 1; 410*d14abf15SRobert Mustacchi break; 411*d14abf15SRobert Mustacchi 412*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_PAUSE: 413*d14abf15SRobert Mustacchi *pVal = 1; 414*d14abf15SRobert Mustacchi break; 415*d14abf15SRobert Mustacchi 416*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_AUTONEG: 417*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg; 418*d14abf15SRobert Mustacchi break; 419*d14abf15SRobert Mustacchi 420*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 421*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_REMFAULT: 422*d14abf15SRobert Mustacchi *pVal = 1; 423*d14abf15SRobert Mustacchi break; 424*d14abf15SRobert Mustacchi #endif 425*d14abf15SRobert Mustacchi 426*d14abf15SRobert Mustacchi #if 0 /* LP caps not supported */ 427*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1) 428*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10GFDX: 429*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10000fdx; 430*d14abf15SRobert Mustacchi break; 431*d14abf15SRobert Mustacchi #endif 432*d14abf15SRobert Mustacchi 433*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_1000FDX: 434*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_1000fdx; 435*d14abf15SRobert Mustacchi break; 436*d14abf15SRobert Mustacchi 437*d14abf15SRobert Mustacchi #if 0 438*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_1000HDX: 439*d14abf15SRobert Mustacchi //*pVal = pUM->remote.param_1000hdx; 440*d14abf15SRobert Mustacchi *pVal = 0; 441*d14abf15SRobert Mustacchi break; 442*d14abf15SRobert Mustacchi #endif 443*d14abf15SRobert Mustacchi 444*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_100FDX: 445*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_100fdx; 446*d14abf15SRobert Mustacchi break; 447*d14abf15SRobert Mustacchi 448*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_100HDX: 449*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_100hdx; 450*d14abf15SRobert Mustacchi break; 451*d14abf15SRobert Mustacchi 452*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10FDX: 453*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10fdx; 454*d14abf15SRobert Mustacchi break; 455*d14abf15SRobert Mustacchi 456*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10HDX: 457*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10hdx; 458*d14abf15SRobert Mustacchi break; 459*d14abf15SRobert Mustacchi 460*d14abf15SRobert Mustacchi #if 0 461*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_ASMPAUSE: 462*d14abf15SRobert Mustacchi /* XXX implement LP_ASYM_PAUSE stat */ 463*d14abf15SRobert Mustacchi break; 464*d14abf15SRobert Mustacchi 465*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_PAUSE: 466*d14abf15SRobert Mustacchi /* XXX implement LP_PAUSE stat */ 467*d14abf15SRobert Mustacchi break; 468*d14abf15SRobert Mustacchi #endif 469*d14abf15SRobert Mustacchi 470*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_AUTONEG: 471*d14abf15SRobert Mustacchi *pVal = pUM->remote.link_autoneg; 472*d14abf15SRobert Mustacchi break; 473*d14abf15SRobert Mustacchi 474*d14abf15SRobert Mustacchi case ETHER_STAT_LP_REMFAULT: 475*d14abf15SRobert Mustacchi /* XXX implement LP_REMFAULT stat */ 476*d14abf15SRobert Mustacchi break; 477*d14abf15SRobert Mustacchi #endif /* LP caps not supported */ 478*d14abf15SRobert Mustacchi 479*d14abf15SRobert Mustacchi #if 0 480*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_ASMPAUSE: 481*d14abf15SRobert Mustacchi /* XXX implement ASMPAUSE stat */ 482*d14abf15SRobert Mustacchi break; 483*d14abf15SRobert Mustacchi 484*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_PAUSE: 485*d14abf15SRobert Mustacchi /* XXX implement PAUSE stat */ 486*d14abf15SRobert Mustacchi break; 487*d14abf15SRobert Mustacchi #endif 488*d14abf15SRobert Mustacchi 489*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_AUTONEG: 490*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg; 491*d14abf15SRobert Mustacchi break; 492*d14abf15SRobert Mustacchi 493*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_DUPLEX: 494*d14abf15SRobert Mustacchi *pVal = (pUM->props.link_duplex == B_TRUE) ? 495*d14abf15SRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; 496*d14abf15SRobert Mustacchi break; 497*d14abf15SRobert Mustacchi 498*d14abf15SRobert Mustacchi default: 499*d14abf15SRobert Mustacchi rc = ENOTSUP; 500*d14abf15SRobert Mustacchi } 501*d14abf15SRobert Mustacchi 502*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 503*d14abf15SRobert Mustacchi 504*d14abf15SRobert Mustacchi return rc; 505*d14abf15SRobert Mustacchi } 506*d14abf15SRobert Mustacchi 507*d14abf15SRobert Mustacchi 508*d14abf15SRobert Mustacchi 509*d14abf15SRobert Mustacchi /* 510*d14abf15SRobert Mustacchi * This routine is called by GLD to enable device for packet reception and 511*d14abf15SRobert Mustacchi * enable interrupts. 512*d14abf15SRobert Mustacchi */ 513*d14abf15SRobert Mustacchi static int BnxeMacStart(void * pArg) 514*d14abf15SRobert Mustacchi { 515*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 516*d14abf15SRobert Mustacchi 517*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 518*d14abf15SRobert Mustacchi 519*d14abf15SRobert Mustacchi if (pUM->plumbed) 520*d14abf15SRobert Mustacchi { 521*d14abf15SRobert Mustacchi /* already started */ 522*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 523*d14abf15SRobert Mustacchi return EAGAIN; 524*d14abf15SRobert Mustacchi } 525*d14abf15SRobert Mustacchi 526*d14abf15SRobert Mustacchi /* Always report the initial link state as unknown. */ 527*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN); 528*d14abf15SRobert Mustacchi 529*d14abf15SRobert Mustacchi if (BnxeHwStartL2(pUM)) 530*d14abf15SRobert Mustacchi { 531*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 532*d14abf15SRobert Mustacchi return EIO; 533*d14abf15SRobert Mustacchi } 534*d14abf15SRobert Mustacchi 535*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_TRUE); 536*d14abf15SRobert Mustacchi 537*d14abf15SRobert Mustacchi mutex_enter(&bnxeLoaderMutex); 538*d14abf15SRobert Mustacchi bnxeNumPlumbed++; 539*d14abf15SRobert Mustacchi mutex_exit(&bnxeLoaderMutex); 540*d14abf15SRobert Mustacchi 541*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 542*d14abf15SRobert Mustacchi 543*d14abf15SRobert Mustacchi return 0; 544*d14abf15SRobert Mustacchi } 545*d14abf15SRobert Mustacchi 546*d14abf15SRobert Mustacchi 547*d14abf15SRobert Mustacchi /* 548*d14abf15SRobert Mustacchi * This routine stops packet reception by clearing RX MASK register. Also 549*d14abf15SRobert Mustacchi * interrupts are disabled for this device. 550*d14abf15SRobert Mustacchi */ 551*d14abf15SRobert Mustacchi static void BnxeMacStop(void * pArg) 552*d14abf15SRobert Mustacchi { 553*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 554*d14abf15SRobert Mustacchi 555*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 556*d14abf15SRobert Mustacchi 557*d14abf15SRobert Mustacchi if (pUM->plumbed) 558*d14abf15SRobert Mustacchi { 559*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE); 560*d14abf15SRobert Mustacchi 561*d14abf15SRobert Mustacchi BnxeHwStopL2(pUM); 562*d14abf15SRobert Mustacchi 563*d14abf15SRobert Mustacchi /* Report the link state back to unknown. */ 564*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN); 565*d14abf15SRobert Mustacchi 566*d14abf15SRobert Mustacchi mutex_enter(&bnxeLoaderMutex); 567*d14abf15SRobert Mustacchi bnxeNumPlumbed--; 568*d14abf15SRobert Mustacchi mutex_exit(&bnxeLoaderMutex); 569*d14abf15SRobert Mustacchi } 570*d14abf15SRobert Mustacchi 571*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 572*d14abf15SRobert Mustacchi } 573*d14abf15SRobert Mustacchi 574*d14abf15SRobert Mustacchi /* (flag) TRUE = on, FALSE = off */ 575*d14abf15SRobert Mustacchi static int BnxeMacPromiscuous(void * pArg, 576*d14abf15SRobert Mustacchi boolean_t flag) 577*d14abf15SRobert Mustacchi { 578*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 579*d14abf15SRobert Mustacchi 580*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 581*d14abf15SRobert Mustacchi 582*d14abf15SRobert Mustacchi if (!pUM->plumbed) 583*d14abf15SRobert Mustacchi { 584*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 585*d14abf15SRobert Mustacchi return EAGAIN; 586*d14abf15SRobert Mustacchi } 587*d14abf15SRobert Mustacchi 588*d14abf15SRobert Mustacchi if (flag) 589*d14abf15SRobert Mustacchi { 590*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] |= 591*d14abf15SRobert Mustacchi LM_RX_MASK_PROMISCUOUS_MODE; 592*d14abf15SRobert Mustacchi } 593*d14abf15SRobert Mustacchi else 594*d14abf15SRobert Mustacchi { 595*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] &= 596*d14abf15SRobert Mustacchi ~LM_RX_MASK_PROMISCUOUS_MODE; 597*d14abf15SRobert Mustacchi } 598*d14abf15SRobert Mustacchi 599*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM); 600*d14abf15SRobert Mustacchi 601*d14abf15SRobert Mustacchi if (BnxeRxMask(pUM, LM_CLI_IDX_NDIS, 602*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS]) < 0) 603*d14abf15SRobert Mustacchi { 604*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 605*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 606*d14abf15SRobert Mustacchi return ECANCELED; 607*d14abf15SRobert Mustacchi } 608*d14abf15SRobert Mustacchi 609*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 610*d14abf15SRobert Mustacchi 611*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 612*d14abf15SRobert Mustacchi 613*d14abf15SRobert Mustacchi return 0; 614*d14abf15SRobert Mustacchi } 615*d14abf15SRobert Mustacchi 616*d14abf15SRobert Mustacchi 617*d14abf15SRobert Mustacchi /* 618*d14abf15SRobert Mustacchi * This function is used to enable or disable multicast packet reception for 619*d14abf15SRobert Mustacchi * particular multicast addresses. 620*d14abf15SRobert Mustacchi * (flag) TRUE = add, FALSE = remove 621*d14abf15SRobert Mustacchi */ 622*d14abf15SRobert Mustacchi static int BnxeMacMulticast(void * pArg, 623*d14abf15SRobert Mustacchi boolean_t flag, 624*d14abf15SRobert Mustacchi const uint8_t * pMcastAddr) 625*d14abf15SRobert Mustacchi { 626*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 627*d14abf15SRobert Mustacchi int rc; 628*d14abf15SRobert Mustacchi 629*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 630*d14abf15SRobert Mustacchi 631*d14abf15SRobert Mustacchi if (!pUM->plumbed) 632*d14abf15SRobert Mustacchi { 633*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 634*d14abf15SRobert Mustacchi return EAGAIN; 635*d14abf15SRobert Mustacchi } 636*d14abf15SRobert Mustacchi 637*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM); 638*d14abf15SRobert Mustacchi rc = BnxeMulticast(pUM, LM_CLI_IDX_NDIS, flag, pMcastAddr, B_TRUE); 639*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 640*d14abf15SRobert Mustacchi 641*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 642*d14abf15SRobert Mustacchi 643*d14abf15SRobert Mustacchi return rc; 644*d14abf15SRobert Mustacchi } 645*d14abf15SRobert Mustacchi 646*d14abf15SRobert Mustacchi 647*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS 648*d14abf15SRobert Mustacchi 649*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 650*d14abf15SRobert Mustacchi static int BnxeRxRingGroupAddMac(void * groupHandle, 651*d14abf15SRobert Mustacchi const uint8_t * pMacAddr, 652*d14abf15SRobert Mustacchi uint64_t flags) 653*d14abf15SRobert Mustacchi #else 654*d14abf15SRobert Mustacchi static int BnxeRxRingGroupAddMac(void * groupHandle, 655*d14abf15SRobert Mustacchi const uint8_t * pMacAddr) 656*d14abf15SRobert Mustacchi #endif 657*d14abf15SRobert Mustacchi { 658*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle; 659*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM; 660*d14abf15SRobert Mustacchi //u32_t idx = pRxQGroup->idx; 661*d14abf15SRobert Mustacchi int rc; 662*d14abf15SRobert Mustacchi 663*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 664*d14abf15SRobert Mustacchi _NOTE(ARGUNUSED(flags)) 665*d14abf15SRobert Mustacchi #endif 666*d14abf15SRobert Mustacchi 667*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 668*d14abf15SRobert Mustacchi 669*d14abf15SRobert Mustacchi if (!pUM->plumbed) 670*d14abf15SRobert Mustacchi { 671*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 672*d14abf15SRobert Mustacchi return ECANCELED; 673*d14abf15SRobert Mustacchi } 674*d14abf15SRobert Mustacchi 675*d14abf15SRobert Mustacchi /* Validate MAC address */ 676*d14abf15SRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr)) 677*d14abf15SRobert Mustacchi { 678*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address."); 679*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 680*d14abf15SRobert Mustacchi return EINVAL; 681*d14abf15SRobert Mustacchi } 682*d14abf15SRobert Mustacchi 683*d14abf15SRobert Mustacchi if (pUM->ucastTableLen == LM_MAX_UC_TABLE_SIZE) 684*d14abf15SRobert Mustacchi { 685*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 686*d14abf15SRobert Mustacchi return ENOMEM; 687*d14abf15SRobert Mustacchi } 688*d14abf15SRobert Mustacchi 689*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM); 690*d14abf15SRobert Mustacchi 691*d14abf15SRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr); 692*d14abf15SRobert Mustacchi 693*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE, 694*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr); 695*d14abf15SRobert Mustacchi 696*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 697*d14abf15SRobert Mustacchi 698*d14abf15SRobert Mustacchi if (rc < 0) 699*d14abf15SRobert Mustacchi { 700*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 701*d14abf15SRobert Mustacchi return ECANCELED; 702*d14abf15SRobert Mustacchi } 703*d14abf15SRobert Mustacchi 704*d14abf15SRobert Mustacchi pUM->ucastTableLen++; 705*d14abf15SRobert Mustacchi 706*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 707*d14abf15SRobert Mustacchi return 0; 708*d14abf15SRobert Mustacchi } 709*d14abf15SRobert Mustacchi 710*d14abf15SRobert Mustacchi 711*d14abf15SRobert Mustacchi static int BnxeRxRingGroupRemMac(void * groupHandle, 712*d14abf15SRobert Mustacchi const uint8_t * pMacAddr) 713*d14abf15SRobert Mustacchi { 714*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle; 715*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM; 716*d14abf15SRobert Mustacchi //u32_t idx = pRxQGroup->idx; 717*d14abf15SRobert Mustacchi int rc; 718*d14abf15SRobert Mustacchi 719*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 720*d14abf15SRobert Mustacchi 721*d14abf15SRobert Mustacchi if (!pUM->plumbed) 722*d14abf15SRobert Mustacchi { 723*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 724*d14abf15SRobert Mustacchi return ECANCELED; 725*d14abf15SRobert Mustacchi } 726*d14abf15SRobert Mustacchi 727*d14abf15SRobert Mustacchi if (pUM->ucastTableLen == 0) 728*d14abf15SRobert Mustacchi { 729*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 730*d14abf15SRobert Mustacchi return EINVAL; 731*d14abf15SRobert Mustacchi } 732*d14abf15SRobert Mustacchi 733*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM); 734*d14abf15SRobert Mustacchi 735*d14abf15SRobert Mustacchi if (!IS_ETH_ADDRESS_EQUAL(pMacAddr, pUM->lm_dev.params.mac_addr)) 736*d14abf15SRobert Mustacchi { 737*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Deleting MAC address that doesn't match default"); 738*d14abf15SRobert Mustacchi /* XXX */ 739*d14abf15SRobert Mustacchi } 740*d14abf15SRobert Mustacchi 741*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_FALSE, 742*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr); 743*d14abf15SRobert Mustacchi 744*d14abf15SRobert Mustacchi memset(pUM->lm_dev.params.mac_addr, 0, sizeof(pUM->lm_dev.params.mac_addr)); 745*d14abf15SRobert Mustacchi 746*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 747*d14abf15SRobert Mustacchi 748*d14abf15SRobert Mustacchi if (rc < 0) 749*d14abf15SRobert Mustacchi { 750*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 751*d14abf15SRobert Mustacchi return ECANCELED; 752*d14abf15SRobert Mustacchi } 753*d14abf15SRobert Mustacchi 754*d14abf15SRobert Mustacchi pUM->ucastTableLen--; 755*d14abf15SRobert Mustacchi 756*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 757*d14abf15SRobert Mustacchi return 0; 758*d14abf15SRobert Mustacchi } 759*d14abf15SRobert Mustacchi 760*d14abf15SRobert Mustacchi 761*d14abf15SRobert Mustacchi static mblk_t * BnxeTxRingSend(void * ringHandle, 762*d14abf15SRobert Mustacchi mblk_t * pMblk) 763*d14abf15SRobert Mustacchi { 764*d14abf15SRobert Mustacchi TxQueue * pTxQ = (TxQueue *)ringHandle; 765*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pTxQ->pUM; 766*d14abf15SRobert Mustacchi u32_t idx = pTxQ->idx; 767*d14abf15SRobert Mustacchi mblk_t * pNextMblk; 768*d14abf15SRobert Mustacchi int rc; 769*d14abf15SRobert Mustacchi 770*d14abf15SRobert Mustacchi while (pMblk) 771*d14abf15SRobert Mustacchi { 772*d14abf15SRobert Mustacchi pNextMblk = pMblk->b_next; 773*d14abf15SRobert Mustacchi pMblk->b_next = NULL; 774*d14abf15SRobert Mustacchi 775*d14abf15SRobert Mustacchi rc = BnxeTxSendMblk(pUM, idx, pMblk, 0, 0); 776*d14abf15SRobert Mustacchi 777*d14abf15SRobert Mustacchi if (rc == BNXE_TX_GOODXMIT) 778*d14abf15SRobert Mustacchi { 779*d14abf15SRobert Mustacchi pMblk = pNextMblk; 780*d14abf15SRobert Mustacchi continue; 781*d14abf15SRobert Mustacchi } 782*d14abf15SRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT) 783*d14abf15SRobert Mustacchi { 784*d14abf15SRobert Mustacchi pMblk = pNextMblk; 785*d14abf15SRobert Mustacchi } 786*d14abf15SRobert Mustacchi else 787*d14abf15SRobert Mustacchi { 788*d14abf15SRobert Mustacchi pMblk->b_next = pNextMblk; 789*d14abf15SRobert Mustacchi } 790*d14abf15SRobert Mustacchi 791*d14abf15SRobert Mustacchi break; 792*d14abf15SRobert Mustacchi } 793*d14abf15SRobert Mustacchi 794*d14abf15SRobert Mustacchi return pMblk; 795*d14abf15SRobert Mustacchi } 796*d14abf15SRobert Mustacchi 797*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */ 798*d14abf15SRobert Mustacchi 799*d14abf15SRobert Mustacchi 800*d14abf15SRobert Mustacchi static int BnxeMacUnicast(void * pArg, 801*d14abf15SRobert Mustacchi const uint8_t * pMacAddr) 802*d14abf15SRobert Mustacchi { 803*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 804*d14abf15SRobert Mustacchi int rc; 805*d14abf15SRobert Mustacchi 806*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 807*d14abf15SRobert Mustacchi 808*d14abf15SRobert Mustacchi if (!pUM->plumbed) 809*d14abf15SRobert Mustacchi { 810*d14abf15SRobert Mustacchi memcpy(pUM->gldMac, pMacAddr, ETHERNET_ADDRESS_SIZE); 811*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 812*d14abf15SRobert Mustacchi return 0; 813*d14abf15SRobert Mustacchi } 814*d14abf15SRobert Mustacchi 815*d14abf15SRobert Mustacchi /* Validate MAC address */ 816*d14abf15SRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr)) 817*d14abf15SRobert Mustacchi { 818*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address."); 819*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 820*d14abf15SRobert Mustacchi return EINVAL; 821*d14abf15SRobert Mustacchi } 822*d14abf15SRobert Mustacchi 823*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM); 824*d14abf15SRobert Mustacchi 825*d14abf15SRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr); 826*d14abf15SRobert Mustacchi 827*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE, 828*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr); 829*d14abf15SRobert Mustacchi 830*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM); 831*d14abf15SRobert Mustacchi 832*d14abf15SRobert Mustacchi if (rc < 0) 833*d14abf15SRobert Mustacchi { 834*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 835*d14abf15SRobert Mustacchi return EAGAIN; 836*d14abf15SRobert Mustacchi } 837*d14abf15SRobert Mustacchi 838*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 839*d14abf15SRobert Mustacchi return 0; 840*d14abf15SRobert Mustacchi } 841*d14abf15SRobert Mustacchi 842*d14abf15SRobert Mustacchi 843*d14abf15SRobert Mustacchi static mblk_t * BnxeMacTx(void * pArg, 844*d14abf15SRobert Mustacchi mblk_t * pMblk) 845*d14abf15SRobert Mustacchi { 846*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 847*d14abf15SRobert Mustacchi mblk_t * pNextMblk; 848*d14abf15SRobert Mustacchi int ring, rc; 849*d14abf15SRobert Mustacchi 850*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLDTX(pUM, RW_READER); 851*d14abf15SRobert Mustacchi 852*d14abf15SRobert Mustacchi if (!pUM->plumbed) 853*d14abf15SRobert Mustacchi { 854*d14abf15SRobert Mustacchi freemsgchain(pMblk); 855*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM); 856*d14abf15SRobert Mustacchi 857*d14abf15SRobert Mustacchi return NULL; 858*d14abf15SRobert Mustacchi } 859*d14abf15SRobert Mustacchi 860*d14abf15SRobert Mustacchi while (pMblk) 861*d14abf15SRobert Mustacchi { 862*d14abf15SRobert Mustacchi ring = BnxeRouteTxRing(pUM, pMblk); 863*d14abf15SRobert Mustacchi 864*d14abf15SRobert Mustacchi pNextMblk = pMblk->b_next; 865*d14abf15SRobert Mustacchi pMblk->b_next = NULL; 866*d14abf15SRobert Mustacchi 867*d14abf15SRobert Mustacchi //rc = BnxeTxSendMblk(pUM, NDIS_CID(&pUM->lm_dev), pMblk, 0, 0); 868*d14abf15SRobert Mustacchi rc = BnxeTxSendMblk(pUM, ring, pMblk, 0, 0); 869*d14abf15SRobert Mustacchi 870*d14abf15SRobert Mustacchi if (rc == BNXE_TX_GOODXMIT) 871*d14abf15SRobert Mustacchi { 872*d14abf15SRobert Mustacchi pMblk = pNextMblk; 873*d14abf15SRobert Mustacchi continue; 874*d14abf15SRobert Mustacchi } 875*d14abf15SRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT) 876*d14abf15SRobert Mustacchi { 877*d14abf15SRobert Mustacchi pMblk = pNextMblk; 878*d14abf15SRobert Mustacchi } 879*d14abf15SRobert Mustacchi else 880*d14abf15SRobert Mustacchi { 881*d14abf15SRobert Mustacchi pMblk->b_next = pNextMblk; 882*d14abf15SRobert Mustacchi } 883*d14abf15SRobert Mustacchi 884*d14abf15SRobert Mustacchi break; 885*d14abf15SRobert Mustacchi } 886*d14abf15SRobert Mustacchi 887*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM); 888*d14abf15SRobert Mustacchi 889*d14abf15SRobert Mustacchi return pMblk; 890*d14abf15SRobert Mustacchi } 891*d14abf15SRobert Mustacchi 892*d14abf15SRobert Mustacchi 893*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES 894*d14abf15SRobert Mustacchi 895*d14abf15SRobert Mustacchi static void BnxeBlank(void * pArg, 896*d14abf15SRobert Mustacchi time_t tick_cnt, 897*d14abf15SRobert Mustacchi uint_t pkt_cnt) 898*d14abf15SRobert Mustacchi { 899*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 900*d14abf15SRobert Mustacchi 901*d14abf15SRobert Mustacchi if (!pUM->plumbed) 902*d14abf15SRobert Mustacchi { 903*d14abf15SRobert Mustacchi return; 904*d14abf15SRobert Mustacchi } 905*d14abf15SRobert Mustacchi 906*d14abf15SRobert Mustacchi /* XXX 907*d14abf15SRobert Mustacchi * Need to dynamically reconfigure the hw with new interrupt 908*d14abf15SRobert Mustacchi * coalescing params... 909*d14abf15SRobert Mustacchi */ 910*d14abf15SRobert Mustacchi } 911*d14abf15SRobert Mustacchi 912*d14abf15SRobert Mustacchi 913*d14abf15SRobert Mustacchi static void BnxeMacResources(void * pArg) 914*d14abf15SRobert Mustacchi { 915*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 916*d14abf15SRobert Mustacchi mac_rx_fifo_t mrf; 917*d14abf15SRobert Mustacchi int idx; 918*d14abf15SRobert Mustacchi 919*d14abf15SRobert Mustacchi mrf.mrf_type = MAC_RX_FIFO; 920*d14abf15SRobert Mustacchi mrf.mrf_blank = BnxeBlank; 921*d14abf15SRobert Mustacchi mrf.mrf_arg = (void *)pUM; 922*d14abf15SRobert Mustacchi mrf.mrf_normal_blank_time = 25; 923*d14abf15SRobert Mustacchi mrf.mrf_normal_pkt_count = 8; 924*d14abf15SRobert Mustacchi 925*d14abf15SRobert Mustacchi LM_FOREACH_RSS_IDX(&pUM->lm_dev, idx) 926*d14abf15SRobert Mustacchi { 927*d14abf15SRobert Mustacchi pUM->macRxResourceHandles[idx] = 928*d14abf15SRobert Mustacchi mac_resource_add(pUM->pMac, (mac_resource_t *)&mrf); 929*d14abf15SRobert Mustacchi } 930*d14abf15SRobert Mustacchi } 931*d14abf15SRobert Mustacchi 932*d14abf15SRobert Mustacchi #endif /* MC_RESOURCES */ 933*d14abf15SRobert Mustacchi 934*d14abf15SRobert Mustacchi 935*d14abf15SRobert Mustacchi static boolean_t BnxeReadReg(um_device_t * pUM, 936*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData) 937*d14abf15SRobert Mustacchi { 938*d14abf15SRobert Mustacchi if (pData->offset & 0x3) 939*d14abf15SRobert Mustacchi { 940*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXEREG ioctl"); 941*d14abf15SRobert Mustacchi return B_FALSE; 942*d14abf15SRobert Mustacchi } 943*d14abf15SRobert Mustacchi 944*d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(&pUM->lm_dev, 0, pData->offset, &pData->value); 945*d14abf15SRobert Mustacchi 946*d14abf15SRobert Mustacchi return B_TRUE; 947*d14abf15SRobert Mustacchi } 948*d14abf15SRobert Mustacchi 949*d14abf15SRobert Mustacchi 950*d14abf15SRobert Mustacchi static boolean_t BnxeWriteReg(um_device_t * pUM, 951*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData) 952*d14abf15SRobert Mustacchi { 953*d14abf15SRobert Mustacchi if (pData->offset & 0x3) 954*d14abf15SRobert Mustacchi { 955*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXEREG ioctl"); 956*d14abf15SRobert Mustacchi return B_FALSE; 957*d14abf15SRobert Mustacchi } 958*d14abf15SRobert Mustacchi 959*d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(&pUM->lm_dev, 0, pData->offset, pData->value); 960*d14abf15SRobert Mustacchi 961*d14abf15SRobert Mustacchi return B_TRUE; 962*d14abf15SRobert Mustacchi } 963*d14abf15SRobert Mustacchi 964*d14abf15SRobert Mustacchi 965*d14abf15SRobert Mustacchi static boolean_t BnxeReadNvm(um_device_t * pUM, 966*d14abf15SRobert Mustacchi struct bnxe_nvram_data * pData) 967*d14abf15SRobert Mustacchi { 968*d14abf15SRobert Mustacchi if (pData->offset & 0x3) 969*d14abf15SRobert Mustacchi { 970*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXENVRM ioctl"); 971*d14abf15SRobert Mustacchi return B_FALSE; 972*d14abf15SRobert Mustacchi } 973*d14abf15SRobert Mustacchi 974*d14abf15SRobert Mustacchi if (lm_nvram_read(&pUM->lm_dev, 975*d14abf15SRobert Mustacchi pData->offset, 976*d14abf15SRobert Mustacchi pData->value, 977*d14abf15SRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) != 978*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS) 979*d14abf15SRobert Mustacchi { 980*d14abf15SRobert Mustacchi return B_FALSE; 981*d14abf15SRobert Mustacchi } 982*d14abf15SRobert Mustacchi 983*d14abf15SRobert Mustacchi return B_TRUE; 984*d14abf15SRobert Mustacchi } 985*d14abf15SRobert Mustacchi 986*d14abf15SRobert Mustacchi 987*d14abf15SRobert Mustacchi static boolean_t BnxeWriteNvm(um_device_t * pUM, 988*d14abf15SRobert Mustacchi struct bnxe_nvram_data * pData) 989*d14abf15SRobert Mustacchi { 990*d14abf15SRobert Mustacchi if (pData->offset & 0x3) 991*d14abf15SRobert Mustacchi { 992*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXENVRM ioctl"); 993*d14abf15SRobert Mustacchi return B_FALSE; 994*d14abf15SRobert Mustacchi } 995*d14abf15SRobert Mustacchi 996*d14abf15SRobert Mustacchi if (lm_nvram_write(&pUM->lm_dev, 997*d14abf15SRobert Mustacchi pData->offset, 998*d14abf15SRobert Mustacchi pData->value, 999*d14abf15SRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) != 1000*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS) 1001*d14abf15SRobert Mustacchi { 1002*d14abf15SRobert Mustacchi return B_FALSE; 1003*d14abf15SRobert Mustacchi } 1004*d14abf15SRobert Mustacchi 1005*d14abf15SRobert Mustacchi return B_TRUE; 1006*d14abf15SRobert Mustacchi } 1007*d14abf15SRobert Mustacchi 1008*d14abf15SRobert Mustacchi 1009*d14abf15SRobert Mustacchi static boolean_t BnxeReadPciCfg(um_device_t * pUM, 1010*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData) 1011*d14abf15SRobert Mustacchi { 1012*d14abf15SRobert Mustacchi pData->value = pci_config_get32(pUM->pPciCfg, (off_t)pData->offset); 1013*d14abf15SRobert Mustacchi return B_TRUE; 1014*d14abf15SRobert Mustacchi } 1015*d14abf15SRobert Mustacchi 1016*d14abf15SRobert Mustacchi typedef enum { 1017*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_NUM, 1018*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_STR, 1019*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_CNT, 1020*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_MAX 1021*d14abf15SRobert Mustacchi } stats_show_type_t; 1022*d14abf15SRobert Mustacchi 1023*d14abf15SRobert Mustacchi typedef union _b10_stats_show_data_t 1024*d14abf15SRobert Mustacchi { 1025*d14abf15SRobert Mustacchi u32_t op; /* ioctl sub-commond */ 1026*d14abf15SRobert Mustacchi 1027*d14abf15SRobert Mustacchi struct 1028*d14abf15SRobert Mustacchi { 1029*d14abf15SRobert Mustacchi u32_t num; /* return number of stats */ 1030*d14abf15SRobert Mustacchi u32_t len; /* length of each string item */ 1031*d14abf15SRobert Mustacchi } desc; 1032*d14abf15SRobert Mustacchi 1033*d14abf15SRobert Mustacchi /* variable length... */ 1034*d14abf15SRobert Mustacchi char str[1]; /* holds names of desc.num stats, each desc.len in length */ 1035*d14abf15SRobert Mustacchi 1036*d14abf15SRobert Mustacchi struct 1037*d14abf15SRobert Mustacchi { 1038*d14abf15SRobert Mustacchi b10_l2_chip_statistics_v2_t l2_chip_stats; 1039*d14abf15SRobert Mustacchi b10_l4_chip_statistics_t l4_chip_stats; 1040*d14abf15SRobert Mustacchi b10_l2_driver_statistics_t l2_drv_stats; 1041*d14abf15SRobert Mustacchi b10_l4_driver_statistics_t l4_drv_stats; 1042*d14abf15SRobert Mustacchi } cnt; 1043*d14abf15SRobert Mustacchi } b10_stats_show_data_t; 1044*d14abf15SRobert Mustacchi 1045*d14abf15SRobert Mustacchi 1046*d14abf15SRobert Mustacchi static boolean_t BnxeStatsShow(um_device_t * pUM, 1047*d14abf15SRobert Mustacchi b10_stats_show_data_t * pStats, 1048*d14abf15SRobert Mustacchi u32_t statsLen) 1049*d14abf15SRobert Mustacchi { 1050*d14abf15SRobert Mustacchi stats_show_type_t op; 1051*d14abf15SRobert Mustacchi const size_t stats_size = sizeof(pStats->cnt); 1052*d14abf15SRobert Mustacchi 1053*d14abf15SRobert Mustacchi /* 1054*d14abf15SRobert Mustacchi * All stats names MUST conform to STATS_STR_LEN length!!! 1055*d14abf15SRobert Mustacchi */ 1056*d14abf15SRobert Mustacchi 1057*d14abf15SRobert Mustacchi #define STATS_STR_LEN 39 1058*d14abf15SRobert Mustacchi 1059*d14abf15SRobert Mustacchi /* XXX 1060*d14abf15SRobert Mustacchi * Note: these strings must be updated whenever any of 1061*d14abf15SRobert Mustacchi * b10_l2_chip_statistics_t, b10_l4_chip_statistics_t, 1062*d14abf15SRobert Mustacchi * b10_l2_driver_statistics_t or b10_l4_driver_statistics_t 1063*d14abf15SRobert Mustacchi * are changed, or additional statistics are required. 1064*d14abf15SRobert Mustacchi */ 1065*d14abf15SRobert Mustacchi 1066*d14abf15SRobert Mustacchi const char p_stat_str[] = 1067*d14abf15SRobert Mustacchi 1068*d14abf15SRobert Mustacchi // b10_l2_chip_statistics_t 1069*d14abf15SRobert Mustacchi 1070*d14abf15SRobert Mustacchi "l2_chip_stats_ver_num\0 " 1071*d14abf15SRobert Mustacchi "IfHCInOctets\0 " 1072*d14abf15SRobert Mustacchi "IfHCInBadOctets\0 " 1073*d14abf15SRobert Mustacchi "IfHCOutOctets\0 " 1074*d14abf15SRobert Mustacchi "IfHCOutBadOctets\0 " 1075*d14abf15SRobert Mustacchi "IfHCOutPkts\0 " 1076*d14abf15SRobert Mustacchi "IfHCInPkts\0 " 1077*d14abf15SRobert Mustacchi "IfHCInUcastPkts\0 " 1078*d14abf15SRobert Mustacchi "IfHCInMulticastPkts\0 " 1079*d14abf15SRobert Mustacchi "IfHCInBroadcastPkts\0 " 1080*d14abf15SRobert Mustacchi "IfHCOutUcastPkts\0 " 1081*d14abf15SRobert Mustacchi "IfHCOutMulticastPkts\0 " 1082*d14abf15SRobert Mustacchi "IfHCOutBroadcastPkts\0 " 1083*d14abf15SRobert Mustacchi "IfHCInUcastOctets\0 " 1084*d14abf15SRobert Mustacchi "IfHCInMulticastOctets\0 " 1085*d14abf15SRobert Mustacchi "IfHCInBroadcastOctets\0 " 1086*d14abf15SRobert Mustacchi "IfHCOutUcastOctets\0 " 1087*d14abf15SRobert Mustacchi "IfHCOutMulticastOctets\0 " 1088*d14abf15SRobert Mustacchi "IfHCOutBroadcastOctets\0 " 1089*d14abf15SRobert Mustacchi "IfHCOutDiscards\0 " 1090*d14abf15SRobert Mustacchi "IfHCInFalseCarrierErrors\0 " 1091*d14abf15SRobert Mustacchi "Dot3StatsInternalMacTransmitErrors\0 " 1092*d14abf15SRobert Mustacchi "Dot3StatsCarrierSenseErrors\0 " 1093*d14abf15SRobert Mustacchi "Dot3StatsFCSErrors\0 " 1094*d14abf15SRobert Mustacchi "Dot3StatsAlignmentErrors\0 " 1095*d14abf15SRobert Mustacchi "Dot3StatsSingleCollisionFrames\0 " 1096*d14abf15SRobert Mustacchi "Dot3StatsMultipleCollisionFrames\0 " 1097*d14abf15SRobert Mustacchi "Dot3StatsDeferredTransmissions\0 " 1098*d14abf15SRobert Mustacchi "Dot3StatsExcessiveCollisions\0 " 1099*d14abf15SRobert Mustacchi "Dot3StatsLateCollisions\0 " 1100*d14abf15SRobert Mustacchi "EtherStatsCollisions\0 " 1101*d14abf15SRobert Mustacchi "EtherStatsFragments\0 " 1102*d14abf15SRobert Mustacchi "EtherStatsJabbers\0 " 1103*d14abf15SRobert Mustacchi "EtherStatsUndersizePkts\0 " 1104*d14abf15SRobert Mustacchi "EtherStatsOverrsizePkts\0 " 1105*d14abf15SRobert Mustacchi "EtherStatsPktsTx64Octets\0 " 1106*d14abf15SRobert Mustacchi "EtherStatsPktsTx65Octetsto127Octets\0 " 1107*d14abf15SRobert Mustacchi "EtherStatsPktsTx128Octetsto255Octets\0 " 1108*d14abf15SRobert Mustacchi "EtherStatsPktsTx256Octetsto511Octets\0 " 1109*d14abf15SRobert Mustacchi "EtherStatsPktsTx512Octetsto1023Octets\0 " 1110*d14abf15SRobert Mustacchi "EtherStatsPktsTx1024Octetsto1522Octets\0" 1111*d14abf15SRobert Mustacchi "EtherStatsPktsTxOver1522Octets\0 " 1112*d14abf15SRobert Mustacchi "XonPauseFramesReceived\0 " 1113*d14abf15SRobert Mustacchi "XoffPauseFramesReceived\0 " 1114*d14abf15SRobert Mustacchi "OutXonSent\0 " 1115*d14abf15SRobert Mustacchi "OutXoffSent\0 " 1116*d14abf15SRobert Mustacchi "FlowControlDone\0 " 1117*d14abf15SRobert Mustacchi "MacControlFramesReceived\0 " 1118*d14abf15SRobert Mustacchi "XoffStateEntered\0 " 1119*d14abf15SRobert Mustacchi "IfInFramesL2FilterDiscards\0 " 1120*d14abf15SRobert Mustacchi "IfInTTL0Discards\0 " 1121*d14abf15SRobert Mustacchi "IfInxxOverflowDiscards\0 " 1122*d14abf15SRobert Mustacchi "IfInMBUFDiscards\0 " 1123*d14abf15SRobert Mustacchi "IfInErrors\0 " 1124*d14abf15SRobert Mustacchi "IfInErrorsOctets\0 " 1125*d14abf15SRobert Mustacchi "IfInNoBrbBuffer\0 " 1126*d14abf15SRobert Mustacchi 1127*d14abf15SRobert Mustacchi "Nig_brb_packet\0 " 1128*d14abf15SRobert Mustacchi "Nig_brb_truncate\0 " 1129*d14abf15SRobert Mustacchi "Nig_flow_ctrl_discard\0 " 1130*d14abf15SRobert Mustacchi "Nig_flow_ctrl_octets\0 " 1131*d14abf15SRobert Mustacchi "Nig_flow_ctrl_packet\0 " 1132*d14abf15SRobert Mustacchi "Nig_mng_discard\0 " 1133*d14abf15SRobert Mustacchi "Nig_mng_octet_inp\0 " 1134*d14abf15SRobert Mustacchi "Nig_mng_octet_out\0 " 1135*d14abf15SRobert Mustacchi "Nig_mng_packet_inp\0 " 1136*d14abf15SRobert Mustacchi "Nig_mng_packet_out\0 " 1137*d14abf15SRobert Mustacchi "Nig_pbf_octets\0 " 1138*d14abf15SRobert Mustacchi "Nig_pbf_packet\0 " 1139*d14abf15SRobert Mustacchi "Nig_safc_inp\0 " 1140*d14abf15SRobert Mustacchi 1141*d14abf15SRobert Mustacchi "Tx_Lpi_Count\0 " // This counter counts the number of timers the debounced version of EEE link idle is asserted 1142*d14abf15SRobert Mustacchi 1143*d14abf15SRobert Mustacchi // b10_l4_chip_statistics_t 1144*d14abf15SRobert Mustacchi 1145*d14abf15SRobert Mustacchi "l4_chip_stats_ver_num\0 " 1146*d14abf15SRobert Mustacchi "NoTxCqes\0 " 1147*d14abf15SRobert Mustacchi "InTCP4Segments\0 " 1148*d14abf15SRobert Mustacchi "OutTCP4Segments\0 " 1149*d14abf15SRobert Mustacchi "RetransmittedTCP4Segments\0 " 1150*d14abf15SRobert Mustacchi "InTCP4Errors\0 " 1151*d14abf15SRobert Mustacchi "InIP4Receives\0 " 1152*d14abf15SRobert Mustacchi "InIP4HeaderErrors\0 " 1153*d14abf15SRobert Mustacchi "InIP4Discards\0 " 1154*d14abf15SRobert Mustacchi "InIP4Delivers\0 " 1155*d14abf15SRobert Mustacchi "InIP4Octets\0 " 1156*d14abf15SRobert Mustacchi "OutIP4Octets\0 " 1157*d14abf15SRobert Mustacchi "InIP4TruncatedPackets\0 " 1158*d14abf15SRobert Mustacchi "InTCP6Segments\0 " 1159*d14abf15SRobert Mustacchi "OutTCP6Segments\0 " 1160*d14abf15SRobert Mustacchi "RetransmittedTCP6Segments\0 " 1161*d14abf15SRobert Mustacchi "InTCP6Errors\0 " 1162*d14abf15SRobert Mustacchi "InIP6Receives\0 " 1163*d14abf15SRobert Mustacchi "InIP6HeaderErrors\0 " 1164*d14abf15SRobert Mustacchi "InIP6Discards\0 " 1165*d14abf15SRobert Mustacchi "InIP6Delivers\0 " 1166*d14abf15SRobert Mustacchi "InIP6Octets\0 " 1167*d14abf15SRobert Mustacchi "OutIP6Octets\0 " 1168*d14abf15SRobert Mustacchi "InIP6TruncatedPackets\0 " 1169*d14abf15SRobert Mustacchi 1170*d14abf15SRobert Mustacchi // b10_l2_driver_statistics_t 1171*d14abf15SRobert Mustacchi 1172*d14abf15SRobert Mustacchi "l2_driver_stats_ver_num\0 " 1173*d14abf15SRobert Mustacchi "RxIPv4FragCount\0 " 1174*d14abf15SRobert Mustacchi "RxIpCsErrorCount\0 " 1175*d14abf15SRobert Mustacchi "RxTcpCsErrorCount\0 " 1176*d14abf15SRobert Mustacchi "RxLlcSnapCount\0 " 1177*d14abf15SRobert Mustacchi "RxPhyErrorCount\0 " 1178*d14abf15SRobert Mustacchi "RxIpv6ExtCount\0 " 1179*d14abf15SRobert Mustacchi "TxNoL2Bd\0 " 1180*d14abf15SRobert Mustacchi "TxNoSqWqe\0 " 1181*d14abf15SRobert Mustacchi "TxL2AssemblyBufUse\0 " 1182*d14abf15SRobert Mustacchi 1183*d14abf15SRobert Mustacchi // b10_l4_driver_statistics_t 1184*d14abf15SRobert Mustacchi 1185*d14abf15SRobert Mustacchi "l4_driver_stats_ver_num\0 " 1186*d14abf15SRobert Mustacchi "CurrentlyIpv4Established\0 " 1187*d14abf15SRobert Mustacchi "OutIpv4Resets\0 " 1188*d14abf15SRobert Mustacchi "OutIpv4Fin\0 " 1189*d14abf15SRobert Mustacchi "InIpv4Reset\0 " 1190*d14abf15SRobert Mustacchi "InIpv4Fin\0 " 1191*d14abf15SRobert Mustacchi "CurrentlyIpv6Established\0 " 1192*d14abf15SRobert Mustacchi "OutIpv6Resets\0 " 1193*d14abf15SRobert Mustacchi "OutIpv6Fin\0 " 1194*d14abf15SRobert Mustacchi "InIpv6Reset\0 " 1195*d14abf15SRobert Mustacchi "InIpv6Fin\0 " 1196*d14abf15SRobert Mustacchi "RxIndicateReturnPendingCnt\0 " 1197*d14abf15SRobert Mustacchi "RxIndicateReturnDoneCnt\0 " 1198*d14abf15SRobert Mustacchi "RxActiveGenBufCnt\0 " 1199*d14abf15SRobert Mustacchi "TxNoL4Bd\0 " 1200*d14abf15SRobert Mustacchi "TxL4AssemblyBufUse\0 " 1201*d14abf15SRobert Mustacchi 1202*d14abf15SRobert Mustacchi ; 1203*d14abf15SRobert Mustacchi 1204*d14abf15SRobert Mustacchi ASSERT_STATIC((sizeof(p_stat_str) / STATS_STR_LEN) == 1205*d14abf15SRobert Mustacchi (stats_size / sizeof(u64_t))); 1206*d14abf15SRobert Mustacchi 1207*d14abf15SRobert Mustacchi op = *((stats_show_type_t *)pStats); 1208*d14abf15SRobert Mustacchi 1209*d14abf15SRobert Mustacchi switch (op) 1210*d14abf15SRobert Mustacchi { 1211*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_NUM: 1212*d14abf15SRobert Mustacchi 1213*d14abf15SRobert Mustacchi if (statsLen < sizeof(pStats->desc)) 1214*d14abf15SRobert Mustacchi { 1215*d14abf15SRobert Mustacchi return B_FALSE; 1216*d14abf15SRobert Mustacchi } 1217*d14abf15SRobert Mustacchi 1218*d14abf15SRobert Mustacchi pStats->desc.num = (stats_size / sizeof(u64_t)); 1219*d14abf15SRobert Mustacchi pStats->desc.len = STATS_STR_LEN; 1220*d14abf15SRobert Mustacchi 1221*d14abf15SRobert Mustacchi return B_TRUE; 1222*d14abf15SRobert Mustacchi 1223*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_STR: 1224*d14abf15SRobert Mustacchi 1225*d14abf15SRobert Mustacchi if (statsLen != sizeof(p_stat_str)) 1226*d14abf15SRobert Mustacchi { 1227*d14abf15SRobert Mustacchi return B_FALSE; 1228*d14abf15SRobert Mustacchi } 1229*d14abf15SRobert Mustacchi 1230*d14abf15SRobert Mustacchi memcpy(pStats->str, p_stat_str, sizeof(p_stat_str)); 1231*d14abf15SRobert Mustacchi 1232*d14abf15SRobert Mustacchi return B_TRUE; 1233*d14abf15SRobert Mustacchi 1234*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_CNT: 1235*d14abf15SRobert Mustacchi 1236*d14abf15SRobert Mustacchi if (statsLen != stats_size) 1237*d14abf15SRobert Mustacchi { 1238*d14abf15SRobert Mustacchi return B_FALSE; 1239*d14abf15SRobert Mustacchi } 1240*d14abf15SRobert Mustacchi 1241*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(&pUM->lm_dev, 1242*d14abf15SRobert Mustacchi &pStats->cnt.l2_chip_stats, 1243*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_2); 1244*d14abf15SRobert Mustacchi 1245*d14abf15SRobert Mustacchi lm_stats_get_l4_chip_stats(&pUM->lm_dev, 1246*d14abf15SRobert Mustacchi &pStats->cnt.l4_chip_stats); 1247*d14abf15SRobert Mustacchi 1248*d14abf15SRobert Mustacchi lm_stats_get_l2_driver_stats(&pUM->lm_dev 1249*d14abf15SRobert Mustacchi ,&pStats->cnt.l2_drv_stats); 1250*d14abf15SRobert Mustacchi 1251*d14abf15SRobert Mustacchi lm_stats_get_l4_driver_stats(&pUM->lm_dev, 1252*d14abf15SRobert Mustacchi &pStats->cnt.l4_drv_stats); 1253*d14abf15SRobert Mustacchi 1254*d14abf15SRobert Mustacchi return B_TRUE; 1255*d14abf15SRobert Mustacchi 1256*d14abf15SRobert Mustacchi default: 1257*d14abf15SRobert Mustacchi 1258*d14abf15SRobert Mustacchi return B_FALSE; 1259*d14abf15SRobert Mustacchi } 1260*d14abf15SRobert Mustacchi } 1261*d14abf15SRobert Mustacchi 1262*d14abf15SRobert Mustacchi static void BnxeMacIoctl(void * pArg, 1263*d14abf15SRobert Mustacchi queue_t * pQ, 1264*d14abf15SRobert Mustacchi mblk_t * pMblk) 1265*d14abf15SRobert Mustacchi { 1266*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 1267*d14abf15SRobert Mustacchi struct iocblk * pIoctl; 1268*d14abf15SRobert Mustacchi int rc; 1269*d14abf15SRobert Mustacchi 1270*d14abf15SRobert Mustacchi if ((pQ == NULL) || (pMblk == NULL)) 1271*d14abf15SRobert Mustacchi { 1272*d14abf15SRobert Mustacchi return; 1273*d14abf15SRobert Mustacchi } 1274*d14abf15SRobert Mustacchi 1275*d14abf15SRobert Mustacchi if (pMblk->b_datap->db_type != M_IOCTL) 1276*d14abf15SRobert Mustacchi { 1277*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1278*d14abf15SRobert Mustacchi return; 1279*d14abf15SRobert Mustacchi } 1280*d14abf15SRobert Mustacchi 1281*d14abf15SRobert Mustacchi pIoctl = (struct iocblk *)pMblk->b_rptr; 1282*d14abf15SRobert Mustacchi 1283*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 1284*d14abf15SRobert Mustacchi 1285*d14abf15SRobert Mustacchi switch (pIoctl->ioc_cmd) 1286*d14abf15SRobert Mustacchi { 1287*d14abf15SRobert Mustacchi case GIOCBNXELLDP: 1288*d14abf15SRobert Mustacchi 1289*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_lldp_params_get_t)) || 1290*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1291*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(b10_lldp_params_get_t)) < 0)) 1292*d14abf15SRobert Mustacchi { 1293*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1294*d14abf15SRobert Mustacchi break; 1295*d14abf15SRobert Mustacchi } 1296*d14abf15SRobert Mustacchi 1297*d14abf15SRobert Mustacchi if (((b10_lldp_params_get_t *)pMblk->b_cont->b_rptr)->ver_num != 1298*d14abf15SRobert Mustacchi LLDP_PARAMS_VER_NUM) 1299*d14abf15SRobert Mustacchi { 1300*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1301*d14abf15SRobert Mustacchi break; 1302*d14abf15SRobert Mustacchi } 1303*d14abf15SRobert Mustacchi 1304*d14abf15SRobert Mustacchi if (lm_dcbx_lldp_read_params(&pUM->lm_dev, 1305*d14abf15SRobert Mustacchi (b10_lldp_params_get_t *)pMblk->b_cont->b_rptr) != 1306*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS) 1307*d14abf15SRobert Mustacchi { 1308*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, 1309*d14abf15SRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL); 1310*d14abf15SRobert Mustacchi break; 1311*d14abf15SRobert Mustacchi } 1312*d14abf15SRobert Mustacchi 1313*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1314*d14abf15SRobert Mustacchi break; 1315*d14abf15SRobert Mustacchi 1316*d14abf15SRobert Mustacchi case GIOCBNXEDCBX: 1317*d14abf15SRobert Mustacchi 1318*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_dcbx_params_get_t)) || 1319*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1320*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(b10_dcbx_params_get_t)) < 0)) 1321*d14abf15SRobert Mustacchi { 1322*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1323*d14abf15SRobert Mustacchi break; 1324*d14abf15SRobert Mustacchi } 1325*d14abf15SRobert Mustacchi 1326*d14abf15SRobert Mustacchi if (((b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr)->ver_num != 1327*d14abf15SRobert Mustacchi DCBX_PARAMS_VER_NUM) 1328*d14abf15SRobert Mustacchi { 1329*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1330*d14abf15SRobert Mustacchi break; 1331*d14abf15SRobert Mustacchi } 1332*d14abf15SRobert Mustacchi 1333*d14abf15SRobert Mustacchi if (lm_dcbx_read_params(&pUM->lm_dev, 1334*d14abf15SRobert Mustacchi (b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr) != 1335*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS) 1336*d14abf15SRobert Mustacchi { 1337*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, 1338*d14abf15SRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL); 1339*d14abf15SRobert Mustacchi break; 1340*d14abf15SRobert Mustacchi } 1341*d14abf15SRobert Mustacchi 1342*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1343*d14abf15SRobert Mustacchi break; 1344*d14abf15SRobert Mustacchi 1345*d14abf15SRobert Mustacchi case SIOCBNXEDCBX: 1346*d14abf15SRobert Mustacchi 1347*d14abf15SRobert Mustacchi /* XXX */ 1348*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1349*d14abf15SRobert Mustacchi break; 1350*d14abf15SRobert Mustacchi 1351*d14abf15SRobert Mustacchi case GIOCBNXEREG: 1352*d14abf15SRobert Mustacchi 1353*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) || 1354*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1355*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0)) 1356*d14abf15SRobert Mustacchi { 1357*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1358*d14abf15SRobert Mustacchi break; 1359*d14abf15SRobert Mustacchi } 1360*d14abf15SRobert Mustacchi 1361*d14abf15SRobert Mustacchi if (!BnxeReadReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr)) 1362*d14abf15SRobert Mustacchi { 1363*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1364*d14abf15SRobert Mustacchi } 1365*d14abf15SRobert Mustacchi else 1366*d14abf15SRobert Mustacchi { 1367*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1368*d14abf15SRobert Mustacchi } 1369*d14abf15SRobert Mustacchi 1370*d14abf15SRobert Mustacchi break; 1371*d14abf15SRobert Mustacchi 1372*d14abf15SRobert Mustacchi case SIOCBNXEREG: 1373*d14abf15SRobert Mustacchi 1374*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) || 1375*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1376*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0)) 1377*d14abf15SRobert Mustacchi { 1378*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1379*d14abf15SRobert Mustacchi break; 1380*d14abf15SRobert Mustacchi } 1381*d14abf15SRobert Mustacchi 1382*d14abf15SRobert Mustacchi if (!BnxeWriteReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr)) 1383*d14abf15SRobert Mustacchi { 1384*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1385*d14abf15SRobert Mustacchi } 1386*d14abf15SRobert Mustacchi else 1387*d14abf15SRobert Mustacchi { 1388*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1389*d14abf15SRobert Mustacchi } 1390*d14abf15SRobert Mustacchi 1391*d14abf15SRobert Mustacchi break; 1392*d14abf15SRobert Mustacchi 1393*d14abf15SRobert Mustacchi case GIOCBNXENVRM: 1394*d14abf15SRobert Mustacchi 1395*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) || 1396*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1397*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0)) 1398*d14abf15SRobert Mustacchi { 1399*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1400*d14abf15SRobert Mustacchi break; 1401*d14abf15SRobert Mustacchi } 1402*d14abf15SRobert Mustacchi 1403*d14abf15SRobert Mustacchi if (!BnxeReadNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr)) 1404*d14abf15SRobert Mustacchi { 1405*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1406*d14abf15SRobert Mustacchi } 1407*d14abf15SRobert Mustacchi else 1408*d14abf15SRobert Mustacchi { 1409*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1410*d14abf15SRobert Mustacchi } 1411*d14abf15SRobert Mustacchi 1412*d14abf15SRobert Mustacchi break; 1413*d14abf15SRobert Mustacchi 1414*d14abf15SRobert Mustacchi case SIOCBNXENVRM: 1415*d14abf15SRobert Mustacchi 1416*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) || 1417*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1418*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0)) 1419*d14abf15SRobert Mustacchi { 1420*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1421*d14abf15SRobert Mustacchi break; 1422*d14abf15SRobert Mustacchi } 1423*d14abf15SRobert Mustacchi 1424*d14abf15SRobert Mustacchi if (!BnxeWriteNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr)) 1425*d14abf15SRobert Mustacchi { 1426*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1427*d14abf15SRobert Mustacchi } 1428*d14abf15SRobert Mustacchi else 1429*d14abf15SRobert Mustacchi { 1430*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1431*d14abf15SRobert Mustacchi } 1432*d14abf15SRobert Mustacchi 1433*d14abf15SRobert Mustacchi break; 1434*d14abf15SRobert Mustacchi 1435*d14abf15SRobert Mustacchi case GIOCBNXEPCI: 1436*d14abf15SRobert Mustacchi 1437*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) || 1438*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1439*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0)) 1440*d14abf15SRobert Mustacchi { 1441*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1442*d14abf15SRobert Mustacchi break; 1443*d14abf15SRobert Mustacchi } 1444*d14abf15SRobert Mustacchi 1445*d14abf15SRobert Mustacchi if (!BnxeReadPciCfg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr)) 1446*d14abf15SRobert Mustacchi { 1447*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1448*d14abf15SRobert Mustacchi } 1449*d14abf15SRobert Mustacchi else 1450*d14abf15SRobert Mustacchi { 1451*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1452*d14abf15SRobert Mustacchi } 1453*d14abf15SRobert Mustacchi 1454*d14abf15SRobert Mustacchi break; 1455*d14abf15SRobert Mustacchi 1456*d14abf15SRobert Mustacchi case GIOCBNXESTATS: 1457*d14abf15SRobert Mustacchi 1458*d14abf15SRobert Mustacchi /* min size = sizeof(op) in b10_stats_show_data_t */ 1459*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(u32_t)) || 1460*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) || 1461*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0)) 1462*d14abf15SRobert Mustacchi { 1463*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1464*d14abf15SRobert Mustacchi break; 1465*d14abf15SRobert Mustacchi } 1466*d14abf15SRobert Mustacchi 1467*d14abf15SRobert Mustacchi if (!BnxeStatsShow(pUM, 1468*d14abf15SRobert Mustacchi (b10_stats_show_data_t *)pMblk->b_cont->b_rptr, 1469*d14abf15SRobert Mustacchi pIoctl->ioc_count)) 1470*d14abf15SRobert Mustacchi { 1471*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1472*d14abf15SRobert Mustacchi } 1473*d14abf15SRobert Mustacchi else 1474*d14abf15SRobert Mustacchi { 1475*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0); 1476*d14abf15SRobert Mustacchi } 1477*d14abf15SRobert Mustacchi 1478*d14abf15SRobert Mustacchi break; 1479*d14abf15SRobert Mustacchi 1480*d14abf15SRobert Mustacchi default: 1481*d14abf15SRobert Mustacchi 1482*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL); 1483*d14abf15SRobert Mustacchi break; 1484*d14abf15SRobert Mustacchi } 1485*d14abf15SRobert Mustacchi 1486*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 1487*d14abf15SRobert Mustacchi } 1488*d14abf15SRobert Mustacchi 1489*d14abf15SRobert Mustacchi 1490*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS 1491*d14abf15SRobert Mustacchi 1492*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1493*d14abf15SRobert Mustacchi static mblk_t * BnxeRxRingPoll(void * ringHandle, 1494*d14abf15SRobert Mustacchi int numBytes, 1495*d14abf15SRobert Mustacchi int numPkts) 1496*d14abf15SRobert Mustacchi #else 1497*d14abf15SRobert Mustacchi static mblk_t * BnxeRxRingPoll(void * ringHandle, 1498*d14abf15SRobert Mustacchi int numBytes) 1499*d14abf15SRobert Mustacchi #endif 1500*d14abf15SRobert Mustacchi { 1501*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle; 1502*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM; 1503*d14abf15SRobert Mustacchi u32_t idx = pRxQ->idx; 1504*d14abf15SRobert Mustacchi mblk_t * pMblk = NULL; 1505*d14abf15SRobert Mustacchi boolean_t pktsRxed = 0; 1506*d14abf15SRobert Mustacchi boolean_t pktsTxed = 0; 1507*d14abf15SRobert Mustacchi 1508*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1509*d14abf15SRobert Mustacchi _NOTE(ARGUNUSED(numPkts)) 1510*d14abf15SRobert Mustacchi #endif 1511*d14abf15SRobert Mustacchi 1512*d14abf15SRobert Mustacchi if (numBytes <= 0) 1513*d14abf15SRobert Mustacchi { 1514*d14abf15SRobert Mustacchi return NULL; 1515*d14abf15SRobert Mustacchi } 1516*d14abf15SRobert Mustacchi 1517*d14abf15SRobert Mustacchi if (pRxQ->inPollMode == B_FALSE) 1518*d14abf15SRobert Mustacchi { 1519*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Polling on ring %d when NOT in poll mode!", idx); 1520*d14abf15SRobert Mustacchi return NULL; 1521*d14abf15SRobert Mustacchi } 1522*d14abf15SRobert Mustacchi 1523*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_INTR(pUM, idx); 1524*d14abf15SRobert Mustacchi 1525*d14abf15SRobert Mustacchi pRxQ->pollCnt++; 1526*d14abf15SRobert Mustacchi 1527*d14abf15SRobert Mustacchi BnxePollRxRing(pUM, idx, &pktsRxed, &pktsTxed); 1528*d14abf15SRobert Mustacchi 1529*d14abf15SRobert Mustacchi if (pktsTxed) BnxeTxRingProcess(pUM, idx); 1530*d14abf15SRobert Mustacchi if (pktsRxed) pMblk = BnxeRxRingProcess(pUM, idx, TRUE, numBytes); 1531*d14abf15SRobert Mustacchi 1532*d14abf15SRobert Mustacchi /* 1533*d14abf15SRobert Mustacchi * This is here for the off chance that all rings are in polling 1534*d14abf15SRobert Mustacchi * mode and the default interrupt hasn't fired recently to handle 1535*d14abf15SRobert Mustacchi * the sq. 1536*d14abf15SRobert Mustacchi */ 1537*d14abf15SRobert Mustacchi lm_sq_post_pending(&pUM->lm_dev); 1538*d14abf15SRobert Mustacchi 1539*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_INTR(pUM, idx); 1540*d14abf15SRobert Mustacchi 1541*d14abf15SRobert Mustacchi return pMblk; 1542*d14abf15SRobert Mustacchi } 1543*d14abf15SRobert Mustacchi 1544*d14abf15SRobert Mustacchi 1545*d14abf15SRobert Mustacchi static int BnxeRxRingStart(mac_ring_driver_t ringHandle 1546*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1547*d14abf15SRobert Mustacchi , uint64_t genNumber 1548*d14abf15SRobert Mustacchi #endif 1549*d14abf15SRobert Mustacchi ) 1550*d14abf15SRobert Mustacchi { 1551*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle; 1552*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM; 1553*d14abf15SRobert Mustacchi u32_t idx = pRxQ->idx; 1554*d14abf15SRobert Mustacchi 1555*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Starting Rx Ring %d", idx); 1556*d14abf15SRobert Mustacchi 1557*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_RX(pUM, idx); 1558*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1559*d14abf15SRobert Mustacchi pRxQ->genNumber = genNumber; 1560*d14abf15SRobert Mustacchi #endif 1561*d14abf15SRobert Mustacchi pRxQ->inPollMode = B_FALSE; 1562*d14abf15SRobert Mustacchi pRxQ->intrDisableCnt = 0; 1563*d14abf15SRobert Mustacchi pRxQ->intrEnableCnt = 0; 1564*d14abf15SRobert Mustacchi pRxQ->pollCnt = 0; 1565*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_RX(pUM, idx); 1566*d14abf15SRobert Mustacchi 1567*d14abf15SRobert Mustacchi return 0; 1568*d14abf15SRobert Mustacchi } 1569*d14abf15SRobert Mustacchi 1570*d14abf15SRobert Mustacchi 1571*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1572*d14abf15SRobert Mustacchi 1573*d14abf15SRobert Mustacchi static int BnxeRingStat(mac_ring_driver_t ringHandle, 1574*d14abf15SRobert Mustacchi uint_t stat, 1575*d14abf15SRobert Mustacchi uint64_t * val) 1576*d14abf15SRobert Mustacchi { 1577*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle; 1578*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM; 1579*d14abf15SRobert Mustacchi 1580*d14abf15SRobert Mustacchi switch (stat) 1581*d14abf15SRobert Mustacchi { 1582*d14abf15SRobert Mustacchi case MAC_STAT_OERRORS: 1583*d14abf15SRobert Mustacchi case MAC_STAT_OBYTES: 1584*d14abf15SRobert Mustacchi case MAC_STAT_OPACKETS: 1585*d14abf15SRobert Mustacchi case MAC_STAT_IERRORS: 1586*d14abf15SRobert Mustacchi case MAC_STAT_RBYTES: /* MAC_STAT_IBYTES */ 1587*d14abf15SRobert Mustacchi case MAC_STAT_IPACKETS: 1588*d14abf15SRobert Mustacchi default: 1589*d14abf15SRobert Mustacchi return ENOTSUP; 1590*d14abf15SRobert Mustacchi } 1591*d14abf15SRobert Mustacchi 1592*d14abf15SRobert Mustacchi return 0; 1593*d14abf15SRobert Mustacchi } 1594*d14abf15SRobert Mustacchi 1595*d14abf15SRobert Mustacchi #endif /* __S11 or __S12 */ 1596*d14abf15SRobert Mustacchi 1597*d14abf15SRobert Mustacchi 1598*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1599*d14abf15SRobert Mustacchi static int BnxeRxRingIntrEnable(mac_ring_driver_t ringHandle) 1600*d14abf15SRobert Mustacchi #else 1601*d14abf15SRobert Mustacchi static int BnxeRxRingIntrEnable(mac_intr_handle_t ringHandle) 1602*d14abf15SRobert Mustacchi #endif 1603*d14abf15SRobert Mustacchi { 1604*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle; 1605*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM; 1606*d14abf15SRobert Mustacchi 1607*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Enabling Interrupt for Rx Ring %d", pRxQ->idx); 1608*d14abf15SRobert Mustacchi 1609*d14abf15SRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */ 1610*d14abf15SRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) && 1611*d14abf15SRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) && 1612*d14abf15SRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev))) 1613*d14abf15SRobert Mustacchi { 1614*d14abf15SRobert Mustacchi return 0; /* ok, already enabled */ 1615*d14abf15SRobert Mustacchi } 1616*d14abf15SRobert Mustacchi 1617*d14abf15SRobert Mustacchi BnxeIntrIguSbEnable(pUM, pRxQ->idx, B_FALSE); 1618*d14abf15SRobert Mustacchi 1619*d14abf15SRobert Mustacchi return 0; 1620*d14abf15SRobert Mustacchi } 1621*d14abf15SRobert Mustacchi 1622*d14abf15SRobert Mustacchi 1623*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1624*d14abf15SRobert Mustacchi static int BnxeRxRingIntrDisable(mac_ring_driver_t ringHandle) 1625*d14abf15SRobert Mustacchi #else 1626*d14abf15SRobert Mustacchi static int BnxeRxRingIntrDisable(mac_intr_handle_t ringHandle) 1627*d14abf15SRobert Mustacchi #endif 1628*d14abf15SRobert Mustacchi { 1629*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle; 1630*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM; 1631*d14abf15SRobert Mustacchi 1632*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Disabling Interrupt for Rx Ring %d", pRxQ->idx); 1633*d14abf15SRobert Mustacchi 1634*d14abf15SRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */ 1635*d14abf15SRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) && 1636*d14abf15SRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) && 1637*d14abf15SRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev))) 1638*d14abf15SRobert Mustacchi { 1639*d14abf15SRobert Mustacchi return -1; /* NO, keep enabled! */ 1640*d14abf15SRobert Mustacchi } 1641*d14abf15SRobert Mustacchi 1642*d14abf15SRobert Mustacchi BnxeIntrIguSbDisable(pUM, pRxQ->idx, B_FALSE); 1643*d14abf15SRobert Mustacchi 1644*d14abf15SRobert Mustacchi return 0; 1645*d14abf15SRobert Mustacchi } 1646*d14abf15SRobert Mustacchi 1647*d14abf15SRobert Mustacchi 1648*d14abf15SRobert Mustacchi /* callback function for MAC layer to register rings */ 1649*d14abf15SRobert Mustacchi static void BnxeFillRing(void * arg, 1650*d14abf15SRobert Mustacchi mac_ring_type_t ringType, 1651*d14abf15SRobert Mustacchi const int ringGroupIndex, 1652*d14abf15SRobert Mustacchi const int ringIndex, 1653*d14abf15SRobert Mustacchi mac_ring_info_t * pRingInfo, 1654*d14abf15SRobert Mustacchi mac_ring_handle_t ringHandle) 1655*d14abf15SRobert Mustacchi { 1656*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)arg; 1657*d14abf15SRobert Mustacchi RxQueue * pRxQ; 1658*d14abf15SRobert Mustacchi TxQueue * pTxQ; 1659*d14abf15SRobert Mustacchi 1660*d14abf15SRobert Mustacchi switch (ringType) 1661*d14abf15SRobert Mustacchi { 1662*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX: 1663*d14abf15SRobert Mustacchi 1664*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Ring %d (Ring Group %d)", 1665*d14abf15SRobert Mustacchi ringIndex, ringGroupIndex); 1666*d14abf15SRobert Mustacchi 1667*d14abf15SRobert Mustacchi ASSERT(ringGroupIndex == 0); 1668*d14abf15SRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings); 1669*d14abf15SRobert Mustacchi 1670*d14abf15SRobert Mustacchi pRxQ = &pUM->rxq[ringIndex]; 1671*d14abf15SRobert Mustacchi pRxQ->ringHandle = ringHandle; 1672*d14abf15SRobert Mustacchi 1673*d14abf15SRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pRxQ; 1674*d14abf15SRobert Mustacchi pRingInfo->mri_start = BnxeRxRingStart; 1675*d14abf15SRobert Mustacchi pRingInfo->mri_stop = NULL; 1676*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1677*d14abf15SRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat; 1678*d14abf15SRobert Mustacchi #endif 1679*d14abf15SRobert Mustacchi pRingInfo->mri_poll = BnxeRxRingPoll; 1680*d14abf15SRobert Mustacchi 1681*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12)) 1682*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_handle = (mac_intr_handle_t)pRxQ; 1683*d14abf15SRobert Mustacchi #endif 1684*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_enable = (mac_intr_enable_t)BnxeRxRingIntrEnable; 1685*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_disable = (mac_intr_disable_t)BnxeRxRingIntrDisable; 1686*d14abf15SRobert Mustacchi 1687*d14abf15SRobert Mustacchi break; 1688*d14abf15SRobert Mustacchi 1689*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX: 1690*d14abf15SRobert Mustacchi 1691*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Tx Ring %d (Ring Group %d)", 1692*d14abf15SRobert Mustacchi ringIndex, ringGroupIndex); 1693*d14abf15SRobert Mustacchi 1694*d14abf15SRobert Mustacchi ASSERT(ringGroupIndex == 0); 1695*d14abf15SRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings); 1696*d14abf15SRobert Mustacchi 1697*d14abf15SRobert Mustacchi pTxQ = &pUM->txq[ringIndex]; 1698*d14abf15SRobert Mustacchi pTxQ->ringHandle = ringHandle; 1699*d14abf15SRobert Mustacchi 1700*d14abf15SRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pTxQ; 1701*d14abf15SRobert Mustacchi pRingInfo->mri_start = NULL; 1702*d14abf15SRobert Mustacchi pRingInfo->mri_stop = NULL; 1703*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12) 1704*d14abf15SRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat; 1705*d14abf15SRobert Mustacchi #endif 1706*d14abf15SRobert Mustacchi pRingInfo->mri_tx = (mac_ring_send_t)BnxeTxRingSend; 1707*d14abf15SRobert Mustacchi 1708*d14abf15SRobert Mustacchi break; 1709*d14abf15SRobert Mustacchi 1710*d14abf15SRobert Mustacchi default: 1711*d14abf15SRobert Mustacchi break; 1712*d14abf15SRobert Mustacchi } 1713*d14abf15SRobert Mustacchi } 1714*d14abf15SRobert Mustacchi 1715*d14abf15SRobert Mustacchi 1716*d14abf15SRobert Mustacchi /* callback function for MAC layer to register groups */ 1717*d14abf15SRobert Mustacchi static void BnxeFillGroup(void * arg, 1718*d14abf15SRobert Mustacchi mac_ring_type_t ringType, 1719*d14abf15SRobert Mustacchi const int ringGroupIndex, 1720*d14abf15SRobert Mustacchi mac_group_info_t * pGroupInfo, 1721*d14abf15SRobert Mustacchi mac_group_handle_t groupHandle) 1722*d14abf15SRobert Mustacchi { 1723*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)arg; 1724*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup; 1725*d14abf15SRobert Mustacchi 1726*d14abf15SRobert Mustacchi switch (ringType) 1727*d14abf15SRobert Mustacchi { 1728*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX: 1729*d14abf15SRobert Mustacchi 1730*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Group %d", ringGroupIndex); 1731*d14abf15SRobert Mustacchi 1732*d14abf15SRobert Mustacchi pRxQGroup = &pUM->rxqGroup[ringGroupIndex]; 1733*d14abf15SRobert Mustacchi pRxQGroup->groupHandle = groupHandle; 1734*d14abf15SRobert Mustacchi 1735*d14abf15SRobert Mustacchi pGroupInfo->mgi_driver = (mac_group_driver_t)pRxQGroup; 1736*d14abf15SRobert Mustacchi pGroupInfo->mgi_start = NULL; 1737*d14abf15SRobert Mustacchi pGroupInfo->mgi_stop = NULL; 1738*d14abf15SRobert Mustacchi pGroupInfo->mgi_addmac = BnxeRxRingGroupAddMac; 1739*d14abf15SRobert Mustacchi pGroupInfo->mgi_remmac = BnxeRxRingGroupRemMac; 1740*d14abf15SRobert Mustacchi pGroupInfo->mgi_count = (pUM->devParams.numRings / 1741*d14abf15SRobert Mustacchi USER_OPTION_RX_RING_GROUPS_DEFAULT); 1742*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1743*d14abf15SRobert Mustacchi pGroupInfo->mgi_flags = MAC_GROUP_DEFAULT; 1744*d14abf15SRobert Mustacchi #endif 1745*d14abf15SRobert Mustacchi 1746*d14abf15SRobert Mustacchi break; 1747*d14abf15SRobert Mustacchi 1748*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX: 1749*d14abf15SRobert Mustacchi default: 1750*d14abf15SRobert Mustacchi break; 1751*d14abf15SRobert Mustacchi } 1752*d14abf15SRobert Mustacchi } 1753*d14abf15SRobert Mustacchi 1754*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */ 1755*d14abf15SRobert Mustacchi 1756*d14abf15SRobert Mustacchi 1757*d14abf15SRobert Mustacchi static boolean_t BnxeMacGetCapability(void * pArg, 1758*d14abf15SRobert Mustacchi mac_capab_t capability, 1759*d14abf15SRobert Mustacchi void * pCapabilityData) 1760*d14abf15SRobert Mustacchi { 1761*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg; 1762*d14abf15SRobert Mustacchi mac_capab_lso_t * pCapLSO; 1763*d14abf15SRobert Mustacchi mac_capab_rings_t * pCapRings; 1764*d14abf15SRobert Mustacchi 1765*d14abf15SRobert Mustacchi switch (capability) 1766*d14abf15SRobert Mustacchi { 1767*d14abf15SRobert Mustacchi case MAC_CAPAB_HCKSUM: 1768*d14abf15SRobert Mustacchi 1769*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) = 0; 1770*d14abf15SRobert Mustacchi 1771*d14abf15SRobert Mustacchi if (pUM->devParams.enabled_oflds & 1772*d14abf15SRobert Mustacchi (LM_OFFLOAD_TX_IP_CKSUM | LM_OFFLOAD_RX_IP_CKSUM)) 1773*d14abf15SRobert Mustacchi { 1774*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_IPHDRCKSUM; 1775*d14abf15SRobert Mustacchi } 1776*d14abf15SRobert Mustacchi 1777*d14abf15SRobert Mustacchi if (pUM->devParams.enabled_oflds & 1778*d14abf15SRobert Mustacchi (LM_OFFLOAD_TX_TCP_CKSUM | LM_OFFLOAD_TX_UDP_CKSUM | 1779*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_TCP_CKSUM | LM_OFFLOAD_RX_UDP_CKSUM)) 1780*d14abf15SRobert Mustacchi { 1781*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_INET_PARTIAL; 1782*d14abf15SRobert Mustacchi } 1783*d14abf15SRobert Mustacchi 1784*d14abf15SRobert Mustacchi break; 1785*d14abf15SRobert Mustacchi 1786*d14abf15SRobert Mustacchi case MAC_CAPAB_LSO: 1787*d14abf15SRobert Mustacchi 1788*d14abf15SRobert Mustacchi pCapLSO = (mac_capab_lso_t *)pCapabilityData; 1789*d14abf15SRobert Mustacchi 1790*d14abf15SRobert Mustacchi if (pUM->devParams.lsoEnable) 1791*d14abf15SRobert Mustacchi { 1792*d14abf15SRobert Mustacchi pCapLSO->lso_flags = LSO_TX_BASIC_TCP_IPV4; 1793*d14abf15SRobert Mustacchi pCapLSO->lso_basic_tcp_ipv4.lso_max = BNXE_LSO_MAXLEN; 1794*d14abf15SRobert Mustacchi break; 1795*d14abf15SRobert Mustacchi } 1796*d14abf15SRobert Mustacchi 1797*d14abf15SRobert Mustacchi return B_FALSE; 1798*d14abf15SRobert Mustacchi 1799*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS 1800*d14abf15SRobert Mustacchi 1801*d14abf15SRobert Mustacchi case MAC_CAPAB_RINGS: 1802*d14abf15SRobert Mustacchi 1803*d14abf15SRobert Mustacchi if (!pUM->devParams.numRings) 1804*d14abf15SRobert Mustacchi { 1805*d14abf15SRobert Mustacchi return B_FALSE; 1806*d14abf15SRobert Mustacchi } 1807*d14abf15SRobert Mustacchi 1808*d14abf15SRobert Mustacchi pCapRings = (mac_capab_rings_t *)pCapabilityData; 1809*d14abf15SRobert Mustacchi 1810*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1811*d14abf15SRobert Mustacchi pCapRings->mr_version = MAC_RINGS_VERSION_1; 1812*d14abf15SRobert Mustacchi pCapRings->mr_flags = MAC_RINGS_FLAGS_NONE; 1813*d14abf15SRobert Mustacchi #endif 1814*d14abf15SRobert Mustacchi pCapRings->mr_group_type = MAC_GROUP_TYPE_STATIC; 1815*d14abf15SRobert Mustacchi pCapRings->mr_rnum = pUM->devParams.numRings; 1816*d14abf15SRobert Mustacchi pCapRings->mr_rget = BnxeFillRing; 1817*d14abf15SRobert Mustacchi pCapRings->mr_gaddring = NULL; 1818*d14abf15SRobert Mustacchi pCapRings->mr_gremring = NULL; 1819*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1820*d14abf15SRobert Mustacchi pCapRings->mr_ggetringtc = NULL; 1821*d14abf15SRobert Mustacchi #endif 1822*d14abf15SRobert Mustacchi 1823*d14abf15SRobert Mustacchi switch (pCapRings->mr_type) 1824*d14abf15SRobert Mustacchi { 1825*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX: 1826*d14abf15SRobert Mustacchi 1827*d14abf15SRobert Mustacchi pCapRings->mr_gnum = USER_OPTION_RX_RING_GROUPS_DEFAULT; 1828*d14abf15SRobert Mustacchi pCapRings->mr_gget = BnxeFillGroup; 1829*d14abf15SRobert Mustacchi break; 1830*d14abf15SRobert Mustacchi 1831*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX: 1832*d14abf15SRobert Mustacchi 1833*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 1834*d14abf15SRobert Mustacchi pCapRings->mr_gnum = 1; 1835*d14abf15SRobert Mustacchi #else 1836*d14abf15SRobert Mustacchi pCapRings->mr_gnum = 0; 1837*d14abf15SRobert Mustacchi #endif 1838*d14abf15SRobert Mustacchi pCapRings->mr_gget = NULL; 1839*d14abf15SRobert Mustacchi break; 1840*d14abf15SRobert Mustacchi 1841*d14abf15SRobert Mustacchi default: 1842*d14abf15SRobert Mustacchi 1843*d14abf15SRobert Mustacchi return B_FALSE; 1844*d14abf15SRobert Mustacchi } 1845*d14abf15SRobert Mustacchi 1846*d14abf15SRobert Mustacchi break; 1847*d14abf15SRobert Mustacchi 1848*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */ 1849*d14abf15SRobert Mustacchi 1850*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12)) 1851*d14abf15SRobert Mustacchi 1852*d14abf15SRobert Mustacchi case MAC_CAPAB_POLL: 1853*d14abf15SRobert Mustacchi 1854*d14abf15SRobert Mustacchi /* 1855*d14abf15SRobert Mustacchi * There's nothing for us to fill in, simply returning B_TRUE stating 1856*d14abf15SRobert Mustacchi * that we support polling is sufficient. 1857*d14abf15SRobert Mustacchi */ 1858*d14abf15SRobert Mustacchi break; 1859*d14abf15SRobert Mustacchi 1860*d14abf15SRobert Mustacchi #endif /* not __S11 or __S12 */ 1861*d14abf15SRobert Mustacchi 1862*d14abf15SRobert Mustacchi default: 1863*d14abf15SRobert Mustacchi 1864*d14abf15SRobert Mustacchi return B_FALSE; 1865*d14abf15SRobert Mustacchi } 1866*d14abf15SRobert Mustacchi 1867*d14abf15SRobert Mustacchi return B_TRUE; 1868*d14abf15SRobert Mustacchi } 1869*d14abf15SRobert Mustacchi 1870*d14abf15SRobert Mustacchi 1871*d14abf15SRobert Mustacchi #ifdef MC_SETPROP 1872*d14abf15SRobert Mustacchi 1873*d14abf15SRobert Mustacchi static int BnxeSetPrivateProperty(um_device_t * pUM, 1874*d14abf15SRobert Mustacchi const char * pr_name, 1875*d14abf15SRobert Mustacchi uint_t pr_valsize, 1876*d14abf15SRobert Mustacchi const void * pr_val) 1877*d14abf15SRobert Mustacchi { 1878*d14abf15SRobert Mustacchi int err = 0; 1879*d14abf15SRobert Mustacchi long result; 1880*d14abf15SRobert Mustacchi 1881*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_en_2500fdx_cap") == 0) 1882*d14abf15SRobert Mustacchi { 1883*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1884*d14abf15SRobert Mustacchi { 1885*d14abf15SRobert Mustacchi return EINVAL; 1886*d14abf15SRobert Mustacchi } 1887*d14abf15SRobert Mustacchi 1888*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 1889*d14abf15SRobert Mustacchi { 1890*d14abf15SRobert Mustacchi return EINVAL; 1891*d14abf15SRobert Mustacchi } 1892*d14abf15SRobert Mustacchi 1893*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_2500fdx = (uint32_t)result; 1894*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_2500fdx = (uint32_t)result; 1895*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 1896*d14abf15SRobert Mustacchi } 1897*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0) 1898*d14abf15SRobert Mustacchi { 1899*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1900*d14abf15SRobert Mustacchi { 1901*d14abf15SRobert Mustacchi return EINVAL; 1902*d14abf15SRobert Mustacchi } 1903*d14abf15SRobert Mustacchi 1904*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 1905*d14abf15SRobert Mustacchi { 1906*d14abf15SRobert Mustacchi return EINVAL; 1907*d14abf15SRobert Mustacchi } 1908*d14abf15SRobert Mustacchi 1909*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = (uint32_t)result; 1910*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = (uint32_t)result; 1911*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 1912*d14abf15SRobert Mustacchi } 1913*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0) 1914*d14abf15SRobert Mustacchi { 1915*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1916*d14abf15SRobert Mustacchi { 1917*d14abf15SRobert Mustacchi return EINVAL; 1918*d14abf15SRobert Mustacchi } 1919*d14abf15SRobert Mustacchi 1920*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 1921*d14abf15SRobert Mustacchi { 1922*d14abf15SRobert Mustacchi return EINVAL; 1923*d14abf15SRobert Mustacchi } 1924*d14abf15SRobert Mustacchi 1925*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = (uint32_t)result; 1926*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = (uint32_t)result; 1927*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 1928*d14abf15SRobert Mustacchi } 1929*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0) 1930*d14abf15SRobert Mustacchi { 1931*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1932*d14abf15SRobert Mustacchi { 1933*d14abf15SRobert Mustacchi return EINVAL; 1934*d14abf15SRobert Mustacchi } 1935*d14abf15SRobert Mustacchi 1936*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 1937*d14abf15SRobert Mustacchi { 1938*d14abf15SRobert Mustacchi return EINVAL; 1939*d14abf15SRobert Mustacchi } 1940*d14abf15SRobert Mustacchi 1941*d14abf15SRobert Mustacchi pUM->hwinit.flow_autoneg = (uint32_t)result; 1942*d14abf15SRobert Mustacchi pUM->curcfg.flow_autoneg = (uint32_t)result; 1943*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 1944*d14abf15SRobert Mustacchi } 1945*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0) 1946*d14abf15SRobert Mustacchi { 1947*d14abf15SRobert Mustacchi if (pUM->plumbed) 1948*d14abf15SRobert Mustacchi { 1949*d14abf15SRobert Mustacchi return EBUSY; 1950*d14abf15SRobert Mustacchi } 1951*d14abf15SRobert Mustacchi 1952*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1953*d14abf15SRobert Mustacchi { 1954*d14abf15SRobert Mustacchi return EINVAL; 1955*d14abf15SRobert Mustacchi } 1956*d14abf15SRobert Mustacchi 1957*d14abf15SRobert Mustacchi switch (result) 1958*d14abf15SRobert Mustacchi { 1959*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_NONE: 1960*d14abf15SRobert Mustacchi 1961*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = LM_OFFLOAD_NONE; 1962*d14abf15SRobert Mustacchi break; 1963*d14abf15SRobert Mustacchi 1964*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_L3: 1965*d14abf15SRobert Mustacchi 1966*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = (LM_OFFLOAD_TX_IP_CKSUM | 1967*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_IP_CKSUM); 1968*d14abf15SRobert Mustacchi break; 1969*d14abf15SRobert Mustacchi 1970*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_L3_L4: 1971*d14abf15SRobert Mustacchi 1972*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = (LM_OFFLOAD_TX_IP_CKSUM | 1973*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_IP_CKSUM | 1974*d14abf15SRobert Mustacchi LM_OFFLOAD_TX_TCP_CKSUM | 1975*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_TCP_CKSUM | 1976*d14abf15SRobert Mustacchi LM_OFFLOAD_TX_UDP_CKSUM | 1977*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_UDP_CKSUM); 1978*d14abf15SRobert Mustacchi break; 1979*d14abf15SRobert Mustacchi 1980*d14abf15SRobert Mustacchi default: 1981*d14abf15SRobert Mustacchi 1982*d14abf15SRobert Mustacchi return EINVAL; 1983*d14abf15SRobert Mustacchi } 1984*d14abf15SRobert Mustacchi 1985*d14abf15SRobert Mustacchi pUM->devParams.checksum = (uint32_t)result; 1986*d14abf15SRobert Mustacchi } 1987*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0) 1988*d14abf15SRobert Mustacchi { 1989*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 1990*d14abf15SRobert Mustacchi { 1991*d14abf15SRobert Mustacchi return EINVAL; 1992*d14abf15SRobert Mustacchi } 1993*d14abf15SRobert Mustacchi 1994*d14abf15SRobert Mustacchi switch (result) 1995*d14abf15SRobert Mustacchi { 1996*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_NONE: 1997*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_TCPUDP: 1998*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_DEST_MAC: 1999*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_MSG_PRIO: 2000*d14abf15SRobert Mustacchi 2001*d14abf15SRobert Mustacchi break; 2002*d14abf15SRobert Mustacchi 2003*d14abf15SRobert Mustacchi default: 2004*d14abf15SRobert Mustacchi 2005*d14abf15SRobert Mustacchi return EINVAL; 2006*d14abf15SRobert Mustacchi } 2007*d14abf15SRobert Mustacchi 2008*d14abf15SRobert Mustacchi pUM->devParams.routeTxRingPolicy = (uint32_t)result; 2009*d14abf15SRobert Mustacchi } 2010*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0) 2011*d14abf15SRobert Mustacchi { 2012*d14abf15SRobert Mustacchi if (pUM->plumbed) 2013*d14abf15SRobert Mustacchi { 2014*d14abf15SRobert Mustacchi return EBUSY; 2015*d14abf15SRobert Mustacchi } 2016*d14abf15SRobert Mustacchi 2017*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2018*d14abf15SRobert Mustacchi { 2019*d14abf15SRobert Mustacchi return EINVAL; 2020*d14abf15SRobert Mustacchi } 2021*d14abf15SRobert Mustacchi 2022*d14abf15SRobert Mustacchi if ((result < USER_OPTION_NUM_RINGS_MIN) || 2023*d14abf15SRobert Mustacchi (result > USER_OPTION_NUM_RINGS_MAX)) 2024*d14abf15SRobert Mustacchi { 2025*d14abf15SRobert Mustacchi return EINVAL; 2026*d14abf15SRobert Mustacchi } 2027*d14abf15SRobert Mustacchi 2028*d14abf15SRobert Mustacchi pUM->devParams.numRings = (uint32_t)result; 2029*d14abf15SRobert Mustacchi } 2030*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0) 2031*d14abf15SRobert Mustacchi { 2032*d14abf15SRobert Mustacchi if (pUM->plumbed) 2033*d14abf15SRobert Mustacchi { 2034*d14abf15SRobert Mustacchi return EBUSY; 2035*d14abf15SRobert Mustacchi } 2036*d14abf15SRobert Mustacchi 2037*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2038*d14abf15SRobert Mustacchi { 2039*d14abf15SRobert Mustacchi return EINVAL; 2040*d14abf15SRobert Mustacchi } 2041*d14abf15SRobert Mustacchi 2042*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX)) 2043*d14abf15SRobert Mustacchi { 2044*d14abf15SRobert Mustacchi return EINVAL; 2045*d14abf15SRobert Mustacchi } 2046*d14abf15SRobert Mustacchi 2047*d14abf15SRobert Mustacchi pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result; 2048*d14abf15SRobert Mustacchi } 2049*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0) 2050*d14abf15SRobert Mustacchi { 2051*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2052*d14abf15SRobert Mustacchi { 2053*d14abf15SRobert Mustacchi return EINVAL; 2054*d14abf15SRobert Mustacchi } 2055*d14abf15SRobert Mustacchi 2056*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX)) 2057*d14abf15SRobert Mustacchi { 2058*d14abf15SRobert Mustacchi return EINVAL; 2059*d14abf15SRobert Mustacchi } 2060*d14abf15SRobert Mustacchi 2061*d14abf15SRobert Mustacchi pUM->devParams.maxRxFree = (uint32_t)result; 2062*d14abf15SRobert Mustacchi } 2063*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0) 2064*d14abf15SRobert Mustacchi { 2065*d14abf15SRobert Mustacchi if (pUM->plumbed) 2066*d14abf15SRobert Mustacchi { 2067*d14abf15SRobert Mustacchi return EBUSY; 2068*d14abf15SRobert Mustacchi } 2069*d14abf15SRobert Mustacchi 2070*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2071*d14abf15SRobert Mustacchi { 2072*d14abf15SRobert Mustacchi return EINVAL; 2073*d14abf15SRobert Mustacchi } 2074*d14abf15SRobert Mustacchi 2075*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX)) 2076*d14abf15SRobert Mustacchi { 2077*d14abf15SRobert Mustacchi return EINVAL; 2078*d14abf15SRobert Mustacchi } 2079*d14abf15SRobert Mustacchi 2080*d14abf15SRobert Mustacchi pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result; 2081*d14abf15SRobert Mustacchi } 2082*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0) 2083*d14abf15SRobert Mustacchi { 2084*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2085*d14abf15SRobert Mustacchi { 2086*d14abf15SRobert Mustacchi return EINVAL; 2087*d14abf15SRobert Mustacchi } 2088*d14abf15SRobert Mustacchi 2089*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX)) 2090*d14abf15SRobert Mustacchi { 2091*d14abf15SRobert Mustacchi return EINVAL; 2092*d14abf15SRobert Mustacchi } 2093*d14abf15SRobert Mustacchi 2094*d14abf15SRobert Mustacchi pUM->devParams.maxTxFree = (uint32_t)result; 2095*d14abf15SRobert Mustacchi } 2096*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0) 2097*d14abf15SRobert Mustacchi { 2098*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2099*d14abf15SRobert Mustacchi { 2100*d14abf15SRobert Mustacchi return EINVAL; 2101*d14abf15SRobert Mustacchi } 2102*d14abf15SRobert Mustacchi 2103*d14abf15SRobert Mustacchi pUM->devParams.rxCopyThreshold = (uint32_t)result; 2104*d14abf15SRobert Mustacchi } 2105*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0) 2106*d14abf15SRobert Mustacchi { 2107*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2108*d14abf15SRobert Mustacchi { 2109*d14abf15SRobert Mustacchi return EINVAL; 2110*d14abf15SRobert Mustacchi } 2111*d14abf15SRobert Mustacchi 2112*d14abf15SRobert Mustacchi pUM->devParams.txCopyThreshold = (uint32_t)result; 2113*d14abf15SRobert Mustacchi } 2114*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0) 2115*d14abf15SRobert Mustacchi { 2116*d14abf15SRobert Mustacchi if (pUM->plumbed) 2117*d14abf15SRobert Mustacchi { 2118*d14abf15SRobert Mustacchi return EBUSY; 2119*d14abf15SRobert Mustacchi } 2120*d14abf15SRobert Mustacchi 2121*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2122*d14abf15SRobert Mustacchi { 2123*d14abf15SRobert Mustacchi return EINVAL; 2124*d14abf15SRobert Mustacchi } 2125*d14abf15SRobert Mustacchi 2126*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2127*d14abf15SRobert Mustacchi { 2128*d14abf15SRobert Mustacchi return EINVAL; 2129*d14abf15SRobert Mustacchi } 2130*d14abf15SRobert Mustacchi 2131*d14abf15SRobert Mustacchi pUM->devParams.intrCoalesce = (uint32_t)result; 2132*d14abf15SRobert Mustacchi } 2133*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0) 2134*d14abf15SRobert Mustacchi { 2135*d14abf15SRobert Mustacchi if (pUM->plumbed) 2136*d14abf15SRobert Mustacchi { 2137*d14abf15SRobert Mustacchi return EBUSY; 2138*d14abf15SRobert Mustacchi } 2139*d14abf15SRobert Mustacchi 2140*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2141*d14abf15SRobert Mustacchi { 2142*d14abf15SRobert Mustacchi return EINVAL; 2143*d14abf15SRobert Mustacchi } 2144*d14abf15SRobert Mustacchi 2145*d14abf15SRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) || 2146*d14abf15SRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX)) 2147*d14abf15SRobert Mustacchi { 2148*d14abf15SRobert Mustacchi return EINVAL; 2149*d14abf15SRobert Mustacchi } 2150*d14abf15SRobert Mustacchi 2151*d14abf15SRobert Mustacchi pUM->devParams.intrRxPerSec = (uint32_t)(1000000 / result); 2152*d14abf15SRobert Mustacchi } 2153*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0) 2154*d14abf15SRobert Mustacchi { 2155*d14abf15SRobert Mustacchi if (pUM->plumbed) 2156*d14abf15SRobert Mustacchi { 2157*d14abf15SRobert Mustacchi return EBUSY; 2158*d14abf15SRobert Mustacchi } 2159*d14abf15SRobert Mustacchi 2160*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2161*d14abf15SRobert Mustacchi { 2162*d14abf15SRobert Mustacchi return EINVAL; 2163*d14abf15SRobert Mustacchi } 2164*d14abf15SRobert Mustacchi 2165*d14abf15SRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) || 2166*d14abf15SRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX)) 2167*d14abf15SRobert Mustacchi { 2168*d14abf15SRobert Mustacchi return EINVAL; 2169*d14abf15SRobert Mustacchi } 2170*d14abf15SRobert Mustacchi 2171*d14abf15SRobert Mustacchi pUM->devParams.intrTxPerSec = (uint32_t)(1000000 / result); 2172*d14abf15SRobert Mustacchi } 2173*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0) 2174*d14abf15SRobert Mustacchi { 2175*d14abf15SRobert Mustacchi if (pUM->plumbed) 2176*d14abf15SRobert Mustacchi { 2177*d14abf15SRobert Mustacchi return EBUSY; 2178*d14abf15SRobert Mustacchi } 2179*d14abf15SRobert Mustacchi 2180*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2181*d14abf15SRobert Mustacchi { 2182*d14abf15SRobert Mustacchi return EINVAL; 2183*d14abf15SRobert Mustacchi } 2184*d14abf15SRobert Mustacchi 2185*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2186*d14abf15SRobert Mustacchi { 2187*d14abf15SRobert Mustacchi return EINVAL; 2188*d14abf15SRobert Mustacchi } 2189*d14abf15SRobert Mustacchi 2190*d14abf15SRobert Mustacchi pUM->devParams.disableMsix = (uint32_t)result; 2191*d14abf15SRobert Mustacchi } 2192*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0) 2193*d14abf15SRobert Mustacchi { 2194*d14abf15SRobert Mustacchi if (pUM->plumbed) 2195*d14abf15SRobert Mustacchi { 2196*d14abf15SRobert Mustacchi return EBUSY; 2197*d14abf15SRobert Mustacchi } 2198*d14abf15SRobert Mustacchi 2199*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2200*d14abf15SRobert Mustacchi { 2201*d14abf15SRobert Mustacchi return EINVAL; 2202*d14abf15SRobert Mustacchi } 2203*d14abf15SRobert Mustacchi 2204*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2205*d14abf15SRobert Mustacchi { 2206*d14abf15SRobert Mustacchi return EINVAL; 2207*d14abf15SRobert Mustacchi } 2208*d14abf15SRobert Mustacchi 2209*d14abf15SRobert Mustacchi pUM->devParams.l2_fw_flow_ctrl = (uint32_t)result; 2210*d14abf15SRobert Mustacchi } 2211*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0) 2212*d14abf15SRobert Mustacchi { 2213*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2214*d14abf15SRobert Mustacchi { 2215*d14abf15SRobert Mustacchi return EINVAL; 2216*d14abf15SRobert Mustacchi } 2217*d14abf15SRobert Mustacchi 2218*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2219*d14abf15SRobert Mustacchi { 2220*d14abf15SRobert Mustacchi return EINVAL; 2221*d14abf15SRobert Mustacchi } 2222*d14abf15SRobert Mustacchi 2223*d14abf15SRobert Mustacchi pUM->devParams.autogreeenEnable = (uint32_t)result; 2224*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 2225*d14abf15SRobert Mustacchi } 2226*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0) 2227*d14abf15SRobert Mustacchi { 2228*d14abf15SRobert Mustacchi if (pUM->plumbed) 2229*d14abf15SRobert Mustacchi { 2230*d14abf15SRobert Mustacchi return EBUSY; 2231*d14abf15SRobert Mustacchi } 2232*d14abf15SRobert Mustacchi 2233*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2234*d14abf15SRobert Mustacchi { 2235*d14abf15SRobert Mustacchi return EINVAL; 2236*d14abf15SRobert Mustacchi } 2237*d14abf15SRobert Mustacchi 2238*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2239*d14abf15SRobert Mustacchi { 2240*d14abf15SRobert Mustacchi return EINVAL; 2241*d14abf15SRobert Mustacchi } 2242*d14abf15SRobert Mustacchi 2243*d14abf15SRobert Mustacchi pUM->devParams.lsoEnable = (uint32_t)result; 2244*d14abf15SRobert Mustacchi } 2245*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0) 2246*d14abf15SRobert Mustacchi { 2247*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2248*d14abf15SRobert Mustacchi { 2249*d14abf15SRobert Mustacchi return EINVAL; 2250*d14abf15SRobert Mustacchi } 2251*d14abf15SRobert Mustacchi 2252*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2253*d14abf15SRobert Mustacchi { 2254*d14abf15SRobert Mustacchi return EINVAL; 2255*d14abf15SRobert Mustacchi } 2256*d14abf15SRobert Mustacchi 2257*d14abf15SRobert Mustacchi pUM->devParams.logEnable = (uint32_t)result; 2258*d14abf15SRobert Mustacchi } 2259*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0) 2260*d14abf15SRobert Mustacchi { 2261*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result)) 2262*d14abf15SRobert Mustacchi { 2263*d14abf15SRobert Mustacchi return EINVAL; 2264*d14abf15SRobert Mustacchi } 2265*d14abf15SRobert Mustacchi 2266*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0)) 2267*d14abf15SRobert Mustacchi { 2268*d14abf15SRobert Mustacchi return EINVAL; 2269*d14abf15SRobert Mustacchi } 2270*d14abf15SRobert Mustacchi 2271*d14abf15SRobert Mustacchi pUM->devParams.fcoeEnable = (uint32_t)result; 2272*d14abf15SRobert Mustacchi 2273*d14abf15SRobert Mustacchi if (BNXE_FCOE(pUM)) 2274*d14abf15SRobert Mustacchi { 2275*d14abf15SRobert Mustacchi BnxeFcoeStartStop(pUM); 2276*d14abf15SRobert Mustacchi } 2277*d14abf15SRobert Mustacchi } 2278*d14abf15SRobert Mustacchi else 2279*d14abf15SRobert Mustacchi { 2280*d14abf15SRobert Mustacchi err = ENOTSUP; 2281*d14abf15SRobert Mustacchi } 2282*d14abf15SRobert Mustacchi 2283*d14abf15SRobert Mustacchi return err; 2284*d14abf15SRobert Mustacchi } 2285*d14abf15SRobert Mustacchi 2286*d14abf15SRobert Mustacchi 2287*d14abf15SRobert Mustacchi static int BnxeMacSetProperty(void * barg, 2288*d14abf15SRobert Mustacchi const char * pr_name, 2289*d14abf15SRobert Mustacchi mac_prop_id_t pr_num, 2290*d14abf15SRobert Mustacchi uint_t pr_valsize, 2291*d14abf15SRobert Mustacchi const void * pr_val) 2292*d14abf15SRobert Mustacchi { 2293*d14abf15SRobert Mustacchi um_device_t * pUM = barg; 2294*d14abf15SRobert Mustacchi boolean_t reprogram = B_FALSE; 2295*d14abf15SRobert Mustacchi boolean_t rxpause; 2296*d14abf15SRobert Mustacchi boolean_t txpause; 2297*d14abf15SRobert Mustacchi uint32_t mtu; 2298*d14abf15SRobert Mustacchi link_flowctrl_t fl; 2299*d14abf15SRobert Mustacchi int err = 0; 2300*d14abf15SRobert Mustacchi 2301*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM); 2302*d14abf15SRobert Mustacchi 2303*d14abf15SRobert Mustacchi switch (pr_num) 2304*d14abf15SRobert Mustacchi { 2305*d14abf15SRobert Mustacchi /* read-only props */ 2306*d14abf15SRobert Mustacchi case MAC_PROP_STATUS: 2307*d14abf15SRobert Mustacchi case MAC_PROP_SPEED: 2308*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX: 2309*d14abf15SRobert Mustacchi 2310*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP: 2311*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP: 2312*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP: 2313*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP: 2314*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP: 2315*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP: 2316*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP: 2317*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP: 2318*d14abf15SRobert Mustacchi 2319*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP: 2320*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP: 2321*d14abf15SRobert Mustacchi 2322*d14abf15SRobert Mustacchi default: 2323*d14abf15SRobert Mustacchi 2324*d14abf15SRobert Mustacchi err = ENOTSUP; 2325*d14abf15SRobert Mustacchi break; 2326*d14abf15SRobert Mustacchi 2327*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP: 2328*d14abf15SRobert Mustacchi 2329*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10000fdx = *(uint8_t *)pr_val; 2330*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10000fdx = *(uint8_t *)pr_val; 2331*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2332*d14abf15SRobert Mustacchi break; 2333*d14abf15SRobert Mustacchi 2334*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP: 2335*d14abf15SRobert Mustacchi 2336*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_1000fdx = *(uint8_t *)pr_val; 2337*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_1000fdx = *(uint8_t *)pr_val; 2338*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2339*d14abf15SRobert Mustacchi break; 2340*d14abf15SRobert Mustacchi 2341*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP: 2342*d14abf15SRobert Mustacchi 2343*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_100fdx = *(uint8_t *)pr_val; 2344*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_100fdx = *(uint8_t *)pr_val; 2345*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2346*d14abf15SRobert Mustacchi break; 2347*d14abf15SRobert Mustacchi 2348*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP: 2349*d14abf15SRobert Mustacchi 2350*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_100hdx = *(uint8_t *)pr_val; 2351*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_100hdx = *(uint8_t *)pr_val; 2352*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2353*d14abf15SRobert Mustacchi break; 2354*d14abf15SRobert Mustacchi 2355*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP: 2356*d14abf15SRobert Mustacchi 2357*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10fdx = *(uint8_t *)pr_val; 2358*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10fdx = *(uint8_t *)pr_val; 2359*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2360*d14abf15SRobert Mustacchi break; 2361*d14abf15SRobert Mustacchi 2362*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP: 2363*d14abf15SRobert Mustacchi 2364*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10hdx = *(uint8_t *)pr_val; 2365*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10hdx = *(uint8_t *)pr_val; 2366*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2367*d14abf15SRobert Mustacchi break; 2368*d14abf15SRobert Mustacchi 2369*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG: 2370*d14abf15SRobert Mustacchi 2371*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.link_autoneg = *(uint8_t *)pr_val; 2372*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.link_autoneg = *(uint8_t *)pr_val; 2373*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2374*d14abf15SRobert Mustacchi break; 2375*d14abf15SRobert Mustacchi 2376*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL: 2377*d14abf15SRobert Mustacchi 2378*d14abf15SRobert Mustacchi bcopy(pr_val, &fl, sizeof(fl)); 2379*d14abf15SRobert Mustacchi 2380*d14abf15SRobert Mustacchi switch (fl) 2381*d14abf15SRobert Mustacchi { 2382*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_NONE: 2383*d14abf15SRobert Mustacchi 2384*d14abf15SRobert Mustacchi rxpause = B_FALSE; 2385*d14abf15SRobert Mustacchi txpause = B_FALSE; 2386*d14abf15SRobert Mustacchi break; 2387*d14abf15SRobert Mustacchi 2388*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_RX: 2389*d14abf15SRobert Mustacchi 2390*d14abf15SRobert Mustacchi rxpause = B_TRUE; 2391*d14abf15SRobert Mustacchi txpause = B_FALSE; 2392*d14abf15SRobert Mustacchi break; 2393*d14abf15SRobert Mustacchi 2394*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_TX: 2395*d14abf15SRobert Mustacchi 2396*d14abf15SRobert Mustacchi rxpause = B_FALSE; 2397*d14abf15SRobert Mustacchi txpause = B_TRUE; 2398*d14abf15SRobert Mustacchi break; 2399*d14abf15SRobert Mustacchi 2400*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_BI: 2401*d14abf15SRobert Mustacchi 2402*d14abf15SRobert Mustacchi rxpause = B_TRUE; 2403*d14abf15SRobert Mustacchi txpause = B_TRUE; 2404*d14abf15SRobert Mustacchi break; 2405*d14abf15SRobert Mustacchi 2406*d14abf15SRobert Mustacchi default: 2407*d14abf15SRobert Mustacchi 2408*d14abf15SRobert Mustacchi err = ENOTSUP; 2409*d14abf15SRobert Mustacchi break; 2410*d14abf15SRobert Mustacchi } 2411*d14abf15SRobert Mustacchi 2412*d14abf15SRobert Mustacchi if (err == 0) 2413*d14abf15SRobert Mustacchi { 2414*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = rxpause; 2415*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = txpause; 2416*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = rxpause; 2417*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = txpause; 2418*d14abf15SRobert Mustacchi reprogram = B_TRUE; 2419*d14abf15SRobert Mustacchi } 2420*d14abf15SRobert Mustacchi 2421*d14abf15SRobert Mustacchi break; 2422*d14abf15SRobert Mustacchi 2423*d14abf15SRobert Mustacchi case MAC_PROP_MTU: 2424*d14abf15SRobert Mustacchi 2425*d14abf15SRobert Mustacchi if (pUM->plumbed) 2426*d14abf15SRobert Mustacchi { 2427*d14abf15SRobert Mustacchi err = EBUSY; 2428*d14abf15SRobert Mustacchi break; 2429*d14abf15SRobert Mustacchi } 2430*d14abf15SRobert Mustacchi 2431*d14abf15SRobert Mustacchi bcopy(pr_val, &mtu, sizeof (mtu)); 2432*d14abf15SRobert Mustacchi 2433*d14abf15SRobert Mustacchi if ((mtu < USER_OPTION_MTU_MIN) || (mtu > USER_OPTION_MTU_MAX)) 2434*d14abf15SRobert Mustacchi { 2435*d14abf15SRobert Mustacchi err = EINVAL; 2436*d14abf15SRobert Mustacchi break; 2437*d14abf15SRobert Mustacchi } 2438*d14abf15SRobert Mustacchi 2439*d14abf15SRobert Mustacchi if (pUM->devParams.mtu[LM_CLI_IDX_NDIS] == mtu) 2440*d14abf15SRobert Mustacchi { 2441*d14abf15SRobert Mustacchi break; 2442*d14abf15SRobert Mustacchi } 2443*d14abf15SRobert Mustacchi 2444*d14abf15SRobert Mustacchi pUM->devParams.mtu[LM_CLI_IDX_NDIS] = mtu; 2445*d14abf15SRobert Mustacchi err = mac_maxsdu_update(pUM->pMac, pUM->devParams.mtu[LM_CLI_IDX_NDIS]); 2446*d14abf15SRobert Mustacchi pUM->lm_dev.params.mtu[LM_CLI_IDX_NDIS] = pUM->devParams.mtu[LM_CLI_IDX_NDIS]; 2447*d14abf15SRobert Mustacchi break; 2448*d14abf15SRobert Mustacchi 2449*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE: 2450*d14abf15SRobert Mustacchi 2451*d14abf15SRobert Mustacchi err = BnxeSetPrivateProperty(pUM, pr_name, pr_valsize, pr_val); 2452*d14abf15SRobert Mustacchi break; 2453*d14abf15SRobert Mustacchi } 2454*d14abf15SRobert Mustacchi 2455*d14abf15SRobert Mustacchi if (!err && reprogram) 2456*d14abf15SRobert Mustacchi { 2457*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM); 2458*d14abf15SRobert Mustacchi } 2459*d14abf15SRobert Mustacchi 2460*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM); 2461*d14abf15SRobert Mustacchi return err; 2462*d14abf15SRobert Mustacchi } 2463*d14abf15SRobert Mustacchi 2464*d14abf15SRobert Mustacchi #endif /* MC_SETPROP */ 2465*d14abf15SRobert Mustacchi 2466*d14abf15SRobert Mustacchi 2467*d14abf15SRobert Mustacchi #ifdef MC_GETPROP 2468*d14abf15SRobert Mustacchi 2469*d14abf15SRobert Mustacchi static int BnxeGetPrivateProperty(um_device_t * pUM, 2470*d14abf15SRobert Mustacchi const char * pr_name, 2471*d14abf15SRobert Mustacchi uint_t pr_valsize, 2472*d14abf15SRobert Mustacchi void * pr_val) 2473*d14abf15SRobert Mustacchi { 2474*d14abf15SRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg; 2475*d14abf15SRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg; 2476*d14abf15SRobert Mustacchi int value; 2477*d14abf15SRobert Mustacchi int err = 0; 2478*d14abf15SRobert Mustacchi 2479*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_adv_2500fdx_cap") == 0) 2480*d14abf15SRobert Mustacchi { 2481*d14abf15SRobert Mustacchi value = lnk_cfg->param_2500fdx; 2482*d14abf15SRobert Mustacchi } 2483*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_2500fdx_cap") == 0) 2484*d14abf15SRobert Mustacchi { 2485*d14abf15SRobert Mustacchi value = hw_cfg->param_2500fdx; 2486*d14abf15SRobert Mustacchi } 2487*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_adv_txpause_cap") == 0) 2488*d14abf15SRobert Mustacchi { 2489*d14abf15SRobert Mustacchi value = lnk_cfg->param_txpause; 2490*d14abf15SRobert Mustacchi } 2491*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0) 2492*d14abf15SRobert Mustacchi { 2493*d14abf15SRobert Mustacchi value = hw_cfg->param_txpause; 2494*d14abf15SRobert Mustacchi } 2495*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_txpause") == 0) 2496*d14abf15SRobert Mustacchi { 2497*d14abf15SRobert Mustacchi value = pUM->props.link_txpause; 2498*d14abf15SRobert Mustacchi } 2499*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_adv_rxpause_cap") == 0) 2500*d14abf15SRobert Mustacchi { 2501*d14abf15SRobert Mustacchi value = lnk_cfg->param_rxpause; 2502*d14abf15SRobert Mustacchi } 2503*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0) 2504*d14abf15SRobert Mustacchi { 2505*d14abf15SRobert Mustacchi value = hw_cfg->param_rxpause; 2506*d14abf15SRobert Mustacchi } 2507*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rxpause") == 0) 2508*d14abf15SRobert Mustacchi { 2509*d14abf15SRobert Mustacchi value = pUM->props.link_rxpause; 2510*d14abf15SRobert Mustacchi } 2511*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0) 2512*d14abf15SRobert Mustacchi { 2513*d14abf15SRobert Mustacchi value = pUM->hwinit.flow_autoneg; 2514*d14abf15SRobert Mustacchi } 2515*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0) 2516*d14abf15SRobert Mustacchi { 2517*d14abf15SRobert Mustacchi value = pUM->devParams.checksum; 2518*d14abf15SRobert Mustacchi } 2519*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0) 2520*d14abf15SRobert Mustacchi { 2521*d14abf15SRobert Mustacchi value = pUM->devParams.routeTxRingPolicy; 2522*d14abf15SRobert Mustacchi } 2523*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0) 2524*d14abf15SRobert Mustacchi { 2525*d14abf15SRobert Mustacchi value = pUM->devParams.numRings; 2526*d14abf15SRobert Mustacchi } 2527*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0) 2528*d14abf15SRobert Mustacchi { 2529*d14abf15SRobert Mustacchi value = pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS]; 2530*d14abf15SRobert Mustacchi } 2531*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0) 2532*d14abf15SRobert Mustacchi { 2533*d14abf15SRobert Mustacchi value = pUM->devParams.maxRxFree; 2534*d14abf15SRobert Mustacchi } 2535*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0) 2536*d14abf15SRobert Mustacchi { 2537*d14abf15SRobert Mustacchi value = pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS]; 2538*d14abf15SRobert Mustacchi } 2539*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0) 2540*d14abf15SRobert Mustacchi { 2541*d14abf15SRobert Mustacchi value = pUM->devParams.maxTxFree; 2542*d14abf15SRobert Mustacchi } 2543*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0) 2544*d14abf15SRobert Mustacchi { 2545*d14abf15SRobert Mustacchi value = pUM->devParams.rxCopyThreshold; 2546*d14abf15SRobert Mustacchi } 2547*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0) 2548*d14abf15SRobert Mustacchi { 2549*d14abf15SRobert Mustacchi value = pUM->devParams.txCopyThreshold; 2550*d14abf15SRobert Mustacchi } 2551*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0) 2552*d14abf15SRobert Mustacchi { 2553*d14abf15SRobert Mustacchi value = pUM->devParams.intrCoalesce; 2554*d14abf15SRobert Mustacchi } 2555*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0) 2556*d14abf15SRobert Mustacchi { 2557*d14abf15SRobert Mustacchi value = pUM->devParams.intrRxPerSec; 2558*d14abf15SRobert Mustacchi } 2559*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0) 2560*d14abf15SRobert Mustacchi { 2561*d14abf15SRobert Mustacchi value = pUM->devParams.intrTxPerSec; 2562*d14abf15SRobert Mustacchi } 2563*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0) 2564*d14abf15SRobert Mustacchi { 2565*d14abf15SRobert Mustacchi value = pUM->devParams.disableMsix; 2566*d14abf15SRobert Mustacchi } 2567*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0) 2568*d14abf15SRobert Mustacchi { 2569*d14abf15SRobert Mustacchi value = pUM->devParams.l2_fw_flow_ctrl; 2570*d14abf15SRobert Mustacchi } 2571*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0) 2572*d14abf15SRobert Mustacchi { 2573*d14abf15SRobert Mustacchi value = pUM->devParams.autogreeenEnable; 2574*d14abf15SRobert Mustacchi } 2575*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0) 2576*d14abf15SRobert Mustacchi { 2577*d14abf15SRobert Mustacchi value = pUM->devParams.lsoEnable; 2578*d14abf15SRobert Mustacchi } 2579*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0) 2580*d14abf15SRobert Mustacchi { 2581*d14abf15SRobert Mustacchi value = pUM->devParams.logEnable; 2582*d14abf15SRobert Mustacchi } 2583*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0) 2584*d14abf15SRobert Mustacchi { 2585*d14abf15SRobert Mustacchi value = pUM->devParams.fcoeEnable; 2586*d14abf15SRobert Mustacchi } 2587*d14abf15SRobert Mustacchi else 2588*d14abf15SRobert Mustacchi { 2589*d14abf15SRobert Mustacchi err = ENOTSUP; 2590*d14abf15SRobert Mustacchi } 2591*d14abf15SRobert Mustacchi 2592*d14abf15SRobert Mustacchi if (!err) 2593*d14abf15SRobert Mustacchi { 2594*d14abf15SRobert Mustacchi (void)snprintf(pr_val, pr_valsize, "%d", value); 2595*d14abf15SRobert Mustacchi } 2596*d14abf15SRobert Mustacchi 2597*d14abf15SRobert Mustacchi return err; 2598*d14abf15SRobert Mustacchi } 2599*d14abf15SRobert Mustacchi 2600*d14abf15SRobert Mustacchi 2601*d14abf15SRobert Mustacchi static int BnxeMacGetProperty(void * barg, 2602*d14abf15SRobert Mustacchi const char * pr_name, 2603*d14abf15SRobert Mustacchi mac_prop_id_t pr_num, 2604*d14abf15SRobert Mustacchi uint_t pr_valsize, 2605*d14abf15SRobert Mustacchi void * pr_val) 2606*d14abf15SRobert Mustacchi { 2607*d14abf15SRobert Mustacchi um_device_t * pUM = barg; 2608*d14abf15SRobert Mustacchi link_flowctrl_t link_flowctrl; 2609*d14abf15SRobert Mustacchi link_state_t link_state; 2610*d14abf15SRobert Mustacchi link_duplex_t link_duplex; 2611*d14abf15SRobert Mustacchi uint64_t link_speed; 2612*d14abf15SRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg; 2613*d14abf15SRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg; 2614*d14abf15SRobert Mustacchi 2615*d14abf15SRobert Mustacchi switch (pr_num) 2616*d14abf15SRobert Mustacchi { 2617*d14abf15SRobert Mustacchi case MAC_PROP_MTU: 2618*d14abf15SRobert Mustacchi 2619*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(u32_t)); 2620*d14abf15SRobert Mustacchi 2621*d14abf15SRobert Mustacchi bcopy(&pUM->devParams.mtu[LM_CLI_IDX_NDIS], pr_val, sizeof(u32_t)); 2622*d14abf15SRobert Mustacchi break; 2623*d14abf15SRobert Mustacchi 2624*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX: 2625*d14abf15SRobert Mustacchi 2626*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_duplex_t)); 2627*d14abf15SRobert Mustacchi 2628*d14abf15SRobert Mustacchi link_duplex = pUM->props.link_duplex ? 2629*d14abf15SRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; 2630*d14abf15SRobert Mustacchi bcopy(&link_duplex, pr_val, sizeof(link_duplex_t)); 2631*d14abf15SRobert Mustacchi break; 2632*d14abf15SRobert Mustacchi 2633*d14abf15SRobert Mustacchi case MAC_PROP_SPEED: 2634*d14abf15SRobert Mustacchi 2635*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_speed)); 2636*d14abf15SRobert Mustacchi 2637*d14abf15SRobert Mustacchi link_speed = (pUM->props.link_speed * 1000000ULL); 2638*d14abf15SRobert Mustacchi bcopy(&link_speed, pr_val, sizeof(link_speed)); 2639*d14abf15SRobert Mustacchi break; 2640*d14abf15SRobert Mustacchi 2641*d14abf15SRobert Mustacchi case MAC_PROP_STATUS: 2642*d14abf15SRobert Mustacchi 2643*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_state_t)); 2644*d14abf15SRobert Mustacchi 2645*d14abf15SRobert Mustacchi link_state = pUM->props.link_speed ? 2646*d14abf15SRobert Mustacchi LINK_STATE_UP : LINK_STATE_DOWN; 2647*d14abf15SRobert Mustacchi bcopy(&link_state, pr_val, sizeof(link_state_t)); 2648*d14abf15SRobert Mustacchi break; 2649*d14abf15SRobert Mustacchi 2650*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG: 2651*d14abf15SRobert Mustacchi 2652*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->link_autoneg; 2653*d14abf15SRobert Mustacchi break; 2654*d14abf15SRobert Mustacchi 2655*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL: 2656*d14abf15SRobert Mustacchi 2657*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_flowctrl_t)); 2658*d14abf15SRobert Mustacchi 2659*d14abf15SRobert Mustacchi if (!lnk_cfg->param_rxpause && !lnk_cfg->param_txpause) 2660*d14abf15SRobert Mustacchi { 2661*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE; 2662*d14abf15SRobert Mustacchi } 2663*d14abf15SRobert Mustacchi if (lnk_cfg->param_rxpause && !lnk_cfg->param_txpause) 2664*d14abf15SRobert Mustacchi { 2665*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX; 2666*d14abf15SRobert Mustacchi } 2667*d14abf15SRobert Mustacchi if (!lnk_cfg->param_rxpause && lnk_cfg->param_txpause) 2668*d14abf15SRobert Mustacchi { 2669*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX; 2670*d14abf15SRobert Mustacchi } 2671*d14abf15SRobert Mustacchi if (lnk_cfg->param_rxpause && lnk_cfg->param_txpause) 2672*d14abf15SRobert Mustacchi { 2673*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI; 2674*d14abf15SRobert Mustacchi } 2675*d14abf15SRobert Mustacchi 2676*d14abf15SRobert Mustacchi bcopy(&link_flowctrl, pr_val, sizeof(link_flowctrl_t)); 2677*d14abf15SRobert Mustacchi break; 2678*d14abf15SRobert Mustacchi 2679*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP: 2680*d14abf15SRobert Mustacchi 2681*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10000fdx; 2682*d14abf15SRobert Mustacchi break; 2683*d14abf15SRobert Mustacchi 2684*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP: 2685*d14abf15SRobert Mustacchi 2686*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10000fdx; 2687*d14abf15SRobert Mustacchi break; 2688*d14abf15SRobert Mustacchi 2689*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP: 2690*d14abf15SRobert Mustacchi 2691*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_1000fdx; 2692*d14abf15SRobert Mustacchi break; 2693*d14abf15SRobert Mustacchi 2694*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP: 2695*d14abf15SRobert Mustacchi 2696*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_1000fdx; 2697*d14abf15SRobert Mustacchi break; 2698*d14abf15SRobert Mustacchi 2699*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP: 2700*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP: 2701*d14abf15SRobert Mustacchi 2702*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = 0; 2703*d14abf15SRobert Mustacchi break; 2704*d14abf15SRobert Mustacchi 2705*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP: 2706*d14abf15SRobert Mustacchi 2707*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100fdx; 2708*d14abf15SRobert Mustacchi break; 2709*d14abf15SRobert Mustacchi 2710*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP: 2711*d14abf15SRobert Mustacchi 2712*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100fdx; 2713*d14abf15SRobert Mustacchi break; 2714*d14abf15SRobert Mustacchi 2715*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP: 2716*d14abf15SRobert Mustacchi 2717*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100hdx; 2718*d14abf15SRobert Mustacchi break; 2719*d14abf15SRobert Mustacchi 2720*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP: 2721*d14abf15SRobert Mustacchi 2722*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100hdx; 2723*d14abf15SRobert Mustacchi break; 2724*d14abf15SRobert Mustacchi 2725*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP: 2726*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP: 2727*d14abf15SRobert Mustacchi 2728*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = 0; 2729*d14abf15SRobert Mustacchi break; 2730*d14abf15SRobert Mustacchi 2731*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP: 2732*d14abf15SRobert Mustacchi 2733*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10fdx; 2734*d14abf15SRobert Mustacchi break; 2735*d14abf15SRobert Mustacchi 2736*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP: 2737*d14abf15SRobert Mustacchi 2738*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10fdx; 2739*d14abf15SRobert Mustacchi break; 2740*d14abf15SRobert Mustacchi 2741*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP: 2742*d14abf15SRobert Mustacchi 2743*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10hdx; 2744*d14abf15SRobert Mustacchi break; 2745*d14abf15SRobert Mustacchi 2746*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP: 2747*d14abf15SRobert Mustacchi 2748*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10hdx; 2749*d14abf15SRobert Mustacchi break; 2750*d14abf15SRobert Mustacchi 2751*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE: 2752*d14abf15SRobert Mustacchi 2753*d14abf15SRobert Mustacchi return BnxeGetPrivateProperty(pUM, 2754*d14abf15SRobert Mustacchi pr_name, 2755*d14abf15SRobert Mustacchi pr_valsize, 2756*d14abf15SRobert Mustacchi pr_val); 2757*d14abf15SRobert Mustacchi 2758*d14abf15SRobert Mustacchi default: 2759*d14abf15SRobert Mustacchi 2760*d14abf15SRobert Mustacchi return ENOTSUP; 2761*d14abf15SRobert Mustacchi } 2762*d14abf15SRobert Mustacchi 2763*d14abf15SRobert Mustacchi return 0; 2764*d14abf15SRobert Mustacchi } 2765*d14abf15SRobert Mustacchi 2766*d14abf15SRobert Mustacchi #endif /* MC_GETPROP */ 2767*d14abf15SRobert Mustacchi 2768*d14abf15SRobert Mustacchi 2769*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO 2770*d14abf15SRobert Mustacchi 2771*d14abf15SRobert Mustacchi static void BnxeMacPrivatePropertyInfo(um_device_t * pUM, 2772*d14abf15SRobert Mustacchi const char * pr_name, 2773*d14abf15SRobert Mustacchi mac_prop_info_handle_t prh) 2774*d14abf15SRobert Mustacchi { 2775*d14abf15SRobert Mustacchi char valstr[64]; 2776*d14abf15SRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg; 2777*d14abf15SRobert Mustacchi int default_val; 2778*d14abf15SRobert Mustacchi 2779*d14abf15SRobert Mustacchi bzero(valstr, sizeof (valstr)); 2780*d14abf15SRobert Mustacchi 2781*d14abf15SRobert Mustacchi if ((strcmp(pr_name, "_adv_2500fdx_cap") == 0) || 2782*d14abf15SRobert Mustacchi (strcmp(pr_name, "_adv_txpause_cap") == 0) || 2783*d14abf15SRobert Mustacchi (strcmp(pr_name, "_txpause") == 0) || 2784*d14abf15SRobert Mustacchi (strcmp(pr_name, "_adv_rxpause_cap") == 0) || 2785*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rxpause") == 0) || 2786*d14abf15SRobert Mustacchi (strcmp(pr_name, "_checksum") == 0) || 2787*d14abf15SRobert Mustacchi (strcmp(pr_name, "_num_rings") == 0) || 2788*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rx_descs") == 0) || 2789*d14abf15SRobert Mustacchi (strcmp(pr_name, "_tx_descs") == 0) || 2790*d14abf15SRobert Mustacchi (strcmp(pr_name, "_interrupt_coalesce") == 0) || 2791*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0) || 2792*d14abf15SRobert Mustacchi (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0) || 2793*d14abf15SRobert Mustacchi (strcmp(pr_name, "_disable_msix") == 0) || 2794*d14abf15SRobert Mustacchi (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0) || 2795*d14abf15SRobert Mustacchi (strcmp(pr_name, "_lso_enable") == 0)) 2796*d14abf15SRobert Mustacchi { 2797*d14abf15SRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ); 2798*d14abf15SRobert Mustacchi return; 2799*d14abf15SRobert Mustacchi } 2800*d14abf15SRobert Mustacchi 2801*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_autoneg_flow") == 0) 2802*d14abf15SRobert Mustacchi { 2803*d14abf15SRobert Mustacchi default_val = B_TRUE; 2804*d14abf15SRobert Mustacchi } 2805*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0) 2806*d14abf15SRobert Mustacchi { 2807*d14abf15SRobert Mustacchi default_val = BNXE_ROUTE_RING_TCPUDP; 2808*d14abf15SRobert Mustacchi } 2809*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0) 2810*d14abf15SRobert Mustacchi { 2811*d14abf15SRobert Mustacchi default_val = USER_OPTION_RX_MAX_FREE_DEFAULT; 2812*d14abf15SRobert Mustacchi } 2813*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0) 2814*d14abf15SRobert Mustacchi { 2815*d14abf15SRobert Mustacchi default_val = USER_OPTION_TX_MAX_FREE_DEFAULT; 2816*d14abf15SRobert Mustacchi } 2817*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0) 2818*d14abf15SRobert Mustacchi { 2819*d14abf15SRobert Mustacchi default_val = USER_OPTION_RX_DCOPY_THRESH_DEFAULT; 2820*d14abf15SRobert Mustacchi } 2821*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0) 2822*d14abf15SRobert Mustacchi { 2823*d14abf15SRobert Mustacchi default_val = USER_OPTION_TX_DCOPY_THRESH_DEFAULT; 2824*d14abf15SRobert Mustacchi } 2825*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0) 2826*d14abf15SRobert Mustacchi { 2827*d14abf15SRobert Mustacchi default_val = B_TRUE; 2828*d14abf15SRobert Mustacchi } 2829*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0) 2830*d14abf15SRobert Mustacchi { 2831*d14abf15SRobert Mustacchi default_val = B_TRUE; 2832*d14abf15SRobert Mustacchi } 2833*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0) 2834*d14abf15SRobert Mustacchi { 2835*d14abf15SRobert Mustacchi default_val = B_TRUE; 2836*d14abf15SRobert Mustacchi } 2837*d14abf15SRobert Mustacchi else 2838*d14abf15SRobert Mustacchi { 2839*d14abf15SRobert Mustacchi return; 2840*d14abf15SRobert Mustacchi } 2841*d14abf15SRobert Mustacchi 2842*d14abf15SRobert Mustacchi snprintf(valstr, sizeof (valstr), "%d", default_val); 2843*d14abf15SRobert Mustacchi mac_prop_info_set_default_str(prh, valstr); 2844*d14abf15SRobert Mustacchi } 2845*d14abf15SRobert Mustacchi 2846*d14abf15SRobert Mustacchi 2847*d14abf15SRobert Mustacchi static void BnxeMacPropertyInfo(void * barg, 2848*d14abf15SRobert Mustacchi const char * pr_name, 2849*d14abf15SRobert Mustacchi mac_prop_id_t pr_num, 2850*d14abf15SRobert Mustacchi mac_prop_info_handle_t prh) 2851*d14abf15SRobert Mustacchi { 2852*d14abf15SRobert Mustacchi um_device_t * pUM = barg; 2853*d14abf15SRobert Mustacchi link_flowctrl_t link_flowctrl; 2854*d14abf15SRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg; 2855*d14abf15SRobert Mustacchi 2856*d14abf15SRobert Mustacchi switch (pr_num) 2857*d14abf15SRobert Mustacchi { 2858*d14abf15SRobert Mustacchi case MAC_PROP_STATUS: 2859*d14abf15SRobert Mustacchi case MAC_PROP_SPEED: 2860*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX: 2861*d14abf15SRobert Mustacchi 2862*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP: 2863*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP: 2864*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP: 2865*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP: 2866*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP: 2867*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP: 2868*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP: 2869*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP: 2870*d14abf15SRobert Mustacchi 2871*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP: 2872*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP: 2873*d14abf15SRobert Mustacchi 2874*d14abf15SRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ); 2875*d14abf15SRobert Mustacchi break; 2876*d14abf15SRobert Mustacchi 2877*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP: 2878*d14abf15SRobert Mustacchi 2879*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10000fdx); 2880*d14abf15SRobert Mustacchi break; 2881*d14abf15SRobert Mustacchi 2882*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP: 2883*d14abf15SRobert Mustacchi 2884*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_1000fdx); 2885*d14abf15SRobert Mustacchi break; 2886*d14abf15SRobert Mustacchi 2887*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP: 2888*d14abf15SRobert Mustacchi 2889*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100fdx); 2890*d14abf15SRobert Mustacchi break; 2891*d14abf15SRobert Mustacchi 2892*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP: 2893*d14abf15SRobert Mustacchi 2894*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100hdx); 2895*d14abf15SRobert Mustacchi break; 2896*d14abf15SRobert Mustacchi 2897*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP: 2898*d14abf15SRobert Mustacchi 2899*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10fdx); 2900*d14abf15SRobert Mustacchi break; 2901*d14abf15SRobert Mustacchi 2902*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP: 2903*d14abf15SRobert Mustacchi 2904*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10hdx); 2905*d14abf15SRobert Mustacchi break; 2906*d14abf15SRobert Mustacchi 2907*d14abf15SRobert Mustacchi case MAC_PROP_MTU: 2908*d14abf15SRobert Mustacchi 2909*d14abf15SRobert Mustacchi mac_prop_info_set_range_uint32(prh, 2910*d14abf15SRobert Mustacchi USER_OPTION_MTU_MIN, 2911*d14abf15SRobert Mustacchi USER_OPTION_MTU_MAX); 2912*d14abf15SRobert Mustacchi break; 2913*d14abf15SRobert Mustacchi 2914*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG: 2915*d14abf15SRobert Mustacchi 2916*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->link_autoneg); 2917*d14abf15SRobert Mustacchi break; 2918*d14abf15SRobert Mustacchi 2919*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL: 2920*d14abf15SRobert Mustacchi 2921*d14abf15SRobert Mustacchi if (!default_cfg->param_rxpause && !default_cfg->param_txpause) 2922*d14abf15SRobert Mustacchi { 2923*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE; 2924*d14abf15SRobert Mustacchi } 2925*d14abf15SRobert Mustacchi 2926*d14abf15SRobert Mustacchi if (default_cfg->param_rxpause && !default_cfg->param_txpause) 2927*d14abf15SRobert Mustacchi { 2928*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX; 2929*d14abf15SRobert Mustacchi } 2930*d14abf15SRobert Mustacchi 2931*d14abf15SRobert Mustacchi if (!default_cfg->param_rxpause && default_cfg->param_txpause) 2932*d14abf15SRobert Mustacchi { 2933*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX; 2934*d14abf15SRobert Mustacchi } 2935*d14abf15SRobert Mustacchi 2936*d14abf15SRobert Mustacchi if (default_cfg->param_rxpause && default_cfg->param_txpause) 2937*d14abf15SRobert Mustacchi { 2938*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI; 2939*d14abf15SRobert Mustacchi } 2940*d14abf15SRobert Mustacchi 2941*d14abf15SRobert Mustacchi mac_prop_info_set_default_link_flowctrl(prh, link_flowctrl); 2942*d14abf15SRobert Mustacchi break; 2943*d14abf15SRobert Mustacchi 2944*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE: 2945*d14abf15SRobert Mustacchi 2946*d14abf15SRobert Mustacchi BnxeMacPrivatePropertyInfo(pUM, pr_name, prh); 2947*d14abf15SRobert Mustacchi break; 2948*d14abf15SRobert Mustacchi } 2949*d14abf15SRobert Mustacchi } 2950*d14abf15SRobert Mustacchi 2951*d14abf15SRobert Mustacchi #endif /* MC_PROPINFO */ 2952*d14abf15SRobert Mustacchi 2953*d14abf15SRobert Mustacchi 2954*d14abf15SRobert Mustacchi static mac_callbacks_t bnxe_callbacks = 2955*d14abf15SRobert Mustacchi { 2956*d14abf15SRobert Mustacchi ( 2957*d14abf15SRobert Mustacchi MC_IOCTL 2958*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES 2959*d14abf15SRobert Mustacchi | MC_RESOURCES 2960*d14abf15SRobert Mustacchi #endif 2961*d14abf15SRobert Mustacchi #ifdef MC_SETPROP 2962*d14abf15SRobert Mustacchi | MC_SETPROP 2963*d14abf15SRobert Mustacchi #endif 2964*d14abf15SRobert Mustacchi #ifdef MC_GETPROP 2965*d14abf15SRobert Mustacchi | MC_GETPROP 2966*d14abf15SRobert Mustacchi #endif 2967*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO 2968*d14abf15SRobert Mustacchi | MC_PROPINFO 2969*d14abf15SRobert Mustacchi #endif 2970*d14abf15SRobert Mustacchi | MC_GETCAPAB 2971*d14abf15SRobert Mustacchi ), 2972*d14abf15SRobert Mustacchi BnxeMacStats, 2973*d14abf15SRobert Mustacchi BnxeMacStart, 2974*d14abf15SRobert Mustacchi BnxeMacStop, 2975*d14abf15SRobert Mustacchi BnxeMacPromiscuous, 2976*d14abf15SRobert Mustacchi BnxeMacMulticast, 2977*d14abf15SRobert Mustacchi NULL, 2978*d14abf15SRobert Mustacchi BnxeMacTx, 2979*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES 2980*d14abf15SRobert Mustacchi BnxeMacResources, 2981*d14abf15SRobert Mustacchi #else 2982*d14abf15SRobert Mustacchi NULL, 2983*d14abf15SRobert Mustacchi #endif 2984*d14abf15SRobert Mustacchi BnxeMacIoctl, 2985*d14abf15SRobert Mustacchi BnxeMacGetCapability, 2986*d14abf15SRobert Mustacchi #ifdef MC_OPEN 2987*d14abf15SRobert Mustacchi NULL, 2988*d14abf15SRobert Mustacchi NULL, 2989*d14abf15SRobert Mustacchi #endif 2990*d14abf15SRobert Mustacchi #ifdef MC_SETPROP 2991*d14abf15SRobert Mustacchi BnxeMacSetProperty, 2992*d14abf15SRobert Mustacchi #endif 2993*d14abf15SRobert Mustacchi #ifdef MC_GETPROP 2994*d14abf15SRobert Mustacchi BnxeMacGetProperty, 2995*d14abf15SRobert Mustacchi #endif 2996*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO 2997*d14abf15SRobert Mustacchi BnxeMacPropertyInfo 2998*d14abf15SRobert Mustacchi #endif 2999*d14abf15SRobert Mustacchi }; 3000*d14abf15SRobert Mustacchi 3001*d14abf15SRobert Mustacchi 3002*d14abf15SRobert Mustacchi boolean_t BnxeGldInit(um_device_t * pUM) 3003*d14abf15SRobert Mustacchi { 3004*d14abf15SRobert Mustacchi mac_register_t * pMac; 3005*d14abf15SRobert Mustacchi int rc; 3006*d14abf15SRobert Mustacchi 3007*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE); 3008*d14abf15SRobert Mustacchi 3009*d14abf15SRobert Mustacchi if ((pMac = mac_alloc(MAC_VERSION)) == NULL) 3010*d14abf15SRobert Mustacchi { 3011*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to allocate GLD MAC memory"); 3012*d14abf15SRobert Mustacchi return B_FALSE; 3013*d14abf15SRobert Mustacchi } 3014*d14abf15SRobert Mustacchi 3015*d14abf15SRobert Mustacchi pMac->m_driver = pUM; 3016*d14abf15SRobert Mustacchi pMac->m_dip = pUM->pDev; 3017*d14abf15SRobert Mustacchi pMac->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 3018*d14abf15SRobert Mustacchi pMac->m_callbacks = &bnxe_callbacks; 3019*d14abf15SRobert Mustacchi pMac->m_min_sdu = 0; 3020*d14abf15SRobert Mustacchi pMac->m_max_sdu = pUM->devParams.mtu[LM_CLI_IDX_NDIS]; 3021*d14abf15SRobert Mustacchi pMac->m_src_addr = &(pUM->lm_dev.params.mac_addr[0]); 3022*d14abf15SRobert Mustacchi 3023*d14abf15SRobert Mustacchi #ifdef MC_OPEN 3024*d14abf15SRobert Mustacchi pMac->m_margin = VLAN_TAGSZ; 3025*d14abf15SRobert Mustacchi #endif 3026*d14abf15SRobert Mustacchi 3027*d14abf15SRobert Mustacchi #ifdef MC_SETPROP 3028*d14abf15SRobert Mustacchi pMac->m_priv_props = bnxeLink_priv_props; 3029*d14abf15SRobert Mustacchi #endif 3030*d14abf15SRobert Mustacchi 3031*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS) 3032*d14abf15SRobert Mustacchi bnxe_callbacks.mc_unicst = 3033*d14abf15SRobert Mustacchi (!pUM->devParams.numRings) ? BnxeMacUnicast : NULL; 3034*d14abf15SRobert Mustacchi #else 3035*d14abf15SRobert Mustacchi bnxe_callbacks.mc_unicst = BnxeMacUnicast; 3036*d14abf15SRobert Mustacchi #endif 3037*d14abf15SRobert Mustacchi 3038*d14abf15SRobert Mustacchi rc = mac_register(pMac, &pUM->pMac); 3039*d14abf15SRobert Mustacchi 3040*d14abf15SRobert Mustacchi mac_free(pMac); 3041*d14abf15SRobert Mustacchi 3042*d14abf15SRobert Mustacchi if (rc != 0) 3043*d14abf15SRobert Mustacchi { 3044*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to register with GLD (%d)", rc); 3045*d14abf15SRobert Mustacchi return B_FALSE; 3046*d14abf15SRobert Mustacchi } 3047*d14abf15SRobert Mustacchi 3048*d14abf15SRobert Mustacchi /* Always report the initial link state as unknown. */ 3049*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN); 3050*d14abf15SRobert Mustacchi 3051*d14abf15SRobert Mustacchi return B_TRUE; 3052*d14abf15SRobert Mustacchi } 3053*d14abf15SRobert Mustacchi 3054*d14abf15SRobert Mustacchi 3055*d14abf15SRobert Mustacchi boolean_t BnxeGldFini(um_device_t * pUM) 3056*d14abf15SRobert Mustacchi { 3057*d14abf15SRobert Mustacchi int cnt; 3058*d14abf15SRobert Mustacchi 3059*d14abf15SRobert Mustacchi if (pUM->plumbed) 3060*d14abf15SRobert Mustacchi { 3061*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Detaching device from GLD that is started!"); 3062*d14abf15SRobert Mustacchi return B_FALSE; 3063*d14abf15SRobert Mustacchi } 3064*d14abf15SRobert Mustacchi 3065*d14abf15SRobert Mustacchi /* We must not detach until all packets held by stack are retrieved. */ 3066*d14abf15SRobert Mustacchi if (!BnxeWaitForPacketsFromClient(pUM, LM_CLI_IDX_NDIS)) 3067*d14abf15SRobert Mustacchi { 3068*d14abf15SRobert Mustacchi return B_FALSE; 3069*d14abf15SRobert Mustacchi } 3070*d14abf15SRobert Mustacchi 3071*d14abf15SRobert Mustacchi if (pUM->pMac) 3072*d14abf15SRobert Mustacchi { 3073*d14abf15SRobert Mustacchi if (mac_unregister(pUM->pMac)) 3074*d14abf15SRobert Mustacchi { 3075*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to unregister with the GLD"); 3076*d14abf15SRobert Mustacchi return B_FALSE; 3077*d14abf15SRobert Mustacchi } 3078*d14abf15SRobert Mustacchi } 3079*d14abf15SRobert Mustacchi 3080*d14abf15SRobert Mustacchi return B_TRUE; 3081*d14abf15SRobert Mustacchi } 3082*d14abf15SRobert Mustacchi 3083*d14abf15SRobert Mustacchi 3084*d14abf15SRobert Mustacchi void BnxeGldLink(um_device_t * pUM, 3085*d14abf15SRobert Mustacchi link_state_t state) 3086*d14abf15SRobert Mustacchi { 3087*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, state); 3088*d14abf15SRobert Mustacchi } 3089*d14abf15SRobert Mustacchi 3090