xref: /onnv-gate/usr/src/uts/common/io/e1000g/e1000g_stat.c (revision 3526:7c9ffe12c144)
1*3526Sxy150489 /*
2*3526Sxy150489  * This file is provided under a CDDLv1 license.  When using or
3*3526Sxy150489  * redistributing this file, you may do so under this license.
4*3526Sxy150489  * In redistributing this file this license must be included
5*3526Sxy150489  * and no other modification of this header file is permitted.
6*3526Sxy150489  *
7*3526Sxy150489  * CDDL LICENSE SUMMARY
8*3526Sxy150489  *
9*3526Sxy150489  * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved.
10*3526Sxy150489  *
11*3526Sxy150489  * The contents of this file are subject to the terms of Version
12*3526Sxy150489  * 1.0 of the Common Development and Distribution License (the "License").
13*3526Sxy150489  *
14*3526Sxy150489  * You should have received a copy of the License with this software.
15*3526Sxy150489  * You can obtain a copy of the License at
16*3526Sxy150489  *	http://www.opensolaris.org/os/licensing.
17*3526Sxy150489  * See the License for the specific language governing permissions
18*3526Sxy150489  * and limitations under the License.
19*3526Sxy150489  */
20*3526Sxy150489 
21*3526Sxy150489 /*
22*3526Sxy150489  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*3526Sxy150489  * Use is subject to license terms of the CDDLv1.
24*3526Sxy150489  */
25*3526Sxy150489 
26*3526Sxy150489 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*3526Sxy150489 
28*3526Sxy150489 /*
29*3526Sxy150489  * **********************************************************************
30*3526Sxy150489  *									*
31*3526Sxy150489  * Module Name:  e1000g_stat.c						*
32*3526Sxy150489  *									*
33*3526Sxy150489  * Abstract:     Functions for displaying statistics			*
34*3526Sxy150489  *									*
35*3526Sxy150489  * **********************************************************************
36*3526Sxy150489  */
37*3526Sxy150489 #include "e1000g_sw.h"
38*3526Sxy150489 #include "e1000g_debug.h"
39*3526Sxy150489 
40*3526Sxy150489 static int UpdateStatsCounters(kstat_t *ksp, int rw);
41*3526Sxy150489 
42*3526Sxy150489 /*
43*3526Sxy150489  * **********************************************************************
44*3526Sxy150489  *									*
45*3526Sxy150489  * Name:	    AdjustTbiAcceptedStats				*
46*3526Sxy150489  *									*
47*3526Sxy150489  * Description:     Adjusts statistic counters when a frame is accepted	*
48*3526Sxy150489  *		  under the TBI workaround. This function has been	*
49*3526Sxy150489  *		  adapted for Solaris from shared code.			*
50*3526Sxy150489  *									*
51*3526Sxy150489  * Author:	  Bill Campbell						*
52*3526Sxy150489  *									*
53*3526Sxy150489  * Born on Date:    4/12/2001						*
54*3526Sxy150489  *									*
55*3526Sxy150489  * Arguments:								*
56*3526Sxy150489  *      Adapter     - Ptr to this card's adapter data structure.	*
57*3526Sxy150489  *      FrameLength - Length as reported from Hardware			*
58*3526Sxy150489  *      MacAddress  - Pointer to MAC address field in frame.		*
59*3526Sxy150489  *									*
60*3526Sxy150489  * Returns:								*
61*3526Sxy150489  *      VOID								*
62*3526Sxy150489  *									*
63*3526Sxy150489  * **********************************************************************
64*3526Sxy150489  */
65*3526Sxy150489 void
66*3526Sxy150489 AdjustTbiAcceptedStats(struct e1000g *Adapter,
67*3526Sxy150489     UINT32 FrameLength, PUCHAR MacAddress)
68*3526Sxy150489 {
69*3526Sxy150489 	UINT32 CarryBit;
70*3526Sxy150489 	e1000gstat *e1000g_ksp;
71*3526Sxy150489 
72*3526Sxy150489 	e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data;
73*3526Sxy150489 
74*3526Sxy150489 	/*
75*3526Sxy150489 	 * First adjust the frame length.
76*3526Sxy150489 	 */
77*3526Sxy150489 	FrameLength--;
78*3526Sxy150489 	/*
79*3526Sxy150489 	 * We need to adjust the statistics counters, since the hardware
80*3526Sxy150489 	 * counters overcount this packet as a CRC error and undercount
81*3526Sxy150489 	 * the packet as a good packet
82*3526Sxy150489 	 */
83*3526Sxy150489 
84*3526Sxy150489 	/*
85*3526Sxy150489 	 * This packet should not be counted as a CRC error.
86*3526Sxy150489 	 */
87*3526Sxy150489 	e1000g_ksp->Crcerrs.value.ul--;
88*3526Sxy150489 	/*
89*3526Sxy150489 	 * This packet does count as a Good Packet Received.
90*3526Sxy150489 	 */
91*3526Sxy150489 	e1000g_ksp->Gprc.value.ul++;
92*3526Sxy150489 
93*3526Sxy150489 	/*
94*3526Sxy150489 	 * Adjust the Good Octets received counters
95*3526Sxy150489 	 */
96*3526Sxy150489 	CarryBit = 0x80000000 & e1000g_ksp->Gorl.value.ul;
97*3526Sxy150489 	e1000g_ksp->Gorl.value.ul += FrameLength;
98*3526Sxy150489 	/*
99*3526Sxy150489 	 * If the high bit of Gorcl (the low 32 bits of the Good Octets
100*3526Sxy150489 	 * Received Count) was one before the addition,
101*3526Sxy150489 	 * AND it is zero after, then we lost the carry out,
102*3526Sxy150489 	 * need to add one to Gorch (Good Octets Received Count High).
103*3526Sxy150489 	 * This could be simplified if all environments supported
104*3526Sxy150489 	 * 64-bit integers.
105*3526Sxy150489 	 */
106*3526Sxy150489 	if (CarryBit && ((e1000g_ksp->Gorl.value.ul & 0x80000000) == 0)) {
107*3526Sxy150489 		e1000g_ksp->Gorh.value.ul++;
108*3526Sxy150489 	}
109*3526Sxy150489 	/*
110*3526Sxy150489 	 * Is this a broadcast or multicast?  Check broadcast first,
111*3526Sxy150489 	 * since the test for a multicast frame will test positive on
112*3526Sxy150489 	 * a broadcast frame.
113*3526Sxy150489 	 */
114*3526Sxy150489 	if ((MacAddress[0] == (UCHAR) 0xff) &&
115*3526Sxy150489 	    (MacAddress[1] == (UCHAR) 0xff)) {
116*3526Sxy150489 		/*
117*3526Sxy150489 		 * Broadcast packet
118*3526Sxy150489 		 */
119*3526Sxy150489 		e1000g_ksp->Bprc.value.ul++;
120*3526Sxy150489 	} else if (*MacAddress & 0x01) {
121*3526Sxy150489 		/*
122*3526Sxy150489 		 * Multicast packet
123*3526Sxy150489 		 */
124*3526Sxy150489 		e1000g_ksp->Mprc.value.ul++;
125*3526Sxy150489 	}
126*3526Sxy150489 	if (FrameLength == Adapter->Shared.max_frame_size) {
127*3526Sxy150489 		/*
128*3526Sxy150489 		 * In this case, the hardware has overcounted the number of
129*3526Sxy150489 		 * oversize frames.
130*3526Sxy150489 		 */
131*3526Sxy150489 		if (e1000g_ksp->Roc.value.ul > 0)
132*3526Sxy150489 			e1000g_ksp->Roc.value.ul--;
133*3526Sxy150489 	}
134*3526Sxy150489 
135*3526Sxy150489 	/*
136*3526Sxy150489 	 * Adjust the bin counters when the extra byte put the frame in the
137*3526Sxy150489 	 * wrong bin. Remember that the FrameLength was adjusted above.
138*3526Sxy150489 	 */
139*3526Sxy150489 	if (FrameLength == 64) {
140*3526Sxy150489 		e1000g_ksp->Prc64.value.ul++;
141*3526Sxy150489 		e1000g_ksp->Prc127.value.ul--;
142*3526Sxy150489 	} else if (FrameLength == 127) {
143*3526Sxy150489 		e1000g_ksp->Prc127.value.ul++;
144*3526Sxy150489 		e1000g_ksp->Prc255.value.ul--;
145*3526Sxy150489 	} else if (FrameLength == 255) {
146*3526Sxy150489 		e1000g_ksp->Prc255.value.ul++;
147*3526Sxy150489 		e1000g_ksp->Prc511.value.ul--;
148*3526Sxy150489 	} else if (FrameLength == 511) {
149*3526Sxy150489 		e1000g_ksp->Prc511.value.ul++;
150*3526Sxy150489 		e1000g_ksp->Prc1023.value.ul--;
151*3526Sxy150489 	} else if (FrameLength == 1023) {
152*3526Sxy150489 		e1000g_ksp->Prc1023.value.ul++;
153*3526Sxy150489 		e1000g_ksp->Prc1522.value.ul--;
154*3526Sxy150489 	} else if (FrameLength == 1522) {
155*3526Sxy150489 		e1000g_ksp->Prc1522.value.ul++;
156*3526Sxy150489 	}
157*3526Sxy150489 }
158*3526Sxy150489 
159*3526Sxy150489 
160*3526Sxy150489 /*
161*3526Sxy150489  * **********************************************************************
162*3526Sxy150489  * Name:	UpdateStatsCounters					*
163*3526Sxy150489  *									*
164*3526Sxy150489  * Description: This routine will dump and reset the 1000's internal	*
165*3526Sxy150489  *	      Statistics counters.  The current stats dump values will	*
166*3526Sxy150489  *	      be sent to the kernel status area.			*
167*3526Sxy150489  *									*
168*3526Sxy150489  * Author:      Phil Cayton						*
169*3526Sxy150489  *									*
170*3526Sxy150489  * Born on Date:    7/13/98						*
171*3526Sxy150489  *									*
172*3526Sxy150489  * Arguments:								*
173*3526Sxy150489  *     *ksp - A kernel stat pointer					*
174*3526Sxy150489  *     rw   - Read/Write flag						*
175*3526Sxy150489  *									*
176*3526Sxy150489  * Returns:								*
177*3526Sxy150489  *      (EACCES) If an attempt is made to write stats to the hw		*
178*3526Sxy150489  *      (0) On successful read of statistics to kernel stats.		*
179*3526Sxy150489  *									*
180*3526Sxy150489  * File: e1000g_stat.c							*
181*3526Sxy150489  *									*
182*3526Sxy150489  * Modification log:							*
183*3526Sxy150489  * Date      Who  Description						*
184*3526Sxy150489  * --------  ---  ------------------------------------------------------*
185*3526Sxy150489  * Sept 10,99 Vinay New Counters for Livengood have been added.		*
186*3526Sxy150489  * **********************************************************************
187*3526Sxy150489  */
188*3526Sxy150489 static int
189*3526Sxy150489 UpdateStatsCounters(IN kstat_t *ksp, int rw)
190*3526Sxy150489 {
191*3526Sxy150489 	uint16_t LineSpeed, Duplex;
192*3526Sxy150489 	struct e1000g *Adapter;
193*3526Sxy150489 	e1000gstat *e1000g_ksp;
194*3526Sxy150489 	uint64_t val;
195*3526Sxy150489 	uint32_t low_val, high_val;
196*3526Sxy150489 
197*3526Sxy150489 	if (rw == KSTAT_WRITE)
198*3526Sxy150489 		return (EACCES);
199*3526Sxy150489 
200*3526Sxy150489 	Adapter = (struct e1000g *)ksp->ks_private;
201*3526Sxy150489 	ASSERT(Adapter != NULL);
202*3526Sxy150489 	e1000g_ksp = (e1000gstat *)ksp->ks_data;
203*3526Sxy150489 	ASSERT(e1000g_ksp != NULL);
204*3526Sxy150489 
205*3526Sxy150489 	e1000g_ksp->link_up.value.ul = Adapter->LinkIsActive;
206*3526Sxy150489 	e1000g_ksp->link_speed.value.ul = Adapter->link_speed;
207*3526Sxy150489 	e1000g_ksp->rx_none.value.ul = Adapter->rx_none;
208*3526Sxy150489 	e1000g_ksp->rx_error.value.ul = Adapter->rx_error;
209*3526Sxy150489 	e1000g_ksp->rx_no_freepkt.value.ul = Adapter->rx_no_freepkt;
210*3526Sxy150489 	e1000g_ksp->rx_esballoc_fail.value.ul = Adapter->rx_esballoc_fail;
211*3526Sxy150489 	e1000g_ksp->rx_exceed_pkt.value.ul = Adapter->rx_exceed_pkt;
212*3526Sxy150489 	e1000g_ksp->rx_multi_desc.value.ul = Adapter->rx_multi_desc;
213*3526Sxy150489 	e1000g_ksp->rx_allocb_fail.value.ul = Adapter->rx_allocb_fail;
214*3526Sxy150489 	e1000g_ksp->rx_avail_freepkt.value.ul = Adapter->rx_avail_freepkt;
215*3526Sxy150489 	e1000g_ksp->rx_seq_intr.value.ul = Adapter->rx_seq_intr;
216*3526Sxy150489 	e1000g_ksp->tx_no_desc.value.ul = Adapter->tx_no_desc;
217*3526Sxy150489 	e1000g_ksp->tx_no_swpkt.value.ul = Adapter->tx_no_swpkt;
218*3526Sxy150489 	e1000g_ksp->tx_lack_desc.value.ul = Adapter->tx_lack_desc;
219*3526Sxy150489 	e1000g_ksp->tx_send_fail.value.ul = Adapter->tx_send_fail;
220*3526Sxy150489 	e1000g_ksp->tx_multi_cookie.value.ul = Adapter->tx_multi_cookie;
221*3526Sxy150489 	e1000g_ksp->tx_over_size.value.ul = Adapter->tx_over_size;
222*3526Sxy150489 	e1000g_ksp->tx_under_size.value.ul = Adapter->tx_under_size;
223*3526Sxy150489 	e1000g_ksp->tx_copy.value.ul = Adapter->tx_copy;
224*3526Sxy150489 	e1000g_ksp->tx_bind.value.ul = Adapter->tx_bind;
225*3526Sxy150489 	e1000g_ksp->tx_multi_copy.value.ul = Adapter->tx_multi_copy;
226*3526Sxy150489 	e1000g_ksp->tx_reschedule.value.ul = Adapter->tx_reschedule;
227*3526Sxy150489 	e1000g_ksp->tx_empty_frags.value.ul = Adapter->tx_empty_frags;
228*3526Sxy150489 	e1000g_ksp->tx_exceed_frags.value.ul = Adapter->tx_exceed_frags;
229*3526Sxy150489 	e1000g_ksp->tx_recycle.value.ul = Adapter->tx_recycle;
230*3526Sxy150489 	e1000g_ksp->tx_recycle_retry.value.ul = Adapter->tx_recycle_retry;
231*3526Sxy150489 	e1000g_ksp->tx_recycle_intr.value.ul = Adapter->tx_recycle_intr;
232*3526Sxy150489 	e1000g_ksp->tx_recycle_none.value.ul = Adapter->tx_recycle_none;
233*3526Sxy150489 	e1000g_ksp->StallWatchdog.value.ul = Adapter->StallWatchdog;
234*3526Sxy150489 	e1000g_ksp->reset_count.value.ul = Adapter->reset_count;
235*3526Sxy150489 	e1000g_ksp->JumboTx_4K.value.ul = Adapter->JumboTx_4K;
236*3526Sxy150489 	e1000g_ksp->JumboRx_4K.value.ul = Adapter->JumboRx_4K;
237*3526Sxy150489 	e1000g_ksp->JumboTx_8K.value.ul = Adapter->JumboTx_8K;
238*3526Sxy150489 	e1000g_ksp->JumboRx_8K.value.ul = Adapter->JumboRx_8K;
239*3526Sxy150489 	e1000g_ksp->JumboTx_16K.value.ul = Adapter->JumboTx_16K;
240*3526Sxy150489 	e1000g_ksp->JumboRx_16K.value.ul = Adapter->JumboRx_16K;
241*3526Sxy150489 	e1000g_ksp->intr_type.value.ul = Adapter->intr_type;
242*3526Sxy150489 
243*3526Sxy150489 	/*
244*3526Sxy150489 	 * Mutex required if in TBI mode
245*3526Sxy150489 	 */
246*3526Sxy150489 	if (Adapter->Shared.tbi_compatibility_on == 1) {
247*3526Sxy150489 		mutex_enter(&Adapter->TbiCntrMutex);
248*3526Sxy150489 	}
249*3526Sxy150489 
250*3526Sxy150489 	/*
251*3526Sxy150489 	 * Standard Stats
252*3526Sxy150489 	 */
253*3526Sxy150489 	e1000g_ksp->Mpc.value.ul +=
254*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, MPC);
255*3526Sxy150489 
256*3526Sxy150489 	e1000g_ksp->Symerrs.value.ul +=
257*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, SYMERRS);
258*3526Sxy150489 
259*3526Sxy150489 	e1000g_ksp->Rlec.value.ul +=
260*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, RLEC);
261*3526Sxy150489 
262*3526Sxy150489 	e1000g_ksp->Xonrxc.value.ul +=
263*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, XONRXC);
264*3526Sxy150489 
265*3526Sxy150489 	e1000g_ksp->Xontxc.value.ul +=
266*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, XONTXC);
267*3526Sxy150489 
268*3526Sxy150489 	e1000g_ksp->Xoffrxc.value.ul +=
269*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, XOFFRXC);
270*3526Sxy150489 
271*3526Sxy150489 	e1000g_ksp->Xofftxc.value.ul +=
272*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, XOFFTXC);
273*3526Sxy150489 
274*3526Sxy150489 	e1000g_ksp->Fcruc.value.ul +=
275*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, FCRUC);
276*3526Sxy150489 
277*3526Sxy150489 	e1000g_ksp->Prc64.value.ul +=
278*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC64);
279*3526Sxy150489 
280*3526Sxy150489 	e1000g_ksp->Prc127.value.ul +=
281*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC127);
282*3526Sxy150489 
283*3526Sxy150489 	e1000g_ksp->Prc255.value.ul +=
284*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC255);
285*3526Sxy150489 
286*3526Sxy150489 	e1000g_ksp->Prc511.value.ul +=
287*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC511);
288*3526Sxy150489 
289*3526Sxy150489 	e1000g_ksp->Prc1023.value.ul +=
290*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC1023);
291*3526Sxy150489 
292*3526Sxy150489 	e1000g_ksp->Prc1522.value.ul +=
293*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PRC1522);
294*3526Sxy150489 
295*3526Sxy150489 	e1000g_ksp->Gprc.value.ul +=
296*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, GPRC);
297*3526Sxy150489 
298*3526Sxy150489 	e1000g_ksp->Gptc.value.ul +=
299*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, GPTC);
300*3526Sxy150489 
301*3526Sxy150489 	/*
302*3526Sxy150489 	 * The 64-bit register will reset whenever the upper
303*3526Sxy150489 	 * 32 bits are read. So we need to read the lower
304*3526Sxy150489 	 * 32 bits first, then read the upper 32 bits.
305*3526Sxy150489 	 */
306*3526Sxy150489 	low_val = E1000_READ_REG(&Adapter->Shared, GORCL);
307*3526Sxy150489 	high_val = E1000_READ_REG(&Adapter->Shared, GORCH);
308*3526Sxy150489 	val = (uint64_t)e1000g_ksp->Gorh.value.ul << 32 |
309*3526Sxy150489 	    (uint64_t)e1000g_ksp->Gorl.value.ul;
310*3526Sxy150489 	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
311*3526Sxy150489 	e1000g_ksp->Gorl.value.ul = (uint32_t)val;
312*3526Sxy150489 	e1000g_ksp->Gorh.value.ul = (uint32_t)(val >> 32);
313*3526Sxy150489 
314*3526Sxy150489 	low_val = E1000_READ_REG(&Adapter->Shared, GOTCL);
315*3526Sxy150489 	high_val = E1000_READ_REG(&Adapter->Shared, GOTCH);
316*3526Sxy150489 	val = (uint64_t)e1000g_ksp->Goth.value.ul << 32 |
317*3526Sxy150489 	    (uint64_t)e1000g_ksp->Gotl.value.ul;
318*3526Sxy150489 	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
319*3526Sxy150489 	e1000g_ksp->Gotl.value.ul = (uint32_t)val;
320*3526Sxy150489 	e1000g_ksp->Goth.value.ul = (uint32_t)(val >> 32);
321*3526Sxy150489 
322*3526Sxy150489 	e1000g_ksp->Ruc.value.ul +=
323*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, RUC);
324*3526Sxy150489 
325*3526Sxy150489 	e1000g_ksp->Rfc.value.ul +=
326*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, RFC);
327*3526Sxy150489 
328*3526Sxy150489 	e1000g_ksp->Roc.value.ul +=
329*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, ROC);
330*3526Sxy150489 
331*3526Sxy150489 	e1000g_ksp->Rjc.value.ul +=
332*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, RJC);
333*3526Sxy150489 
334*3526Sxy150489 	low_val = E1000_READ_REG(&Adapter->Shared, TORL);
335*3526Sxy150489 	high_val = E1000_READ_REG(&Adapter->Shared, TORH);
336*3526Sxy150489 	val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
337*3526Sxy150489 	    (uint64_t)e1000g_ksp->Torl.value.ul;
338*3526Sxy150489 	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
339*3526Sxy150489 	e1000g_ksp->Torl.value.ul = (uint32_t)val;
340*3526Sxy150489 	e1000g_ksp->Torh.value.ul = (uint32_t)(val >> 32);
341*3526Sxy150489 
342*3526Sxy150489 	low_val = E1000_READ_REG(&Adapter->Shared, TOTL);
343*3526Sxy150489 	high_val = E1000_READ_REG(&Adapter->Shared, TOTH);
344*3526Sxy150489 	val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
345*3526Sxy150489 	    (uint64_t)e1000g_ksp->Totl.value.ul;
346*3526Sxy150489 	val += (uint64_t)high_val << 32 | (uint64_t)low_val;
347*3526Sxy150489 	e1000g_ksp->Totl.value.ul = (uint32_t)val;
348*3526Sxy150489 	e1000g_ksp->Toth.value.ul = (uint32_t)(val >> 32);
349*3526Sxy150489 
350*3526Sxy150489 	e1000g_ksp->Tpr.value.ul +=
351*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, TPR);
352*3526Sxy150489 
353*3526Sxy150489 	/*
354*3526Sxy150489 	 * Adaptive Calculations
355*3526Sxy150489 	 */
356*3526Sxy150489 	Adapter->Shared.tx_packet_delta =
357*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, TPT);
358*3526Sxy150489 	e1000g_ksp->Tpt.value.ul +=
359*3526Sxy150489 	    Adapter->Shared.tx_packet_delta;
360*3526Sxy150489 
361*3526Sxy150489 	e1000g_ksp->Ptc64.value.ul +=
362*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC64);
363*3526Sxy150489 
364*3526Sxy150489 	e1000g_ksp->Ptc127.value.ul +=
365*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC127);
366*3526Sxy150489 
367*3526Sxy150489 	e1000g_ksp->Ptc255.value.ul +=
368*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC255);
369*3526Sxy150489 
370*3526Sxy150489 	e1000g_ksp->Ptc511.value.ul +=
371*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC511);
372*3526Sxy150489 
373*3526Sxy150489 	e1000g_ksp->Ptc1023.value.ul +=
374*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC1023);
375*3526Sxy150489 
376*3526Sxy150489 	e1000g_ksp->Ptc1522.value.ul +=
377*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, PTC1522);
378*3526Sxy150489 
379*3526Sxy150489 	/*
380*3526Sxy150489 	 * Livengood Counters
381*3526Sxy150489 	 */
382*3526Sxy150489 	e1000g_ksp->Tncrs.value.ul +=
383*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, TNCRS);
384*3526Sxy150489 
385*3526Sxy150489 	e1000g_ksp->Tsctc.value.ul +=
386*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, TSCTC);
387*3526Sxy150489 
388*3526Sxy150489 	e1000g_ksp->Tsctfc.value.ul +=
389*3526Sxy150489 	    E1000_READ_REG(&Adapter->Shared, TSCTFC);
390*3526Sxy150489 
391*3526Sxy150489 	/*
392*3526Sxy150489 	 * Mutex required if in TBI mode
393*3526Sxy150489 	 */
394*3526Sxy150489 	if (Adapter->Shared.tbi_compatibility_on == 1) {
395*3526Sxy150489 		mutex_exit(&Adapter->TbiCntrMutex);
396*3526Sxy150489 	}
397*3526Sxy150489 
398*3526Sxy150489 	return (0);
399*3526Sxy150489 }
400*3526Sxy150489 
401*3526Sxy150489 int
402*3526Sxy150489 e1000g_m_stat(void *arg, uint_t stat, uint64_t *val)
403*3526Sxy150489 {
404*3526Sxy150489 	struct e1000g *Adapter = (struct e1000g *)arg;
405*3526Sxy150489 	e1000gstat *e1000g_ksp;
406*3526Sxy150489 	uint32_t low_val, high_val;
407*3526Sxy150489 	uint16_t phy_reg, phy_reg_2;
408*3526Sxy150489 
409*3526Sxy150489 	e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data;
410*3526Sxy150489 
411*3526Sxy150489 	switch (stat) {
412*3526Sxy150489 	case MAC_STAT_IFSPEED:
413*3526Sxy150489 		*val = Adapter->link_speed * 1000000ull;
414*3526Sxy150489 		break;
415*3526Sxy150489 
416*3526Sxy150489 	case MAC_STAT_MULTIRCV:
417*3526Sxy150489 		e1000g_ksp->Mprc.value.ul +=
418*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, MPRC);
419*3526Sxy150489 		*val = e1000g_ksp->Mprc.value.ul;
420*3526Sxy150489 		break;
421*3526Sxy150489 
422*3526Sxy150489 	case MAC_STAT_BRDCSTRCV:
423*3526Sxy150489 		e1000g_ksp->Bprc.value.ul +=
424*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, BPRC);
425*3526Sxy150489 		*val = e1000g_ksp->Bprc.value.ul;
426*3526Sxy150489 		break;
427*3526Sxy150489 
428*3526Sxy150489 	case MAC_STAT_MULTIXMT:
429*3526Sxy150489 		e1000g_ksp->Mptc.value.ul +=
430*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, MPTC);
431*3526Sxy150489 		*val = e1000g_ksp->Mptc.value.ul;
432*3526Sxy150489 		break;
433*3526Sxy150489 
434*3526Sxy150489 	case MAC_STAT_BRDCSTXMT:
435*3526Sxy150489 		e1000g_ksp->Bptc.value.ul +=
436*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, BPTC);
437*3526Sxy150489 		*val = e1000g_ksp->Bptc.value.ul;
438*3526Sxy150489 		break;
439*3526Sxy150489 
440*3526Sxy150489 	case MAC_STAT_NORCVBUF:
441*3526Sxy150489 		e1000g_ksp->Rnbc.value.ul +=
442*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, RNBC);
443*3526Sxy150489 		*val = e1000g_ksp->Rnbc.value.ul;
444*3526Sxy150489 		break;
445*3526Sxy150489 
446*3526Sxy150489 	case MAC_STAT_IERRORS:
447*3526Sxy150489 		e1000g_ksp->Rxerrc.value.ul +=
448*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, RXERRC);
449*3526Sxy150489 		e1000g_ksp->Algnerrc.value.ul +=
450*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ALGNERRC);
451*3526Sxy150489 		e1000g_ksp->Rlec.value.ul +=
452*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, RLEC);
453*3526Sxy150489 		e1000g_ksp->Crcerrs.value.ul +=
454*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, CRCERRS);
455*3526Sxy150489 		e1000g_ksp->Cexterr.value.ul +=
456*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, CEXTERR);
457*3526Sxy150489 		*val = e1000g_ksp->Rxerrc.value.ul +
458*3526Sxy150489 		    e1000g_ksp->Algnerrc.value.ul +
459*3526Sxy150489 		    e1000g_ksp->Rlec.value.ul +
460*3526Sxy150489 		    e1000g_ksp->Crcerrs.value.ul +
461*3526Sxy150489 		    e1000g_ksp->Cexterr.value.ul;
462*3526Sxy150489 		break;
463*3526Sxy150489 
464*3526Sxy150489 	case MAC_STAT_NOXMTBUF:
465*3526Sxy150489 		*val = Adapter->tx_no_desc;
466*3526Sxy150489 		break;
467*3526Sxy150489 
468*3526Sxy150489 	case MAC_STAT_OERRORS:
469*3526Sxy150489 		e1000g_ksp->Ecol.value.ul +=
470*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ECOL);
471*3526Sxy150489 		*val = e1000g_ksp->Ecol.value.ul;
472*3526Sxy150489 		break;
473*3526Sxy150489 
474*3526Sxy150489 	case MAC_STAT_COLLISIONS:
475*3526Sxy150489 		e1000g_ksp->Colc.value.ul +=
476*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, COLC);
477*3526Sxy150489 		*val = e1000g_ksp->Colc.value.ul;
478*3526Sxy150489 		break;
479*3526Sxy150489 
480*3526Sxy150489 	case MAC_STAT_RBYTES:
481*3526Sxy150489 		/*
482*3526Sxy150489 		 * The 64-bit register will reset whenever the upper
483*3526Sxy150489 		 * 32 bits are read. So we need to read the lower
484*3526Sxy150489 		 * 32 bits first, then read the upper 32 bits.
485*3526Sxy150489 		 */
486*3526Sxy150489 		low_val = E1000_READ_REG(&Adapter->Shared, TORL);
487*3526Sxy150489 		high_val = E1000_READ_REG(&Adapter->Shared, TORH);
488*3526Sxy150489 		*val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 |
489*3526Sxy150489 		    (uint64_t)e1000g_ksp->Torl.value.ul;
490*3526Sxy150489 		*val += (uint64_t)high_val << 32 | (uint64_t)low_val;
491*3526Sxy150489 
492*3526Sxy150489 		e1000g_ksp->Torl.value.ul = (uint32_t)*val;
493*3526Sxy150489 		e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32);
494*3526Sxy150489 		break;
495*3526Sxy150489 
496*3526Sxy150489 	case MAC_STAT_IPACKETS:
497*3526Sxy150489 		e1000g_ksp->Tpr.value.ul +=
498*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, TPR);
499*3526Sxy150489 		*val = e1000g_ksp->Tpr.value.ul;
500*3526Sxy150489 		break;
501*3526Sxy150489 
502*3526Sxy150489 	case MAC_STAT_OBYTES:
503*3526Sxy150489 		/*
504*3526Sxy150489 		 * The 64-bit register will reset whenever the upper
505*3526Sxy150489 		 * 32 bits are read. So we need to read the lower
506*3526Sxy150489 		 * 32 bits first, then read the upper 32 bits.
507*3526Sxy150489 		 */
508*3526Sxy150489 		low_val = E1000_READ_REG(&Adapter->Shared, TOTL);
509*3526Sxy150489 		high_val = E1000_READ_REG(&Adapter->Shared, TOTH);
510*3526Sxy150489 		*val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 |
511*3526Sxy150489 		    (uint64_t)e1000g_ksp->Totl.value.ul;
512*3526Sxy150489 		*val += (uint64_t)high_val << 32 | (uint64_t)low_val;
513*3526Sxy150489 
514*3526Sxy150489 		e1000g_ksp->Totl.value.ul = (uint32_t)*val;
515*3526Sxy150489 		e1000g_ksp->Toth.value.ul = (uint32_t)(*val >> 32);
516*3526Sxy150489 		break;
517*3526Sxy150489 
518*3526Sxy150489 	case MAC_STAT_OPACKETS:
519*3526Sxy150489 		e1000g_ksp->Tpt.value.ul +=
520*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, TPT);
521*3526Sxy150489 		*val = e1000g_ksp->Tpt.value.ul;
522*3526Sxy150489 		break;
523*3526Sxy150489 
524*3526Sxy150489 	case ETHER_STAT_ALIGN_ERRORS:
525*3526Sxy150489 		e1000g_ksp->Algnerrc.value.ul +=
526*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ALGNERRC);
527*3526Sxy150489 		*val = e1000g_ksp->Algnerrc.value.ul;
528*3526Sxy150489 		break;
529*3526Sxy150489 
530*3526Sxy150489 	case ETHER_STAT_FCS_ERRORS:
531*3526Sxy150489 		e1000g_ksp->Crcerrs.value.ul +=
532*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, CRCERRS);
533*3526Sxy150489 		*val = e1000g_ksp->Crcerrs.value.ul;
534*3526Sxy150489 		break;
535*3526Sxy150489 
536*3526Sxy150489 	case ETHER_STAT_SQE_ERRORS:
537*3526Sxy150489 		e1000g_ksp->Sec.value.ul +=
538*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, SEC);
539*3526Sxy150489 		*val = e1000g_ksp->Sec.value.ul;
540*3526Sxy150489 		break;
541*3526Sxy150489 
542*3526Sxy150489 	case ETHER_STAT_CARRIER_ERRORS:
543*3526Sxy150489 		e1000g_ksp->Cexterr.value.ul +=
544*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, CEXTERR);
545*3526Sxy150489 		*val = e1000g_ksp->Cexterr.value.ul;
546*3526Sxy150489 		break;
547*3526Sxy150489 
548*3526Sxy150489 	case ETHER_STAT_EX_COLLISIONS:
549*3526Sxy150489 		e1000g_ksp->Ecol.value.ul +=
550*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ECOL);
551*3526Sxy150489 		*val = e1000g_ksp->Ecol.value.ul;
552*3526Sxy150489 		break;
553*3526Sxy150489 
554*3526Sxy150489 	case ETHER_STAT_TX_LATE_COLLISIONS:
555*3526Sxy150489 		e1000g_ksp->Latecol.value.ul +=
556*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, LATECOL);
557*3526Sxy150489 		*val = e1000g_ksp->Latecol.value.ul;
558*3526Sxy150489 		break;
559*3526Sxy150489 
560*3526Sxy150489 	case ETHER_STAT_DEFER_XMTS:
561*3526Sxy150489 		e1000g_ksp->Dc.value.ul +=
562*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, DC);
563*3526Sxy150489 		*val = e1000g_ksp->Dc.value.ul;
564*3526Sxy150489 		break;
565*3526Sxy150489 
566*3526Sxy150489 	case ETHER_STAT_FIRST_COLLISIONS:
567*3526Sxy150489 		e1000g_ksp->Scc.value.ul +=
568*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, SCC);
569*3526Sxy150489 		*val = e1000g_ksp->Scc.value.ul;
570*3526Sxy150489 		break;
571*3526Sxy150489 
572*3526Sxy150489 	case ETHER_STAT_MULTI_COLLISIONS:
573*3526Sxy150489 		e1000g_ksp->Mcc.value.ul +=
574*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, MCC);
575*3526Sxy150489 		*val = e1000g_ksp->Mcc.value.ul;
576*3526Sxy150489 		break;
577*3526Sxy150489 
578*3526Sxy150489 	case ETHER_STAT_MACRCV_ERRORS:
579*3526Sxy150489 		e1000g_ksp->Rxerrc.value.ul +=
580*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, RXERRC);
581*3526Sxy150489 		*val = e1000g_ksp->Rxerrc.value.ul;
582*3526Sxy150489 		break;
583*3526Sxy150489 
584*3526Sxy150489 	case ETHER_STAT_MACXMT_ERRORS:
585*3526Sxy150489 		e1000g_ksp->Ecol.value.ul +=
586*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ECOL);
587*3526Sxy150489 		*val = e1000g_ksp->Ecol.value.ul;
588*3526Sxy150489 		break;
589*3526Sxy150489 
590*3526Sxy150489 	case ETHER_STAT_TOOLONG_ERRORS:
591*3526Sxy150489 		e1000g_ksp->Roc.value.ul +=
592*3526Sxy150489 		    E1000_READ_REG(&Adapter->Shared, ROC);
593*3526Sxy150489 		*val = e1000g_ksp->Roc.value.ul;
594*3526Sxy150489 		break;
595*3526Sxy150489 
596*3526Sxy150489 	case ETHER_STAT_XCVR_ADDR:
597*3526Sxy150489 		/* The Internal PHY's MDI address for each MAC is 1 */
598*3526Sxy150489 		*val = 1;
599*3526Sxy150489 		break;
600*3526Sxy150489 
601*3526Sxy150489 	case ETHER_STAT_XCVR_ID:
602*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_ID1, &phy_reg);
603*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_ID2, &phy_reg_2);
604*3526Sxy150489 		*val = (uint32_t)((phy_reg << 16) | phy_reg_2);
605*3526Sxy150489 		break;
606*3526Sxy150489 
607*3526Sxy150489 	case ETHER_STAT_XCVR_INUSE:
608*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
609*3526Sxy150489 		switch (Adapter->link_speed) {
610*3526Sxy150489 		case SPEED_1000:
611*3526Sxy150489 			*val =
612*3526Sxy150489 			    (Adapter->Shared.media_type ==
613*3526Sxy150489 			    e1000_media_type_copper) ? XCVR_1000T :
614*3526Sxy150489 			    XCVR_1000X;
615*3526Sxy150489 			break;
616*3526Sxy150489 		case SPEED_100:
617*3526Sxy150489 			*val =
618*3526Sxy150489 			    (Adapter->Shared.media_type ==
619*3526Sxy150489 			    e1000_media_type_copper) ? (phy_reg &
620*3526Sxy150489 			    MII_SR_100T4_CAPS) ? XCVR_100T4 : XCVR_100T2 :
621*3526Sxy150489 			    XCVR_100X;
622*3526Sxy150489 			break;
623*3526Sxy150489 		case SPEED_10:
624*3526Sxy150489 			*val = XCVR_10;
625*3526Sxy150489 			break;
626*3526Sxy150489 		default:
627*3526Sxy150489 			*val = XCVR_NONE;
628*3526Sxy150489 			break;
629*3526Sxy150489 		}
630*3526Sxy150489 		break;
631*3526Sxy150489 
632*3526Sxy150489 	case ETHER_STAT_CAP_1000FDX:
633*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS,
634*3526Sxy150489 		    &phy_reg);
635*3526Sxy150489 		*val = ((phy_reg & IEEE_ESR_1000T_FD_CAPS) ||
636*3526Sxy150489 		    (phy_reg & IEEE_ESR_1000X_FD_CAPS)) ? 1 : 0;
637*3526Sxy150489 		break;
638*3526Sxy150489 
639*3526Sxy150489 	case ETHER_STAT_CAP_1000HDX:
640*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS,
641*3526Sxy150489 		    &phy_reg);
642*3526Sxy150489 		*val = ((phy_reg & IEEE_ESR_1000T_HD_CAPS) ||
643*3526Sxy150489 		    (phy_reg & IEEE_ESR_1000X_HD_CAPS)) ? 1 : 0;
644*3526Sxy150489 		break;
645*3526Sxy150489 
646*3526Sxy150489 	case ETHER_STAT_CAP_100FDX:
647*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
648*3526Sxy150489 		*val = ((phy_reg & MII_SR_100X_FD_CAPS) ||
649*3526Sxy150489 		    (phy_reg & MII_SR_100T2_FD_CAPS)) ? 1 : 0;
650*3526Sxy150489 		break;
651*3526Sxy150489 
652*3526Sxy150489 	case ETHER_STAT_CAP_100HDX:
653*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
654*3526Sxy150489 		*val = ((phy_reg & MII_SR_100X_HD_CAPS) ||
655*3526Sxy150489 		    (phy_reg & MII_SR_100T2_HD_CAPS)) ? 1 : 0;
656*3526Sxy150489 		break;
657*3526Sxy150489 
658*3526Sxy150489 	case ETHER_STAT_CAP_10FDX:
659*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
660*3526Sxy150489 		*val = (phy_reg & MII_SR_10T_FD_CAPS) ? 1 : 0;
661*3526Sxy150489 		break;
662*3526Sxy150489 
663*3526Sxy150489 	case ETHER_STAT_CAP_10HDX:
664*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
665*3526Sxy150489 		*val = (phy_reg & MII_SR_10T_HD_CAPS) ? 1 : 0;
666*3526Sxy150489 		break;
667*3526Sxy150489 
668*3526Sxy150489 	case ETHER_STAT_CAP_ASMPAUSE:
669*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
670*3526Sxy150489 		    &phy_reg);
671*3526Sxy150489 		*val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
672*3526Sxy150489 		break;
673*3526Sxy150489 
674*3526Sxy150489 	case ETHER_STAT_CAP_PAUSE:
675*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
676*3526Sxy150489 		    &phy_reg);
677*3526Sxy150489 		*val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
678*3526Sxy150489 		break;
679*3526Sxy150489 
680*3526Sxy150489 	case ETHER_STAT_CAP_AUTONEG:
681*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg);
682*3526Sxy150489 		*val = (phy_reg & MII_SR_AUTONEG_CAPS) ? 1 : 0;
683*3526Sxy150489 		break;
684*3526Sxy150489 
685*3526Sxy150489 	case ETHER_STAT_ADV_CAP_1000FDX:
686*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL,
687*3526Sxy150489 		    &phy_reg);
688*3526Sxy150489 		*val = (phy_reg & CR_1000T_FD_CAPS) ? 1 : 0;
689*3526Sxy150489 		break;
690*3526Sxy150489 
691*3526Sxy150489 	case ETHER_STAT_ADV_CAP_1000HDX:
692*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL,
693*3526Sxy150489 		    &phy_reg);
694*3526Sxy150489 		*val = (phy_reg & CR_1000T_HD_CAPS) ? 1 : 0;
695*3526Sxy150489 		break;
696*3526Sxy150489 
697*3526Sxy150489 	case ETHER_STAT_ADV_CAP_100FDX:
698*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
699*3526Sxy150489 		    &phy_reg);
700*3526Sxy150489 		*val = (phy_reg & NWAY_AR_100TX_FD_CAPS) ? 1 : 0;
701*3526Sxy150489 		break;
702*3526Sxy150489 
703*3526Sxy150489 	case ETHER_STAT_ADV_CAP_100HDX:
704*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
705*3526Sxy150489 		    &phy_reg);
706*3526Sxy150489 		*val = (phy_reg & NWAY_AR_100TX_HD_CAPS) ? 1 : 0;
707*3526Sxy150489 		break;
708*3526Sxy150489 
709*3526Sxy150489 	case ETHER_STAT_ADV_CAP_10FDX:
710*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
711*3526Sxy150489 		    &phy_reg);
712*3526Sxy150489 		*val = (phy_reg & NWAY_AR_10T_FD_CAPS) ? 1 : 0;
713*3526Sxy150489 		break;
714*3526Sxy150489 
715*3526Sxy150489 	case ETHER_STAT_ADV_CAP_10HDX:
716*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
717*3526Sxy150489 		    &phy_reg);
718*3526Sxy150489 		*val = (phy_reg & NWAY_AR_10T_HD_CAPS) ? 1 : 0;
719*3526Sxy150489 		break;
720*3526Sxy150489 
721*3526Sxy150489 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
722*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
723*3526Sxy150489 		    &phy_reg);
724*3526Sxy150489 		*val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
725*3526Sxy150489 		break;
726*3526Sxy150489 
727*3526Sxy150489 	case ETHER_STAT_ADV_CAP_PAUSE:
728*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
729*3526Sxy150489 		    &phy_reg);
730*3526Sxy150489 		*val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
731*3526Sxy150489 		break;
732*3526Sxy150489 
733*3526Sxy150489 	case ETHER_STAT_ADV_CAP_AUTONEG:
734*3526Sxy150489 		*val = Adapter->Shared.autoneg;
735*3526Sxy150489 		break;
736*3526Sxy150489 
737*3526Sxy150489 	case ETHER_STAT_LP_CAP_1000FDX:
738*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS,
739*3526Sxy150489 		    &phy_reg);
740*3526Sxy150489 		*val = (phy_reg & SR_1000T_LP_FD_CAPS) ? 1 : 0;
741*3526Sxy150489 		break;
742*3526Sxy150489 
743*3526Sxy150489 	case ETHER_STAT_LP_CAP_1000HDX:
744*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS,
745*3526Sxy150489 		    &phy_reg);
746*3526Sxy150489 		*val = (phy_reg & SR_1000T_LP_HD_CAPS) ? 1 : 0;
747*3526Sxy150489 		break;
748*3526Sxy150489 
749*3526Sxy150489 	case ETHER_STAT_LP_CAP_100FDX:
750*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
751*3526Sxy150489 		    &phy_reg);
752*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_100TX_FD_CAPS) ? 1 : 0;
753*3526Sxy150489 		break;
754*3526Sxy150489 
755*3526Sxy150489 	case ETHER_STAT_LP_CAP_100HDX:
756*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
757*3526Sxy150489 		    &phy_reg);
758*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_100TX_HD_CAPS) ? 1 : 0;
759*3526Sxy150489 		break;
760*3526Sxy150489 
761*3526Sxy150489 	case ETHER_STAT_LP_CAP_10FDX:
762*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
763*3526Sxy150489 		    &phy_reg);
764*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_10T_FD_CAPS) ? 1 : 0;
765*3526Sxy150489 		break;
766*3526Sxy150489 
767*3526Sxy150489 	case ETHER_STAT_LP_CAP_10HDX:
768*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
769*3526Sxy150489 		    &phy_reg);
770*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_10T_HD_CAPS) ? 1 : 0;
771*3526Sxy150489 		break;
772*3526Sxy150489 
773*3526Sxy150489 	case ETHER_STAT_LP_CAP_ASMPAUSE:
774*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
775*3526Sxy150489 		    &phy_reg);
776*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_ASM_DIR) ? 1 : 0;
777*3526Sxy150489 		break;
778*3526Sxy150489 
779*3526Sxy150489 	case ETHER_STAT_LP_CAP_PAUSE:
780*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY,
781*3526Sxy150489 		    &phy_reg);
782*3526Sxy150489 		*val = (phy_reg & NWAY_LPAR_PAUSE) ? 1 : 0;
783*3526Sxy150489 		break;
784*3526Sxy150489 
785*3526Sxy150489 	case ETHER_STAT_LP_CAP_AUTONEG:
786*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_EXP,
787*3526Sxy150489 		    &phy_reg);
788*3526Sxy150489 		*val = (phy_reg & NWAY_ER_LP_NWAY_CAPS) ? 1 : 0;
789*3526Sxy150489 		break;
790*3526Sxy150489 
791*3526Sxy150489 	case ETHER_STAT_LINK_ASMPAUSE:
792*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
793*3526Sxy150489 		    &phy_reg);
794*3526Sxy150489 		*val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0;
795*3526Sxy150489 		break;
796*3526Sxy150489 
797*3526Sxy150489 	case ETHER_STAT_LINK_PAUSE:
798*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV,
799*3526Sxy150489 		    &phy_reg);
800*3526Sxy150489 		*val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0;
801*3526Sxy150489 		break;
802*3526Sxy150489 
803*3526Sxy150489 	case ETHER_STAT_LINK_AUTONEG:
804*3526Sxy150489 		e1000_read_phy_reg(&Adapter->Shared, PHY_CTRL, &phy_reg);
805*3526Sxy150489 		*val = (phy_reg & MII_CR_AUTO_NEG_EN) ? 1 : 0;
806*3526Sxy150489 		break;
807*3526Sxy150489 
808*3526Sxy150489 	case ETHER_STAT_LINK_DUPLEX:
809*3526Sxy150489 		*val = (Adapter->link_duplex == FULL_DUPLEX) ?
810*3526Sxy150489 		    LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
811*3526Sxy150489 		break;
812*3526Sxy150489 
813*3526Sxy150489 	default:
814*3526Sxy150489 		return (ENOTSUP);
815*3526Sxy150489 	}
816*3526Sxy150489 
817*3526Sxy150489 	return (0);
818*3526Sxy150489 }
819*3526Sxy150489 
820*3526Sxy150489 /*
821*3526Sxy150489  * **********************************************************************
822*3526Sxy150489  * Name:	InitStatsCounters					*
823*3526Sxy150489  *									*
824*3526Sxy150489  * Description: This routine will create and initialize the kernel	*
825*3526Sxy150489  *	       statistics counters.					*
826*3526Sxy150489  *									*
827*3526Sxy150489  * Author:      Phil Cayton						*
828*3526Sxy150489  *									*
829*3526Sxy150489  * Born on Date:    7/13/98						*
830*3526Sxy150489  *									*
831*3526Sxy150489  * Arguments:								*
832*3526Sxy150489  *      Adapter - A pointer to our context sensitive "Adapter"		*
833*3526Sxy150489  *		structure.						*
834*3526Sxy150489  *									*
835*3526Sxy150489  * Returns:								*
836*3526Sxy150489  *      '0' if unable to create kernel statistics structure.		*
837*3526Sxy150489  *      '1' if creation and initialization successful			*
838*3526Sxy150489  *									*
839*3526Sxy150489  * File: e1000g_stat.c							*
840*3526Sxy150489  *									*
841*3526Sxy150489  * Modification log:							*
842*3526Sxy150489  * Date      Who  Description						*
843*3526Sxy150489  * --------  ---  ------------------------------------------------------*
844*3526Sxy150489  *									*
845*3526Sxy150489  * **********************************************************************
846*3526Sxy150489  */
847*3526Sxy150489 int
848*3526Sxy150489 InitStatsCounters(IN struct e1000g *Adapter)
849*3526Sxy150489 {
850*3526Sxy150489 	kstat_t *ksp;
851*3526Sxy150489 	e1000gstat *e1000g_ksp;
852*3526Sxy150489 
853*3526Sxy150489 	/*
854*3526Sxy150489 	 * Create and init kstat
855*3526Sxy150489 	 */
856*3526Sxy150489 	ksp = kstat_create(WSNAME, ddi_get_instance(Adapter->dip),
857*3526Sxy150489 	    "statistics", "net", KSTAT_TYPE_NAMED,
858*3526Sxy150489 	    sizeof (e1000gstat) / sizeof (kstat_named_t), 0);
859*3526Sxy150489 
860*3526Sxy150489 	if (ksp == NULL) {
861*3526Sxy150489 		e1000g_log(Adapter, CE_WARN,
862*3526Sxy150489 		    "Could not create kernel statistics\n");
863*3526Sxy150489 		return (DDI_FAILURE);
864*3526Sxy150489 	}
865*3526Sxy150489 
866*3526Sxy150489 	Adapter->e1000g_ksp = ksp;	/* Fill in the Adapters ksp */
867*3526Sxy150489 
868*3526Sxy150489 	e1000g_ksp = (e1000gstat *) ksp->ks_data;
869*3526Sxy150489 
870*3526Sxy150489 	/*
871*3526Sxy150489 	 * Initialize all the statistics
872*3526Sxy150489 	 */
873*3526Sxy150489 	kstat_named_init(&e1000g_ksp->link_up, "link_up",
874*3526Sxy150489 	    KSTAT_DATA_ULONG);
875*3526Sxy150489 
876*3526Sxy150489 	kstat_named_init(&e1000g_ksp->link_speed, "link_speed",
877*3526Sxy150489 	    KSTAT_DATA_ULONG);
878*3526Sxy150489 
879*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_none, "Rx No Data",
880*3526Sxy150489 	    KSTAT_DATA_ULONG);
881*3526Sxy150489 
882*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_error, "Rx Error",
883*3526Sxy150489 	    KSTAT_DATA_ULONG);
884*3526Sxy150489 
885*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_no_freepkt, "Rx Freelist Empty",
886*3526Sxy150489 	    KSTAT_DATA_ULONG);
887*3526Sxy150489 
888*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_avail_freepkt, "Rx Freelist Avail",
889*3526Sxy150489 	    KSTAT_DATA_ULONG);
890*3526Sxy150489 
891*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_esballoc_fail, "Rx Desballoc Failure",
892*3526Sxy150489 	    KSTAT_DATA_ULONG);
893*3526Sxy150489 
894*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_exceed_pkt, "Rx Exceed Max Pkt Count",
895*3526Sxy150489 	    KSTAT_DATA_ULONG);
896*3526Sxy150489 
897*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_multi_desc, "Rx Span Multi Desc",
898*3526Sxy150489 	    KSTAT_DATA_ULONG);
899*3526Sxy150489 
900*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_allocb_fail, "Rx Allocb Failure",
901*3526Sxy150489 	    KSTAT_DATA_ULONG);
902*3526Sxy150489 
903*3526Sxy150489 	kstat_named_init(&e1000g_ksp->rx_seq_intr, "Rx Seq Err Intr",
904*3526Sxy150489 	    KSTAT_DATA_ULONG);
905*3526Sxy150489 
906*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_no_desc, "Tx No Desc",
907*3526Sxy150489 	    KSTAT_DATA_ULONG);
908*3526Sxy150489 
909*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_no_swpkt, "Tx No Buffer",
910*3526Sxy150489 	    KSTAT_DATA_ULONG);
911*3526Sxy150489 
912*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_lack_desc, "Tx Desc Insufficient",
913*3526Sxy150489 	    KSTAT_DATA_ULONG);
914*3526Sxy150489 
915*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_send_fail,
916*3526Sxy150489 	    "Tx Send Failure", KSTAT_DATA_ULONG);
917*3526Sxy150489 
918*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_multi_cookie,
919*3526Sxy150489 	    "Tx Bind Multi Cookies", KSTAT_DATA_ULONG);
920*3526Sxy150489 
921*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_over_size, "Tx Pkt Over Size",
922*3526Sxy150489 	    KSTAT_DATA_ULONG);
923*3526Sxy150489 
924*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_under_size, "Tx Pkt Under Size",
925*3526Sxy150489 	    KSTAT_DATA_ULONG);
926*3526Sxy150489 
927*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_copy, "Tx Send Copy",
928*3526Sxy150489 	    KSTAT_DATA_ULONG);
929*3526Sxy150489 
930*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_bind, "Tx Send Bind",
931*3526Sxy150489 	    KSTAT_DATA_ULONG);
932*3526Sxy150489 
933*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_multi_copy, "Tx Copy Multi Frags",
934*3526Sxy150489 	    KSTAT_DATA_ULONG);
935*3526Sxy150489 
936*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_reschedule, "Tx Reschedule",
937*3526Sxy150489 	    KSTAT_DATA_ULONG);
938*3526Sxy150489 
939*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_empty_frags, "Tx Empty Frags",
940*3526Sxy150489 	    KSTAT_DATA_ULONG);
941*3526Sxy150489 
942*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_exceed_frags, "Tx Exceed Max Frags",
943*3526Sxy150489 	    KSTAT_DATA_ULONG);
944*3526Sxy150489 
945*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_recycle,
946*3526Sxy150489 	    "Tx Desc Recycle", KSTAT_DATA_ULONG);
947*3526Sxy150489 
948*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_recycle_retry,
949*3526Sxy150489 	    "Tx Desc Recycle Retry", KSTAT_DATA_ULONG);
950*3526Sxy150489 
951*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_recycle_intr,
952*3526Sxy150489 	    "Tx Desc Recycle Intr", KSTAT_DATA_ULONG);
953*3526Sxy150489 
954*3526Sxy150489 	kstat_named_init(&e1000g_ksp->tx_recycle_none,
955*3526Sxy150489 	    "Tx Desc Recycled None", KSTAT_DATA_ULONG);
956*3526Sxy150489 
957*3526Sxy150489 	kstat_named_init(&e1000g_ksp->StallWatchdog,
958*3526Sxy150489 	    "Tx Stall Watchdog", KSTAT_DATA_ULONG);
959*3526Sxy150489 
960*3526Sxy150489 	kstat_named_init(&e1000g_ksp->reset_count,
961*3526Sxy150489 	    "Reset Count", KSTAT_DATA_ULONG);
962*3526Sxy150489 
963*3526Sxy150489 	kstat_named_init(&e1000g_ksp->intr_type,
964*3526Sxy150489 	    "Interrupt Type", KSTAT_DATA_ULONG);
965*3526Sxy150489 
966*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Mpc, "Recv_Missed_Packets",
967*3526Sxy150489 	    KSTAT_DATA_ULONG);
968*3526Sxy150489 
969*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Symerrs, "Recv_Symbol_Errors",
970*3526Sxy150489 	    KSTAT_DATA_ULONG);
971*3526Sxy150489 
972*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Rlec, "Recv_Length_Errors",
973*3526Sxy150489 	    KSTAT_DATA_ULONG);
974*3526Sxy150489 
975*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Xonrxc, "XONs_Recvd",
976*3526Sxy150489 	    KSTAT_DATA_ULONG);
977*3526Sxy150489 
978*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Xontxc, "XONs_Xmitd",
979*3526Sxy150489 	    KSTAT_DATA_ULONG);
980*3526Sxy150489 
981*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Xoffrxc, "XOFFs_Recvd",
982*3526Sxy150489 	    KSTAT_DATA_ULONG);
983*3526Sxy150489 
984*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Xofftxc, "XOFFs_Xmitd",
985*3526Sxy150489 	    KSTAT_DATA_ULONG);
986*3526Sxy150489 
987*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Fcruc, "Recv_Unsupport_FC_Pkts",
988*3526Sxy150489 	    KSTAT_DATA_ULONG);
989*3526Sxy150489 
990*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc64, "Pkts_Recvd_(  64b)",
991*3526Sxy150489 	    KSTAT_DATA_ULONG);
992*3526Sxy150489 
993*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc127, "Pkts_Recvd_(  65- 127b)",
994*3526Sxy150489 	    KSTAT_DATA_ULONG);
995*3526Sxy150489 
996*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc255, "Pkts_Recvd_( 127- 255b)",
997*3526Sxy150489 	    KSTAT_DATA_ULONG);
998*3526Sxy150489 
999*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc511, "Pkts_Recvd_( 256- 511b)",
1000*3526Sxy150489 	    KSTAT_DATA_ULONG);
1001*3526Sxy150489 
1002*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc1023, "Pkts_Recvd_( 511-1023b)",
1003*3526Sxy150489 	    KSTAT_DATA_ULONG);
1004*3526Sxy150489 
1005*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Prc1522, "Pkts_Recvd_(1024-1522b)",
1006*3526Sxy150489 	    KSTAT_DATA_ULONG);
1007*3526Sxy150489 
1008*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Gprc, "Good_Pkts_Recvd",
1009*3526Sxy150489 	    KSTAT_DATA_ULONG);
1010*3526Sxy150489 
1011*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Gptc, "Good_Pkts_Xmitd",
1012*3526Sxy150489 	    KSTAT_DATA_ULONG);
1013*3526Sxy150489 
1014*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Gorl, "Good_Octets_Recvd_Lo",
1015*3526Sxy150489 	    KSTAT_DATA_ULONG);
1016*3526Sxy150489 
1017*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Gorh, "Good_Octets_Recvd_Hi",
1018*3526Sxy150489 	    KSTAT_DATA_ULONG);
1019*3526Sxy150489 
1020*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Gotl, "Good_Octets_Xmitd_Lo",
1021*3526Sxy150489 	    KSTAT_DATA_ULONG);
1022*3526Sxy150489 
1023*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi",
1024*3526Sxy150489 	    KSTAT_DATA_ULONG);
1025*3526Sxy150489 
1026*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ruc, "Recv_Undersize",
1027*3526Sxy150489 	    KSTAT_DATA_ULONG);
1028*3526Sxy150489 
1029*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag",
1030*3526Sxy150489 	    KSTAT_DATA_ULONG);
1031*3526Sxy150489 
1032*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Roc, "Recv_Oversize",
1033*3526Sxy150489 	    KSTAT_DATA_ULONG);
1034*3526Sxy150489 
1035*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Rjc, "Recv_Jabber",
1036*3526Sxy150489 	    KSTAT_DATA_ULONG);
1037*3526Sxy150489 
1038*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Torl, "Total_Octets_Recvd_Lo",
1039*3526Sxy150489 	    KSTAT_DATA_ULONG);
1040*3526Sxy150489 
1041*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Torh, "Total_Octets_Recvd_Hi",
1042*3526Sxy150489 	    KSTAT_DATA_ULONG);
1043*3526Sxy150489 
1044*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Totl, "Total_Octets_Xmitd_Lo",
1045*3526Sxy150489 	    KSTAT_DATA_ULONG);
1046*3526Sxy150489 
1047*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Toth, "Total_Octets_Xmitd_Hi",
1048*3526Sxy150489 	    KSTAT_DATA_ULONG);
1049*3526Sxy150489 
1050*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Tpr, "Total_Packets_Recvd",
1051*3526Sxy150489 	    KSTAT_DATA_ULONG);
1052*3526Sxy150489 
1053*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Tpt, "Total_Packets_Xmitd",
1054*3526Sxy150489 	    KSTAT_DATA_ULONG);
1055*3526Sxy150489 
1056*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_(  64b)",
1057*3526Sxy150489 	    KSTAT_DATA_ULONG);
1058*3526Sxy150489 
1059*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc127, "Pkts_Xmitd_(  65- 127b)",
1060*3526Sxy150489 	    KSTAT_DATA_ULONG);
1061*3526Sxy150489 
1062*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc255, "Pkts_Xmitd_( 128- 255b)",
1063*3526Sxy150489 	    KSTAT_DATA_ULONG);
1064*3526Sxy150489 
1065*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc511, "Pkts_Xmitd_( 255- 511b)",
1066*3526Sxy150489 	    KSTAT_DATA_ULONG);
1067*3526Sxy150489 
1068*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc1023, "Pkts_Xmitd_( 512-1023b)",
1069*3526Sxy150489 	    KSTAT_DATA_ULONG);
1070*3526Sxy150489 
1071*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Ptc1522, "Pkts_Xmitd_(1024-1522b)",
1072*3526Sxy150489 	    KSTAT_DATA_ULONG);
1073*3526Sxy150489 
1074*3526Sxy150489 	/*
1075*3526Sxy150489 	 * Livengood Initializations
1076*3526Sxy150489 	 */
1077*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Tncrs, "Xmit_with_No_CRS",
1078*3526Sxy150489 	    KSTAT_DATA_ULONG);
1079*3526Sxy150489 
1080*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Tsctc, "Xmit_TCP_Seg_Contexts",
1081*3526Sxy150489 	    KSTAT_DATA_ULONG);
1082*3526Sxy150489 
1083*3526Sxy150489 	kstat_named_init(&e1000g_ksp->Tsctfc, "Xmit_TCP_Seg_Contexts_Fail",
1084*3526Sxy150489 	    KSTAT_DATA_ULONG);
1085*3526Sxy150489 
1086*3526Sxy150489 	/*
1087*3526Sxy150489 	 * Jumbo Frame Counters
1088*3526Sxy150489 	 */
1089*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboTx_4K, "Jumbo Tx Frame  4K",
1090*3526Sxy150489 	    KSTAT_DATA_ULONG);
1091*3526Sxy150489 
1092*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboRx_4K, "Jumbo Rx Frame  4K",
1093*3526Sxy150489 	    KSTAT_DATA_ULONG);
1094*3526Sxy150489 
1095*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboTx_8K, "Jumbo Tx Frame  8K",
1096*3526Sxy150489 	    KSTAT_DATA_ULONG);
1097*3526Sxy150489 
1098*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboRx_8K, "Jumbo Rx Frame  8K",
1099*3526Sxy150489 	    KSTAT_DATA_ULONG);
1100*3526Sxy150489 
1101*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboTx_16K, "Jumbo Tx Frame 16K",
1102*3526Sxy150489 	    KSTAT_DATA_ULONG);
1103*3526Sxy150489 
1104*3526Sxy150489 	kstat_named_init(&e1000g_ksp->JumboRx_16K, "Jumbo Rx Frame 16K",
1105*3526Sxy150489 	    KSTAT_DATA_ULONG);
1106*3526Sxy150489 
1107*3526Sxy150489 	/*
1108*3526Sxy150489 	 * Function to provide kernel stat update on demand
1109*3526Sxy150489 	 */
1110*3526Sxy150489 	ksp->ks_update = UpdateStatsCounters;
1111*3526Sxy150489 
1112*3526Sxy150489 	/*
1113*3526Sxy150489 	 * Pointer into provider's raw statistics
1114*3526Sxy150489 	 */
1115*3526Sxy150489 	ksp->ks_private = (void *)Adapter;
1116*3526Sxy150489 
1117*3526Sxy150489 	/*
1118*3526Sxy150489 	 * Add kstat to systems kstat chain
1119*3526Sxy150489 	 */
1120*3526Sxy150489 	kstat_install(ksp);
1121*3526Sxy150489 
1122*3526Sxy150489 	return (DDI_SUCCESS);
1123*3526Sxy150489 }
1124