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