Print this page
4431 igb support for I354
4616 igb has uninitialized kstats

*** 24,33 **** --- 24,34 ---- */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2013, Nexenta Systems, Inc. All rights reserved. + * Copyright 2014 Pluribus Networks Inc. */ #include "igb_sw.h" int
*** 51,121 **** case MAC_STAT_IFSPEED: *val = igb->link_speed * 1000000ull; break; case MAC_STAT_MULTIRCV: ! igb_ks->mprc.value.ui64 += ! E1000_READ_REG(hw, E1000_MPRC); ! *val = igb_ks->mprc.value.ui64; break; case MAC_STAT_BRDCSTRCV: ! igb_ks->bprc.value.ui64 += ! E1000_READ_REG(hw, E1000_BPRC); ! *val = igb_ks->bprc.value.ui64; break; case MAC_STAT_MULTIXMT: ! igb_ks->mptc.value.ui64 += ! E1000_READ_REG(hw, E1000_MPTC); ! *val = igb_ks->mptc.value.ui64; break; case MAC_STAT_BRDCSTXMT: ! igb_ks->bptc.value.ui64 += ! E1000_READ_REG(hw, E1000_BPTC); ! *val = igb_ks->bptc.value.ui64; break; case MAC_STAT_NORCVBUF: ! igb_ks->rnbc.value.ui64 += ! E1000_READ_REG(hw, E1000_RNBC); ! *val = igb_ks->rnbc.value.ui64; break; case MAC_STAT_IERRORS: ! igb_ks->rxerrc.value.ui64 += ! E1000_READ_REG(hw, E1000_RXERRC); ! igb_ks->algnerrc.value.ui64 += ! E1000_READ_REG(hw, E1000_ALGNERRC); igb_ks->rlec.value.ui64 += E1000_READ_REG(hw, E1000_RLEC); ! igb_ks->crcerrs.value.ui64 += ! E1000_READ_REG(hw, E1000_CRCERRS); ! igb_ks->cexterr.value.ui64 += ! E1000_READ_REG(hw, E1000_CEXTERR); ! *val = igb_ks->rxerrc.value.ui64 + ! igb_ks->algnerrc.value.ui64 + igb_ks->rlec.value.ui64 + ! igb_ks->crcerrs.value.ui64 + ! igb_ks->cexterr.value.ui64; break; case MAC_STAT_NOXMTBUF: *val = 0; break; case MAC_STAT_OERRORS: ! igb_ks->ecol.value.ui64 += ! E1000_READ_REG(hw, E1000_ECOL); ! *val = igb_ks->ecol.value.ui64; break; case MAC_STAT_COLLISIONS: ! igb_ks->colc.value.ui64 += ! E1000_READ_REG(hw, E1000_COLC); ! *val = igb_ks->colc.value.ui64; break; case MAC_STAT_RBYTES: /* * The 64-bit register will reset whenever the upper --- 52,111 ---- case MAC_STAT_IFSPEED: *val = igb->link_speed * 1000000ull; break; case MAC_STAT_MULTIRCV: ! igb->stat_mprc += E1000_READ_REG(hw, E1000_MPRC); ! *val = igb->stat_mprc; break; case MAC_STAT_BRDCSTRCV: ! igb->stat_bprc += E1000_READ_REG(hw, E1000_BPRC); ! *val = igb->stat_bprc; break; case MAC_STAT_MULTIXMT: ! igb->stat_mptc += E1000_READ_REG(hw, E1000_MPTC); ! *val = igb->stat_mptc; break; case MAC_STAT_BRDCSTXMT: ! igb->stat_bptc += E1000_READ_REG(hw, E1000_BPTC); ! *val = igb->stat_bptc; break; case MAC_STAT_NORCVBUF: ! igb->stat_rnbc += E1000_READ_REG(hw, E1000_RNBC); ! *val = igb->stat_rnbc; break; case MAC_STAT_IERRORS: ! igb->stat_rxerrc += E1000_READ_REG(hw, E1000_RXERRC); ! igb->stat_algnerrc += E1000_READ_REG(hw, E1000_ALGNERRC); igb_ks->rlec.value.ui64 += E1000_READ_REG(hw, E1000_RLEC); ! igb->stat_crcerrs += E1000_READ_REG(hw, E1000_CRCERRS); ! igb->stat_cexterr += E1000_READ_REG(hw, E1000_CEXTERR); ! *val = igb->stat_rxerrc + ! igb->stat_algnerrc + igb_ks->rlec.value.ui64 + ! igb->stat_crcerrs + ! igb->stat_cexterr; break; case MAC_STAT_NOXMTBUF: *val = 0; break; case MAC_STAT_OERRORS: ! igb->stat_ecol += E1000_READ_REG(hw, E1000_ECOL); ! *val = igb->stat_ecol; break; case MAC_STAT_COLLISIONS: ! igb->stat_colc += E1000_READ_REG(hw, E1000_COLC); ! *val = igb->stat_colc; break; case MAC_STAT_RBYTES: /* * The 64-bit register will reset whenever the upper
*** 122,140 **** * 32 bits are read. So we need to read the lower * 32 bits first, then read the upper 32 bits. */ low_val = E1000_READ_REG(hw, E1000_TORL); high_val = E1000_READ_REG(hw, E1000_TORH); ! igb_ks->tor.value.ui64 += ! (uint64_t)high_val << 32 | (uint64_t)low_val; ! *val = igb_ks->tor.value.ui64; break; case MAC_STAT_IPACKETS: ! igb_ks->tpr.value.ui64 += ! E1000_READ_REG(hw, E1000_TPR); ! *val = igb_ks->tpr.value.ui64; break; case MAC_STAT_OBYTES: /* * The 64-bit register will reset whenever the upper --- 112,128 ---- * 32 bits are read. So we need to read the lower * 32 bits first, then read the upper 32 bits. */ low_val = E1000_READ_REG(hw, E1000_TORL); high_val = E1000_READ_REG(hw, E1000_TORH); ! igb->stat_tor += (uint64_t)high_val << 32 | (uint64_t)low_val; ! *val = igb->stat_tor; break; case MAC_STAT_IPACKETS: ! igb->stat_tpr += E1000_READ_REG(hw, E1000_TPR); ! *val = igb->stat_tpr; break; case MAC_STAT_OBYTES: /* * The 64-bit register will reset whenever the upper
*** 141,232 **** * 32 bits are read. So we need to read the lower * 32 bits first, then read the upper 32 bits. */ low_val = E1000_READ_REG(hw, E1000_TOTL); high_val = E1000_READ_REG(hw, E1000_TOTH); ! igb_ks->tot.value.ui64 += ! (uint64_t)high_val << 32 | (uint64_t)low_val; ! *val = igb_ks->tot.value.ui64; break; case MAC_STAT_OPACKETS: ! igb_ks->tpt.value.ui64 += ! E1000_READ_REG(hw, E1000_TPT); ! *val = igb_ks->tpt.value.ui64; break; /* RFC 1643 stats */ case ETHER_STAT_ALIGN_ERRORS: ! igb_ks->algnerrc.value.ui64 += ! E1000_READ_REG(hw, E1000_ALGNERRC); ! *val = igb_ks->algnerrc.value.ui64; break; case ETHER_STAT_FCS_ERRORS: ! igb_ks->crcerrs.value.ui64 += ! E1000_READ_REG(hw, E1000_CRCERRS); ! *val = igb_ks->crcerrs.value.ui64; break; case ETHER_STAT_FIRST_COLLISIONS: ! igb_ks->scc.value.ui64 += ! E1000_READ_REG(hw, E1000_SCC); ! *val = igb_ks->scc.value.ui64; break; case ETHER_STAT_MULTI_COLLISIONS: ! igb_ks->mcc.value.ui64 += ! E1000_READ_REG(hw, E1000_MCC); ! *val = igb_ks->mcc.value.ui64; break; case ETHER_STAT_SQE_ERRORS: ! igb_ks->sec.value.ui64 += ! E1000_READ_REG(hw, E1000_SEC); ! *val = igb_ks->sec.value.ui64; break; case ETHER_STAT_DEFER_XMTS: ! igb_ks->dc.value.ui64 += ! E1000_READ_REG(hw, E1000_DC); ! *val = igb_ks->dc.value.ui64; break; case ETHER_STAT_TX_LATE_COLLISIONS: ! igb_ks->latecol.value.ui64 += ! E1000_READ_REG(hw, E1000_LATECOL); ! *val = igb_ks->latecol.value.ui64; break; case ETHER_STAT_EX_COLLISIONS: ! igb_ks->ecol.value.ui64 += ! E1000_READ_REG(hw, E1000_ECOL); ! *val = igb_ks->ecol.value.ui64; break; case ETHER_STAT_MACXMT_ERRORS: ! igb_ks->ecol.value.ui64 += ! E1000_READ_REG(hw, E1000_ECOL); ! *val = igb_ks->ecol.value.ui64; break; case ETHER_STAT_CARRIER_ERRORS: ! igb_ks->cexterr.value.ui64 += ! E1000_READ_REG(hw, E1000_CEXTERR); ! *val = igb_ks->cexterr.value.ui64; break; case ETHER_STAT_TOOLONG_ERRORS: ! igb_ks->roc.value.ui64 += ! E1000_READ_REG(hw, E1000_ROC); ! *val = igb_ks->roc.value.ui64; break; case ETHER_STAT_MACRCV_ERRORS: ! igb_ks->rxerrc.value.ui64 += ! E1000_READ_REG(hw, E1000_RXERRC); ! *val = igb_ks->rxerrc.value.ui64; break; /* MII/GMII stats */ case ETHER_STAT_XCVR_ADDR: /* The Internal PHY's MDI address for each MAC is 1 */ --- 129,206 ---- * 32 bits are read. So we need to read the lower * 32 bits first, then read the upper 32 bits. */ low_val = E1000_READ_REG(hw, E1000_TOTL); high_val = E1000_READ_REG(hw, E1000_TOTH); ! igb->stat_tot += (uint64_t)high_val << 32 | (uint64_t)low_val; ! *val = igb->stat_tot; break; case MAC_STAT_OPACKETS: ! igb->stat_tpt += E1000_READ_REG(hw, E1000_TPT); ! *val = igb->stat_tpt; break; /* RFC 1643 stats */ case ETHER_STAT_ALIGN_ERRORS: ! igb->stat_algnerrc += E1000_READ_REG(hw, E1000_ALGNERRC); ! *val = igb->stat_algnerrc; break; case ETHER_STAT_FCS_ERRORS: ! igb->stat_crcerrs += E1000_READ_REG(hw, E1000_CRCERRS); ! *val = igb->stat_crcerrs; break; case ETHER_STAT_FIRST_COLLISIONS: ! igb->stat_scc += E1000_READ_REG(hw, E1000_SCC); ! *val = igb->stat_scc; break; case ETHER_STAT_MULTI_COLLISIONS: ! igb->stat_mcc += E1000_READ_REG(hw, E1000_MCC); ! *val = igb->stat_mcc; break; case ETHER_STAT_SQE_ERRORS: ! igb->stat_sec += E1000_READ_REG(hw, E1000_SEC); ! *val = igb->stat_sec; break; case ETHER_STAT_DEFER_XMTS: ! igb->stat_dc += E1000_READ_REG(hw, E1000_DC); ! *val = igb->stat_dc; break; case ETHER_STAT_TX_LATE_COLLISIONS: ! igb->stat_latecol += E1000_READ_REG(hw, E1000_LATECOL); ! *val = igb->stat_latecol; break; case ETHER_STAT_EX_COLLISIONS: ! igb->stat_ecol += E1000_READ_REG(hw, E1000_ECOL); ! *val = igb->stat_ecol; break; case ETHER_STAT_MACXMT_ERRORS: ! igb->stat_ecol += E1000_READ_REG(hw, E1000_ECOL); ! *val = igb->stat_ecol; break; case ETHER_STAT_CARRIER_ERRORS: ! igb->stat_cexterr += E1000_READ_REG(hw, E1000_CEXTERR); ! *val = igb->stat_cexterr; break; case ETHER_STAT_TOOLONG_ERRORS: ! igb->stat_roc += E1000_READ_REG(hw, E1000_ROC); ! *val = igb->stat_roc; break; case ETHER_STAT_MACRCV_ERRORS: ! igb->stat_rxerrc += E1000_READ_REG(hw, E1000_RXERRC); ! *val = igb->stat_rxerrc; break; /* MII/GMII stats */ case ETHER_STAT_XCVR_ADDR: /* The Internal PHY's MDI address for each MAC is 1 */
*** 383,395 **** *val = (igb->link_duplex == FULL_DUPLEX) ? LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; break; case ETHER_STAT_TOOSHORT_ERRORS: ! igb_ks->ruc.value.ui64 += ! E1000_READ_REG(hw, E1000_RUC); ! *val = igb_ks->ruc.value.ui64; break; case ETHER_STAT_CAP_REMFAULT: *val = igb->param_rem_fault; break; --- 357,368 ---- *val = (igb->link_duplex == FULL_DUPLEX) ? LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; break; case ETHER_STAT_TOOSHORT_ERRORS: ! igb->stat_ruc += E1000_READ_REG(hw, E1000_RUC); ! *val = igb->stat_ruc; break; case ETHER_STAT_CAP_REMFAULT: *val = igb->param_rem_fault; break;
*** 401,413 **** case ETHER_STAT_LP_REMFAULT: *val = igb->param_lp_rem_fault; break; case ETHER_STAT_JABBER_ERRORS: ! igb_ks->rjc.value.ui64 += ! E1000_READ_REG(hw, E1000_RJC); ! *val = igb_ks->rjc.value.ui64; break; case ETHER_STAT_CAP_100T4: *val = igb->param_100t4_cap; break; --- 374,385 ---- case ETHER_STAT_LP_REMFAULT: *val = igb->param_lp_rem_fault; break; case ETHER_STAT_JABBER_ERRORS: ! igb->stat_rjc += E1000_READ_REG(hw, E1000_RJC); ! *val = igb->stat_rjc; break; case ETHER_STAT_CAP_100T4: *val = igb->param_100t4_cap; break;
*** 1391,1414 **** return (EINVAL); (void) ddi_strtol(pr_val, (char **)NULL, 0, &result); switch (result) { case 0: case 1: - if (hw->mac.type != e1000_i350) { /* ! * For now, only supported on I350. * Add new mac.type values (or use < instead) * as new cards offer up EEE. */ ! return (ENXIO); ! } /* Must set this prior to the set call. */ hw->dev_spec._82575.eee_disable = !result; if (e1000_set_eee_i350(hw) != E1000_SUCCESS) err = EIO; break; default: err = EINVAL; /* FALLTHRU */ } return (err); } --- 1363,1395 ---- return (EINVAL); (void) ddi_strtol(pr_val, (char **)NULL, 0, &result); switch (result) { case 0: case 1: /* ! * For now, only supported on I350/I354. * Add new mac.type values (or use < instead) * as new cards offer up EEE. */ ! switch (hw->mac.type) { ! case e1000_i350: /* Must set this prior to the set call. */ hw->dev_spec._82575.eee_disable = !result; if (e1000_set_eee_i350(hw) != E1000_SUCCESS) err = EIO; break; + case e1000_i354: + /* Must set this prior to the set call. */ + hw->dev_spec._82575.eee_disable = !result; + if (e1000_set_eee_i354(hw) != E1000_SUCCESS) + err = EIO; + break; default: + return (ENXIO); + } + break; + default: err = EINVAL; /* FALLTHRU */ } return (err); }
*** 1537,1548 **** } else if (strcmp(pr_name, "_eee_support") == 0) { /* * For now, only supported on I350. Add new mac.type values * (or use < instead) as new cards offer up EEE. */ ! value = (igb->hw.mac.type != e1000_i350) ? 0 : ! !(igb->hw.dev_spec._82575.eee_disable); } else if (strcmp(pr_name, "_tx_copy_thresh") == 0) { value = igb->tx_copy_thresh; } else if (strcmp(pr_name, "_tx_recycle_thresh") == 0) { value = igb->tx_recycle_thresh; } else if (strcmp(pr_name, "_tx_overload_thresh") == 0) { --- 1518,1535 ---- } else if (strcmp(pr_name, "_eee_support") == 0) { /* * For now, only supported on I350. Add new mac.type values * (or use < instead) as new cards offer up EEE. */ ! switch (igb->hw.mac.type) { ! case e1000_i350: ! case e1000_i354: ! value = !(igb->hw.dev_spec._82575.eee_disable); ! break; ! default: ! value = 0; ! } } else if (strcmp(pr_name, "_tx_copy_thresh") == 0) { value = igb->tx_copy_thresh; } else if (strcmp(pr_name, "_tx_recycle_thresh") == 0) { value = igb->tx_recycle_thresh; } else if (strcmp(pr_name, "_tx_overload_thresh") == 0) {