1*9d26e4fcSRobert Mustacchi /*
2*9d26e4fcSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*9d26e4fcSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*9d26e4fcSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*9d26e4fcSRobert Mustacchi  * 1.0 of the CDDL.
6*9d26e4fcSRobert Mustacchi  *
7*9d26e4fcSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*9d26e4fcSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*9d26e4fcSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*9d26e4fcSRobert Mustacchi  */
11*9d26e4fcSRobert Mustacchi 
12*9d26e4fcSRobert Mustacchi /*
13*9d26e4fcSRobert Mustacchi  * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
14*9d26e4fcSRobert Mustacchi  * Copyright 2016 Joyent, Inc.
15*9d26e4fcSRobert Mustacchi  */
16*9d26e4fcSRobert Mustacchi 
17*9d26e4fcSRobert Mustacchi #include "i40e_sw.h"
18*9d26e4fcSRobert Mustacchi 
19*9d26e4fcSRobert Mustacchi /*
20*9d26e4fcSRobert Mustacchi  * -------------------
21*9d26e4fcSRobert Mustacchi  * Statistics Overview
22*9d26e4fcSRobert Mustacchi  * -------------------
23*9d26e4fcSRobert Mustacchi  *
24*9d26e4fcSRobert Mustacchi  * As part of managing the driver and understanding what's going on, we keep
25*9d26e4fcSRobert Mustacchi  * track of statistics from two different sources:
26*9d26e4fcSRobert Mustacchi  *
27*9d26e4fcSRobert Mustacchi  *   - Statistics from the device
28*9d26e4fcSRobert Mustacchi  *   - Statistics maintained by the driver
29*9d26e4fcSRobert Mustacchi  *
30*9d26e4fcSRobert Mustacchi  * Generally, the hardware provides us traditional IETF and MIB Ethernet
31*9d26e4fcSRobert Mustacchi  * statistics, for example, the total packets in and out, various errors in
32*9d26e4fcSRobert Mustacchi  * packets, the negotiated status etc. The driver, on the other hand, primarily
33*9d26e4fcSRobert Mustacchi  * contains statistics around driver-specific issues, such as information about
34*9d26e4fcSRobert Mustacchi  * checksumming on receive and transmit and the data in and out of a specific
35*9d26e4fcSRobert Mustacchi  * ring.
36*9d26e4fcSRobert Mustacchi  *
37*9d26e4fcSRobert Mustacchi  * We export statistics in two different forms. The first form is the required
38*9d26e4fcSRobert Mustacchi  * GLDv3 endpoints, specifically:
39*9d26e4fcSRobert Mustacchi  *
40*9d26e4fcSRobert Mustacchi  *   - The general GLDv3 mc_getstat interface
41*9d26e4fcSRobert Mustacchi  *   - The GLDv3 ring mri_stat interface
42*9d26e4fcSRobert Mustacchi  *
43*9d26e4fcSRobert Mustacchi  * The second form that we export statistics is through kstats. kstats are
44*9d26e4fcSRobert Mustacchi  * exported in different ways. Particularly we arrange the kstats to monitor the
45*9d26e4fcSRobert Mustacchi  * layout of the device. Currently we have kstats which capture both the IEEE
46*9d26e4fcSRobert Mustacchi  * and driver-implementation specific stats. There are kstats for each of the
47*9d26e4fcSRobert Mustacchi  * following structures:
48*9d26e4fcSRobert Mustacchi  *
49*9d26e4fcSRobert Mustacchi  *   - Each physical function
50*9d26e4fcSRobert Mustacchi  *   - Each VSI
51*9d26e4fcSRobert Mustacchi  *   - Each Queue
52*9d26e4fcSRobert Mustacchi  *
53*9d26e4fcSRobert Mustacchi  * The PF's kstat is called 'pfstats' so as not to collide with other system
54*9d26e4fcSRobert Mustacchi  * provided kstats. Thus, for instance 0, usually the first PF, the full kstat
55*9d26e4fcSRobert Mustacchi  * would be: i40e:0:pfstats:.
56*9d26e4fcSRobert Mustacchi  *
57*9d26e4fcSRobert Mustacchi  * The kstat for each VSI is called vsi_%instance. So for the first PF, which is
58*9d26e4fcSRobert Mustacchi  * instance zero and the first vsi, which has id 0, it will be named vsi_0 and
59*9d26e4fcSRobert Mustacchi  * the full kstat would be i40e:0:vsi_0:.
60*9d26e4fcSRobert Mustacchi  *
61*9d26e4fcSRobert Mustacchi  * The kstat for each queue is trqpair_tx_%queue and trqpair_rx_%queue. Note
62*9d26e4fcSRobert Mustacchi  * that these are labeled based on their local index, which may mean that
63*9d26e4fcSRobert Mustacchi  * different instances have overlapping sets of queues. This isn't a problem as
64*9d26e4fcSRobert Mustacchi  * the kstats will always use the instance number of the pf to distinguish it in
65*9d26e4fcSRobert Mustacchi  * the kstat tuple.
66*9d26e4fcSRobert Mustacchi  *
67*9d26e4fcSRobert Mustacchi  * ---------------------
68*9d26e4fcSRobert Mustacchi  * Hardware Arrangements
69*9d26e4fcSRobert Mustacchi  * ---------------------
70*9d26e4fcSRobert Mustacchi  *
71*9d26e4fcSRobert Mustacchi  * The hardware keeps statistics at each physical function/MAC (PF) and it keeps
72*9d26e4fcSRobert Mustacchi  * statistics on each virtual station interface (VSI). Currently we only use one
73*9d26e4fcSRobert Mustacchi  * VSI per PF (see the i40e_main.c theory statement). The hardware has a limited
74*9d26e4fcSRobert Mustacchi  * number of statistics units available. While every PF is guaranteed to have a
75*9d26e4fcSRobert Mustacchi  * statistics unit, it is possible that we will run out for a given VSI. We'll
76*9d26e4fcSRobert Mustacchi  * have to figure out an appropriate strategy here when we end up supporting
77*9d26e4fcSRobert Mustacchi  * multiple VSIs.
78*9d26e4fcSRobert Mustacchi  *
79*9d26e4fcSRobert Mustacchi  * The hardware keeps these statistics as 32-bit and 48-bit counters. We are
80*9d26e4fcSRobert Mustacchi  * required to read them and then compute the differences between them. The
81*9d26e4fcSRobert Mustacchi  * 48-bit counters span more than one 32-bit register in the BAR. The hardware
82*9d26e4fcSRobert Mustacchi  * suggests that to read them, we perform 64-bit reads of the lower of the two
83*9d26e4fcSRobert Mustacchi  * registers that make up a 48-bit stat. The hardware guarantees that the reads
84*9d26e4fcSRobert Mustacchi  * of those two registers will be atomic and we'll get a consistent value, not a
85*9d26e4fcSRobert Mustacchi  * property it has for every read of two registers.
86*9d26e4fcSRobert Mustacchi  *
87*9d26e4fcSRobert Mustacchi  * For every kstat we have based on this, we have a corresponding uint64_t that
88*9d26e4fcSRobert Mustacchi  * we keep around as a base value in a separate structure. Whenever we read a
89*9d26e4fcSRobert Mustacchi  * value, we end up grabbing the current value, calculating a difference between
90*9d26e4fcSRobert Mustacchi  * the previously stored value and the current one, and updating the kstat with
91*9d26e4fcSRobert Mustacchi  * that difference. After which, we go through and update the base value that we
92*9d26e4fcSRobert Mustacchi  * stored. This is all encapsulated in i40e_stat_get_uint32() and
93*9d26e4fcSRobert Mustacchi  * i40e_stat_get_uint48().
94*9d26e4fcSRobert Mustacchi  *
95*9d26e4fcSRobert Mustacchi  * The only unfortunate thing here is that the hardware doesn't give us any kind
96*9d26e4fcSRobert Mustacchi  * of overflow counter. It just tries to make sure that the uint32_t and
97*9d26e4fcSRobert Mustacchi  * uint48_t counters are large enough to hopefully not overflow right away. This
98*9d26e4fcSRobert Mustacchi  * isn't the most reassuring statement and we should investigate ways of
99*9d26e4fcSRobert Mustacchi  * ensuring that if a system is active, but not actively measured, we don't lose
100*9d26e4fcSRobert Mustacchi  * data.
101*9d26e4fcSRobert Mustacchi  *
102*9d26e4fcSRobert Mustacchi  * The pf kstats data is stored in the i40e_t`i40e_pf_kstat. It is backed by the
103*9d26e4fcSRobert Mustacchi  * i40e_t`i40e_pf_stat structure. Similarly the VSI related kstat is in
104*9d26e4fcSRobert Mustacchi  * i40e_t`i40e_vsi_kstat and the data is backed in the i40e_t`i40e_vsi_stat. All
105*9d26e4fcSRobert Mustacchi  * of this data is protected by the i40e_stat_lock, which should be taken last,
106*9d26e4fcSRobert Mustacchi  * when acquiring locks.
107*9d26e4fcSRobert Mustacchi  */
108*9d26e4fcSRobert Mustacchi 
109*9d26e4fcSRobert Mustacchi static void
110*9d26e4fcSRobert Mustacchi i40e_stat_get_uint48(i40e_t *i40e, uintptr_t reg, kstat_named_t *kstat,
111*9d26e4fcSRobert Mustacchi     uint64_t *base, boolean_t init)
112*9d26e4fcSRobert Mustacchi {
113*9d26e4fcSRobert Mustacchi 	i40e_hw_t *hw = &i40e->i40e_hw_space;
114*9d26e4fcSRobert Mustacchi 	uint64_t raw, delta;
115*9d26e4fcSRobert Mustacchi 
116*9d26e4fcSRobert Mustacchi 	ASSERT(MUTEX_HELD(&i40e->i40e_stat_lock));
117*9d26e4fcSRobert Mustacchi 
118*9d26e4fcSRobert Mustacchi 	raw = ddi_get64(i40e->i40e_osdep_space.ios_reg_handle,
119*9d26e4fcSRobert Mustacchi 	    (uint64_t *)((uintptr_t)hw->hw_addr + reg));
120*9d26e4fcSRobert Mustacchi 
121*9d26e4fcSRobert Mustacchi 	if (init == B_TRUE) {
122*9d26e4fcSRobert Mustacchi 		*base = raw;
123*9d26e4fcSRobert Mustacchi 		return;
124*9d26e4fcSRobert Mustacchi 	}
125*9d26e4fcSRobert Mustacchi 
126*9d26e4fcSRobert Mustacchi 	/*
127*9d26e4fcSRobert Mustacchi 	 * Check for wraparound, note that the counter is actually only 48-bits,
128*9d26e4fcSRobert Mustacchi 	 * even though it has two uint32_t regs present.
129*9d26e4fcSRobert Mustacchi 	 */
130*9d26e4fcSRobert Mustacchi 	if (raw >= *base) {
131*9d26e4fcSRobert Mustacchi 		delta = raw - *base;
132*9d26e4fcSRobert Mustacchi 	} else {
133*9d26e4fcSRobert Mustacchi 		delta = 0x1000000000000ULL - *base + raw;
134*9d26e4fcSRobert Mustacchi 	}
135*9d26e4fcSRobert Mustacchi 
136*9d26e4fcSRobert Mustacchi 	kstat->value.ui64 += delta;
137*9d26e4fcSRobert Mustacchi 	*base = raw;
138*9d26e4fcSRobert Mustacchi }
139*9d26e4fcSRobert Mustacchi 
140*9d26e4fcSRobert Mustacchi static void
141*9d26e4fcSRobert Mustacchi i40e_stat_get_uint32(i40e_t *i40e, uintptr_t reg, kstat_named_t *kstat,
142*9d26e4fcSRobert Mustacchi     uint64_t *base, boolean_t init)
143*9d26e4fcSRobert Mustacchi {
144*9d26e4fcSRobert Mustacchi 	i40e_hw_t *hw = &i40e->i40e_hw_space;
145*9d26e4fcSRobert Mustacchi 	uint64_t raw, delta;
146*9d26e4fcSRobert Mustacchi 
147*9d26e4fcSRobert Mustacchi 	ASSERT(MUTEX_HELD(&i40e->i40e_stat_lock));
148*9d26e4fcSRobert Mustacchi 
149*9d26e4fcSRobert Mustacchi 	raw = ddi_get32(i40e->i40e_osdep_space.ios_reg_handle,
150*9d26e4fcSRobert Mustacchi 	    (uint32_t *)((uintptr_t)hw->hw_addr + reg));
151*9d26e4fcSRobert Mustacchi 
152*9d26e4fcSRobert Mustacchi 	if (init == B_TRUE) {
153*9d26e4fcSRobert Mustacchi 		*base = raw;
154*9d26e4fcSRobert Mustacchi 		return;
155*9d26e4fcSRobert Mustacchi 	}
156*9d26e4fcSRobert Mustacchi 
157*9d26e4fcSRobert Mustacchi 	/*
158*9d26e4fcSRobert Mustacchi 	 * Watch out for wraparound as we only have a 32-bit counter.
159*9d26e4fcSRobert Mustacchi 	 */
160*9d26e4fcSRobert Mustacchi 	if (raw >= *base) {
161*9d26e4fcSRobert Mustacchi 		delta = raw - *base;
162*9d26e4fcSRobert Mustacchi 	} else {
163*9d26e4fcSRobert Mustacchi 		delta = 0x100000000ULL - *base + raw;
164*9d26e4fcSRobert Mustacchi 	}
165*9d26e4fcSRobert Mustacchi 
166*9d26e4fcSRobert Mustacchi 	kstat->value.ui64 += delta;
167*9d26e4fcSRobert Mustacchi 	*base = raw;
168*9d26e4fcSRobert Mustacchi 
169*9d26e4fcSRobert Mustacchi }
170*9d26e4fcSRobert Mustacchi 
171*9d26e4fcSRobert Mustacchi static void
172*9d26e4fcSRobert Mustacchi i40e_stat_vsi_update(i40e_t *i40e, boolean_t init)
173*9d26e4fcSRobert Mustacchi {
174*9d26e4fcSRobert Mustacchi 	i40e_vsi_stats_t *ivs;
175*9d26e4fcSRobert Mustacchi 	i40e_vsi_kstats_t *ivk;
176*9d26e4fcSRobert Mustacchi 	int id = i40e->i40e_vsi_stat_id;
177*9d26e4fcSRobert Mustacchi 
178*9d26e4fcSRobert Mustacchi 	ASSERT(i40e->i40e_vsi_kstat != NULL);
179*9d26e4fcSRobert Mustacchi 	ivs = &i40e->i40e_vsi_stat;
180*9d26e4fcSRobert Mustacchi 	ivk = i40e->i40e_vsi_kstat->ks_data;
181*9d26e4fcSRobert Mustacchi 
182*9d26e4fcSRobert Mustacchi 	mutex_enter(&i40e->i40e_stat_lock);
183*9d26e4fcSRobert Mustacchi 
184*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_GORCL(id), &ivk->ivk_rx_bytes,
185*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_bytes, init);
186*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_UPRCL(id), &ivk->ivk_rx_unicast,
187*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_unicast, init);
188*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_MPRCL(id), &ivk->ivk_rx_multicast,
189*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_multicast, init);
190*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_BPRCL(id), &ivk->ivk_rx_broadcast,
191*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_broadcast, init);
192*9d26e4fcSRobert Mustacchi 
193*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLV_RDPC(id), &ivk->ivk_rx_discards,
194*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_discards, init);
195*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLV_RUPP(id),
196*9d26e4fcSRobert Mustacchi 	    &ivk->ivk_rx_unknown_protocol,
197*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_rx_unknown_protocol,
198*9d26e4fcSRobert Mustacchi 	    init);
199*9d26e4fcSRobert Mustacchi 
200*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_GOTCL(id), &ivk->ivk_tx_bytes,
201*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_tx_bytes, init);
202*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_UPTCL(id), &ivk->ivk_tx_unicast,
203*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_tx_unicast, init);
204*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_MPTCL(id), &ivk->ivk_tx_multicast,
205*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_tx_multicast, init);
206*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLV_BPTCL(id), &ivk->ivk_tx_broadcast,
207*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_tx_broadcast, init);
208*9d26e4fcSRobert Mustacchi 
209*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLV_TEPC(id), &ivk->ivk_tx_errors,
210*9d26e4fcSRobert Mustacchi 	    &ivs->ivs_tx_errors, init);
211*9d26e4fcSRobert Mustacchi 
212*9d26e4fcSRobert Mustacchi 	mutex_exit(&i40e->i40e_stat_lock);
213*9d26e4fcSRobert Mustacchi 
214*9d26e4fcSRobert Mustacchi 	/*
215*9d26e4fcSRobert Mustacchi 	 * We follow ixgbe's lead here and that if a kstat update didn't work
216*9d26e4fcSRobert Mustacchi 	 * 100% then we mark service unaffected as opposed to when fetching
217*9d26e4fcSRobert Mustacchi 	 * things for MAC directly.
218*9d26e4fcSRobert Mustacchi 	 */
219*9d26e4fcSRobert Mustacchi 	if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_reg_handle) !=
220*9d26e4fcSRobert Mustacchi 	    DDI_FM_OK) {
221*9d26e4fcSRobert Mustacchi 		ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_UNAFFECTED);
222*9d26e4fcSRobert Mustacchi 	}
223*9d26e4fcSRobert Mustacchi }
224*9d26e4fcSRobert Mustacchi 
225*9d26e4fcSRobert Mustacchi static int
226*9d26e4fcSRobert Mustacchi i40e_stat_vsi_kstat_update(kstat_t *ksp, int rw)
227*9d26e4fcSRobert Mustacchi {
228*9d26e4fcSRobert Mustacchi 	i40e_t *i40e;
229*9d26e4fcSRobert Mustacchi 
230*9d26e4fcSRobert Mustacchi 	if (rw == KSTAT_WRITE)
231*9d26e4fcSRobert Mustacchi 		return (EACCES);
232*9d26e4fcSRobert Mustacchi 
233*9d26e4fcSRobert Mustacchi 	i40e = ksp->ks_private;
234*9d26e4fcSRobert Mustacchi 	i40e_stat_vsi_update(i40e, B_FALSE);
235*9d26e4fcSRobert Mustacchi 	return (0);
236*9d26e4fcSRobert Mustacchi }
237*9d26e4fcSRobert Mustacchi 
238*9d26e4fcSRobert Mustacchi void
239*9d26e4fcSRobert Mustacchi i40e_stat_vsi_fini(i40e_t *i40e)
240*9d26e4fcSRobert Mustacchi {
241*9d26e4fcSRobert Mustacchi 	if (i40e->i40e_vsi_kstat != NULL) {
242*9d26e4fcSRobert Mustacchi 		kstat_delete(i40e->i40e_vsi_kstat);
243*9d26e4fcSRobert Mustacchi 		i40e->i40e_vsi_kstat = NULL;
244*9d26e4fcSRobert Mustacchi 	}
245*9d26e4fcSRobert Mustacchi }
246*9d26e4fcSRobert Mustacchi 
247*9d26e4fcSRobert Mustacchi boolean_t
248*9d26e4fcSRobert Mustacchi i40e_stat_vsi_init(i40e_t *i40e)
249*9d26e4fcSRobert Mustacchi {
250*9d26e4fcSRobert Mustacchi 	kstat_t *ksp;
251*9d26e4fcSRobert Mustacchi 	i40e_vsi_kstats_t *ivk;
252*9d26e4fcSRobert Mustacchi 	char buf[64];
253*9d26e4fcSRobert Mustacchi 
254*9d26e4fcSRobert Mustacchi 	(void) snprintf(buf, sizeof (buf), "vsi_%d", i40e->i40e_vsi_id);
255*9d26e4fcSRobert Mustacchi 
256*9d26e4fcSRobert Mustacchi 	ksp = kstat_create(I40E_MODULE_NAME, ddi_get_instance(i40e->i40e_dip),
257*9d26e4fcSRobert Mustacchi 	    buf, "net", KSTAT_TYPE_NAMED,
258*9d26e4fcSRobert Mustacchi 	    sizeof (i40e_vsi_kstats_t) / sizeof (kstat_named_t), 0);
259*9d26e4fcSRobert Mustacchi 
260*9d26e4fcSRobert Mustacchi 	if (ksp == NULL) {
261*9d26e4fcSRobert Mustacchi 		i40e_error(i40e, "Failed to create kstats for VSI %d",
262*9d26e4fcSRobert Mustacchi 		    i40e->i40e_vsi_id);
263*9d26e4fcSRobert Mustacchi 		return (B_FALSE);
264*9d26e4fcSRobert Mustacchi 	}
265*9d26e4fcSRobert Mustacchi 
266*9d26e4fcSRobert Mustacchi 	i40e->i40e_vsi_kstat = ksp;
267*9d26e4fcSRobert Mustacchi 	ivk = ksp->ks_data;
268*9d26e4fcSRobert Mustacchi 	ksp->ks_update = i40e_stat_vsi_kstat_update;
269*9d26e4fcSRobert Mustacchi 	ksp->ks_private = i40e;
270*9d26e4fcSRobert Mustacchi 
271*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_bytes, "rx_bytes",
272*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
273*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_unicast, "rx_unicast",
274*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
275*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_multicast, "rx_multicast",
276*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
277*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_broadcast, "rx_broadcast",
278*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
279*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_discards, "rx_discards",
280*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
281*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_rx_unknown_protocol, "rx_unknown_protocol",
282*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
283*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_tx_bytes, "tx_bytes",
284*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
285*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_tx_unicast, "tx_unicast",
286*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
287*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_tx_multicast, "tx_multicast",
288*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
289*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_tx_broadcast, "tx_broadcast",
290*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
291*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ivk->ivk_tx_errors, "tx_errors",
292*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
293*9d26e4fcSRobert Mustacchi 
294*9d26e4fcSRobert Mustacchi 	bzero(&i40e->i40e_vsi_stat, sizeof (i40e_vsi_stats_t));
295*9d26e4fcSRobert Mustacchi 	i40e_stat_vsi_update(i40e, B_TRUE);
296*9d26e4fcSRobert Mustacchi 	kstat_install(i40e->i40e_vsi_kstat);
297*9d26e4fcSRobert Mustacchi 
298*9d26e4fcSRobert Mustacchi 	return (B_TRUE);
299*9d26e4fcSRobert Mustacchi }
300*9d26e4fcSRobert Mustacchi 
301*9d26e4fcSRobert Mustacchi static void
302*9d26e4fcSRobert Mustacchi i40e_stat_pf_update(i40e_t *i40e, boolean_t init)
303*9d26e4fcSRobert Mustacchi {
304*9d26e4fcSRobert Mustacchi 	i40e_pf_stats_t *ips;
305*9d26e4fcSRobert Mustacchi 	i40e_pf_kstats_t *ipk;
306*9d26e4fcSRobert Mustacchi 	int port = i40e->i40e_hw_space.port;
307*9d26e4fcSRobert Mustacchi 	int i;
308*9d26e4fcSRobert Mustacchi 
309*9d26e4fcSRobert Mustacchi 	ASSERT(i40e->i40e_pf_kstat != NULL);
310*9d26e4fcSRobert Mustacchi 	ips = &i40e->i40e_pf_stat;
311*9d26e4fcSRobert Mustacchi 	ipk = i40e->i40e_pf_kstat->ks_data;
312*9d26e4fcSRobert Mustacchi 
313*9d26e4fcSRobert Mustacchi 	mutex_enter(&i40e->i40e_stat_lock);
314*9d26e4fcSRobert Mustacchi 
315*9d26e4fcSRobert Mustacchi 	/* 64-bit PCIe regs */
316*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_GORCL(port),
317*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_bytes, &ips->ips_rx_bytes, init);
318*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_UPRCL(port),
319*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_unicast, &ips->ips_rx_unicast, init);
320*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_MPRCL(port),
321*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_multicast, &ips->ips_rx_multicast, init);
322*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_BPRCL(port),
323*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_broadcast, &ips->ips_rx_broadcast, init);
324*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_GOTCL(port),
325*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_bytes, &ips->ips_tx_bytes, init);
326*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_UPTCL(port),
327*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_unicast, &ips->ips_tx_unicast, init);
328*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_MPTCL(port),
329*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_multicast, &ips->ips_tx_multicast, init);
330*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_BPTCL(port),
331*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_broadcast, &ips->ips_tx_broadcast, init);
332*9d26e4fcSRobert Mustacchi 
333*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC64L(port),
334*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_64, &ips->ips_rx_size_64, init);
335*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC127L(port),
336*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_127, &ips->ips_rx_size_127, init);
337*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC255L(port),
338*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_255, &ips->ips_rx_size_255, init);
339*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC511L(port),
340*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_511, &ips->ips_rx_size_511, init);
341*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC1023L(port),
342*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_1023, &ips->ips_rx_size_1023, init);
343*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC1522L(port),
344*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_1522, &ips->ips_rx_size_1522, init);
345*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PRC9522L(port),
346*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_size_9522, &ips->ips_rx_size_9522, init);
347*9d26e4fcSRobert Mustacchi 
348*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC64L(port),
349*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_64, &ips->ips_tx_size_64, init);
350*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC127L(port),
351*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_127, &ips->ips_tx_size_127, init);
352*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC255L(port),
353*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_255, &ips->ips_tx_size_255, init);
354*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC511L(port),
355*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_511, &ips->ips_tx_size_511, init);
356*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC1023L(port),
357*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_1023, &ips->ips_tx_size_1023, init);
358*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC1522L(port),
359*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_1522, &ips->ips_tx_size_1522, init);
360*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GLPRT_PTC9522L(port),
361*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_size_9522, &ips->ips_tx_size_9522, init);
362*9d26e4fcSRobert Mustacchi 
363*9d26e4fcSRobert Mustacchi 	/* 32-bit PCIe regs */
364*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_LXONRXC(port),
365*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_link_xon_rx, &ips->ips_link_xon_rx, init);
366*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_LXOFFRXC(port),
367*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_link_xoff_rx, &ips->ips_link_xoff_rx, init);
368*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_LXONTXC(port),
369*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_link_xon_tx, &ips->ips_link_xon_tx, init);
370*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_LXOFFTXC(port),
371*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_link_xoff_tx, &ips->ips_link_xoff_tx, init);
372*9d26e4fcSRobert Mustacchi 
373*9d26e4fcSRobert Mustacchi 	for (i = 0; i < 8; i++) {
374*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_PXONRXC(port, i),
375*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_priority_xon_rx[i], &ips->ips_priority_xon_rx[i],
376*9d26e4fcSRobert Mustacchi 		    init);
377*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_PXOFFRXC(port, i),
378*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_priority_xoff_rx[i],
379*9d26e4fcSRobert Mustacchi 		    &ips->ips_priority_xoff_rx[i],
380*9d26e4fcSRobert Mustacchi 		    init);
381*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_PXONTXC(port, i),
382*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_priority_xon_tx[i], &ips->ips_priority_xon_tx[i],
383*9d26e4fcSRobert Mustacchi 		    init);
384*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_PXOFFTXC(port, i),
385*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_priority_xoff_tx[i],
386*9d26e4fcSRobert Mustacchi 		    &ips->ips_priority_xoff_tx[i],
387*9d26e4fcSRobert Mustacchi 		    init);
388*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RXON2OFFCNT(port, i),
389*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_priority_xon_2_xoff[i],
390*9d26e4fcSRobert Mustacchi 		    &ips->ips_priority_xon_2_xoff[i],
391*9d26e4fcSRobert Mustacchi 		    init);
392*9d26e4fcSRobert Mustacchi 	}
393*9d26e4fcSRobert Mustacchi 
394*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_CRCERRS(port),
395*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_crc_errors, &ips->ips_crc_errors, init);
396*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_ILLERRC(port),
397*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_illegal_bytes, &ips->ips_illegal_bytes, init);
398*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_MLFC(port),
399*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_mac_local_faults, &ips->ips_mac_local_faults, init);
400*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_MRFC(port),
401*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_mac_remote_faults, &ips->ips_mac_remote_faults, init);
402*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RLEC(port),
403*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_length_errors, &ips->ips_rx_length_errors, init);
404*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RUC(port),
405*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_undersize, &ips->ips_rx_undersize, init);
406*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RFC(port),
407*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_fragments, &ips->ips_rx_fragments, init);
408*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_ROC(port),
409*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_oversize, &ips->ips_rx_oversize, init);
410*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RJC(port),
411*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_jabber, &ips->ips_rx_jabber, init);
412*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RDPC(port),
413*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_discards, &ips->ips_rx_discards, init);
414*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_LDPC(port),
415*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_vm_discards, &ips->ips_rx_vm_discards, init);
416*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_MSPDC(port),
417*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_short_discards, &ips->ips_rx_short_discards, init);
418*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_TDOLD(port),
419*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_tx_dropped_link_down, &ips->ips_tx_dropped_link_down,
420*9d26e4fcSRobert Mustacchi 	    init);
421*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint32(i40e, I40E_GLPRT_RUPP(port),
422*9d26e4fcSRobert Mustacchi 	    &ipk->ipk_rx_unknown_protocol, &ips->ips_rx_unknown_protocol, init);
423*9d26e4fcSRobert Mustacchi 
424*9d26e4fcSRobert Mustacchi 	/* 64-bit */
425*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GL_RXERR1_L(port), &ipk->ipk_rx_err1,
426*9d26e4fcSRobert Mustacchi 	    &ips->ips_rx_err1, init);
427*9d26e4fcSRobert Mustacchi 	i40e_stat_get_uint48(i40e, I40E_GL_RXERR2_L(port), &ipk->ipk_rx_err2,
428*9d26e4fcSRobert Mustacchi 	    &ips->ips_rx_err2, init);
429*9d26e4fcSRobert Mustacchi 
430*9d26e4fcSRobert Mustacchi 	mutex_exit(&i40e->i40e_stat_lock);
431*9d26e4fcSRobert Mustacchi 
432*9d26e4fcSRobert Mustacchi 	/*
433*9d26e4fcSRobert Mustacchi 	 * We follow ixgbe's lead here and that if a kstat update didn't work
434*9d26e4fcSRobert Mustacchi 	 * 100% then we mark service unaffected as opposed to when fetching
435*9d26e4fcSRobert Mustacchi 	 * things for MAC directly.
436*9d26e4fcSRobert Mustacchi 	 */
437*9d26e4fcSRobert Mustacchi 	if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_reg_handle) !=
438*9d26e4fcSRobert Mustacchi 	    DDI_FM_OK) {
439*9d26e4fcSRobert Mustacchi 		ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_UNAFFECTED);
440*9d26e4fcSRobert Mustacchi 	}
441*9d26e4fcSRobert Mustacchi }
442*9d26e4fcSRobert Mustacchi 
443*9d26e4fcSRobert Mustacchi static int
444*9d26e4fcSRobert Mustacchi i40e_stat_pf_kstat_update(kstat_t *ksp, int rw)
445*9d26e4fcSRobert Mustacchi {
446*9d26e4fcSRobert Mustacchi 	i40e_t *i40e;
447*9d26e4fcSRobert Mustacchi 
448*9d26e4fcSRobert Mustacchi 	if (rw == KSTAT_WRITE)
449*9d26e4fcSRobert Mustacchi 		return (EACCES);
450*9d26e4fcSRobert Mustacchi 
451*9d26e4fcSRobert Mustacchi 	i40e = ksp->ks_private;
452*9d26e4fcSRobert Mustacchi 	i40e_stat_pf_update(i40e, B_FALSE);
453*9d26e4fcSRobert Mustacchi 	return (0);
454*9d26e4fcSRobert Mustacchi }
455*9d26e4fcSRobert Mustacchi 
456*9d26e4fcSRobert Mustacchi 
457*9d26e4fcSRobert Mustacchi static boolean_t
458*9d26e4fcSRobert Mustacchi i40e_stat_pf_init(i40e_t *i40e)
459*9d26e4fcSRobert Mustacchi {
460*9d26e4fcSRobert Mustacchi 	kstat_t *ksp;
461*9d26e4fcSRobert Mustacchi 	i40e_pf_kstats_t *ipk;
462*9d26e4fcSRobert Mustacchi 
463*9d26e4fcSRobert Mustacchi 	ksp = kstat_create(I40E_MODULE_NAME, ddi_get_instance(i40e->i40e_dip),
464*9d26e4fcSRobert Mustacchi 	    "pfstats", "net", KSTAT_TYPE_NAMED,
465*9d26e4fcSRobert Mustacchi 	    sizeof (i40e_pf_kstats_t) / sizeof (kstat_named_t), 0);
466*9d26e4fcSRobert Mustacchi 	if (ksp == NULL) {
467*9d26e4fcSRobert Mustacchi 		i40e_error(i40e, "Could not create kernel statistics.");
468*9d26e4fcSRobert Mustacchi 		return (B_FALSE);
469*9d26e4fcSRobert Mustacchi 	}
470*9d26e4fcSRobert Mustacchi 
471*9d26e4fcSRobert Mustacchi 	i40e->i40e_pf_kstat = ksp;
472*9d26e4fcSRobert Mustacchi 	ipk = ksp->ks_data;
473*9d26e4fcSRobert Mustacchi 	ksp->ks_update = i40e_stat_pf_kstat_update;
474*9d26e4fcSRobert Mustacchi 	ksp->ks_private = i40e;
475*9d26e4fcSRobert Mustacchi 
476*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_bytes, "rx_bytes",
477*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
478*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_unicast, "rx_unicast",
479*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
480*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_multicast, "rx_multicast",
481*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
482*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_broadcast, "rx_broadcast",
483*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
484*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_bytes, "tx_bytes",
485*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
486*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_unicast, "tx_unicast",
487*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
488*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_multicast, "tx_multicast",
489*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
490*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_broadcast, "tx_broadcast",
491*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
492*9d26e4fcSRobert Mustacchi 
493*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_64, "rx_size_64",
494*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
495*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_127, "rx_size_127",
496*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
497*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_255, "rx_size_255",
498*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
499*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_511, "rx_size_511",
500*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
501*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_1023, "rx_size_1023",
502*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
503*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_1522, "rx_size_1522",
504*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
505*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_size_9522, "rx_size_9522",
506*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
507*9d26e4fcSRobert Mustacchi 
508*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_64, "tx_size_64",
509*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
510*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_127, "tx_size_127",
511*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
512*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_255, "tx_size_255",
513*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
514*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_511, "tx_size_511",
515*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
516*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_1023, "tx_size_1023",
517*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
518*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_1522, "tx_size_1522",
519*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
520*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_size_9522, "tx_size_9522",
521*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
522*9d26e4fcSRobert Mustacchi 
523*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_link_xon_rx, "link_xon_rx",
524*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
525*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_link_xoff_rx, "link_xoff_rx",
526*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
527*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_link_xon_tx, "link_xon_tx",
528*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
529*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_link_xoff_tx, "link_xoff_tx",
530*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
531*9d26e4fcSRobert Mustacchi 
532*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[0], "priority_xon_rx[0]",
533*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
534*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[0], "priority_xoff_rx[0]",
535*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
536*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[0], "priority_xon_tx[0]",
537*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
538*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[0], "priority_xoff_tx[0]",
539*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
540*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[0],
541*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[0]",
542*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
543*9d26e4fcSRobert Mustacchi 
544*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[1], "priority_xon_rx[1]",
545*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
546*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[1], "priority_xoff_rx[1]",
547*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
548*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[1], "priority_xon_tx[1]",
549*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
550*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[1], "priority_xoff_tx[1]",
551*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
552*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[1],
553*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[1]",
554*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
555*9d26e4fcSRobert Mustacchi 
556*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[2], "priority_xon_rx[2]",
557*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
558*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[2], "priority_xoff_rx[2]",
559*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
560*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[2], "priority_xon_tx[2]",
561*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
562*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[2], "priority_xoff_tx[2]",
563*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
564*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[2],
565*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[2]",
566*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
567*9d26e4fcSRobert Mustacchi 
568*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[3], "priority_xon_rx[3]",
569*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
570*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[3], "priority_xoff_rx[3]",
571*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
572*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[3], "priority_xon_tx[3]",
573*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
574*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[3], "priority_xoff_tx[3]",
575*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
576*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[3],
577*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[3]",
578*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
579*9d26e4fcSRobert Mustacchi 
580*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[4], "priority_xon_rx[4]",
581*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
582*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[4], "priority_xoff_rx[4]",
583*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
584*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[4], "priority_xon_tx[4]",
585*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
586*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[4], "priority_xoff_tx[4]",
587*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
588*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[4],
589*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[4]",
590*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
591*9d26e4fcSRobert Mustacchi 
592*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[5], "priority_xon_rx[5]",
593*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
594*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[5], "priority_xoff_rx[5]",
595*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
596*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[5], "priority_xon_tx[5]",
597*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
598*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[5], "priority_xoff_tx[5]",
599*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
600*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[5],
601*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[5]",
602*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
603*9d26e4fcSRobert Mustacchi 
604*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[6], "priority_xon_rx[6]",
605*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
606*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[6], "priority_xoff_rx[6]",
607*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
608*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[6], "priority_xon_tx[6]",
609*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
610*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[6], "priority_xoff_tx[6]",
611*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
612*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[6],
613*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[6]",
614*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
615*9d26e4fcSRobert Mustacchi 
616*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_rx[7], "priority_xon_rx[7]",
617*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
618*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_rx[7], "priority_xoff_rx[7]",
619*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
620*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_tx[7], "priority_xon_tx[7]",
621*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
622*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xoff_tx[7], "priority_xoff_tx[7]",
623*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
624*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_priority_xon_2_xoff[7],
625*9d26e4fcSRobert Mustacchi 	    "priority_xon_2_xoff[7]",
626*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
627*9d26e4fcSRobert Mustacchi 
628*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_crc_errors, "crc_errors",
629*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
630*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_illegal_bytes, "illegal_bytes",
631*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
632*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_mac_local_faults, "mac_local_faults",
633*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
634*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_mac_remote_faults, "mac_remote_faults",
635*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
636*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_length_errors, "rx_length_errors",
637*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
638*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_undersize, "rx_undersize",
639*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
640*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_fragments, "rx_fragments",
641*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
642*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_oversize, "rx_oversize",
643*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
644*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_jabber, "rx_jabber",
645*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
646*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_discards, "rx_discards",
647*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
648*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_vm_discards, "rx_vm_discards",
649*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
650*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_short_discards, "rx_short_discards",
651*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
652*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_tx_dropped_link_down, "tx_dropped_link_down",
653*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
654*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_unknown_protocol, "rx_unknown_protocol",
655*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
656*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_err1, "rx_err1",
657*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
658*9d26e4fcSRobert Mustacchi 	kstat_named_init(&ipk->ipk_rx_err2, "rx_err2",
659*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
660*9d26e4fcSRobert Mustacchi 
661*9d26e4fcSRobert Mustacchi 
662*9d26e4fcSRobert Mustacchi 	bzero(&i40e->i40e_pf_stat, sizeof (i40e_pf_stats_t));
663*9d26e4fcSRobert Mustacchi 	i40e_stat_pf_update(i40e, B_TRUE);
664*9d26e4fcSRobert Mustacchi 
665*9d26e4fcSRobert Mustacchi 	kstat_install(i40e->i40e_pf_kstat);
666*9d26e4fcSRobert Mustacchi 
667*9d26e4fcSRobert Mustacchi 	return (B_TRUE);
668*9d26e4fcSRobert Mustacchi }
669*9d26e4fcSRobert Mustacchi 
670*9d26e4fcSRobert Mustacchi void
671*9d26e4fcSRobert Mustacchi i40e_stats_fini(i40e_t *i40e)
672*9d26e4fcSRobert Mustacchi {
673*9d26e4fcSRobert Mustacchi 	ASSERT(i40e->i40e_vsi_kstat == NULL);
674*9d26e4fcSRobert Mustacchi 	if (i40e->i40e_pf_kstat != NULL) {
675*9d26e4fcSRobert Mustacchi 		kstat_delete(i40e->i40e_pf_kstat);
676*9d26e4fcSRobert Mustacchi 		i40e->i40e_pf_kstat = NULL;
677*9d26e4fcSRobert Mustacchi 	}
678*9d26e4fcSRobert Mustacchi 
679*9d26e4fcSRobert Mustacchi 	mutex_destroy(&i40e->i40e_stat_lock);
680*9d26e4fcSRobert Mustacchi }
681*9d26e4fcSRobert Mustacchi 
682*9d26e4fcSRobert Mustacchi boolean_t
683*9d26e4fcSRobert Mustacchi i40e_stats_init(i40e_t *i40e)
684*9d26e4fcSRobert Mustacchi {
685*9d26e4fcSRobert Mustacchi 	mutex_init(&i40e->i40e_stat_lock, NULL, MUTEX_DRIVER, NULL);
686*9d26e4fcSRobert Mustacchi 	if (i40e_stat_pf_init(i40e) == B_FALSE) {
687*9d26e4fcSRobert Mustacchi 		mutex_destroy(&i40e->i40e_stat_lock);
688*9d26e4fcSRobert Mustacchi 		return (B_FALSE);
689*9d26e4fcSRobert Mustacchi 	}
690*9d26e4fcSRobert Mustacchi 
691*9d26e4fcSRobert Mustacchi 	return (B_TRUE);
692*9d26e4fcSRobert Mustacchi }
693*9d26e4fcSRobert Mustacchi 
694*9d26e4fcSRobert Mustacchi /*
695*9d26e4fcSRobert Mustacchi  * For Nemo/GLDv3.
696*9d26e4fcSRobert Mustacchi  */
697*9d26e4fcSRobert Mustacchi int
698*9d26e4fcSRobert Mustacchi i40e_m_stat(void *arg, uint_t stat, uint64_t *val)
699*9d26e4fcSRobert Mustacchi {
700*9d26e4fcSRobert Mustacchi 	i40e_t *i40e = (i40e_t *)arg;
701*9d26e4fcSRobert Mustacchi 	i40e_hw_t *hw = &i40e->i40e_hw_space;
702*9d26e4fcSRobert Mustacchi 	int port = i40e->i40e_hw_space.port;
703*9d26e4fcSRobert Mustacchi 	i40e_pf_stats_t *ips;
704*9d26e4fcSRobert Mustacchi 	i40e_pf_kstats_t *ipk;
705*9d26e4fcSRobert Mustacchi 
706*9d26e4fcSRobert Mustacchi 
707*9d26e4fcSRobert Mustacchi 	ASSERT(i40e->i40e_pf_kstat != NULL);
708*9d26e4fcSRobert Mustacchi 	ips = &i40e->i40e_pf_stat;
709*9d26e4fcSRobert Mustacchi 	ipk = i40e->i40e_pf_kstat->ks_data;
710*9d26e4fcSRobert Mustacchi 
711*9d26e4fcSRobert Mustacchi 	/*
712*9d26e4fcSRobert Mustacchi 	 * We need both locks, as various stats are protected by different
713*9d26e4fcSRobert Mustacchi 	 * things here.
714*9d26e4fcSRobert Mustacchi 	 */
715*9d26e4fcSRobert Mustacchi 	mutex_enter(&i40e->i40e_general_lock);
716*9d26e4fcSRobert Mustacchi 
717*9d26e4fcSRobert Mustacchi 	if (i40e->i40e_state & I40E_SUSPENDED) {
718*9d26e4fcSRobert Mustacchi 		mutex_exit(&i40e->i40e_general_lock);
719*9d26e4fcSRobert Mustacchi 		return (ECANCELED);
720*9d26e4fcSRobert Mustacchi 	}
721*9d26e4fcSRobert Mustacchi 
722*9d26e4fcSRobert Mustacchi 	mutex_enter(&i40e->i40e_stat_lock);
723*9d26e4fcSRobert Mustacchi 
724*9d26e4fcSRobert Mustacchi 	/*
725*9d26e4fcSRobert Mustacchi 	 * Unfortunately the GLDv3 conflates two rather different things here.
726*9d26e4fcSRobert Mustacchi 	 * We're combining statistics about the physical port represented by
727*9d26e4fcSRobert Mustacchi 	 * this instance with statistics that describe the properties of the
728*9d26e4fcSRobert Mustacchi 	 * logical interface. As such, we're going to use the various aspects of
729*9d26e4fcSRobert Mustacchi 	 * the port to describe these stats as they represent what the physical
730*9d26e4fcSRobert Mustacchi 	 * instance is doing, even though that that means some tools may be
731*9d26e4fcSRobert Mustacchi 	 * confused and that to see the logical traffic on the interface itself
732*9d26e4fcSRobert Mustacchi 	 * sans VNICs and the like will require more work.
733*9d26e4fcSRobert Mustacchi 	 *
734*9d26e4fcSRobert Mustacchi 	 * Stats which are not listed in this switch statement are unimplemented
735*9d26e4fcSRobert Mustacchi 	 * at this time in hardware or don't currently apply to the device.
736*9d26e4fcSRobert Mustacchi 	 */
737*9d26e4fcSRobert Mustacchi 	switch (stat) {
738*9d26e4fcSRobert Mustacchi 	/* MIB-II stats (RFC 1213 and RFC 1573) */
739*9d26e4fcSRobert Mustacchi 	case MAC_STAT_IFSPEED:
740*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_speed * 1000000ull;
741*9d26e4fcSRobert Mustacchi 		break;
742*9d26e4fcSRobert Mustacchi 	case MAC_STAT_MULTIRCV:
743*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_MPRCL(port),
744*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_multicast, &ips->ips_rx_multicast, B_FALSE);
745*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_multicast.value.ui64;
746*9d26e4fcSRobert Mustacchi 		break;
747*9d26e4fcSRobert Mustacchi 	case MAC_STAT_BRDCSTRCV:
748*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_BPRCL(port),
749*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_broadcast, &ips->ips_rx_broadcast, B_FALSE);
750*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_broadcast.value.ui64;
751*9d26e4fcSRobert Mustacchi 		break;
752*9d26e4fcSRobert Mustacchi 	case MAC_STAT_MULTIXMT:
753*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_MPTCL(port),
754*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_multicast, &ips->ips_tx_multicast, B_FALSE);
755*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_tx_multicast.value.ui64;
756*9d26e4fcSRobert Mustacchi 		break;
757*9d26e4fcSRobert Mustacchi 	case MAC_STAT_BRDCSTXMT:
758*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_BPTCL(port),
759*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_broadcast, &ips->ips_tx_broadcast, B_FALSE);
760*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_tx_broadcast.value.ui64;
761*9d26e4fcSRobert Mustacchi 		break;
762*9d26e4fcSRobert Mustacchi 	case MAC_STAT_NORCVBUF:
763*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RDPC(port),
764*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_discards, &ips->ips_rx_discards, B_FALSE);
765*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_LDPC(port),
766*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_vm_discards, &ips->ips_rx_vm_discards,
767*9d26e4fcSRobert Mustacchi 		    B_FALSE);
768*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_discards.value.ui64 +
769*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_vm_discards.value.ui64;
770*9d26e4fcSRobert Mustacchi 		break;
771*9d26e4fcSRobert Mustacchi 	/*
772*9d26e4fcSRobert Mustacchi 	 * Note, that some RXERR2 stats are also duplicated by the switch filter
773*9d26e4fcSRobert Mustacchi 	 * stats; however, since we're not using those at this time, it seems
774*9d26e4fcSRobert Mustacchi 	 * reasonable to include them.
775*9d26e4fcSRobert Mustacchi 	 */
776*9d26e4fcSRobert Mustacchi 	case MAC_STAT_IERRORS:
777*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_CRCERRS(port),
778*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_crc_errors, &ips->ips_crc_errors, B_FALSE);
779*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_ILLERRC(port),
780*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_illegal_bytes, &ips->ips_illegal_bytes, B_FALSE);
781*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RLEC(port),
782*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_length_errors, &ips->ips_rx_length_errors,
783*9d26e4fcSRobert Mustacchi 		    B_FALSE);
784*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GL_RXERR1_L(port),
785*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_err1, &ips->ips_rx_err1, B_FALSE);
786*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GL_RXERR2_L(port),
787*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_err2, &ips->ips_rx_err2, B_FALSE);
788*9d26e4fcSRobert Mustacchi 
789*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_crc_errors.value.ui64 +
790*9d26e4fcSRobert Mustacchi 		    ipk->ipk_illegal_bytes.value.ui64 +
791*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_length_errors.value.ui64 +
792*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_err1.value.ui64 +
793*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_err2.value.ui64;
794*9d26e4fcSRobert Mustacchi 		break;
795*9d26e4fcSRobert Mustacchi 	case MAC_STAT_UNKNOWNS:
796*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RUPP(port),
797*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_unknown_protocol,
798*9d26e4fcSRobert Mustacchi 		    &ips->ips_rx_unknown_protocol,
799*9d26e4fcSRobert Mustacchi 		    B_FALSE);
800*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_unknown_protocol.value.ui64;
801*9d26e4fcSRobert Mustacchi 		break;
802*9d26e4fcSRobert Mustacchi 	case MAC_STAT_RBYTES:
803*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_GORCL(port),
804*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_bytes, &ips->ips_rx_bytes, B_FALSE);
805*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_bytes.value.ui64;
806*9d26e4fcSRobert Mustacchi 		break;
807*9d26e4fcSRobert Mustacchi 	case MAC_STAT_IPACKETS:
808*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_UPRCL(port),
809*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_unicast, &ips->ips_rx_unicast, B_FALSE);
810*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_MPRCL(port),
811*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_multicast, &ips->ips_rx_multicast, B_FALSE);
812*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_BPRCL(port),
813*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_broadcast, &ips->ips_rx_broadcast, B_FALSE);
814*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_unicast.value.ui64 +
815*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_multicast.value.ui64 +
816*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_broadcast.value.ui64;
817*9d26e4fcSRobert Mustacchi 		break;
818*9d26e4fcSRobert Mustacchi 	case MAC_STAT_OBYTES:
819*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_GOTCL(port),
820*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_bytes, &ips->ips_tx_bytes, B_FALSE);
821*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_tx_bytes.value.ui64;
822*9d26e4fcSRobert Mustacchi 		break;
823*9d26e4fcSRobert Mustacchi 	case MAC_STAT_OPACKETS:
824*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_UPTCL(port),
825*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_unicast, &ips->ips_tx_unicast, B_FALSE);
826*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_MPTCL(port),
827*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_multicast, &ips->ips_tx_multicast, B_FALSE);
828*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint48(i40e, I40E_GLPRT_BPTCL(port),
829*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_tx_broadcast, &ips->ips_tx_broadcast, B_FALSE);
830*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_tx_unicast.value.ui64 +
831*9d26e4fcSRobert Mustacchi 		    ipk->ipk_tx_multicast.value.ui64 +
832*9d26e4fcSRobert Mustacchi 		    ipk->ipk_tx_broadcast.value.ui64;
833*9d26e4fcSRobert Mustacchi 		break;
834*9d26e4fcSRobert Mustacchi 	case MAC_STAT_UNDERFLOWS:
835*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RUC(port),
836*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_undersize, &ips->ips_rx_undersize, B_FALSE);
837*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RFC(port),
838*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_fragments, &ips->ips_rx_fragments, B_FALSE);
839*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_MSPDC(port),
840*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_short_discards, &ips->ips_rx_short_discards,
841*9d26e4fcSRobert Mustacchi 		    B_FALSE);
842*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_undersize.value.ui64 +
843*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_fragments.value.ui64 +
844*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_short_discards.value.ui64;
845*9d26e4fcSRobert Mustacchi 		break;
846*9d26e4fcSRobert Mustacchi 	case MAC_STAT_OVERFLOWS:
847*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_ROC(port),
848*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_oversize, &ips->ips_rx_oversize, B_FALSE);
849*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RJC(port),
850*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_jabber, &ips->ips_rx_jabber, B_FALSE);
851*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_oversize.value.ui64 +
852*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_fragments.value.ui64;
853*9d26e4fcSRobert Mustacchi 		break;
854*9d26e4fcSRobert Mustacchi 
855*9d26e4fcSRobert Mustacchi 	/* RFC 1643 stats */
856*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_FCS_ERRORS:
857*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_CRCERRS(port),
858*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_crc_errors, &ips->ips_crc_errors, B_FALSE);
859*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_crc_errors.value.ui64;
860*9d26e4fcSRobert Mustacchi 		break;
861*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_TOOLONG_ERRORS:
862*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_ROC(port),
863*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_oversize, &ips->ips_rx_oversize, B_FALSE);
864*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_oversize.value.ui64;
865*9d26e4fcSRobert Mustacchi 		break;
866*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_MACRCV_ERRORS:
867*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_ILLERRC(port),
868*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_illegal_bytes, &ips->ips_illegal_bytes, B_FALSE);
869*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RLEC(port),
870*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_length_errors, &ips->ips_rx_length_errors,
871*9d26e4fcSRobert Mustacchi 		    B_FALSE);
872*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RFC(port),
873*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_fragments, &ips->ips_rx_fragments, B_FALSE);
874*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_illegal_bytes.value.ui64 +
875*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_length_errors.value.ui64 +
876*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_fragments.value.ui64;
877*9d26e4fcSRobert Mustacchi 		break;
878*9d26e4fcSRobert Mustacchi 	/* MII/GMII stats */
879*9d26e4fcSRobert Mustacchi 
880*9d26e4fcSRobert Mustacchi 	/*
881*9d26e4fcSRobert Mustacchi 	 * The receiver address is apparently the same as the port number.
882*9d26e4fcSRobert Mustacchi 	 */
883*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_XCVR_ADDR:
884*9d26e4fcSRobert Mustacchi 		/* The Receiver address is apparently the same as the port */
885*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_hw_space.port;
886*9d26e4fcSRobert Mustacchi 		break;
887*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_XCVR_ID:
888*9d26e4fcSRobert Mustacchi 		switch (hw->phy.media_type) {
889*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_BASET:
890*9d26e4fcSRobert Mustacchi 			/*
891*9d26e4fcSRobert Mustacchi 			 * Transform the data here into the ID. Note, generally
892*9d26e4fcSRobert Mustacchi 			 * the revision is left out.
893*9d26e4fcSRobert Mustacchi 			 */
894*9d26e4fcSRobert Mustacchi 			*val = i40e->i40e_phy.phy_id[3] << 24 |
895*9d26e4fcSRobert Mustacchi 			    i40e->i40e_phy.phy_id[2] << 16 |
896*9d26e4fcSRobert Mustacchi 			    i40e->i40e_phy.phy_id[1] << 8;
897*9d26e4fcSRobert Mustacchi 			break;
898*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_FIBER:
899*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_BACKPLANE:
900*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_CX4:
901*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_DA:
902*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_VIRTUAL:
903*9d26e4fcSRobert Mustacchi 			*val = i40e->i40e_phy.phy_id[0] |
904*9d26e4fcSRobert Mustacchi 			    i40e->i40e_phy.phy_id[1] << 8 |
905*9d26e4fcSRobert Mustacchi 			    i40e->i40e_phy.phy_id[2] << 16;
906*9d26e4fcSRobert Mustacchi 			break;
907*9d26e4fcSRobert Mustacchi 		case I40E_MEDIA_TYPE_UNKNOWN:
908*9d26e4fcSRobert Mustacchi 		default:
909*9d26e4fcSRobert Mustacchi 			goto unimpl;
910*9d26e4fcSRobert Mustacchi 		}
911*9d26e4fcSRobert Mustacchi 		break;
912*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_XCVR_INUSE:
913*9d26e4fcSRobert Mustacchi 		switch (hw->phy.link_info.phy_type) {
914*9d26e4fcSRobert Mustacchi 		case I40E_PHY_TYPE_100BASE_TX:
915*9d26e4fcSRobert Mustacchi 			*val = XCVR_100T2;
916*9d26e4fcSRobert Mustacchi 			break;
917*9d26e4fcSRobert Mustacchi 		case I40E_PHY_TYPE_1000BASE_T:
918*9d26e4fcSRobert Mustacchi 			*val = XCVR_1000T;
919*9d26e4fcSRobert Mustacchi 			break;
920*9d26e4fcSRobert Mustacchi 		default:
921*9d26e4fcSRobert Mustacchi 			*val = XCVR_UNDEFINED;
922*9d26e4fcSRobert Mustacchi 			break;
923*9d26e4fcSRobert Mustacchi 		}
924*9d26e4fcSRobert Mustacchi 		break;
925*9d26e4fcSRobert Mustacchi 
926*9d26e4fcSRobert Mustacchi 	/*
927*9d26e4fcSRobert Mustacchi 	 * This group answers the question of do we support a given speed in
928*9d26e4fcSRobert Mustacchi 	 * theory.
929*9d26e4fcSRobert Mustacchi 	 */
930*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_100FDX:
931*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_100MB) != 0;
932*9d26e4fcSRobert Mustacchi 		break;
933*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_1000FDX:
934*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_1GB) != 0;
935*9d26e4fcSRobert Mustacchi 		break;
936*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_10GFDX:
937*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_10GB) != 0;
938*9d26e4fcSRobert Mustacchi 		break;
939*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_40GFDX:
940*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_40GB) != 0;
941*9d26e4fcSRobert Mustacchi 		break;
942*9d26e4fcSRobert Mustacchi 
943*9d26e4fcSRobert Mustacchi 	/*
944*9d26e4fcSRobert Mustacchi 	 * These ask are we currently advertising these speeds and abilities.
945*9d26e4fcSRobert Mustacchi 	 * Until we support setting these because we're working with a copper
946*9d26e4fcSRobert Mustacchi 	 * PHY, then the only things we advertise are based on the link PHY
947*9d26e4fcSRobert Mustacchi 	 * speeds. In other words, we advertise everything we support.
948*9d26e4fcSRobert Mustacchi 	 */
949*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_100FDX:
950*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_100MB) != 0;
951*9d26e4fcSRobert Mustacchi 		break;
952*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_1000FDX:
953*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_1GB) != 0;
954*9d26e4fcSRobert Mustacchi 		break;
955*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_10GFDX:
956*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_10GB) != 0;
957*9d26e4fcSRobert Mustacchi 		break;
958*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_40GFDX:
959*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.link_speed & I40E_LINK_SPEED_40GB) != 0;
960*9d26e4fcSRobert Mustacchi 		break;
961*9d26e4fcSRobert Mustacchi 
962*9d26e4fcSRobert Mustacchi 	/*
963*9d26e4fcSRobert Mustacchi 	 * These ask if the peer supports these speeds, e.g. what did they tell
964*9d26e4fcSRobert Mustacchi 	 * us in auto-negotiation. Unfortunately, hardware doesn't appear to
965*9d26e4fcSRobert Mustacchi 	 * give us a way to determine whether or not they actually support
966*9d26e4fcSRobert Mustacchi 	 * something, only what they have enabled. This means that all we can
967*9d26e4fcSRobert Mustacchi 	 * tell the user is the speed that we're currently at, unfortunately.
968*9d26e4fcSRobert Mustacchi 	 */
969*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_100FDX:
970*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_speed == 100;
971*9d26e4fcSRobert Mustacchi 		break;
972*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_1000FDX:
973*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_speed == 1000;
974*9d26e4fcSRobert Mustacchi 		break;
975*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_10GFDX:
976*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_speed == 10000;
977*9d26e4fcSRobert Mustacchi 		break;
978*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_40GFDX:
979*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_speed == 40000;
980*9d26e4fcSRobert Mustacchi 		break;
981*9d26e4fcSRobert Mustacchi 
982*9d26e4fcSRobert Mustacchi 	/*
983*9d26e4fcSRobert Mustacchi 	 * Statistics for unsupported speeds. Note that these often have the
984*9d26e4fcSRobert Mustacchi 	 * same constraints as the other ones. For example, we can't answer the
985*9d26e4fcSRobert Mustacchi 	 * question of the ETHER_STAT_LP_CAP family because hardware doesn't
986*9d26e4fcSRobert Mustacchi 	 * give us any way of knowing whether or not it does.
987*9d26e4fcSRobert Mustacchi 	 */
988*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_100HDX:
989*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_1000HDX:
990*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_10FDX:
991*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_10HDX:
992*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_100T4:
993*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_100GFDX:
994*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_2500FDX:
995*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_5000FDX:
996*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_1000HDX:
997*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_100HDX:
998*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_10FDX:
999*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_10HDX:
1000*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_100T4:
1001*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_100GFDX:
1002*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_2500FDX:
1003*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_5000FDX:
1004*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_1000HDX:
1005*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_100HDX:
1006*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_10FDX:
1007*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_10HDX:
1008*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_100T4:
1009*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_100GFDX:
1010*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_2500FDX:
1011*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_5000FDX:
1012*9d26e4fcSRobert Mustacchi 		*val = 0;
1013*9d26e4fcSRobert Mustacchi 		break;
1014*9d26e4fcSRobert Mustacchi 
1015*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LINK_DUPLEX:
1016*9d26e4fcSRobert Mustacchi 		*val = i40e->i40e_link_duplex;
1017*9d26e4fcSRobert Mustacchi 		break;
1018*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_TOOSHORT_ERRORS:
1019*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RUC(port),
1020*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_undersize, &ips->ips_rx_undersize, B_FALSE);
1021*9d26e4fcSRobert Mustacchi 
1022*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_MSPDC(port),
1023*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_short_discards, &ips->ips_rx_short_discards,
1024*9d26e4fcSRobert Mustacchi 		    B_FALSE);
1025*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_undersize.value.ui64 +
1026*9d26e4fcSRobert Mustacchi 		    ipk->ipk_rx_short_discards.value.ui64;
1027*9d26e4fcSRobert Mustacchi 		break;
1028*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_JABBER_ERRORS:
1029*9d26e4fcSRobert Mustacchi 		i40e_stat_get_uint32(i40e, I40E_GLPRT_RJC(port),
1030*9d26e4fcSRobert Mustacchi 		    &ipk->ipk_rx_jabber, &ips->ips_rx_jabber, B_FALSE);
1031*9d26e4fcSRobert Mustacchi 		*val = ipk->ipk_rx_jabber.value.ui64;
1032*9d26e4fcSRobert Mustacchi 		break;
1033*9d26e4fcSRobert Mustacchi 
1034*9d26e4fcSRobert Mustacchi 	/*
1035*9d26e4fcSRobert Mustacchi 	 * Non-Link speed related capabilities.
1036*9d26e4fcSRobert Mustacchi 	 */
1037*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_AUTONEG:
1038*9d26e4fcSRobert Mustacchi 		*val = 1;
1039*9d26e4fcSRobert Mustacchi 		break;
1040*9d26e4fcSRobert Mustacchi 
1041*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_AUTONEG:
1042*9d26e4fcSRobert Mustacchi 		*val = 1;
1043*9d26e4fcSRobert Mustacchi 		break;
1044*9d26e4fcSRobert Mustacchi 
1045*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_AUTONEG:
1046*9d26e4fcSRobert Mustacchi 		*val = (hw->phy.link_info.an_info & I40E_AQ_LP_AN_ABILITY) != 0;
1047*9d26e4fcSRobert Mustacchi 		break;
1048*9d26e4fcSRobert Mustacchi 
1049*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LINK_AUTONEG:
1050*9d26e4fcSRobert Mustacchi 		*val = 1;
1051*9d26e4fcSRobert Mustacchi 		break;
1052*9d26e4fcSRobert Mustacchi 
1053*9d26e4fcSRobert Mustacchi 	/*
1054*9d26e4fcSRobert Mustacchi 	 * Note that while the hardware does support the pause functionality, at
1055*9d26e4fcSRobert Mustacchi 	 * this time we do not use it at all and effectively disable it.
1056*9d26e4fcSRobert Mustacchi 	 */
1057*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_ASMPAUSE:
1058*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.abilities &
1059*9d26e4fcSRobert Mustacchi 		    I40E_AQ_PHY_FLAG_PAUSE_RX) != 0;
1060*9d26e4fcSRobert Mustacchi 		break;
1061*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_CAP_PAUSE:
1062*9d26e4fcSRobert Mustacchi 		*val = (i40e->i40e_phy.abilities &
1063*9d26e4fcSRobert Mustacchi 		    I40E_AQ_PHY_FLAG_PAUSE_TX) != 0;
1064*9d26e4fcSRobert Mustacchi 		break;
1065*9d26e4fcSRobert Mustacchi 
1066*9d26e4fcSRobert Mustacchi 	/*
1067*9d26e4fcSRobert Mustacchi 	 * Because we don't support these at this time, they are always
1068*9d26e4fcSRobert Mustacchi 	 * hard-coded to zero.
1069*9d26e4fcSRobert Mustacchi 	 */
1070*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
1071*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_ADV_CAP_PAUSE:
1072*9d26e4fcSRobert Mustacchi 		*val = 0;
1073*9d26e4fcSRobert Mustacchi 		break;
1074*9d26e4fcSRobert Mustacchi 
1075*9d26e4fcSRobert Mustacchi 	/*
1076*9d26e4fcSRobert Mustacchi 	 * Like the other LP fields, we can only answer the question have we
1077*9d26e4fcSRobert Mustacchi 	 * enabled it, not whether the other end actually supports it.
1078*9d26e4fcSRobert Mustacchi 	 */
1079*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_ASMPAUSE:
1080*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LINK_ASMPAUSE:
1081*9d26e4fcSRobert Mustacchi 		*val = (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX) != 0;
1082*9d26e4fcSRobert Mustacchi 		break;
1083*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LP_CAP_PAUSE:
1084*9d26e4fcSRobert Mustacchi 	case ETHER_STAT_LINK_PAUSE:
1085*9d26e4fcSRobert Mustacchi 		*val = (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX) != 0;
1086*9d26e4fcSRobert Mustacchi 		break;
1087*9d26e4fcSRobert Mustacchi 
1088*9d26e4fcSRobert Mustacchi 	default:
1089*9d26e4fcSRobert Mustacchi 	unimpl:
1090*9d26e4fcSRobert Mustacchi 		mutex_exit(&i40e->i40e_stat_lock);
1091*9d26e4fcSRobert Mustacchi 		mutex_exit(&i40e->i40e_general_lock);
1092*9d26e4fcSRobert Mustacchi 		return (ENOTSUP);
1093*9d26e4fcSRobert Mustacchi 	}
1094*9d26e4fcSRobert Mustacchi 
1095*9d26e4fcSRobert Mustacchi 	mutex_exit(&i40e->i40e_stat_lock);
1096*9d26e4fcSRobert Mustacchi 	mutex_exit(&i40e->i40e_general_lock);
1097*9d26e4fcSRobert Mustacchi 
1098*9d26e4fcSRobert Mustacchi 	if (i40e_check_acc_handle(i40e->i40e_osdep_space.ios_reg_handle) !=
1099*9d26e4fcSRobert Mustacchi 	    DDI_FM_OK) {
1100*9d26e4fcSRobert Mustacchi 		ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_DEGRADED);
1101*9d26e4fcSRobert Mustacchi 		return (EIO);
1102*9d26e4fcSRobert Mustacchi 	}
1103*9d26e4fcSRobert Mustacchi 
1104*9d26e4fcSRobert Mustacchi 	return (0);
1105*9d26e4fcSRobert Mustacchi }
1106*9d26e4fcSRobert Mustacchi 
1107*9d26e4fcSRobert Mustacchi int
1108*9d26e4fcSRobert Mustacchi i40e_rx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
1109*9d26e4fcSRobert Mustacchi {
1110*9d26e4fcSRobert Mustacchi 	i40e_trqpair_t *itrq = (i40e_trqpair_t *)rh;
1111*9d26e4fcSRobert Mustacchi 	i40e_t *i40e = itrq->itrq_i40e;
1112*9d26e4fcSRobert Mustacchi 
1113*9d26e4fcSRobert Mustacchi 	if (i40e->i40e_state & I40E_SUSPENDED) {
1114*9d26e4fcSRobert Mustacchi 		return (ECANCELED);
1115*9d26e4fcSRobert Mustacchi 	}
1116*9d26e4fcSRobert Mustacchi 
1117*9d26e4fcSRobert Mustacchi 	switch (stat) {
1118*9d26e4fcSRobert Mustacchi 	case MAC_STAT_RBYTES:
1119*9d26e4fcSRobert Mustacchi 		*val = itrq->itrq_rxstat.irxs_bytes.value.ui64;
1120*9d26e4fcSRobert Mustacchi 		break;
1121*9d26e4fcSRobert Mustacchi 	case MAC_STAT_IPACKETS:
1122*9d26e4fcSRobert Mustacchi 		*val = itrq->itrq_rxstat.irxs_packets.value.ui64;
1123*9d26e4fcSRobert Mustacchi 		break;
1124*9d26e4fcSRobert Mustacchi 	default:
1125*9d26e4fcSRobert Mustacchi 		*val = 0;
1126*9d26e4fcSRobert Mustacchi 		return (ENOTSUP);
1127*9d26e4fcSRobert Mustacchi 	}
1128*9d26e4fcSRobert Mustacchi 
1129*9d26e4fcSRobert Mustacchi 	return (0);
1130*9d26e4fcSRobert Mustacchi }
1131*9d26e4fcSRobert Mustacchi 
1132*9d26e4fcSRobert Mustacchi int
1133*9d26e4fcSRobert Mustacchi i40e_tx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
1134*9d26e4fcSRobert Mustacchi {
1135*9d26e4fcSRobert Mustacchi 	i40e_trqpair_t *itrq = (i40e_trqpair_t *)rh;
1136*9d26e4fcSRobert Mustacchi 	i40e_t *i40e = itrq->itrq_i40e;
1137*9d26e4fcSRobert Mustacchi 
1138*9d26e4fcSRobert Mustacchi 	if (i40e->i40e_state & I40E_SUSPENDED) {
1139*9d26e4fcSRobert Mustacchi 		return (ECANCELED);
1140*9d26e4fcSRobert Mustacchi 	}
1141*9d26e4fcSRobert Mustacchi 
1142*9d26e4fcSRobert Mustacchi 	switch (stat) {
1143*9d26e4fcSRobert Mustacchi 	case MAC_STAT_OBYTES:
1144*9d26e4fcSRobert Mustacchi 		*val = itrq->itrq_txstat.itxs_bytes.value.ui64;
1145*9d26e4fcSRobert Mustacchi 		break;
1146*9d26e4fcSRobert Mustacchi 	case MAC_STAT_OPACKETS:
1147*9d26e4fcSRobert Mustacchi 		*val = itrq->itrq_txstat.itxs_packets.value.ui64;
1148*9d26e4fcSRobert Mustacchi 		break;
1149*9d26e4fcSRobert Mustacchi 	default:
1150*9d26e4fcSRobert Mustacchi 		*val = 0;
1151*9d26e4fcSRobert Mustacchi 		return (ENOTSUP);
1152*9d26e4fcSRobert Mustacchi 	}
1153*9d26e4fcSRobert Mustacchi 
1154*9d26e4fcSRobert Mustacchi 	return (0);
1155*9d26e4fcSRobert Mustacchi }
1156*9d26e4fcSRobert Mustacchi 
1157*9d26e4fcSRobert Mustacchi /*
1158*9d26e4fcSRobert Mustacchi  * When we end up refactoring all off the queue assignments and have non-static
1159*9d26e4fcSRobert Mustacchi  * queue to VSI mappings, then we may need to revisit the general locking
1160*9d26e4fcSRobert Mustacchi  * strategy that we employ and have the kstat creation / deletion be part of the
1161*9d26e4fcSRobert Mustacchi  * ring start and stop routines.
1162*9d26e4fcSRobert Mustacchi  */
1163*9d26e4fcSRobert Mustacchi void
1164*9d26e4fcSRobert Mustacchi i40e_stats_trqpair_fini(i40e_trqpair_t *itrq)
1165*9d26e4fcSRobert Mustacchi {
1166*9d26e4fcSRobert Mustacchi 	if (itrq->itrq_txkstat != NULL) {
1167*9d26e4fcSRobert Mustacchi 		kstat_delete(itrq->itrq_txkstat);
1168*9d26e4fcSRobert Mustacchi 		itrq->itrq_txkstat = NULL;
1169*9d26e4fcSRobert Mustacchi 	}
1170*9d26e4fcSRobert Mustacchi 
1171*9d26e4fcSRobert Mustacchi 	if (itrq->itrq_rxkstat != NULL) {
1172*9d26e4fcSRobert Mustacchi 		kstat_delete(itrq->itrq_rxkstat);
1173*9d26e4fcSRobert Mustacchi 		itrq->itrq_rxkstat = NULL;
1174*9d26e4fcSRobert Mustacchi 	}
1175*9d26e4fcSRobert Mustacchi }
1176*9d26e4fcSRobert Mustacchi 
1177*9d26e4fcSRobert Mustacchi boolean_t
1178*9d26e4fcSRobert Mustacchi i40e_stats_trqpair_init(i40e_trqpair_t *itrq)
1179*9d26e4fcSRobert Mustacchi {
1180*9d26e4fcSRobert Mustacchi 	char buf[128];
1181*9d26e4fcSRobert Mustacchi 	i40e_t *i40e = itrq->itrq_i40e;
1182*9d26e4fcSRobert Mustacchi 	i40e_txq_stat_t *tsp = &itrq->itrq_txstat;
1183*9d26e4fcSRobert Mustacchi 	i40e_rxq_stat_t *rsp = &itrq->itrq_rxstat;
1184*9d26e4fcSRobert Mustacchi 
1185*9d26e4fcSRobert Mustacchi 	(void) snprintf(buf, sizeof (buf), "trqpair_tx_%d", itrq->itrq_index);
1186*9d26e4fcSRobert Mustacchi 	itrq->itrq_txkstat = kstat_create(I40E_MODULE_NAME,
1187*9d26e4fcSRobert Mustacchi 	    ddi_get_instance(i40e->i40e_dip), buf, "net", KSTAT_TYPE_NAMED,
1188*9d26e4fcSRobert Mustacchi 	    sizeof (i40e_txq_stat_t) / sizeof (kstat_named_t),
1189*9d26e4fcSRobert Mustacchi 	    KSTAT_FLAG_VIRTUAL);
1190*9d26e4fcSRobert Mustacchi 
1191*9d26e4fcSRobert Mustacchi 	if (itrq->itrq_txkstat == NULL)
1192*9d26e4fcSRobert Mustacchi 		return (B_FALSE);
1193*9d26e4fcSRobert Mustacchi 
1194*9d26e4fcSRobert Mustacchi 	(void) snprintf(buf, sizeof (buf), "trqpair_rx_%d", itrq->itrq_index);
1195*9d26e4fcSRobert Mustacchi 	itrq->itrq_rxkstat = kstat_create(I40E_MODULE_NAME,
1196*9d26e4fcSRobert Mustacchi 	    ddi_get_instance(i40e->i40e_dip), buf, "net", KSTAT_TYPE_NAMED,
1197*9d26e4fcSRobert Mustacchi 	    sizeof (i40e_rxq_stat_t) / sizeof (kstat_named_t),
1198*9d26e4fcSRobert Mustacchi 	    KSTAT_FLAG_VIRTUAL);
1199*9d26e4fcSRobert Mustacchi 
1200*9d26e4fcSRobert Mustacchi 	if (itrq->itrq_rxkstat == NULL) {
1201*9d26e4fcSRobert Mustacchi 		kstat_delete(itrq->itrq_txkstat);
1202*9d26e4fcSRobert Mustacchi 		itrq->itrq_txkstat = NULL;
1203*9d26e4fcSRobert Mustacchi 		return (B_FALSE);
1204*9d26e4fcSRobert Mustacchi 	}
1205*9d26e4fcSRobert Mustacchi 
1206*9d26e4fcSRobert Mustacchi 	itrq->itrq_txkstat->ks_data = &itrq->itrq_txstat;
1207*9d26e4fcSRobert Mustacchi 	itrq->itrq_rxkstat->ks_data = &itrq->itrq_rxstat;
1208*9d26e4fcSRobert Mustacchi 
1209*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_bytes, "tx_bytes",
1210*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1211*9d26e4fcSRobert Mustacchi 	tsp->itxs_bytes.value.ui64 = 0;
1212*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_packets, "tx_packets",
1213*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1214*9d26e4fcSRobert Mustacchi 	tsp->itxs_packets.value.ui64 = 0;
1215*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_descriptors, "tx_descriptors",
1216*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1217*9d26e4fcSRobert Mustacchi 	tsp->itxs_descriptors.value.ui64 = 0;
1218*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_recycled, "tx_recycled",
1219*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1220*9d26e4fcSRobert Mustacchi 	tsp->itxs_recycled.value.ui64 = 0;
1221*9d26e4fcSRobert Mustacchi 
1222*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_meoifail, "tx_hck_meoifail",
1223*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1224*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_meoifail.value.ui64 = 0;
1225*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_nol2info, "tx_hck_nol2info",
1226*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1227*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_nol2info.value.ui64 = 0;
1228*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_nol3info, "tx_hck_nol3info",
1229*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1230*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_nol3info.value.ui64 = 0;
1231*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_nol4info, "tx_hck_nol4info",
1232*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1233*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_nol4info.value.ui64 = 0;
1234*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_badl3, "tx_hck_badl3",
1235*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1236*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_badl3.value.ui64 = 0;
1237*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_hck_badl4, "tx_hck_badl4",
1238*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1239*9d26e4fcSRobert Mustacchi 	tsp->itxs_hck_badl4.value.ui64 = 0;
1240*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_err_notcb, "tx_err_notcb",
1241*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1242*9d26e4fcSRobert Mustacchi 	tsp->itxs_err_notcb.value.ui64 = 0;
1243*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_err_nodescs, "tx_err_nodescs",
1244*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1245*9d26e4fcSRobert Mustacchi 	tsp->itxs_err_nodescs.value.ui64 = 0;
1246*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_err_context, "tx_err_context",
1247*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1248*9d26e4fcSRobert Mustacchi 	tsp->itxs_err_context.value.ui64 = 0;
1249*9d26e4fcSRobert Mustacchi 	kstat_named_init(&tsp->itxs_num_unblocked, "tx_num_unblocked",
1250*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1251*9d26e4fcSRobert Mustacchi 	tsp->itxs_num_unblocked.value.ui64 = 0;
1252*9d26e4fcSRobert Mustacchi 
1253*9d26e4fcSRobert Mustacchi 
1254*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_bytes, "rx_bytes",
1255*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1256*9d26e4fcSRobert Mustacchi 	rsp->irxs_bytes.value.ui64 = 0;
1257*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_packets, "rx_packets",
1258*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1259*9d26e4fcSRobert Mustacchi 	rsp->irxs_packets.value.ui64 = 0;
1260*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_rx_desc_error, "rx_desc_error",
1261*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1262*9d26e4fcSRobert Mustacchi 	rsp->irxs_rx_desc_error.value.ui64 = 0;
1263*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_rx_intr_limit, "rx_intr_limit",
1264*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1265*9d26e4fcSRobert Mustacchi 	rsp->irxs_rx_intr_limit.value.ui64 = 0;
1266*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_rx_bind_norcb, "rx_bind_norcb",
1267*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1268*9d26e4fcSRobert Mustacchi 	rsp->irxs_rx_bind_norcb.value.ui64 = 0;
1269*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_rx_bind_nomp, "rx_bind_nomp",
1270*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1271*9d26e4fcSRobert Mustacchi 	rsp->irxs_rx_bind_nomp.value.ui64 = 0;
1272*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_rx_copy_nomem, "rx_copy_nomem",
1273*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1274*9d26e4fcSRobert Mustacchi 	rsp->irxs_rx_copy_nomem.value.ui64 = 0;
1275*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_v4hdrok, "rx_hck_v4hdrok",
1276*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1277*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_v4hdrok.value.ui64 = 0;
1278*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_l4hdrok, "rx_hck_l4hdrok",
1279*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1280*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_l4hdrok.value.ui64 = 0;
1281*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_unknown, "rx_hck_unknown",
1282*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1283*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_unknown.value.ui64 = 0;
1284*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_nol3l4p, "rx_hck_nol3l4p",
1285*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1286*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_nol3l4p.value.ui64 = 0;
1287*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_iperr, "rx_hck_iperr",
1288*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1289*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_iperr.value.ui64 = 0;
1290*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_eiperr, "rx_hck_eiperr",
1291*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1292*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_eiperr.value.ui64 = 0;
1293*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_l4err, "rx_hck_l4err",
1294*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1295*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_l4err.value.ui64 = 0;
1296*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_v6skip, "rx_hck_v6skip",
1297*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1298*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_v6skip.value.ui64 = 0;
1299*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_set, "rx_hck_set",
1300*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1301*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_set.value.ui64 = 0;
1302*9d26e4fcSRobert Mustacchi 	kstat_named_init(&rsp->irxs_hck_miss, "rx_hck_miss",
1303*9d26e4fcSRobert Mustacchi 	    KSTAT_DATA_UINT64);
1304*9d26e4fcSRobert Mustacchi 	rsp->irxs_hck_miss.value.ui64 = 0;
1305*9d26e4fcSRobert Mustacchi 
1306*9d26e4fcSRobert Mustacchi 	kstat_install(itrq->itrq_txkstat);
1307*9d26e4fcSRobert Mustacchi 	kstat_install(itrq->itrq_rxkstat);
1308*9d26e4fcSRobert Mustacchi 
1309*9d26e4fcSRobert Mustacchi 	return (B_TRUE);
1310*9d26e4fcSRobert Mustacchi }
1311