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