xref: /illumos-gate/usr/src/uts/common/io/ixgbe/ixgbe_stat.c (revision 5b6dd21f5401160f9a62ac2e76a858c2bc105370)
19da57d7bSbt150084 /*
29da57d7bSbt150084  * CDDL HEADER START
39da57d7bSbt150084  *
49da57d7bSbt150084  * The contents of this file are subject to the terms of the
59da57d7bSbt150084  * Common Development and Distribution License (the "License").
69da57d7bSbt150084  * You may not use this file except in compliance with the License.
79da57d7bSbt150084  *
8da14cebeSEric Cheng  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da14cebeSEric Cheng  * or http://www.opensolaris.org/os/licensing.
109da57d7bSbt150084  * See the License for the specific language governing permissions
119da57d7bSbt150084  * and limitations under the License.
129da57d7bSbt150084  *
13da14cebeSEric Cheng  * When distributing Covered Code, include this CDDL HEADER in each
14da14cebeSEric Cheng  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159da57d7bSbt150084  * If applicable, add the following below this CDDL HEADER, with the
169da57d7bSbt150084  * fields enclosed by brackets "[]" replaced with your own identifying
179da57d7bSbt150084  * information: Portions Copyright [yyyy] [name of copyright owner]
189da57d7bSbt150084  *
199da57d7bSbt150084  * CDDL HEADER END
209da57d7bSbt150084  */
219da57d7bSbt150084 
229da57d7bSbt150084 /*
23*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China  * Copyright(c) 2007-2010 Intel Corporation. All rights reserved.
24*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China  */
25*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
26*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China /*
27*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28da14cebeSEric Cheng  */
299da57d7bSbt150084 
309da57d7bSbt150084 #include "ixgbe_sw.h"
319da57d7bSbt150084 
329da57d7bSbt150084 /*
339da57d7bSbt150084  * Update driver private statistics.
349da57d7bSbt150084  */
359da57d7bSbt150084 static int
369da57d7bSbt150084 ixgbe_update_stats(kstat_t *ks, int rw)
379da57d7bSbt150084 {
389da57d7bSbt150084 	ixgbe_t *ixgbe;
399da57d7bSbt150084 	struct ixgbe_hw *hw;
409da57d7bSbt150084 	ixgbe_stat_t *ixgbe_ks;
419da57d7bSbt150084 	int i;
429da57d7bSbt150084 
439da57d7bSbt150084 	if (rw == KSTAT_WRITE)
449da57d7bSbt150084 		return (EACCES);
459da57d7bSbt150084 
469da57d7bSbt150084 	ixgbe = (ixgbe_t *)ks->ks_private;
479da57d7bSbt150084 	ixgbe_ks = (ixgbe_stat_t *)ks->ks_data;
489da57d7bSbt150084 	hw = &ixgbe->hw;
499da57d7bSbt150084 
509da57d7bSbt150084 	mutex_enter(&ixgbe->gen_lock);
519da57d7bSbt150084 
529da57d7bSbt150084 	/*
539da57d7bSbt150084 	 * Basic information
549da57d7bSbt150084 	 */
559da57d7bSbt150084 	ixgbe_ks->link_speed.value.ui64 = ixgbe->link_speed;
569da57d7bSbt150084 	ixgbe_ks->reset_count.value.ui64 = ixgbe->reset_count;
57ffd8e883SWinson Wang - Sun Microsystems - Beijing China 	ixgbe_ks->lroc.value.ui64 = ixgbe->lro_pkt_count;
589da57d7bSbt150084 
593cfa0eb9Schenlu chen - Sun Microsystems - Beijing China #ifdef IXGBE_DEBUG
609da57d7bSbt150084 	ixgbe_ks->rx_frame_error.value.ui64 = 0;
619da57d7bSbt150084 	ixgbe_ks->rx_cksum_error.value.ui64 = 0;
629da57d7bSbt150084 	ixgbe_ks->rx_exceed_pkt.value.ui64 = 0;
639da57d7bSbt150084 	for (i = 0; i < ixgbe->num_rx_rings; i++) {
649da57d7bSbt150084 		ixgbe_ks->rx_frame_error.value.ui64 +=
659da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_frame_error;
669da57d7bSbt150084 		ixgbe_ks->rx_cksum_error.value.ui64 +=
679da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_cksum_error;
689da57d7bSbt150084 		ixgbe_ks->rx_exceed_pkt.value.ui64 +=
699da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_exceed_pkt;
709da57d7bSbt150084 	}
719da57d7bSbt150084 
729da57d7bSbt150084 	ixgbe_ks->tx_overload.value.ui64 = 0;
739da57d7bSbt150084 	ixgbe_ks->tx_fail_no_tbd.value.ui64 = 0;
749da57d7bSbt150084 	ixgbe_ks->tx_fail_no_tcb.value.ui64 = 0;
759da57d7bSbt150084 	ixgbe_ks->tx_fail_dma_bind.value.ui64 = 0;
769da57d7bSbt150084 	ixgbe_ks->tx_reschedule.value.ui64 = 0;
779da57d7bSbt150084 	for (i = 0; i < ixgbe->num_tx_rings; i++) {
789da57d7bSbt150084 		ixgbe_ks->tx_overload.value.ui64 +=
799da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_overload;
809da57d7bSbt150084 		ixgbe_ks->tx_fail_no_tbd.value.ui64 +=
819da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_no_tbd;
829da57d7bSbt150084 		ixgbe_ks->tx_fail_no_tcb.value.ui64 +=
839da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_no_tcb;
849da57d7bSbt150084 		ixgbe_ks->tx_fail_dma_bind.value.ui64 +=
859da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_dma_bind;
869da57d7bSbt150084 		ixgbe_ks->tx_reschedule.value.ui64 +=
879da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_reschedule;
889da57d7bSbt150084 	}
89da14cebeSEric Cheng #endif
909da57d7bSbt150084 
919da57d7bSbt150084 	/*
929da57d7bSbt150084 	 * Hardware calculated statistics.
939da57d7bSbt150084 	 */
94da14cebeSEric Cheng 	ixgbe_ks->gprc.value.ui64 = 0;
95da14cebeSEric Cheng 	ixgbe_ks->gptc.value.ui64 = 0;
96da14cebeSEric Cheng 	ixgbe_ks->tor.value.ui64 = 0;
97da14cebeSEric Cheng 	ixgbe_ks->tot.value.ui64 = 0;
989da57d7bSbt150084 	for (i = 0; i < 16; i++) {
99da14cebeSEric Cheng 		ixgbe_ks->qprc[i].value.ui64 +=
100da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QPRC(i));
101da14cebeSEric Cheng 		ixgbe_ks->gprc.value.ui64 += ixgbe_ks->qprc[i].value.ui64;
102da14cebeSEric Cheng 		ixgbe_ks->qptc[i].value.ui64 +=
103da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QPTC(i));
104da14cebeSEric Cheng 		ixgbe_ks->gptc.value.ui64 += ixgbe_ks->qptc[i].value.ui64;
105da14cebeSEric Cheng 		ixgbe_ks->qbrc[i].value.ui64 +=
106da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QBRC(i));
107da14cebeSEric Cheng 		ixgbe_ks->tor.value.ui64 += ixgbe_ks->qbrc[i].value.ui64;
108*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		switch (hw->mac.type) {
109*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		case ixgbe_mac_82598EB:
110da14cebeSEric Cheng 			ixgbe_ks->qbtc[i].value.ui64 +=
111da14cebeSEric Cheng 			    IXGBE_READ_REG(hw, IXGBE_QBTC(i));
112*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			break;
113*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
114*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		case ixgbe_mac_82599EB:
115*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			ixgbe_ks->qbtc[i].value.ui64 +=
116*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			    IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
117*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			ixgbe_ks->qbtc[i].value.ui64 +=
118*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			    ((uint64_t)((IXGBE_READ_REG(hw,
119*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			    IXGBE_QBTC_H(i))) & 0xF) << 32);
120*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			break;
121*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
122*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		default:
123*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			break;
12473cd555cSBin Tu - Sun Microsystems - Beijing China 		}
125da14cebeSEric Cheng 		ixgbe_ks->tot.value.ui64 += ixgbe_ks->qbtc[i].value.ui64;
1269da57d7bSbt150084 	}
127f27d3025Sgg161487 	/*
128f27d3025Sgg161487 	 * This is a Workaround:
129f27d3025Sgg161487 	 * Currently h/w GORCH, GOTCH, TORH registers are not
130f27d3025Sgg161487 	 * correctly implemented. We found that the values in
131f27d3025Sgg161487 	 * these registers are same as those in corresponding
132f27d3025Sgg161487 	 * *L registers (i.e. GORCL, GOTCL, and TORL). Here the
133f27d3025Sgg161487 	 * gor and got stat data will not be retrieved through
134f27d3025Sgg161487 	 * GORC{H/L} and GOTC{H/L} registers but be obtained by
135f27d3025Sgg161487 	 * simply assigning tor/tot stat data, so the gor/got
136f27d3025Sgg161487 	 * stat data will not be accurate.
137f27d3025Sgg161487 	 */
1389da57d7bSbt150084 	ixgbe_ks->gor.value.ui64 = ixgbe_ks->tor.value.ui64;
139f27d3025Sgg161487 	ixgbe_ks->got.value.ui64 = ixgbe_ks->tot.value.ui64;
1409da57d7bSbt150084 
1419da57d7bSbt150084 	ixgbe_ks->prc64.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC64);
1429da57d7bSbt150084 	ixgbe_ks->prc127.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC127);
1439da57d7bSbt150084 	ixgbe_ks->prc255.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC255);
1449da57d7bSbt150084 	ixgbe_ks->prc511.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC511);
1459da57d7bSbt150084 	ixgbe_ks->prc1023.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC1023);
1469da57d7bSbt150084 	ixgbe_ks->prc1522.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC1522);
1479da57d7bSbt150084 	ixgbe_ks->ptc64.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC64);
1489da57d7bSbt150084 	ixgbe_ks->ptc127.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC127);
1499da57d7bSbt150084 	ixgbe_ks->ptc255.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC255);
1509da57d7bSbt150084 	ixgbe_ks->ptc511.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC511);
1519da57d7bSbt150084 	ixgbe_ks->ptc1023.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC1023);
1529da57d7bSbt150084 	ixgbe_ks->ptc1522.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC1522);
1539da57d7bSbt150084 
1549da57d7bSbt150084 	ixgbe_ks->mspdc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MSPDC);
1559da57d7bSbt150084 	for (i = 0; i < 8; i++)
1569da57d7bSbt150084 		ixgbe_ks->mpc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MPC(i));
1579da57d7bSbt150084 	ixgbe_ks->mlfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MLFC);
1589da57d7bSbt150084 	ixgbe_ks->mrfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MRFC);
1599da57d7bSbt150084 	ixgbe_ks->rlec.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RLEC);
1609da57d7bSbt150084 	ixgbe_ks->lxontxc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_LXONTXC);
161*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	switch (hw->mac.type) {
162*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	case ixgbe_mac_82598EB:
16373cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxonrxc.value.ui64 += IXGBE_READ_REG(hw,
16473cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXONRXC);
165*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
166*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
167*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	case ixgbe_mac_82599EB:
16873cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxonrxc.value.ui64 += IXGBE_READ_REG(hw,
16973cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXONRXCNT);
170*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
171*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
172*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	default:
173*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
17473cd555cSBin Tu - Sun Microsystems - Beijing China 	}
1759da57d7bSbt150084 	ixgbe_ks->lxofftxc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
176*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	switch (hw->mac.type) {
177*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	case ixgbe_mac_82598EB:
17873cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxoffrxc.value.ui64 += IXGBE_READ_REG(hw,
17973cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXOFFRXC);
180*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
181*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
182*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	case ixgbe_mac_82599EB:
18373cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxoffrxc.value.ui64 += IXGBE_READ_REG(hw,
18473cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXOFFRXCNT);
185*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
186*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
187*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 	default:
188*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 		break;
18973cd555cSBin Tu - Sun Microsystems - Beijing China 	}
1909da57d7bSbt150084 	ixgbe_ks->ruc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RUC);
1919da57d7bSbt150084 	ixgbe_ks->rfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RFC);
1929da57d7bSbt150084 	ixgbe_ks->roc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_ROC);
1939da57d7bSbt150084 	ixgbe_ks->rjc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RJC);
1949da57d7bSbt150084 
1959da57d7bSbt150084 	mutex_exit(&ixgbe->gen_lock);
1969da57d7bSbt150084 
1979da57d7bSbt150084 	if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK)
1989da57d7bSbt150084 		ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_UNAFFECTED);
1999da57d7bSbt150084 
2009da57d7bSbt150084 	return (0);
2019da57d7bSbt150084 }
2029da57d7bSbt150084 
2039da57d7bSbt150084 /*
2049da57d7bSbt150084  * Create and initialize the driver private statistics.
2059da57d7bSbt150084  */
2069da57d7bSbt150084 int
2079da57d7bSbt150084 ixgbe_init_stats(ixgbe_t *ixgbe)
2089da57d7bSbt150084 {
2099da57d7bSbt150084 	kstat_t *ks;
2109da57d7bSbt150084 	ixgbe_stat_t *ixgbe_ks;
2119da57d7bSbt150084 
2129da57d7bSbt150084 	/*
2139da57d7bSbt150084 	 * Create and init kstat
2149da57d7bSbt150084 	 */
2159da57d7bSbt150084 	ks = kstat_create(MODULE_NAME, ddi_get_instance(ixgbe->dip),
2169da57d7bSbt150084 	    "statistics", "net", KSTAT_TYPE_NAMED,
2179da57d7bSbt150084 	    sizeof (ixgbe_stat_t) / sizeof (kstat_named_t), 0);
2189da57d7bSbt150084 
2199da57d7bSbt150084 	if (ks == NULL) {
2209da57d7bSbt150084 		ixgbe_error(ixgbe,
2219da57d7bSbt150084 		    "Could not create kernel statistics");
2229da57d7bSbt150084 		return (IXGBE_FAILURE);
2239da57d7bSbt150084 	}
2249da57d7bSbt150084 
2259da57d7bSbt150084 	ixgbe->ixgbe_ks = ks;
2269da57d7bSbt150084 
2279da57d7bSbt150084 	ixgbe_ks = (ixgbe_stat_t *)ks->ks_data;
2289da57d7bSbt150084 
2299da57d7bSbt150084 	/*
2309da57d7bSbt150084 	 * Initialize all the statistics.
2319da57d7bSbt150084 	 */
2329da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->link_speed, "link_speed",
2339da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2349da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->reset_count, "reset_count",
2359da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2363cfa0eb9Schenlu chen - Sun Microsystems - Beijing China 
2373cfa0eb9Schenlu chen - Sun Microsystems - Beijing China #ifdef IXGBE_DEBUG
2389da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_frame_error, "rx_frame_error",
2399da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2409da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_cksum_error, "rx_cksum_error",
2419da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2429da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_exceed_pkt, "rx_exceed_pkt",
2439da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2449da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_overload, "tx_overload",
2459da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2469da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_no_tbd, "tx_fail_no_tbd",
2479da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2489da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_no_tcb, "tx_fail_no_tcb",
2499da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2509da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_dma_bind, "tx_fail_dma_bind",
2519da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2529da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_reschedule, "tx_reschedule",
2539da57d7bSbt150084 	    KSTAT_DATA_UINT64);
254da14cebeSEric Cheng #endif
2559da57d7bSbt150084 
2569da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gprc, "good_pkts_recvd",
2579da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2589da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gptc, "good_pkts_xmitd",
2599da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2609da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gor, "good_octets_recvd",
2619da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2629da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->got, "good_octets_xmitd",
2639da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2649da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc64, "pkts_recvd_(  64b)",
2659da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2669da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc127, "pkts_recvd_(  65- 127b)",
2679da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2689da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc255, "pkts_recvd_( 127- 255b)",
2699da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2709da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc511, "pkts_recvd_( 256- 511b)",
2719da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2729da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc1023, "pkts_recvd_( 511-1023b)",
2739da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2749da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc1522, "pkts_recvd_(1024-1522b)",
2759da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2769da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc64, "pkts_xmitd_(  64b)",
2779da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2789da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc127, "pkts_xmitd_(  65- 127b)",
2799da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2809da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc255, "pkts_xmitd_( 128- 255b)",
2819da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2829da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc511, "pkts_xmitd_( 255- 511b)",
2839da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2849da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc1023, "pkts_xmitd_( 512-1023b)",
2859da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2869da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc1522, "pkts_xmitd_(1024-1522b)",
2879da57d7bSbt150084 	    KSTAT_DATA_UINT64);
288da14cebeSEric Cheng 
289da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[0], "queue_pkts_recvd [ 0]",
290da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
291da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[1], "queue_pkts_recvd [ 1]",
292da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
293da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[2], "queue_pkts_recvd [ 2]",
294da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
295da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[3], "queue_pkts_recvd [ 3]",
296da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
297da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[4], "queue_pkts_recvd [ 4]",
298da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
299da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[5], "queue_pkts_recvd [ 5]",
300da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
301da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[6], "queue_pkts_recvd [ 6]",
302da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
303da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[7], "queue_pkts_recvd [ 7]",
304da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
305da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[8], "queue_pkts_recvd [ 8]",
306da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
307da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[9], "queue_pkts_recvd [ 9]",
308da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
309da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[10], "queue_pkts_recvd [10]",
310da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
311da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[11], "queue_pkts_recvd [11]",
312da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
313da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[12], "queue_pkts_recvd [12]",
314da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
315da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[13], "queue_pkts_recvd [13]",
316da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
317da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[14], "queue_pkts_recvd [14]",
318da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
319da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[15], "queue_pkts_recvd [15]",
320da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
321da14cebeSEric Cheng 
322da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[0], "queue_pkts_xmitd [ 0]",
323da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
324da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[1], "queue_pkts_xmitd [ 1]",
325da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
326da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[2], "queue_pkts_xmitd [ 2]",
327da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
328da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[3], "queue_pkts_xmitd [ 3]",
329da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
330da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[4], "queue_pkts_xmitd [ 4]",
331da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
332da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[5], "queue_pkts_xmitd [ 5]",
333da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
334da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[6], "queue_pkts_xmitd [ 6]",
335da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
336da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[7], "queue_pkts_xmitd [ 7]",
337da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
338da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[8], "queue_pkts_xmitd [ 8]",
339da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
340da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[9], "queue_pkts_xmitd [ 9]",
341da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
342da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[10], "queue_pkts_xmitd [10]",
343da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
344da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[11], "queue_pkts_xmitd [11]",
345da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
346da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[12], "queue_pkts_xmitd [12]",
347da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
348da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[13], "queue_pkts_xmitd [13]",
349da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
350da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[14], "queue_pkts_xmitd [14]",
351da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
352da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[15], "queue_pkts_xmitd [15]",
353da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
354da14cebeSEric Cheng 
355da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[0], "queue_bytes_recvd [ 0]",
356da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
357da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[1], "queue_bytes_recvd [ 1]",
358da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
359da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[2], "queue_bytes_recvd [ 2]",
360da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
361da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[3], "queue_bytes_recvd [ 3]",
362da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
363da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[4], "queue_bytes_recvd [ 4]",
364da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
365da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[5], "queue_bytes_recvd [ 5]",
366da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
367da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[6], "queue_bytes_recvd [ 6]",
368da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
369da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[7], "queue_bytes_recvd [ 7]",
370da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
371da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[8], "queue_bytes_recvd [ 8]",
372da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
373da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[9], "queue_bytes_recvd [ 9]",
374da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
375da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[10], "queue_bytes_recvd [10]",
376da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
377da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[11], "queue_bytes_recvd [11]",
378da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
379da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[12], "queue_bytes_recvd [12]",
380da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
381da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[13], "queue_bytes_recvd [13]",
382da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
383da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[14], "queue_bytes_recvd [14]",
384da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
385da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[15], "queue_bytes_recvd [15]",
386da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
387da14cebeSEric Cheng 
388da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[0], "queue_bytes_xmitd [ 0]",
389da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
390da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[1], "queue_bytes_xmitd [ 1]",
391da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
392da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[2], "queue_bytes_xmitd [ 2]",
393da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
394da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[3], "queue_bytes_xmitd [ 3]",
395da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
396da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[4], "queue_bytes_xmitd [ 4]",
397da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
398da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[5], "queue_bytes_xmitd [ 5]",
399da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
400da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[6], "queue_bytes_xmitd [ 6]",
401da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
402da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[7], "queue_bytes_xmitd [ 7]",
403da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
404da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[8], "queue_bytes_xmitd [ 8]",
405da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
406da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[9], "queue_bytes_xmitd [ 9]",
407da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
408da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[10], "queue_bytes_xmitd [10]",
409da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
410da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[11], "queue_bytes_xmitd [11]",
411da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
412da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[12], "queue_bytes_xmitd [12]",
413da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
414da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[13], "queue_bytes_xmitd [13]",
415da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
416da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[14], "queue_bytes_xmitd [14]",
417da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
418da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[15], "queue_bytes_xmitd [15]",
419da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
4209da57d7bSbt150084 
4219da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mspdc, "mac_short_packet_discard",
4229da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4239da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mpc, "missed_packets",
4249da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4259da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mlfc, "mac_local_fault",
4269da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4279da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mrfc, "mac_remote_fault",
4289da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4299da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rlec, "recv_length_err",
4309da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4319da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxontxc, "link_xon_xmitd",
4329da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4339da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxonrxc, "link_xon_recvd",
4349da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4359da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxofftxc, "link_xoff_xmitd",
4369da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4379da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxoffrxc, "link_xoff_recvd",
4389da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4399da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ruc, "recv_undersize",
4409da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4419da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rfc, "recv_fragment",
4429da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4439da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->roc, "recv_oversize",
4449da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4459da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rjc, "recv_jabber",
4469da57d7bSbt150084 	    KSTAT_DATA_UINT64);
44713740cb2SPaul Guo 	kstat_named_init(&ixgbe_ks->rnbc, "recv_no_buffer",
44813740cb2SPaul Guo 	    KSTAT_DATA_UINT64);
449ffd8e883SWinson Wang - Sun Microsystems - Beijing China 	kstat_named_init(&ixgbe_ks->lroc, "lro_pkt_count",
450ffd8e883SWinson Wang - Sun Microsystems - Beijing China 	    KSTAT_DATA_UINT64);
4519da57d7bSbt150084 	/*
4529da57d7bSbt150084 	 * Function to provide kernel stat update on demand
4539da57d7bSbt150084 	 */
4549da57d7bSbt150084 	ks->ks_update = ixgbe_update_stats;
4559da57d7bSbt150084 
4569da57d7bSbt150084 	ks->ks_private = (void *)ixgbe;
4579da57d7bSbt150084 
4589da57d7bSbt150084 	/*
4599da57d7bSbt150084 	 * Add kstat to systems kstat chain
4609da57d7bSbt150084 	 */
4619da57d7bSbt150084 	kstat_install(ks);
4629da57d7bSbt150084 
4639da57d7bSbt150084 	return (IXGBE_SUCCESS);
4649da57d7bSbt150084 }
4650dc2366fSVenugopal Iyer 
4660dc2366fSVenugopal Iyer /*
4670dc2366fSVenugopal Iyer  * Retrieve a value for one of the statistics.
4680dc2366fSVenugopal Iyer  */
4690dc2366fSVenugopal Iyer int
4700dc2366fSVenugopal Iyer ixgbe_m_stat(void *arg, uint_t stat, uint64_t *val)
4710dc2366fSVenugopal Iyer {
4720dc2366fSVenugopal Iyer 	ixgbe_t *ixgbe = (ixgbe_t *)arg;
4730dc2366fSVenugopal Iyer 	struct ixgbe_hw *hw = &ixgbe->hw;
4740dc2366fSVenugopal Iyer 	ixgbe_stat_t *ixgbe_ks;
4750dc2366fSVenugopal Iyer 	int i;
4760dc2366fSVenugopal Iyer 
4770dc2366fSVenugopal Iyer 	ixgbe_ks = (ixgbe_stat_t *)ixgbe->ixgbe_ks->ks_data;
4780dc2366fSVenugopal Iyer 
4790dc2366fSVenugopal Iyer 	mutex_enter(&ixgbe->gen_lock);
4800dc2366fSVenugopal Iyer 
4810dc2366fSVenugopal Iyer 	if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
4820dc2366fSVenugopal Iyer 		mutex_exit(&ixgbe->gen_lock);
4830dc2366fSVenugopal Iyer 		return (ECANCELED);
4840dc2366fSVenugopal Iyer 	}
4850dc2366fSVenugopal Iyer 
4860dc2366fSVenugopal Iyer 	switch (stat) {
4870dc2366fSVenugopal Iyer 	case MAC_STAT_IFSPEED:
4880dc2366fSVenugopal Iyer 		*val = ixgbe->link_speed * 1000000ull;
4890dc2366fSVenugopal Iyer 		break;
4900dc2366fSVenugopal Iyer 
4910dc2366fSVenugopal Iyer 	case MAC_STAT_MULTIRCV:
4920dc2366fSVenugopal Iyer 		ixgbe_ks->mprc.value.ui64 +=
4930dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_MPRC);
4940dc2366fSVenugopal Iyer 		*val = ixgbe_ks->mprc.value.ui64;
4950dc2366fSVenugopal Iyer 		break;
4960dc2366fSVenugopal Iyer 
4970dc2366fSVenugopal Iyer 	case MAC_STAT_BRDCSTRCV:
4980dc2366fSVenugopal Iyer 		ixgbe_ks->bprc.value.ui64 +=
4990dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_BPRC);
5000dc2366fSVenugopal Iyer 		*val = ixgbe_ks->bprc.value.ui64;
5010dc2366fSVenugopal Iyer 		break;
5020dc2366fSVenugopal Iyer 
5030dc2366fSVenugopal Iyer 	case MAC_STAT_MULTIXMT:
5040dc2366fSVenugopal Iyer 		ixgbe_ks->mptc.value.ui64 +=
5050dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_MPTC);
5060dc2366fSVenugopal Iyer 		*val = ixgbe_ks->mptc.value.ui64;
5070dc2366fSVenugopal Iyer 		break;
5080dc2366fSVenugopal Iyer 
5090dc2366fSVenugopal Iyer 	case MAC_STAT_BRDCSTXMT:
5100dc2366fSVenugopal Iyer 		ixgbe_ks->bptc.value.ui64 +=
5110dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_BPTC);
5120dc2366fSVenugopal Iyer 		*val = ixgbe_ks->bptc.value.ui64;
5130dc2366fSVenugopal Iyer 		break;
5140dc2366fSVenugopal Iyer 
5150dc2366fSVenugopal Iyer 	case MAC_STAT_NORCVBUF:
5160dc2366fSVenugopal Iyer 		for (i = 0; i < 8; i++) {
5170dc2366fSVenugopal Iyer 			ixgbe_ks->rnbc.value.ui64 +=
5180dc2366fSVenugopal Iyer 			    IXGBE_READ_REG(hw, IXGBE_RNBC(i));
5190dc2366fSVenugopal Iyer 		}
5200dc2366fSVenugopal Iyer 		*val = ixgbe_ks->rnbc.value.ui64;
5210dc2366fSVenugopal Iyer 		break;
5220dc2366fSVenugopal Iyer 
5230dc2366fSVenugopal Iyer 	case MAC_STAT_IERRORS:
5240dc2366fSVenugopal Iyer 		ixgbe_ks->crcerrs.value.ui64 +=
5250dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_CRCERRS);
5260dc2366fSVenugopal Iyer 		ixgbe_ks->illerrc.value.ui64 +=
5270dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_ILLERRC);
5280dc2366fSVenugopal Iyer 		ixgbe_ks->errbc.value.ui64 +=
5290dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_ERRBC);
5300dc2366fSVenugopal Iyer 		ixgbe_ks->rlec.value.ui64 +=
5310dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_RLEC);
5320dc2366fSVenugopal Iyer 		*val = ixgbe_ks->crcerrs.value.ui64 +
5330dc2366fSVenugopal Iyer 		    ixgbe_ks->illerrc.value.ui64 +
5340dc2366fSVenugopal Iyer 		    ixgbe_ks->errbc.value.ui64 +
5350dc2366fSVenugopal Iyer 		    ixgbe_ks->rlec.value.ui64;
5360dc2366fSVenugopal Iyer 		break;
5370dc2366fSVenugopal Iyer 
5380dc2366fSVenugopal Iyer 	case MAC_STAT_RBYTES:
5390dc2366fSVenugopal Iyer 		ixgbe_ks->tor.value.ui64 = 0;
5400dc2366fSVenugopal Iyer 		for (i = 0; i < 16; i++) {
5410dc2366fSVenugopal Iyer 			ixgbe_ks->qbrc[i].value.ui64 +=
5420dc2366fSVenugopal Iyer 			    IXGBE_READ_REG(hw, IXGBE_QBRC(i));
5430dc2366fSVenugopal Iyer 			ixgbe_ks->tor.value.ui64 +=
5440dc2366fSVenugopal Iyer 			    ixgbe_ks->qbrc[i].value.ui64;
5450dc2366fSVenugopal Iyer 		}
5460dc2366fSVenugopal Iyer 		*val = ixgbe_ks->tor.value.ui64;
5470dc2366fSVenugopal Iyer 		break;
5480dc2366fSVenugopal Iyer 
5490dc2366fSVenugopal Iyer 	case MAC_STAT_OBYTES:
5500dc2366fSVenugopal Iyer 		ixgbe_ks->tot.value.ui64 = 0;
5510dc2366fSVenugopal Iyer 		for (i = 0; i < 16; i++) {
552*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			switch (hw->mac.type) {
553*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			case ixgbe_mac_82598EB:
5540dc2366fSVenugopal Iyer 				ixgbe_ks->qbtc[i].value.ui64 +=
5550dc2366fSVenugopal Iyer 				    IXGBE_READ_REG(hw, IXGBE_QBTC(i));
556*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				break;
557*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
558*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			case ixgbe_mac_82599EB:
559*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				ixgbe_ks->qbtc[i].value.ui64 +=
560*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				    IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
561*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				ixgbe_ks->qbtc[i].value.ui64 +=
562*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				    ((uint64_t)((IXGBE_READ_REG(hw,
563*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				    IXGBE_QBTC_H(i))) & 0xF) << 32);
564*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				break;
565*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 
566*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 			default:
567*5b6dd21fSchenlu chen - Sun Microsystems - Beijing China 				break;
5680dc2366fSVenugopal Iyer 			}
5690dc2366fSVenugopal Iyer 			ixgbe_ks->tot.value.ui64 +=
5700dc2366fSVenugopal Iyer 			    ixgbe_ks->qbtc[i].value.ui64;
5710dc2366fSVenugopal Iyer 		}
5720dc2366fSVenugopal Iyer 		*val = ixgbe_ks->tot.value.ui64;
5730dc2366fSVenugopal Iyer 		break;
5740dc2366fSVenugopal Iyer 
5750dc2366fSVenugopal Iyer 	case MAC_STAT_IPACKETS:
5760dc2366fSVenugopal Iyer 		ixgbe_ks->tpr.value.ui64 +=
5770dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_TPR);
5780dc2366fSVenugopal Iyer 		*val = ixgbe_ks->tpr.value.ui64;
5790dc2366fSVenugopal Iyer 		break;
5800dc2366fSVenugopal Iyer 
5810dc2366fSVenugopal Iyer 	case MAC_STAT_OPACKETS:
5820dc2366fSVenugopal Iyer 		ixgbe_ks->tpt.value.ui64 +=
5830dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_TPT);
5840dc2366fSVenugopal Iyer 		*val = ixgbe_ks->tpt.value.ui64;
5850dc2366fSVenugopal Iyer 		break;
5860dc2366fSVenugopal Iyer 
5870dc2366fSVenugopal Iyer 	/* RFC 1643 stats */
5880dc2366fSVenugopal Iyer 	case ETHER_STAT_FCS_ERRORS:
5890dc2366fSVenugopal Iyer 		ixgbe_ks->crcerrs.value.ui64 +=
5900dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_CRCERRS);
5910dc2366fSVenugopal Iyer 		*val = ixgbe_ks->crcerrs.value.ui64;
5920dc2366fSVenugopal Iyer 		break;
5930dc2366fSVenugopal Iyer 
5940dc2366fSVenugopal Iyer 	case ETHER_STAT_TOOLONG_ERRORS:
5950dc2366fSVenugopal Iyer 		ixgbe_ks->roc.value.ui64 +=
5960dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_ROC);
5970dc2366fSVenugopal Iyer 		*val = ixgbe_ks->roc.value.ui64;
5980dc2366fSVenugopal Iyer 		break;
5990dc2366fSVenugopal Iyer 
6000dc2366fSVenugopal Iyer 	case ETHER_STAT_MACRCV_ERRORS:
6010dc2366fSVenugopal Iyer 		ixgbe_ks->crcerrs.value.ui64 +=
6020dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_CRCERRS);
6030dc2366fSVenugopal Iyer 		ixgbe_ks->illerrc.value.ui64 +=
6040dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_ILLERRC);
6050dc2366fSVenugopal Iyer 		ixgbe_ks->errbc.value.ui64 +=
6060dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_ERRBC);
6070dc2366fSVenugopal Iyer 		ixgbe_ks->rlec.value.ui64 +=
6080dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_RLEC);
6090dc2366fSVenugopal Iyer 		*val = ixgbe_ks->crcerrs.value.ui64 +
6100dc2366fSVenugopal Iyer 		    ixgbe_ks->illerrc.value.ui64 +
6110dc2366fSVenugopal Iyer 		    ixgbe_ks->errbc.value.ui64 +
6120dc2366fSVenugopal Iyer 		    ixgbe_ks->rlec.value.ui64;
6130dc2366fSVenugopal Iyer 		break;
6140dc2366fSVenugopal Iyer 
6150dc2366fSVenugopal Iyer 	/* MII/GMII stats */
6160dc2366fSVenugopal Iyer 	case ETHER_STAT_XCVR_ADDR:
6170dc2366fSVenugopal Iyer 		/* The Internal PHY's MDI address for each MAC is 1 */
6180dc2366fSVenugopal Iyer 		*val = 1;
6190dc2366fSVenugopal Iyer 		break;
6200dc2366fSVenugopal Iyer 
6210dc2366fSVenugopal Iyer 	case ETHER_STAT_XCVR_ID:
6220dc2366fSVenugopal Iyer 		*val = hw->phy.id;
6230dc2366fSVenugopal Iyer 		break;
6240dc2366fSVenugopal Iyer 
6250dc2366fSVenugopal Iyer 	case ETHER_STAT_XCVR_INUSE:
6260dc2366fSVenugopal Iyer 		switch (ixgbe->link_speed) {
6270dc2366fSVenugopal Iyer 		case IXGBE_LINK_SPEED_1GB_FULL:
6280dc2366fSVenugopal Iyer 			*val =
6290dc2366fSVenugopal Iyer 			    (hw->phy.media_type == ixgbe_media_type_copper) ?
6300dc2366fSVenugopal Iyer 			    XCVR_1000T : XCVR_1000X;
6310dc2366fSVenugopal Iyer 			break;
6320dc2366fSVenugopal Iyer 		case IXGBE_LINK_SPEED_100_FULL:
6330dc2366fSVenugopal Iyer 			*val = (hw->phy.media_type == ixgbe_media_type_copper) ?
6340dc2366fSVenugopal Iyer 			    XCVR_100T2 : XCVR_100X;
6350dc2366fSVenugopal Iyer 			break;
6360dc2366fSVenugopal Iyer 		default:
6370dc2366fSVenugopal Iyer 			*val = XCVR_NONE;
6380dc2366fSVenugopal Iyer 			break;
6390dc2366fSVenugopal Iyer 		}
6400dc2366fSVenugopal Iyer 		break;
6410dc2366fSVenugopal Iyer 
6420dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_10GFDX:
6430dc2366fSVenugopal Iyer 		*val = 1;
6440dc2366fSVenugopal Iyer 		break;
6450dc2366fSVenugopal Iyer 
6460dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_1000FDX:
6470dc2366fSVenugopal Iyer 		*val = 1;
6480dc2366fSVenugopal Iyer 		break;
6490dc2366fSVenugopal Iyer 
6500dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_100FDX:
6510dc2366fSVenugopal Iyer 		*val = 1;
6520dc2366fSVenugopal Iyer 		break;
6530dc2366fSVenugopal Iyer 
6540dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_ASMPAUSE:
6550dc2366fSVenugopal Iyer 		*val = ixgbe->param_asym_pause_cap;
6560dc2366fSVenugopal Iyer 		break;
6570dc2366fSVenugopal Iyer 
6580dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_PAUSE:
6590dc2366fSVenugopal Iyer 		*val = ixgbe->param_pause_cap;
6600dc2366fSVenugopal Iyer 		break;
6610dc2366fSVenugopal Iyer 
6620dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_AUTONEG:
6630dc2366fSVenugopal Iyer 		*val = 1;
6640dc2366fSVenugopal Iyer 		break;
6650dc2366fSVenugopal Iyer 
6660dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_10GFDX:
6670dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_10000fdx_cap;
6680dc2366fSVenugopal Iyer 		break;
6690dc2366fSVenugopal Iyer 
6700dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_1000FDX:
6710dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_1000fdx_cap;
6720dc2366fSVenugopal Iyer 		break;
6730dc2366fSVenugopal Iyer 
6740dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_100FDX:
6750dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_100fdx_cap;
6760dc2366fSVenugopal Iyer 		break;
6770dc2366fSVenugopal Iyer 
6780dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
6790dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_asym_pause_cap;
6800dc2366fSVenugopal Iyer 		break;
6810dc2366fSVenugopal Iyer 
6820dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_PAUSE:
6830dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_pause_cap;
6840dc2366fSVenugopal Iyer 		break;
6850dc2366fSVenugopal Iyer 
6860dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_CAP_AUTONEG:
6870dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_autoneg_cap;
6880dc2366fSVenugopal Iyer 		break;
6890dc2366fSVenugopal Iyer 
6900dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_10GFDX:
6910dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_10000fdx_cap;
6920dc2366fSVenugopal Iyer 		break;
6930dc2366fSVenugopal Iyer 
6940dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_1000FDX:
6950dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_1000fdx_cap;
6960dc2366fSVenugopal Iyer 		break;
6970dc2366fSVenugopal Iyer 
6980dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_100FDX:
6990dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_100fdx_cap;
7000dc2366fSVenugopal Iyer 		break;
7010dc2366fSVenugopal Iyer 
7020dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_ASMPAUSE:
7030dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_asym_pause_cap;
7040dc2366fSVenugopal Iyer 		break;
7050dc2366fSVenugopal Iyer 
7060dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_PAUSE:
7070dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_pause_cap;
7080dc2366fSVenugopal Iyer 		break;
7090dc2366fSVenugopal Iyer 
7100dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_CAP_AUTONEG:
7110dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_autoneg_cap;
7120dc2366fSVenugopal Iyer 		break;
7130dc2366fSVenugopal Iyer 
7140dc2366fSVenugopal Iyer 	case ETHER_STAT_LINK_ASMPAUSE:
7150dc2366fSVenugopal Iyer 		*val = ixgbe->param_asym_pause_cap;
7160dc2366fSVenugopal Iyer 		break;
7170dc2366fSVenugopal Iyer 
7180dc2366fSVenugopal Iyer 	case ETHER_STAT_LINK_PAUSE:
7190dc2366fSVenugopal Iyer 		*val = ixgbe->param_pause_cap;
7200dc2366fSVenugopal Iyer 		break;
7210dc2366fSVenugopal Iyer 
7220dc2366fSVenugopal Iyer 	case ETHER_STAT_LINK_AUTONEG:
7230dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_autoneg_cap;
7240dc2366fSVenugopal Iyer 		break;
7250dc2366fSVenugopal Iyer 
7260dc2366fSVenugopal Iyer 	case ETHER_STAT_LINK_DUPLEX:
7270dc2366fSVenugopal Iyer 		*val = ixgbe->link_duplex;
7280dc2366fSVenugopal Iyer 		break;
7290dc2366fSVenugopal Iyer 
7300dc2366fSVenugopal Iyer 	case ETHER_STAT_TOOSHORT_ERRORS:
7310dc2366fSVenugopal Iyer 		ixgbe_ks->ruc.value.ui64 +=
7320dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_RUC);
7330dc2366fSVenugopal Iyer 		*val = ixgbe_ks->ruc.value.ui64;
7340dc2366fSVenugopal Iyer 		break;
7350dc2366fSVenugopal Iyer 
7360dc2366fSVenugopal Iyer 	case ETHER_STAT_CAP_REMFAULT:
7370dc2366fSVenugopal Iyer 		*val = ixgbe->param_rem_fault;
7380dc2366fSVenugopal Iyer 		break;
7390dc2366fSVenugopal Iyer 
7400dc2366fSVenugopal Iyer 	case ETHER_STAT_ADV_REMFAULT:
7410dc2366fSVenugopal Iyer 		*val = ixgbe->param_adv_rem_fault;
7420dc2366fSVenugopal Iyer 		break;
7430dc2366fSVenugopal Iyer 
7440dc2366fSVenugopal Iyer 	case ETHER_STAT_LP_REMFAULT:
7450dc2366fSVenugopal Iyer 		*val = ixgbe->param_lp_rem_fault;
7460dc2366fSVenugopal Iyer 		break;
7470dc2366fSVenugopal Iyer 
7480dc2366fSVenugopal Iyer 	case ETHER_STAT_JABBER_ERRORS:
7490dc2366fSVenugopal Iyer 		ixgbe_ks->rjc.value.ui64 +=
7500dc2366fSVenugopal Iyer 		    IXGBE_READ_REG(hw, IXGBE_RJC);
7510dc2366fSVenugopal Iyer 		*val = ixgbe_ks->rjc.value.ui64;
7520dc2366fSVenugopal Iyer 		break;
7530dc2366fSVenugopal Iyer 
7540dc2366fSVenugopal Iyer 	default:
7550dc2366fSVenugopal Iyer 		mutex_exit(&ixgbe->gen_lock);
7560dc2366fSVenugopal Iyer 		return (ENOTSUP);
7570dc2366fSVenugopal Iyer 	}
7580dc2366fSVenugopal Iyer 
7590dc2366fSVenugopal Iyer 	mutex_exit(&ixgbe->gen_lock);
7600dc2366fSVenugopal Iyer 
7610dc2366fSVenugopal Iyer 	if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
7620dc2366fSVenugopal Iyer 		ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
7630dc2366fSVenugopal Iyer 		return (EIO);
7640dc2366fSVenugopal Iyer 	}
7650dc2366fSVenugopal Iyer 
7660dc2366fSVenugopal Iyer 	return (0);
7670dc2366fSVenugopal Iyer }
7680dc2366fSVenugopal Iyer 
7690dc2366fSVenugopal Iyer /*
7700dc2366fSVenugopal Iyer  * Retrieve a value for one of the statistics for a particular rx ring
7710dc2366fSVenugopal Iyer  */
7720dc2366fSVenugopal Iyer int
7730dc2366fSVenugopal Iyer ixgbe_rx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
7740dc2366fSVenugopal Iyer {
7750dc2366fSVenugopal Iyer 	ixgbe_rx_ring_t	*rx_ring = (ixgbe_rx_ring_t *)rh;
7760dc2366fSVenugopal Iyer 	ixgbe_t *ixgbe = rx_ring->ixgbe;
7770dc2366fSVenugopal Iyer 
7780dc2366fSVenugopal Iyer 	if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
7790dc2366fSVenugopal Iyer 		return (ECANCELED);
7800dc2366fSVenugopal Iyer 	}
7810dc2366fSVenugopal Iyer 
7820dc2366fSVenugopal Iyer 	switch (stat) {
7830dc2366fSVenugopal Iyer 	case MAC_STAT_RBYTES:
7840dc2366fSVenugopal Iyer 		*val = rx_ring->stat_rbytes;
7850dc2366fSVenugopal Iyer 		break;
7860dc2366fSVenugopal Iyer 
7870dc2366fSVenugopal Iyer 	case MAC_STAT_IPACKETS:
7880dc2366fSVenugopal Iyer 		*val = rx_ring->stat_ipackets;
7890dc2366fSVenugopal Iyer 		break;
7900dc2366fSVenugopal Iyer 
7910dc2366fSVenugopal Iyer 	default:
7920dc2366fSVenugopal Iyer 		*val = 0;
7930dc2366fSVenugopal Iyer 		return (ENOTSUP);
7940dc2366fSVenugopal Iyer 	}
7950dc2366fSVenugopal Iyer 
7960dc2366fSVenugopal Iyer 	return (0);
7970dc2366fSVenugopal Iyer }
7980dc2366fSVenugopal Iyer 
7990dc2366fSVenugopal Iyer /*
8000dc2366fSVenugopal Iyer  * Retrieve a value for one of the statistics for a particular tx ring
8010dc2366fSVenugopal Iyer  */
8020dc2366fSVenugopal Iyer int
8030dc2366fSVenugopal Iyer ixgbe_tx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
8040dc2366fSVenugopal Iyer {
8050dc2366fSVenugopal Iyer 	ixgbe_tx_ring_t	*tx_ring = (ixgbe_tx_ring_t *)rh;
8060dc2366fSVenugopal Iyer 	ixgbe_t *ixgbe = tx_ring->ixgbe;
8070dc2366fSVenugopal Iyer 
8080dc2366fSVenugopal Iyer 	if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
8090dc2366fSVenugopal Iyer 		return (ECANCELED);
8100dc2366fSVenugopal Iyer 	}
8110dc2366fSVenugopal Iyer 
8120dc2366fSVenugopal Iyer 	switch (stat) {
8130dc2366fSVenugopal Iyer 	case MAC_STAT_OBYTES:
8140dc2366fSVenugopal Iyer 		*val = tx_ring->stat_obytes;
8150dc2366fSVenugopal Iyer 		break;
8160dc2366fSVenugopal Iyer 
8170dc2366fSVenugopal Iyer 	case MAC_STAT_OPACKETS:
8180dc2366fSVenugopal Iyer 		*val = tx_ring->stat_opackets;
8190dc2366fSVenugopal Iyer 		break;
8200dc2366fSVenugopal Iyer 
8210dc2366fSVenugopal Iyer 	default:
8220dc2366fSVenugopal Iyer 		*val = 0;
8230dc2366fSVenugopal Iyer 		return (ENOTSUP);
8240dc2366fSVenugopal Iyer 	}
8250dc2366fSVenugopal Iyer 
8260dc2366fSVenugopal Iyer 	return (0);
8270dc2366fSVenugopal Iyer }
828