xref: /illumos-gate/usr/src/uts/common/io/ixgbe/ixgbe_stat.c (revision 73cd555c10e70dac413ae4b40de8450a291750ac)
19da57d7bSbt150084 /*
29da57d7bSbt150084  * CDDL HEADER START
39da57d7bSbt150084  *
4*73cd555cSBin Tu - Sun Microsystems - Beijing China  * Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
59da57d7bSbt150084  * The contents of this file are subject to the terms of the
69da57d7bSbt150084  * Common Development and Distribution License (the "License").
79da57d7bSbt150084  * You may not use this file except in compliance with the License.
89da57d7bSbt150084  *
9da14cebeSEric Cheng  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10da14cebeSEric Cheng  * or http://www.opensolaris.org/os/licensing.
119da57d7bSbt150084  * See the License for the specific language governing permissions
129da57d7bSbt150084  * and limitations under the License.
139da57d7bSbt150084  *
14da14cebeSEric Cheng  * When distributing Covered Code, include this CDDL HEADER in each
15da14cebeSEric Cheng  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
169da57d7bSbt150084  * If applicable, add the following below this CDDL HEADER, with the
179da57d7bSbt150084  * fields enclosed by brackets "[]" replaced with your own identifying
189da57d7bSbt150084  * information: Portions Copyright [yyyy] [name of copyright owner]
199da57d7bSbt150084  *
209da57d7bSbt150084  * CDDL HEADER END
219da57d7bSbt150084  */
229da57d7bSbt150084 
239da57d7bSbt150084 /*
2413740cb2SPaul Guo  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25da14cebeSEric Cheng  * Use is subject to license terms.
26da14cebeSEric Cheng  */
279da57d7bSbt150084 
289da57d7bSbt150084 #include "ixgbe_sw.h"
299da57d7bSbt150084 
309da57d7bSbt150084 /*
319da57d7bSbt150084  * Update driver private statistics.
329da57d7bSbt150084  */
339da57d7bSbt150084 static int
349da57d7bSbt150084 ixgbe_update_stats(kstat_t *ks, int rw)
359da57d7bSbt150084 {
369da57d7bSbt150084 	ixgbe_t *ixgbe;
379da57d7bSbt150084 	struct ixgbe_hw *hw;
389da57d7bSbt150084 	ixgbe_stat_t *ixgbe_ks;
399da57d7bSbt150084 	int i;
409da57d7bSbt150084 
419da57d7bSbt150084 	if (rw == KSTAT_WRITE)
429da57d7bSbt150084 		return (EACCES);
439da57d7bSbt150084 
449da57d7bSbt150084 	ixgbe = (ixgbe_t *)ks->ks_private;
459da57d7bSbt150084 	ixgbe_ks = (ixgbe_stat_t *)ks->ks_data;
469da57d7bSbt150084 	hw = &ixgbe->hw;
479da57d7bSbt150084 
489da57d7bSbt150084 	mutex_enter(&ixgbe->gen_lock);
499da57d7bSbt150084 
509da57d7bSbt150084 	/*
519da57d7bSbt150084 	 * Basic information
529da57d7bSbt150084 	 */
539da57d7bSbt150084 	ixgbe_ks->link_speed.value.ui64 = ixgbe->link_speed;
549da57d7bSbt150084 
559da57d7bSbt150084 #ifdef IXGBE_DEBUG
569da57d7bSbt150084 	ixgbe_ks->reset_count.value.ui64 = ixgbe->reset_count;
579da57d7bSbt150084 
589da57d7bSbt150084 	ixgbe_ks->rx_frame_error.value.ui64 = 0;
599da57d7bSbt150084 	ixgbe_ks->rx_cksum_error.value.ui64 = 0;
609da57d7bSbt150084 	ixgbe_ks->rx_exceed_pkt.value.ui64 = 0;
619da57d7bSbt150084 	for (i = 0; i < ixgbe->num_rx_rings; i++) {
629da57d7bSbt150084 		ixgbe_ks->rx_frame_error.value.ui64 +=
639da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_frame_error;
649da57d7bSbt150084 		ixgbe_ks->rx_cksum_error.value.ui64 +=
659da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_cksum_error;
669da57d7bSbt150084 		ixgbe_ks->rx_exceed_pkt.value.ui64 +=
679da57d7bSbt150084 		    ixgbe->rx_rings[i].stat_exceed_pkt;
689da57d7bSbt150084 	}
699da57d7bSbt150084 
709da57d7bSbt150084 	ixgbe_ks->tx_overload.value.ui64 = 0;
719da57d7bSbt150084 	ixgbe_ks->tx_fail_no_tbd.value.ui64 = 0;
729da57d7bSbt150084 	ixgbe_ks->tx_fail_no_tcb.value.ui64 = 0;
739da57d7bSbt150084 	ixgbe_ks->tx_fail_dma_bind.value.ui64 = 0;
749da57d7bSbt150084 	ixgbe_ks->tx_reschedule.value.ui64 = 0;
759da57d7bSbt150084 	for (i = 0; i < ixgbe->num_tx_rings; i++) {
769da57d7bSbt150084 		ixgbe_ks->tx_overload.value.ui64 +=
779da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_overload;
789da57d7bSbt150084 		ixgbe_ks->tx_fail_no_tbd.value.ui64 +=
799da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_no_tbd;
809da57d7bSbt150084 		ixgbe_ks->tx_fail_no_tcb.value.ui64 +=
819da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_no_tcb;
829da57d7bSbt150084 		ixgbe_ks->tx_fail_dma_bind.value.ui64 +=
839da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_fail_dma_bind;
849da57d7bSbt150084 		ixgbe_ks->tx_reschedule.value.ui64 +=
859da57d7bSbt150084 		    ixgbe->tx_rings[i].stat_reschedule;
869da57d7bSbt150084 	}
87da14cebeSEric Cheng #endif
889da57d7bSbt150084 
899da57d7bSbt150084 	/*
909da57d7bSbt150084 	 * Hardware calculated statistics.
919da57d7bSbt150084 	 */
92da14cebeSEric Cheng 	ixgbe_ks->gprc.value.ui64 = 0;
93da14cebeSEric Cheng 	ixgbe_ks->gptc.value.ui64 = 0;
94da14cebeSEric Cheng 	ixgbe_ks->tor.value.ui64 = 0;
95da14cebeSEric Cheng 	ixgbe_ks->tot.value.ui64 = 0;
969da57d7bSbt150084 	for (i = 0; i < 16; i++) {
97da14cebeSEric Cheng 		ixgbe_ks->qprc[i].value.ui64 +=
98da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QPRC(i));
99da14cebeSEric Cheng 		ixgbe_ks->gprc.value.ui64 += ixgbe_ks->qprc[i].value.ui64;
100da14cebeSEric Cheng 		ixgbe_ks->qptc[i].value.ui64 +=
101da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QPTC(i));
102da14cebeSEric Cheng 		ixgbe_ks->gptc.value.ui64 += ixgbe_ks->qptc[i].value.ui64;
103da14cebeSEric Cheng 		ixgbe_ks->qbrc[i].value.ui64 +=
104da14cebeSEric Cheng 		    IXGBE_READ_REG(hw, IXGBE_QBRC(i));
105da14cebeSEric Cheng 		ixgbe_ks->tor.value.ui64 += ixgbe_ks->qbrc[i].value.ui64;
106*73cd555cSBin Tu - Sun Microsystems - Beijing China 		if (hw->mac.type >= ixgbe_mac_82599EB) {
107*73cd555cSBin Tu - Sun Microsystems - Beijing China 			ixgbe_ks->qbtc[i].value.ui64 +=
108*73cd555cSBin Tu - Sun Microsystems - Beijing China 			    IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
109*73cd555cSBin Tu - Sun Microsystems - Beijing China 			ixgbe_ks->qbtc[i].value.ui64 += ((uint64_t)
110*73cd555cSBin Tu - Sun Microsystems - Beijing China 			    (IXGBE_READ_REG(hw, IXGBE_QBTC_H(i))) << 32);
111*73cd555cSBin Tu - Sun Microsystems - Beijing China 		} else {
112da14cebeSEric Cheng 			ixgbe_ks->qbtc[i].value.ui64 +=
113da14cebeSEric Cheng 			    IXGBE_READ_REG(hw, IXGBE_QBTC(i));
114*73cd555cSBin Tu - Sun Microsystems - Beijing China 		}
115da14cebeSEric Cheng 		ixgbe_ks->tot.value.ui64 += ixgbe_ks->qbtc[i].value.ui64;
1169da57d7bSbt150084 	}
117f27d3025Sgg161487 	/*
118f27d3025Sgg161487 	 * This is a Workaround:
119f27d3025Sgg161487 	 * Currently h/w GORCH, GOTCH, TORH registers are not
120f27d3025Sgg161487 	 * correctly implemented. We found that the values in
121f27d3025Sgg161487 	 * these registers are same as those in corresponding
122f27d3025Sgg161487 	 * *L registers (i.e. GORCL, GOTCL, and TORL). Here the
123f27d3025Sgg161487 	 * gor and got stat data will not be retrieved through
124f27d3025Sgg161487 	 * GORC{H/L} and GOTC{H/L} registers but be obtained by
125f27d3025Sgg161487 	 * simply assigning tor/tot stat data, so the gor/got
126f27d3025Sgg161487 	 * stat data will not be accurate.
127f27d3025Sgg161487 	 */
1289da57d7bSbt150084 	ixgbe_ks->gor.value.ui64 = ixgbe_ks->tor.value.ui64;
129f27d3025Sgg161487 	ixgbe_ks->got.value.ui64 = ixgbe_ks->tot.value.ui64;
1309da57d7bSbt150084 
1319da57d7bSbt150084 	ixgbe_ks->prc64.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC64);
1329da57d7bSbt150084 	ixgbe_ks->prc127.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC127);
1339da57d7bSbt150084 	ixgbe_ks->prc255.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC255);
1349da57d7bSbt150084 	ixgbe_ks->prc511.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC511);
1359da57d7bSbt150084 	ixgbe_ks->prc1023.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC1023);
1369da57d7bSbt150084 	ixgbe_ks->prc1522.value.ul += IXGBE_READ_REG(hw, IXGBE_PRC1522);
1379da57d7bSbt150084 	ixgbe_ks->ptc64.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC64);
1389da57d7bSbt150084 	ixgbe_ks->ptc127.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC127);
1399da57d7bSbt150084 	ixgbe_ks->ptc255.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC255);
1409da57d7bSbt150084 	ixgbe_ks->ptc511.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC511);
1419da57d7bSbt150084 	ixgbe_ks->ptc1023.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC1023);
1429da57d7bSbt150084 	ixgbe_ks->ptc1522.value.ul += IXGBE_READ_REG(hw, IXGBE_PTC1522);
1439da57d7bSbt150084 
1449da57d7bSbt150084 	ixgbe_ks->mspdc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MSPDC);
1459da57d7bSbt150084 	for (i = 0; i < 8; i++)
1469da57d7bSbt150084 		ixgbe_ks->mpc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MPC(i));
1479da57d7bSbt150084 	ixgbe_ks->mlfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MLFC);
1489da57d7bSbt150084 	ixgbe_ks->mrfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_MRFC);
1499da57d7bSbt150084 	ixgbe_ks->rlec.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RLEC);
1509da57d7bSbt150084 	ixgbe_ks->lxontxc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_LXONTXC);
151*73cd555cSBin Tu - Sun Microsystems - Beijing China 	if (hw->mac.type == ixgbe_mac_82598EB) {
152*73cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxonrxc.value.ui64 += IXGBE_READ_REG(hw,
153*73cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXONRXC);
154*73cd555cSBin Tu - Sun Microsystems - Beijing China 	} else {
155*73cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxonrxc.value.ui64 += IXGBE_READ_REG(hw,
156*73cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXONRXCNT);
157*73cd555cSBin Tu - Sun Microsystems - Beijing China 	}
1589da57d7bSbt150084 	ixgbe_ks->lxofftxc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
159*73cd555cSBin Tu - Sun Microsystems - Beijing China 	if (hw->mac.type == ixgbe_mac_82598EB) {
160*73cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxoffrxc.value.ui64 += IXGBE_READ_REG(hw,
161*73cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXOFFRXC);
162*73cd555cSBin Tu - Sun Microsystems - Beijing China 	} else {
163*73cd555cSBin Tu - Sun Microsystems - Beijing China 		ixgbe_ks->lxoffrxc.value.ui64 += IXGBE_READ_REG(hw,
164*73cd555cSBin Tu - Sun Microsystems - Beijing China 		    IXGBE_LXOFFRXCNT);
165*73cd555cSBin Tu - Sun Microsystems - Beijing China 	}
1669da57d7bSbt150084 	ixgbe_ks->ruc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RUC);
1679da57d7bSbt150084 	ixgbe_ks->rfc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RFC);
1689da57d7bSbt150084 	ixgbe_ks->roc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_ROC);
1699da57d7bSbt150084 	ixgbe_ks->rjc.value.ui64 += IXGBE_READ_REG(hw, IXGBE_RJC);
1709da57d7bSbt150084 
1719da57d7bSbt150084 	mutex_exit(&ixgbe->gen_lock);
1729da57d7bSbt150084 
1739da57d7bSbt150084 	if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK)
1749da57d7bSbt150084 		ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_UNAFFECTED);
1759da57d7bSbt150084 
1769da57d7bSbt150084 	return (0);
1779da57d7bSbt150084 }
1789da57d7bSbt150084 
1799da57d7bSbt150084 /*
1809da57d7bSbt150084  * Create and initialize the driver private statistics.
1819da57d7bSbt150084  */
1829da57d7bSbt150084 int
1839da57d7bSbt150084 ixgbe_init_stats(ixgbe_t *ixgbe)
1849da57d7bSbt150084 {
1859da57d7bSbt150084 	kstat_t *ks;
1869da57d7bSbt150084 	ixgbe_stat_t *ixgbe_ks;
1879da57d7bSbt150084 
1889da57d7bSbt150084 	/*
1899da57d7bSbt150084 	 * Create and init kstat
1909da57d7bSbt150084 	 */
1919da57d7bSbt150084 	ks = kstat_create(MODULE_NAME, ddi_get_instance(ixgbe->dip),
1929da57d7bSbt150084 	    "statistics", "net", KSTAT_TYPE_NAMED,
1939da57d7bSbt150084 	    sizeof (ixgbe_stat_t) / sizeof (kstat_named_t), 0);
1949da57d7bSbt150084 
1959da57d7bSbt150084 	if (ks == NULL) {
1969da57d7bSbt150084 		ixgbe_error(ixgbe,
1979da57d7bSbt150084 		    "Could not create kernel statistics");
1989da57d7bSbt150084 		return (IXGBE_FAILURE);
1999da57d7bSbt150084 	}
2009da57d7bSbt150084 
2019da57d7bSbt150084 	ixgbe->ixgbe_ks = ks;
2029da57d7bSbt150084 
2039da57d7bSbt150084 	ixgbe_ks = (ixgbe_stat_t *)ks->ks_data;
2049da57d7bSbt150084 
2059da57d7bSbt150084 	/*
2069da57d7bSbt150084 	 * Initialize all the statistics.
2079da57d7bSbt150084 	 */
2089da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->link_speed, "link_speed",
2099da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2109da57d7bSbt150084 
2119da57d7bSbt150084 #ifdef IXGBE_DEBUG
2129da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->reset_count, "reset_count",
2139da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2149da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_frame_error, "rx_frame_error",
2159da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2169da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_cksum_error, "rx_cksum_error",
2179da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2189da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rx_exceed_pkt, "rx_exceed_pkt",
2199da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2209da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_overload, "tx_overload",
2219da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2229da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_no_tbd, "tx_fail_no_tbd",
2239da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2249da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_no_tcb, "tx_fail_no_tcb",
2259da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2269da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_fail_dma_bind, "tx_fail_dma_bind",
2279da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2289da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->tx_reschedule, "tx_reschedule",
2299da57d7bSbt150084 	    KSTAT_DATA_UINT64);
230da14cebeSEric Cheng #endif
2319da57d7bSbt150084 
2329da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gprc, "good_pkts_recvd",
2339da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2349da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gptc, "good_pkts_xmitd",
2359da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2369da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->gor, "good_octets_recvd",
2379da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2389da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->got, "good_octets_xmitd",
2399da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2409da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc64, "pkts_recvd_(  64b)",
2419da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2429da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc127, "pkts_recvd_(  65- 127b)",
2439da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2449da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc255, "pkts_recvd_( 127- 255b)",
2459da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2469da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc511, "pkts_recvd_( 256- 511b)",
2479da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2489da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc1023, "pkts_recvd_( 511-1023b)",
2499da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2509da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->prc1522, "pkts_recvd_(1024-1522b)",
2519da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2529da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc64, "pkts_xmitd_(  64b)",
2539da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2549da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc127, "pkts_xmitd_(  65- 127b)",
2559da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2569da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc255, "pkts_xmitd_( 128- 255b)",
2579da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2589da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc511, "pkts_xmitd_( 255- 511b)",
2599da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2609da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc1023, "pkts_xmitd_( 512-1023b)",
2619da57d7bSbt150084 	    KSTAT_DATA_UINT64);
2629da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ptc1522, "pkts_xmitd_(1024-1522b)",
2639da57d7bSbt150084 	    KSTAT_DATA_UINT64);
264da14cebeSEric Cheng 
265da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[0], "queue_pkts_recvd [ 0]",
266da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
267da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[1], "queue_pkts_recvd [ 1]",
268da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
269da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[2], "queue_pkts_recvd [ 2]",
270da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
271da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[3], "queue_pkts_recvd [ 3]",
272da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
273da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[4], "queue_pkts_recvd [ 4]",
274da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
275da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[5], "queue_pkts_recvd [ 5]",
276da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
277da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[6], "queue_pkts_recvd [ 6]",
278da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
279da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[7], "queue_pkts_recvd [ 7]",
280da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
281da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[8], "queue_pkts_recvd [ 8]",
282da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
283da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[9], "queue_pkts_recvd [ 9]",
284da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
285da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[10], "queue_pkts_recvd [10]",
286da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
287da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[11], "queue_pkts_recvd [11]",
288da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
289da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[12], "queue_pkts_recvd [12]",
290da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
291da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[13], "queue_pkts_recvd [13]",
292da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
293da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[14], "queue_pkts_recvd [14]",
294da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
295da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qprc[15], "queue_pkts_recvd [15]",
296da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
297da14cebeSEric Cheng 
298da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[0], "queue_pkts_xmitd [ 0]",
299da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
300da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[1], "queue_pkts_xmitd [ 1]",
301da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
302da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[2], "queue_pkts_xmitd [ 2]",
303da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
304da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[3], "queue_pkts_xmitd [ 3]",
305da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
306da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[4], "queue_pkts_xmitd [ 4]",
307da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
308da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[5], "queue_pkts_xmitd [ 5]",
309da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
310da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[6], "queue_pkts_xmitd [ 6]",
311da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
312da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[7], "queue_pkts_xmitd [ 7]",
313da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
314da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[8], "queue_pkts_xmitd [ 8]",
315da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
316da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[9], "queue_pkts_xmitd [ 9]",
317da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
318da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[10], "queue_pkts_xmitd [10]",
319da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
320da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[11], "queue_pkts_xmitd [11]",
321da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
322da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[12], "queue_pkts_xmitd [12]",
323da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
324da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[13], "queue_pkts_xmitd [13]",
325da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
326da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[14], "queue_pkts_xmitd [14]",
327da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
328da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qptc[15], "queue_pkts_xmitd [15]",
329da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
330da14cebeSEric Cheng 
331da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[0], "queue_bytes_recvd [ 0]",
332da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
333da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[1], "queue_bytes_recvd [ 1]",
334da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
335da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[2], "queue_bytes_recvd [ 2]",
336da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
337da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[3], "queue_bytes_recvd [ 3]",
338da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
339da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[4], "queue_bytes_recvd [ 4]",
340da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
341da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[5], "queue_bytes_recvd [ 5]",
342da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
343da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[6], "queue_bytes_recvd [ 6]",
344da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
345da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[7], "queue_bytes_recvd [ 7]",
346da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
347da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[8], "queue_bytes_recvd [ 8]",
348da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
349da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[9], "queue_bytes_recvd [ 9]",
350da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
351da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[10], "queue_bytes_recvd [10]",
352da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
353da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[11], "queue_bytes_recvd [11]",
354da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
355da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[12], "queue_bytes_recvd [12]",
356da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
357da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[13], "queue_bytes_recvd [13]",
358da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
359da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[14], "queue_bytes_recvd [14]",
360da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
361da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbrc[15], "queue_bytes_recvd [15]",
362da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
363da14cebeSEric Cheng 
364da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[0], "queue_bytes_xmitd [ 0]",
365da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
366da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[1], "queue_bytes_xmitd [ 1]",
367da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
368da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[2], "queue_bytes_xmitd [ 2]",
369da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
370da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[3], "queue_bytes_xmitd [ 3]",
371da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
372da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[4], "queue_bytes_xmitd [ 4]",
373da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
374da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[5], "queue_bytes_xmitd [ 5]",
375da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
376da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[6], "queue_bytes_xmitd [ 6]",
377da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
378da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[7], "queue_bytes_xmitd [ 7]",
379da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
380da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[8], "queue_bytes_xmitd [ 8]",
381da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
382da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[9], "queue_bytes_xmitd [ 9]",
383da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
384da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[10], "queue_bytes_xmitd [10]",
385da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
386da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[11], "queue_bytes_xmitd [11]",
387da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
388da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[12], "queue_bytes_xmitd [12]",
389da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
390da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[13], "queue_bytes_xmitd [13]",
391da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
392da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[14], "queue_bytes_xmitd [14]",
393da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
394da14cebeSEric Cheng 	kstat_named_init(&ixgbe_ks->qbtc[15], "queue_bytes_xmitd [15]",
395da14cebeSEric Cheng 	    KSTAT_DATA_UINT64);
3969da57d7bSbt150084 
3979da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mspdc, "mac_short_packet_discard",
3989da57d7bSbt150084 	    KSTAT_DATA_UINT64);
3999da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mpc, "missed_packets",
4009da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4019da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mlfc, "mac_local_fault",
4029da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4039da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->mrfc, "mac_remote_fault",
4049da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4059da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rlec, "recv_length_err",
4069da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4079da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxontxc, "link_xon_xmitd",
4089da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4099da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxonrxc, "link_xon_recvd",
4109da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4119da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxofftxc, "link_xoff_xmitd",
4129da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4139da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->lxoffrxc, "link_xoff_recvd",
4149da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4159da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->ruc, "recv_undersize",
4169da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4179da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rfc, "recv_fragment",
4189da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4199da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->roc, "recv_oversize",
4209da57d7bSbt150084 	    KSTAT_DATA_UINT64);
4219da57d7bSbt150084 	kstat_named_init(&ixgbe_ks->rjc, "recv_jabber",
4229da57d7bSbt150084 	    KSTAT_DATA_UINT64);
42313740cb2SPaul Guo 	kstat_named_init(&ixgbe_ks->rnbc, "recv_no_buffer",
42413740cb2SPaul Guo 	    KSTAT_DATA_UINT64);
4259da57d7bSbt150084 
4269da57d7bSbt150084 	/*
4279da57d7bSbt150084 	 * Function to provide kernel stat update on demand
4289da57d7bSbt150084 	 */
4299da57d7bSbt150084 	ks->ks_update = ixgbe_update_stats;
4309da57d7bSbt150084 
4319da57d7bSbt150084 	ks->ks_private = (void *)ixgbe;
4329da57d7bSbt150084 
4339da57d7bSbt150084 	/*
4349da57d7bSbt150084 	 * Add kstat to systems kstat chain
4359da57d7bSbt150084 	 */
4369da57d7bSbt150084 	kstat_install(ks);
4379da57d7bSbt150084 
4389da57d7bSbt150084 	return (IXGBE_SUCCESS);
4399da57d7bSbt150084 }
440