changeset 13610:32b4d7ddcb1e

2054 e1000g kstat structure contains needless fields Reviewed by: Dan McDonald <danmcd@nexenta.com> Reviewed by: Michael Speer <michael.speer@pluribusnetworks.com> Approved by: Richard Lowe <richlowe@richlowe.net>
author David Höppner <0xffea@gmail.com>
date Wed, 15 Feb 2012 17:59:08 +0100
parents 7442c4b86390
children 4af57d96fcca
files usr/src/uts/common/io/e1000g/e1000g_stat.c usr/src/uts/common/io/e1000g/e1000g_sw.h
diffstat 2 files changed, 112 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/e1000g/e1000g_stat.c	Wed Feb 15 12:37:00 2012 +0100
+++ b/usr/src/uts/common/io/e1000g/e1000g_stat.c	Wed Feb 15 17:59:08 2012 +0100
@@ -20,6 +20,7 @@
 
 /*
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2012 David Höppner. All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -63,7 +64,7 @@
 	 * the packet as a good packet
 	 */
 	/* This packet should not be counted as a CRC error */
-	e1000g_ksp->Crcerrs.value.ul--;
+	Adapter->fcs_errors--;
 	/* This packet does count as a Good Packet Received */
 	e1000g_ksp->Gprc.value.ul++;
 
@@ -93,12 +94,12 @@
 		/*
 		 * Broadcast packet
 		 */
-		e1000g_ksp->Bprc.value.ul++;
+		Adapter->brdcstrcv++;
 	} else if (*mac_addr & 0x01) {
 		/*
 		 * Multicast packet
 		 */
-		e1000g_ksp->Mprc.value.ul++;
+		Adapter->multircv++;
 	}
 
 	if (frame_len == Adapter->max_frame_size) {
@@ -106,8 +107,8 @@
 		 * In this case, the hardware has overcounted the number of
 		 * oversize frames.
 		 */
-		if (e1000g_ksp->Roc.value.ul > 0)
-			e1000g_ksp->Roc.value.ul--;
+		if (Adapter->toolong_errors > 0)
+			Adapter->toolong_errors--;
 	}
 
 #ifdef E1000G_DEBUG
@@ -175,7 +176,6 @@
 
 	rw_enter(&Adapter->chip_lock, RW_WRITER);
 
-	e1000g_ksp->link_speed.value.ul = Adapter->link_speed;
 	e1000g_ksp->reset_count.value.ul = Adapter->reset_count;
 
 	e1000g_ksp->rx_error.value.ul = rx_ring->stat_error;
@@ -257,11 +257,7 @@
 
 	e1000g_ksp->Gprc.value.ul += E1000_READ_REG(hw, E1000_GPRC);
 	e1000g_ksp->Gptc.value.ul += E1000_READ_REG(hw, E1000_GPTC);
-	e1000g_ksp->Ruc.value.ul += E1000_READ_REG(hw, E1000_RUC);
 	e1000g_ksp->Rfc.value.ul += E1000_READ_REG(hw, E1000_RFC);
-	e1000g_ksp->Roc.value.ul += E1000_READ_REG(hw, E1000_ROC);
-	e1000g_ksp->Rjc.value.ul += E1000_READ_REG(hw, E1000_RJC);
-	e1000g_ksp->Tpr.value.ul += E1000_READ_REG(hw, E1000_TPR);
 	e1000g_ksp->Tncrs.value.ul += e1000g_read_phy_stat(hw, E1000_TNCRS);
 	e1000g_ksp->Tsctc.value.ul += E1000_READ_REG(hw, E1000_TSCTC);
 	e1000g_ksp->Tsctfc.value.ul += E1000_READ_REG(hw, E1000_TSCTFC);
@@ -270,7 +266,7 @@
 	 * Adaptive Calculations
 	 */
 	hw->mac.tx_packet_delta = E1000_READ_REG(hw, E1000_TPT);
-	e1000g_ksp->Tpt.value.ul += hw->mac.tx_packet_delta;
+	Adapter->opackets += hw->mac.tx_packet_delta;
 
 	/*
 	 * The 64-bit register will reset whenever the upper
@@ -295,19 +291,13 @@
 
 	low_val = E1000_READ_REG(hw, E1000_TORL);
 	high_val = E1000_READ_REG(hw, E1000_TORH);
-	val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
-	    (uint64_t)e1000g_ksp->Torl.value.ul;
-	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
-	e1000g_ksp->Torl.value.ul = (uint32_t)val;
-	e1000g_ksp->Torh.value.ul = (uint32_t)(val >> 32);
+	Adapter->rbytes +=
+	    (uint64_t)high_val << 32 | (uint64_t)low_val;
 
 	low_val = E1000_READ_REG(hw, E1000_TOTL);
 	high_val = E1000_READ_REG(hw, E1000_TOTH);
-	val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
-	    (uint64_t)e1000g_ksp->Totl.value.ul;
-	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
-	e1000g_ksp->Totl.value.ul = (uint32_t)val;
-	e1000g_ksp->Toth.value.ul = (uint32_t)(val >> 32);
+	Adapter->obytes +=
+	    (uint64_t)high_val << 32 | (uint64_t)low_val;
 
 	rw_exit(&Adapter->chip_lock);
 
@@ -342,51 +332,51 @@
 		break;
 
 	case MAC_STAT_MULTIRCV:
-		e1000g_ksp->Mprc.value.ul +=
+		Adapter->multircv +=
 		    E1000_READ_REG(hw, E1000_MPRC);
-		*val = e1000g_ksp->Mprc.value.ul;
+		*val = Adapter->multircv;
 		break;
 
 	case MAC_STAT_BRDCSTRCV:
-		e1000g_ksp->Bprc.value.ul +=
+		Adapter->brdcstrcv +=
 		    E1000_READ_REG(hw, E1000_BPRC);
-		*val = e1000g_ksp->Bprc.value.ul;
+		*val = Adapter->brdcstrcv;
 		break;
 
 	case MAC_STAT_MULTIXMT:
-		e1000g_ksp->Mptc.value.ul +=
+		Adapter->multixmt +=
 		    E1000_READ_REG(hw, E1000_MPTC);
-		*val = e1000g_ksp->Mptc.value.ul;
+		*val = Adapter->multixmt;
 		break;
 
 	case MAC_STAT_BRDCSTXMT:
-		e1000g_ksp->Bptc.value.ul +=
+		Adapter->brdcstxmt +=
 		    E1000_READ_REG(hw, E1000_BPTC);
-		*val = e1000g_ksp->Bptc.value.ul;
+		*val = Adapter->brdcstxmt;
 		break;
 
 	case MAC_STAT_NORCVBUF:
-		e1000g_ksp->Rnbc.value.ul +=
+		Adapter->norcvbuf +=
 		    E1000_READ_REG(hw, E1000_RNBC);
-		*val = e1000g_ksp->Rnbc.value.ul;
+		*val = Adapter->norcvbuf;
 		break;
 
 	case MAC_STAT_IERRORS:
-		e1000g_ksp->Rxerrc.value.ul +=
+		Adapter->macrcv_errors +=
 		    E1000_READ_REG(hw, E1000_RXERRC);
-		e1000g_ksp->Algnerrc.value.ul +=
+		Adapter->align_errors +=
 		    E1000_READ_REG(hw, E1000_ALGNERRC);
 		e1000g_ksp->Rlec.value.ul +=
 		    E1000_READ_REG(hw, E1000_RLEC);
-		e1000g_ksp->Crcerrs.value.ul +=
+		Adapter->fcs_errors +=
 		    E1000_READ_REG(hw, E1000_CRCERRS);
-		e1000g_ksp->Cexterr.value.ul +=
+		Adapter->carrier_errors +=
 		    E1000_READ_REG(hw, E1000_CEXTERR);
-		*val = e1000g_ksp->Rxerrc.value.ul +
-		    e1000g_ksp->Algnerrc.value.ul +
+		*val = Adapter->macrcv_errors +
+		    Adapter->align_errors +
 		    e1000g_ksp->Rlec.value.ul +
-		    e1000g_ksp->Crcerrs.value.ul +
-		    e1000g_ksp->Cexterr.value.ul;
+		    Adapter->fcs_errors +
+		    Adapter->carrier_errors;
 		break;
 
 	case MAC_STAT_NOXMTBUF:
@@ -394,15 +384,15 @@
 		break;
 
 	case MAC_STAT_OERRORS:
-		e1000g_ksp->Ecol.value.ul +=
+		Adapter->oerrors +=
 		    e1000g_read_phy_stat(hw, E1000_ECOL);
-		*val = e1000g_ksp->Ecol.value.ul;
+		*val = Adapter->oerrors;
 		break;
 
 	case MAC_STAT_COLLISIONS:
-		e1000g_ksp->Colc.value.ul +=
+		Adapter->collisions +=
 		    e1000g_read_phy_stat(hw, E1000_COLC);
-		*val = e1000g_ksp->Colc.value.ul;
+		*val = Adapter->collisions;
 		break;
 
 	case MAC_STAT_RBYTES:
@@ -413,18 +403,15 @@
 		 */
 		low_val = E1000_READ_REG(hw, E1000_TORL);
 		high_val = E1000_READ_REG(hw, E1000_TORH);
-		*val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
-		    (uint64_t)e1000g_ksp->Torl.value.ul;
-		*val += (uint64_t)high_val << 32 | (uint64_t)low_val;
-
-		e1000g_ksp->Torl.value.ul = (uint32_t)*val;
-		e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32);
+		Adapter->rbytes +=
+		    (uint64_t)high_val << 32 | (uint64_t)low_val;
+		*val = Adapter->rbytes;
 		break;
 
 	case MAC_STAT_IPACKETS:
-		e1000g_ksp->Tpr.value.ul +=
+		Adapter->ipackets +=
 		    E1000_READ_REG(hw, E1000_TPR);
-		*val = e1000g_ksp->Tpr.value.ul;
+		*val = Adapter->ipackets;
 		break;
 
 	case MAC_STAT_OBYTES:
@@ -435,90 +422,99 @@
 		 */
 		low_val = E1000_READ_REG(hw, E1000_TOTL);
 		high_val = E1000_READ_REG(hw, E1000_TOTH);
-		*val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
-		    (uint64_t)e1000g_ksp->Totl.value.ul;
-		*val += (uint64_t)high_val << 32 | (uint64_t)low_val;
-
-		e1000g_ksp->Totl.value.ul = (uint32_t)*val;
-		e1000g_ksp->Toth.value.ul = (uint32_t)(*val >> 32);
+		Adapter->obytes +=
+		    (uint64_t)high_val << 32 | (uint64_t)low_val;
+		*val = Adapter->obytes;
 		break;
 
 	case MAC_STAT_OPACKETS:
-		e1000g_ksp->Tpt.value.ul +=
+		Adapter->opackets +=
 		    E1000_READ_REG(hw, E1000_TPT);
-		*val = e1000g_ksp->Tpt.value.ul;
+		*val = Adapter->opackets;
 		break;
 
 	case ETHER_STAT_ALIGN_ERRORS:
-		e1000g_ksp->Algnerrc.value.ul +=
+		Adapter->align_errors +=
 		    E1000_READ_REG(hw, E1000_ALGNERRC);
-		*val = e1000g_ksp->Algnerrc.value.ul;
+		*val = Adapter->align_errors;
 		break;
 
 	case ETHER_STAT_FCS_ERRORS:
-		e1000g_ksp->Crcerrs.value.ul +=
+		Adapter->fcs_errors +=
 		    E1000_READ_REG(hw, E1000_CRCERRS);
-		*val = e1000g_ksp->Crcerrs.value.ul;
+		*val = Adapter->fcs_errors;
 		break;
 
 	case ETHER_STAT_SQE_ERRORS:
-		e1000g_ksp->Sec.value.ul +=
+		Adapter->sqe_errors +=
 		    E1000_READ_REG(hw, E1000_SEC);
-		*val = e1000g_ksp->Sec.value.ul;
+		*val = Adapter->sqe_errors;
 		break;
 
 	case ETHER_STAT_CARRIER_ERRORS:
-		e1000g_ksp->Cexterr.value.ul +=
+		Adapter->carrier_errors +=
 		    E1000_READ_REG(hw, E1000_CEXTERR);
-		*val = e1000g_ksp->Cexterr.value.ul;
+		*val = Adapter->carrier_errors;
 		break;
 
 	case ETHER_STAT_EX_COLLISIONS:
-		e1000g_ksp->Ecol.value.ul +=
+		Adapter->ex_collisions +=
 		    e1000g_read_phy_stat(hw, E1000_ECOL);
-		*val = e1000g_ksp->Ecol.value.ul;
+		*val = Adapter->ex_collisions;
 		break;
 
 	case ETHER_STAT_TX_LATE_COLLISIONS:
-		e1000g_ksp->Latecol.value.ul +=
+		Adapter->tx_late_collisions +=
 		    e1000g_read_phy_stat(hw, E1000_LATECOL);
-		*val = e1000g_ksp->Latecol.value.ul;
+		*val = Adapter->tx_late_collisions;
 		break;
 
 	case ETHER_STAT_DEFER_XMTS:
-		e1000g_ksp->Dc.value.ul +=
+		Adapter->defer_xmts +=
 		    e1000g_read_phy_stat(hw, E1000_DC);
-		*val = e1000g_ksp->Dc.value.ul;
+		*val = Adapter->defer_xmts;
 		break;
 
 	case ETHER_STAT_FIRST_COLLISIONS:
-		e1000g_ksp->Scc.value.ul +=
+		Adapter->first_collisions +=
 		    e1000g_read_phy_stat(hw, E1000_SCC);
-		*val = e1000g_ksp->Scc.value.ul;
+		*val = Adapter->first_collisions;
 		break;
 
 	case ETHER_STAT_MULTI_COLLISIONS:
-		e1000g_ksp->Mcc.value.ul +=
+		Adapter->multi_collisions +=
 		    e1000g_read_phy_stat(hw, E1000_MCC);
-		*val = e1000g_ksp->Mcc.value.ul;
+		*val = Adapter->multi_collisions;
 		break;
 
 	case ETHER_STAT_MACRCV_ERRORS:
-		e1000g_ksp->Rxerrc.value.ul +=
+		Adapter->macrcv_errors +=
 		    E1000_READ_REG(hw, E1000_RXERRC);
-		*val = e1000g_ksp->Rxerrc.value.ul;
+		*val = Adapter->macrcv_errors;
 		break;
 
 	case ETHER_STAT_MACXMT_ERRORS:
-		e1000g_ksp->Ecol.value.ul +=
+		Adapter->macxmt_errors +=
 		    e1000g_read_phy_stat(hw, E1000_ECOL);
-		*val = e1000g_ksp->Ecol.value.ul;
+		*val = Adapter->macxmt_errors;
 		break;
 
 	case ETHER_STAT_TOOLONG_ERRORS:
-		e1000g_ksp->Roc.value.ul +=
+		Adapter->toolong_errors +=
 		    E1000_READ_REG(hw, E1000_ROC);
-		*val = e1000g_ksp->Roc.value.ul;
+		*val = Adapter->toolong_errors;
+		break;
+
+	case ETHER_STAT_TOOSHORT_ERRORS:
+		Adapter->tooshort_errors +=
+		    E1000_READ_REG(hw, E1000_RUC);
+		*val = Adapter->tooshort_errors;
+		break;
+
+	case ETHER_STAT_JABBER_ERRORS:
+		Adapter->jabber_errors +=
+		    E1000_READ_REG(hw, E1000_RJC);
+		*val = Adapter->jabber_errors;
 		break;
 
 	case ETHER_STAT_XCVR_ADDR:
@@ -736,8 +732,6 @@
 	/*
 	 * Initialize all the statistics
 	 */
-	kstat_named_init(&e1000g_ksp->link_speed, "link_speed",
-	    KSTAT_DATA_ULONG);
 	kstat_named_init(&e1000g_ksp->reset_count, "Reset Count",
 	    KSTAT_DATA_ULONG);
 
@@ -801,26 +795,8 @@
 	    KSTAT_DATA_ULONG);
 	kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi",
 	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Ruc, "Recv_Undersize",
-	    KSTAT_DATA_ULONG);
 	kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag",
 	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Roc, "Recv_Oversize",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Rjc, "Recv_Jabber",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Torl, "Total_Octets_Recvd_Lo",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Torh, "Total_Octets_Recvd_Hi",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Totl, "Total_Octets_Xmitd_Lo",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Toth, "Total_Octets_Xmitd_Hi",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Tpr, "Total_Packets_Recvd",
-	    KSTAT_DATA_ULONG);
-	kstat_named_init(&e1000g_ksp->Tpt, "Total_Packets_Xmitd",
-	    KSTAT_DATA_ULONG);
 #ifdef E1000G_DEBUG
 	kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_(  64b)",
 	    KSTAT_DATA_ULONG);
@@ -981,8 +957,6 @@
 	e1000g_rx_ring_t *rx_ring = (e1000g_rx_ring_t *)rh;
 	struct e1000g *Adapter = rx_ring->adapter;
 	struct e1000_hw *hw = &Adapter->shared;
-	p_e1000g_stat_t e1000g_ksp =
-	    (p_e1000g_stat_t)Adapter->e1000g_ksp->ks_data;
 	uint32_t low_val, high_val;
 
 	rw_enter(&Adapter->chip_lock, RW_READER);
@@ -1001,18 +975,15 @@
 		 */
 		low_val = E1000_READ_REG(hw, E1000_TORL);
 		high_val = E1000_READ_REG(hw, E1000_TORH);
-		*val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
-		    (uint64_t)e1000g_ksp->Torl.value.ul;
-		*val += (uint64_t)high_val << 32 | (uint64_t)low_val;
-
-		e1000g_ksp->Torl.value.ul = (uint32_t)*val;
-		e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32);
+		Adapter->rbytes +=
+		    (uint64_t)high_val << 32 | (uint64_t)low_val;
+		*val = Adapter->rbytes;
 		break;
 
 	case MAC_STAT_IPACKETS:
-		e1000g_ksp->Tpr.value.ul +=
+		Adapter->ipackets +=
 		    E1000_READ_REG(hw, E1000_TPR);
-		*val = e1000g_ksp->Tpr.value.ul;
+		*val = Adapter->ipackets;
 		break;
 
 	default:
--- a/usr/src/uts/common/io/e1000g/e1000g_sw.h	Wed Feb 15 12:37:00 2012 +0100
+++ b/usr/src/uts/common/io/e1000g/e1000g_sw.h	Wed Feb 15 17:59:08 2012 +0100
@@ -20,6 +20,7 @@
 
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2012 David Höppner. All rights reserved.
  */
 
 #ifndef _E1000G_SW_H
@@ -618,8 +619,6 @@
 } e1000g_ether_addr_t;
 
 typedef struct _e1000g_stat {
-
-	kstat_named_t link_speed;	/* Link Speed */
 	kstat_named_t reset_count;	/* Reset Count */
 
 	kstat_named_t rx_error;		/* Rx Error in Packet */
@@ -652,16 +651,8 @@
 	kstat_named_t tx_lack_desc;	/* Tx Lack of Desc */
 #endif
 
-	kstat_named_t Crcerrs;	/* CRC Error Count */
 	kstat_named_t Symerrs;	/* Symbol Error Count */
 	kstat_named_t Mpc;	/* Missed Packet Count */
-	kstat_named_t Scc;	/* Single Collision Count */
-	kstat_named_t Ecol;	/* Excessive Collision Count */
-	kstat_named_t Mcc;	/* Multiple Collision Count */
-	kstat_named_t Latecol;	/* Late Collision Count */
-	kstat_named_t Colc;	/* Collision Count */
-	kstat_named_t Dc;	/* Defer Count */
-	kstat_named_t Sec;	/* Sequence Error Count */
 	kstat_named_t Rlec;	/* Receive Length Error Count */
 	kstat_named_t Xonrxc;	/* XON Received Count */
 	kstat_named_t Xontxc;	/* XON Xmitted Count */
@@ -677,24 +668,12 @@
 	kstat_named_t Prc1522;	/* Packets Received - 1024-1522b */
 #endif
 	kstat_named_t Gprc;	/* Good Packets Received Count */
-	kstat_named_t Bprc;	/* Broadcasts Pkts Received Count */
-	kstat_named_t Mprc;	/* Multicast Pkts Received Count */
 	kstat_named_t Gptc;	/* Good Packets Xmitted Count */
 	kstat_named_t Gorl;	/* Good Octets Recvd Lo Count */
 	kstat_named_t Gorh;	/* Good Octets Recvd Hi Count */
 	kstat_named_t Gotl;	/* Good Octets Xmitd Lo Count */
 	kstat_named_t Goth;	/* Good Octets Xmitd Hi Count */
-	kstat_named_t Rnbc;	/* Receive No Buffers Count */
-	kstat_named_t Ruc;	/* Receive Undersize Count */
 	kstat_named_t Rfc;	/* Receive Frag Count */
-	kstat_named_t Roc;	/* Receive Oversize Count */
-	kstat_named_t Rjc;	/* Receive Jabber Count */
-	kstat_named_t Torl;	/* Total Octets Recvd Lo Count */
-	kstat_named_t Torh;	/* Total Octets Recvd Hi Count */
-	kstat_named_t Totl;	/* Total Octets Xmted Lo Count */
-	kstat_named_t Toth;	/* Total Octets Xmted Hi Count */
-	kstat_named_t Tpr;	/* Total Packets Received */
-	kstat_named_t Tpt;	/* Total Packets Xmitted */
 #ifdef E1000G_DEBUG
 	kstat_named_t Ptc64;	/* Packets Xmitted (64b) */
 	kstat_named_t Ptc127;	/* Packets Xmitted (64-127b) */
@@ -703,14 +682,7 @@
 	kstat_named_t Ptc1023;	/* Packets Xmitted (512-1023b) */
 	kstat_named_t Ptc1522;	/* Packets Xmitted (1024-1522b */
 #endif
-	kstat_named_t Mptc;	/* Multicast Packets Xmited Count */
-	kstat_named_t Bptc;	/* Broadcast Packets Xmited Count */
-	kstat_named_t Algnerrc;	/* Alignment Error count */
-	kstat_named_t Tuc;	/* Transmit Underrun count */
-	kstat_named_t Rxerrc;	/* Rx Error Count */
 	kstat_named_t Tncrs;	/* Transmit with no CRS */
-	kstat_named_t Cexterr;	/* Carrier Extension Error count */
-	kstat_named_t Rutec;	/* Receive DMA too Early count */
 	kstat_named_t Tsctc;	/* TCP seg contexts xmit count */
 	kstat_named_t Tsctfc;	/* TCP seg contexts xmit fail count */
 } e1000g_stat_t, *p_e1000g_stat_t;
@@ -860,7 +832,7 @@
 	boolean_t rx_buffer_setup;
 	boolean_t esb2_workaround;
 	link_state_t link_state;
-	uint32_t link_speed;
+	uint64_t link_speed;
 	uint32_t link_duplex;
 	uint32_t master_latency_timer;
 	uint32_t smartspeed;	/* smartspeed w/a counter */
@@ -873,6 +845,32 @@
 	uint32_t loopback_mode;
 	uint32_t pending_rx_count;
 
+	uint32_t align_errors;
+	uint32_t brdcstrcv;
+	uint32_t brdcstxmt;
+	uint32_t carrier_errors;
+	uint32_t collisions;
+	uint32_t defer_xmts;
+	uint32_t ex_collisions;
+	uint32_t fcs_errors;
+	uint32_t first_collisions;
+	uint32_t ipackets;
+	uint32_t jabber_errors;
+	uint32_t macrcv_errors;
+	uint32_t macxmt_errors;
+	uint32_t multi_collisions;
+	uint32_t multircv;
+	uint32_t multixmt;
+	uint32_t norcvbuf;
+	uint32_t oerrors;
+	uint32_t opackets;
+	uint32_t sqe_errors;
+	uint32_t toolong_errors;
+	uint32_t tooshort_errors;
+	uint32_t tx_late_collisions;
+	uint64_t obytes;
+	uint64_t rbytes;
+
 	uint32_t tx_desc_num;
 	uint32_t tx_freelist_num;
 	uint32_t rx_desc_num;