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) {