Home | History | Annotate | Download | only in nxge
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     27 
     28 #include <sys/nxge/nxge_impl.h>
     29 #include <sys/nxge/nxge_hio.h>
     30 
     31 #include <inet/mi.h>
     32 
     33 #define	RDC_NAME_FORMAT1	"RDC Channel"
     34 #define	TDC_NAME_FORMAT1	"TDC Channel"
     35 #define	CH_NAME_FORMAT		" %d Stats"
     36 #define	TDC_NAME_FORMAT		"TDC Channel %d Stats"
     37 #define	RDC_NAME_FORMAT		"RDC Channel %d Stats"
     38 
     39 void nxge_mac_init_kstats(p_nxge_t, struct kstat *);
     40 void nxge_xmac_init_kstats(struct kstat *);
     41 void nxge_bmac_init_kstats(struct kstat *);
     42 
     43 /* ARGSUSED */
     44 void
     45 nxge_init_statsp(p_nxge_t nxgep)
     46 {
     47 	size_t stats_size;
     48 
     49 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_init_statsp"));
     50 
     51 	stats_size = sizeof (nxge_stats_t);
     52 	nxgep->statsp = KMEM_ZALLOC(stats_size, KM_SLEEP);
     53 	nxgep->statsp->stats_size = stats_size;
     54 
     55 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_init_statsp"));
     56 }
     57 
     58 typedef struct {
     59 	uint8_t index;
     60 	uint8_t type;
     61 	char *name;
     62 } nxge_kstat_index_t;
     63 
     64 typedef enum {
     65 	RDC_STAT_PACKETS = 0,
     66 	RDC_STAT_BYTES,
     67 	RDC_STAT_ERRORS,
     68 	RDC_STAT_DCF_ERR,
     69 	RDC_STAT_RCR_ACK_ERR,
     70 	RDC_STAT_RCR_DC_FIFOFLOW_ERR,
     71 	RDC_STAT_RCR_SHA_PAR_ERR,
     72 	RDC_STAT_RBR_PRE_PAR_ERR,
     73 	RDC_STAT_WRED_DROP,
     74 	RDC_STAT_RBR_PRE_EMTY,
     75 	RDC_STAT_RCR_SHADOW_FULL,
     76 	RDC_STAT_RBR_TMOUT,
     77 	RDC_STAT_RSP_CNT_ERR,
     78 	RDC_STAT_BYTE_EN_BUS,
     79 	RDC_STAT_RSP_DAT_ERR,
     80 	RDC_STAT_PKT_TOO_LONG_ERR,
     81 	RDC_STAT_COMPL_L2_ERR,
     82 	RDC_STAT_COMPL_L4_CKSUM_ERR,
     83 	RDC_STAT_COMPL_ZCP_SOFT_ERR,
     84 	RDC_STAT_COMPL_FFLP_SOFT_ERR,
     85 	RDC_STAT_CONFIG_ERR,
     86 	RDC_STAT_RCRINCON,
     87 	RDC_STAT_RCRFULL,
     88 	RDC_STAT_RBR_EMPTY,
     89 	RDC_STAT_RBR_FULL,
     90 	RDC_STAT_RBRLOGPAGE,
     91 	RDC_STAT_CFIGLOGPAGE,
     92 	RDC_STAT_PORT_DROP_PKT,
     93 	RDC_STAT_RCRTO,
     94 	RDC_STAT_RCRTHRES,
     95 	RDC_STAT_MEX,
     96 	RDC_STAT_ID_MIS,
     97 	RDC_STAT_ZCP_EOP,
     98 	RDC_STAT_IPP_EOP,
     99 	RDC_STAT_END
    100 } nxge_rdc_stat_index_t;
    101 
    102 nxge_kstat_index_t nxge_rdc_stats[] = {
    103 	{RDC_STAT_PACKETS, KSTAT_DATA_UINT64, "rdc_packets"},
    104 	{RDC_STAT_BYTES, KSTAT_DATA_UINT64, "rdc_bytes"},
    105 	{RDC_STAT_ERRORS, KSTAT_DATA_ULONG, "rdc_errors"},
    106 	{RDC_STAT_DCF_ERR, KSTAT_DATA_ULONG, "rdc_dcf_err"},
    107 	{RDC_STAT_RCR_ACK_ERR, KSTAT_DATA_ULONG, "rdc_rcr_ack_err"},
    108 	{RDC_STAT_RCR_DC_FIFOFLOW_ERR, KSTAT_DATA_ULONG, "rdc_dc_fifoflow_err"},
    109 	{RDC_STAT_RCR_SHA_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rcr_sha_par_err"},
    110 	{RDC_STAT_RBR_PRE_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rbr_pre_par_err"},
    111 	{RDC_STAT_WRED_DROP, KSTAT_DATA_ULONG, "rdc_wred_drop"},
    112 	{RDC_STAT_RBR_PRE_EMTY, KSTAT_DATA_ULONG, "rdc_rbr_pre_empty"},
    113 	{RDC_STAT_RCR_SHADOW_FULL, KSTAT_DATA_ULONG, "rdc_rcr_shadow_full"},
    114 	{RDC_STAT_RBR_TMOUT, KSTAT_DATA_ULONG, "rdc_rbr_tmout"},
    115 	{RDC_STAT_RSP_CNT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_cnt_err"},
    116 	{RDC_STAT_BYTE_EN_BUS, KSTAT_DATA_ULONG, "rdc_byte_en_bus"},
    117 	{RDC_STAT_RSP_DAT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_dat_err"},
    118 	{RDC_STAT_PKT_TOO_LONG_ERR, KSTAT_DATA_ULONG, "rdc_pkt_too_long_err"},
    119 	{RDC_STAT_COMPL_L2_ERR, KSTAT_DATA_ULONG, "rdc_compl_l2_err"},
    120 	{RDC_STAT_COMPL_L4_CKSUM_ERR, KSTAT_DATA_ULONG, "rdc_compl_l4_cksum"},
    121 	{RDC_STAT_COMPL_ZCP_SOFT_ERR, KSTAT_DATA_ULONG,
    122 		"rdc_compl_zcp_soft_err"},
    123 	{RDC_STAT_COMPL_FFLP_SOFT_ERR, KSTAT_DATA_ULONG,
    124 		"rdc_compl_fflp_soft_err"},
    125 	{RDC_STAT_CONFIG_ERR, KSTAT_DATA_ULONG, "rdc_config_err"},
    126 	{RDC_STAT_RCRINCON, KSTAT_DATA_ULONG, "rdc_rcrincon"},
    127 	{RDC_STAT_RCRFULL, KSTAT_DATA_ULONG, "rdc_rcrfull"},
    128 	{RDC_STAT_RBR_EMPTY, KSTAT_DATA_ULONG, "rdc_rbr_empty"},
    129 	{RDC_STAT_RBR_FULL, KSTAT_DATA_ULONG, "rdc_rbrfull"},
    130 	{RDC_STAT_RBRLOGPAGE, KSTAT_DATA_ULONG, "rdc_rbrlogpage"},
    131 	{RDC_STAT_CFIGLOGPAGE, KSTAT_DATA_ULONG, "rdc_cfiglogpage"},
    132 	{RDC_STAT_PORT_DROP_PKT, KSTAT_DATA_ULONG, "rdc_port_drop_pkt"},
    133 	{RDC_STAT_RCRTO, KSTAT_DATA_ULONG, "rdc_rcrto"},
    134 	{RDC_STAT_RCRTHRES, KSTAT_DATA_ULONG, "rdc_rcrthres"},
    135 	{RDC_STAT_MEX, KSTAT_DATA_ULONG, "rdc_mex"},
    136 	{RDC_STAT_ID_MIS, KSTAT_DATA_ULONG, "rdc_id_mismatch"},
    137 	{RDC_STAT_ZCP_EOP, KSTAT_DATA_ULONG, "rdc_zcp_eop"},
    138 	{RDC_STAT_IPP_EOP, KSTAT_DATA_ULONG, "rdc_ipp_eop"},
    139 	{RDC_STAT_END, NULL, NULL}
    140 };
    141 
    142 typedef enum {
    143 	RDC_SYS_STAT_PRE_PAR_ERR = 0,
    144 	RDC_SYS_STAT_SHA_PAR_ERR,
    145 	RDC_SYS_STAT_ID_MISMATCH,
    146 	RDC_SYS_STAT_IPP_EOP_ERR,
    147 	RDC_SYS_STAT_ZCP_EOP_ERR,
    148 	RDC_SYS_STAT_END
    149 } nxge_rdc_sys_stat_idx_t;
    150 
    151 nxge_kstat_index_t nxge_rdc_sys_stats[] = {
    152 	{RDC_SYS_STAT_PRE_PAR_ERR, KSTAT_DATA_UINT64, "rdc_pre_par_err"},
    153 	{RDC_SYS_STAT_SHA_PAR_ERR, KSTAT_DATA_UINT64, "rdc_sha_par_err"},
    154 	{RDC_SYS_STAT_ID_MISMATCH, KSTAT_DATA_UINT64, "rdc_stat_id_mismatch"},
    155 	{RDC_SYS_STAT_IPP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_ipp_eop_err"},
    156 	{RDC_SYS_STAT_ZCP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_zcp_eop_err"},
    157 	{RDC_SYS_STAT_END, NULL, NULL}
    158 };
    159 
    160 typedef enum {
    161 	TDC_STAT_PACKETS = 0,
    162 	TDC_STAT_BYTES,
    163 	TDC_STAT_ERRORS,
    164 	TDC_STAT_TX_INITS,
    165 	TDC_STAT_TX_NO_BUF,
    166 	TDC_STAT_MBOX_ERR,
    167 	TDC_STAT_PKT_SIZE_ERR,
    168 	TDC_STAT_TX_RING_OFLOW,
    169 	TDC_STAT_PREF_BUF_ECC_ERR,
    170 	TDC_STAT_NACK_PREF,
    171 	TDC_STAT_NACK_PKT_RD,
    172 	TDC_STAT_CONF_PART_ERR,
    173 	TDC_STAT_PKT_PRT_ERR,
    174 	TDC_STAT_RESET_FAIL,
    175 	TDC_STAT_TX_STARTS,
    176 	TDC_STAT_TX_NOCANPUT,
    177 	TDC_STAT_TX_MSGDUP_FAIL,
    178 	TDC_STAT_TX_ALLOCB_FAIL,
    179 	TDC_STAT_TX_NO_DESC,
    180 	TDC_STAT_TX_DMA_BIND_FAIL,
    181 	TDC_STAT_TX_UFLOW,
    182 	TDC_STAT_TX_HDR_PKTS,
    183 	TDC_STAT_TX_DDI_PKTS,
    184 	TDC_STAT_TX_DVMA_PKTS,
    185 	TDC_STAT_TX_MAX_PEND,
    186 	TDC_STAT_END
    187 } nxge_tdc_stats_index_t;
    188 
    189 nxge_kstat_index_t nxge_tdc_stats[] = {
    190 	{TDC_STAT_PACKETS, KSTAT_DATA_UINT64, "tdc_packets"},
    191 	{TDC_STAT_BYTES, KSTAT_DATA_UINT64, "tdc_bytes"},
    192 	{TDC_STAT_ERRORS, KSTAT_DATA_UINT64, "tdc_errors"},
    193 	{TDC_STAT_TX_INITS, KSTAT_DATA_ULONG, "tdc_tx_inits"},
    194 	{TDC_STAT_TX_NO_BUF, KSTAT_DATA_ULONG, "tdc_tx_no_buf"},
    195 	{TDC_STAT_MBOX_ERR, KSTAT_DATA_ULONG, "tdc_mbox_err"},
    196 	{TDC_STAT_PKT_SIZE_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_err"},
    197 	{TDC_STAT_TX_RING_OFLOW,
    198 		KSTAT_DATA_ULONG, "tdc_tx_ring_oflow"},
    199 	{TDC_STAT_PREF_BUF_ECC_ERR,
    200 		KSTAT_DATA_ULONG, "tdc_pref_buf_err_err"},
    201 	{TDC_STAT_NACK_PREF, KSTAT_DATA_ULONG, "tdc_nack_pref"},
    202 	{TDC_STAT_NACK_PKT_RD, KSTAT_DATA_ULONG, "tdc_nack_pkt_rd"},
    203 	{TDC_STAT_CONF_PART_ERR,
    204 		KSTAT_DATA_ULONG, "tdc_conf_part_err"},
    205 	{TDC_STAT_PKT_PRT_ERR, KSTAT_DATA_ULONG, "tdc_pkt_prt_err"},
    206 	{TDC_STAT_RESET_FAIL, KSTAT_DATA_ULONG, "tdc_reset_fail"},
    207 	{TDC_STAT_TX_STARTS, KSTAT_DATA_ULONG, "tdc_tx_starts"},
    208 	{TDC_STAT_TX_NOCANPUT, KSTAT_DATA_ULONG, "tdc_tx_nocanput"},
    209 	{TDC_STAT_TX_MSGDUP_FAIL, KSTAT_DATA_ULONG, "tdc_tx_msgdup_fail"},
    210 	{TDC_STAT_TX_ALLOCB_FAIL, KSTAT_DATA_ULONG, "tdc_tx_allocb_fail"},
    211 	{TDC_STAT_TX_NO_DESC, KSTAT_DATA_ULONG, "tdc_tx_no_desc"},
    212 	{TDC_STAT_TX_DMA_BIND_FAIL, KSTAT_DATA_ULONG, "tdc_tx_dma_bind_fail"},
    213 	{TDC_STAT_TX_UFLOW, KSTAT_DATA_ULONG, "tdc_tx_uflow"},
    214 	{TDC_STAT_TX_HDR_PKTS, KSTAT_DATA_ULONG, "tdc_tx_hdr_pkts"},
    215 	{TDC_STAT_TX_DDI_PKTS, KSTAT_DATA_ULONG, "tdc_tx_ddi_pkts"},
    216 	{TDC_STAT_TX_DVMA_PKTS, KSTAT_DATA_ULONG, "tdc_tx_dvma_pkts"},
    217 	{TDC_STAT_TX_MAX_PEND, KSTAT_DATA_ULONG, "tdc_tx_max_pend"},
    218 	{TDC_STAT_END, NULL, NULL}
    219 };
    220 
    221 /* IPP Statistics definitions */
    222 typedef enum {
    223 	IPP_STAT_EOP_MISS = 0,
    224 	IPP_STAT_SOP_MISS,
    225 	IPP_STAT_DFIFO_UE,
    226 	IPP_STAT_ECC_ERR,
    227 	IPP_STAT_PFIFO_PERR,
    228 	IPP_STAT_PFIFO_OVER,
    229 	IPP_STAT_PFIFO_UND,
    230 	IPP_STAT_BAD_CS,
    231 	IPP_STAT_BAD_DIS,
    232 	IPP_STAT_END
    233 } nxge_ipp_stat_index_t;
    234 
    235 nxge_kstat_index_t nxge_ipp_stats[] = {
    236 	{IPP_STAT_EOP_MISS, KSTAT_DATA_ULONG, "rxipp_eop_miss"},
    237 	{IPP_STAT_SOP_MISS, KSTAT_DATA_ULONG, "rxipp_sop_miss"},
    238 	{IPP_STAT_DFIFO_UE, KSTAT_DATA_ULONG, "rxipp_dfifo_ue"},
    239 	{IPP_STAT_ECC_ERR, KSTAT_DATA_ULONG, "rxipp_ecc_err"},
    240 	{IPP_STAT_PFIFO_PERR, KSTAT_DATA_ULONG, "rxipp_pfifo_perr"},
    241 	{IPP_STAT_PFIFO_OVER, KSTAT_DATA_ULONG, "rxipp_pfifo_over"},
    242 	{IPP_STAT_PFIFO_UND, KSTAT_DATA_ULONG, "rxipp_pfifo_und"},
    243 	{IPP_STAT_BAD_CS, KSTAT_DATA_ULONG, "rxipp_bad_cs"},
    244 	{IPP_STAT_BAD_DIS, KSTAT_DATA_ULONG, "rxipp_bad_dis"},
    245 	{IPP_STAT_END, NULL, NULL}
    246 };
    247 
    248 /* TXC Statistics definitions */
    249 typedef enum {
    250 	TXC_STAT_PKT_STUFFED = 0,
    251 	TXC_STAT_PKT_XMIT,
    252 	TXC_STAT_RO_CORRECT_ERR,
    253 	TXC_STAT_RO_UNCORRECT_ERR,
    254 	TXC_STAT_SF_CORRECT_ERR,
    255 	TXC_STAT_SF_UNCORRECT_ERR,
    256 	TXC_STAT_ADDRESS_FAILED,
    257 	TXC_STAT_DMA_FAILED,
    258 	TXC_STAT_LENGTH_FAILED,
    259 	TXC_STAT_PKT_ASSY_DEAD,
    260 	TXC_STAT_REORDER_ERR,
    261 	TXC_STAT_END
    262 } nxge_txc_stat_index_t;
    263 
    264 nxge_kstat_index_t nxge_txc_stats[] = {
    265 	{TXC_STAT_PKT_STUFFED, KSTAT_DATA_ULONG, "txc_pkt_stuffed"},
    266 	{TXC_STAT_PKT_XMIT, KSTAT_DATA_ULONG, "txc_pkt_xmit"},
    267 	{TXC_STAT_RO_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_correct_err"},
    268 	{TXC_STAT_RO_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_uncorrect_err"},
    269 	{TXC_STAT_SF_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_correct_err"},
    270 	{TXC_STAT_SF_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_uncorrect_err"},
    271 	{TXC_STAT_ADDRESS_FAILED, KSTAT_DATA_ULONG, "txc_address_failed"},
    272 	{TXC_STAT_DMA_FAILED, KSTAT_DATA_ULONG, "txc_dma_failed"},
    273 	{TXC_STAT_LENGTH_FAILED, KSTAT_DATA_ULONG, "txc_length_failed"},
    274 	{TXC_STAT_PKT_ASSY_DEAD, KSTAT_DATA_ULONG, "txc_pkt_assy_dead"},
    275 	{TXC_STAT_REORDER_ERR, KSTAT_DATA_ULONG, "txc_reorder_err"},
    276 	{TXC_STAT_END, NULL, NULL}
    277 };
    278 
    279 typedef enum {
    280 	XMAC_STAT_TX_FRAME_CNT = 0,
    281 	XMAC_STAT_TX_UNDERFLOW_ERR,
    282 	XMAC_STAT_TX_MAXPKTSIZE_ERR,
    283 	XMAC_STAT_TX_OVERFLOW_ERR,
    284 	XMAC_STAT_TX_FIFO_XFR_ERR,
    285 	XMAC_STAT_TX_BYTE_CNT,
    286 	XMAC_STAT_RX_FRAME_CNT,
    287 	XMAC_STAT_RX_UNDERFLOW_ERR,
    288 	XMAC_STAT_RX_OVERFLOW_ERR,
    289 	XMAC_STAT_RX_CRC_ERR_CNT,
    290 	XMAC_STAT_RX_LEN_ERR_CNT,
    291 	XMAC_STAT_RX_VIOL_ERR_CNT,
    292 	XMAC_STAT_RX_BYTE_CNT,
    293 	XMAC_STAT_RX_HIST1_CNT,
    294 	XMAC_STAT_RX_HIST2_CNT,
    295 	XMAC_STAT_RX_HIST3_CNT,
    296 	XMAC_STAT_RX_HIST4_CNT,
    297 	XMAC_STAT_RX_HIST5_CNT,
    298 	XMAC_STAT_RX_HIST6_CNT,
    299 	XMAC_STAT_RX_HIST7_CNT,
    300 	XMAC_STAT_RX_BROADCAST_CNT,
    301 	XMAC_STAT_RX_MULT_CNT,
    302 	XMAC_STAT_RX_FRAG_CNT,
    303 	XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
    304 	XMAC_STAT_RX_LINKFAULT_ERR_CNT,
    305 	XMAC_STAT_RX_REMOTEFAULT_ERR,
    306 	XMAC_STAT_RX_LOCALFAULT_ERR,
    307 	XMAC_STAT_RX_PAUSE_CNT,
    308 	XMAC_STAT_TX_PAUSE_STATE,
    309 	XMAC_STAT_TX_NOPAUSE_STATE,
    310 	XMAC_STAT_XPCS_DESKEW_ERR_CNT,
    311 #ifdef	NXGE_DEBUG_SYMBOL_ERR
    312 	XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
    313 	XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
    314 	XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
    315 	XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
    316 #endif
    317 	XMAC_STAT_END
    318 } nxge_xmac_stat_index_t;
    319 
    320 nxge_kstat_index_t nxge_xmac_stats[] = {
    321 	{XMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
    322 	{XMAC_STAT_TX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "tmac_underflow_err"},
    323 	{XMAC_STAT_TX_MAXPKTSIZE_ERR, KSTAT_DATA_ULONG, "txmac_maxpktsize_err"},
    324 	{XMAC_STAT_TX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "txmac_overflow_err"},
    325 	{XMAC_STAT_TX_FIFO_XFR_ERR, KSTAT_DATA_ULONG, "txmac_fifo_xfr_err"},
    326 	{XMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
    327 	{XMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
    328 	{XMAC_STAT_RX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_underflow_err"},
    329 	{XMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
    330 	{XMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err"},
    331 	{XMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_length_err"},
    332 	{XMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_code_violations"},
    333 	{XMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
    334 	{XMAC_STAT_RX_HIST1_CNT, KSTAT_DATA_ULONG, "rxmac_64_cnt"},
    335 	{XMAC_STAT_RX_HIST2_CNT, KSTAT_DATA_ULONG, "rxmac_65_127_cnt"},
    336 	{XMAC_STAT_RX_HIST3_CNT, KSTAT_DATA_ULONG, "rxmac_128_255_cnt"},
    337 	{XMAC_STAT_RX_HIST4_CNT, KSTAT_DATA_ULONG, "rxmac_256_511_cnt"},
    338 	{XMAC_STAT_RX_HIST5_CNT, KSTAT_DATA_ULONG, "rxmac_512_1023_cnt"},
    339 	{XMAC_STAT_RX_HIST6_CNT, KSTAT_DATA_ULONG, "rxmac_1024_1522_cnt"},
    340 	{XMAC_STAT_RX_HIST7_CNT, KSTAT_DATA_ULONG, "rxmac_jumbo_cnt"},
    341 	{XMAC_STAT_RX_BROADCAST_CNT, KSTAT_DATA_ULONG, "rxmac_broadcast_cnt"},
    342 	{XMAC_STAT_RX_MULT_CNT, KSTAT_DATA_ULONG, "rxmac_multicast_cnt"},
    343 	{XMAC_STAT_RX_FRAG_CNT, KSTAT_DATA_ULONG, "rxmac_fragment_cnt"},
    344 	{XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
    345 		KSTAT_DATA_ULONG, "rxmac_alignment_err"},
    346 	{XMAC_STAT_RX_LINKFAULT_ERR_CNT,
    347 		KSTAT_DATA_ULONG, "rxmac_linkfault_errs"},
    348 	{XMAC_STAT_RX_REMOTEFAULT_ERR,
    349 		KSTAT_DATA_ULONG, "rxmac_remote_faults"},
    350 	{XMAC_STAT_RX_LOCALFAULT_ERR,
    351 		KSTAT_DATA_ULONG, "rxmac_local_faults"},
    352 	{XMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
    353 	{XMAC_STAT_TX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
    354 	{XMAC_STAT_TX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "txmac_nopause_state"},
    355 	{XMAC_STAT_XPCS_DESKEW_ERR_CNT,
    356 		KSTAT_DATA_ULONG, "xpcs_deskew_err_cnt"},
    357 #ifdef	NXGE_DEBUG_SYMBOL_ERR
    358 	{XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
    359 		KSTAT_DATA_ULONG, "xpcs_ln0_symbol_err_cnt"},
    360 	{XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
    361 		KSTAT_DATA_ULONG, "xpcs_ln1_symbol_err_cnt"},
    362 	{XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
    363 		KSTAT_DATA_ULONG, "xpcs_ln2_symbol_err_cnt"},
    364 	{XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
    365 		KSTAT_DATA_ULONG, "xpcs_ln3_symbol_err_cnt"},
    366 #endif
    367 	{XMAC_STAT_END, NULL, NULL}
    368 };
    369 
    370 typedef enum {
    371 	BMAC_STAT_TX_FRAME_CNT = 0,
    372 	BMAC_STAT_TX_UNDERRUN_ERR,
    373 	BMAC_STAT_TX_MAX_PKT_ERR,
    374 	BMAC_STAT_TX_BYTE_CNT,
    375 	BMAC_STAT_RX_FRAME_CNT,
    376 	BMAC_STAT_RX_BYTE_CNT,
    377 	BMAC_STAT_RX_OVERFLOW_ERR,
    378 	BMAC_STAT_RX_ALIGN_ERR_CNT,
    379 	BMAC_STAT_RX_CRC_ERR_CNT,
    380 	BMAC_STAT_RX_LEN_ERR_CNT,
    381 	BMAC_STAT_RX_VIOL_ERR_CNT,
    382 	BMAC_STAT_RX_PAUSE_CNT,
    383 	BMAC_STAT_RX_PAUSE_STATE,
    384 	BMAC_STAT_RX_NOPAUSE_STATE,
    385 	BMAC_STAT_END
    386 } nxge_bmac_stat_index_t;
    387 
    388 nxge_kstat_index_t nxge_bmac_stats[] = {
    389 	{BMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
    390 	{BMAC_STAT_TX_UNDERRUN_ERR, KSTAT_DATA_ULONG, "txmac_underrun_err"},
    391 	{BMAC_STAT_TX_MAX_PKT_ERR, KSTAT_DATA_ULONG, "txmac_max_pkt_err"},
    392 	{BMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
    393 	{BMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
    394 	{BMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
    395 	{BMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
    396 	{BMAC_STAT_RX_ALIGN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_align_err_cnt"},
    397 	{BMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err_cnt"},
    398 	{BMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_len_err_cnt"},
    399 	{BMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_viol_err_cnt"},
    400 	{BMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
    401 	{BMAC_STAT_RX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
    402 	{BMAC_STAT_RX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "tx_nopause_state"},
    403 	{BMAC_STAT_END, NULL, NULL}
    404 };
    405 
    406 typedef enum {
    407 	ZCP_STAT_ERRORS,
    408 	ZCP_STAT_INITS,
    409 	ZCP_STAT_RRFIFO_UNDERRUN,
    410 	ZCP_STAT_RRFIFO_OVERRUN,
    411 	ZCP_STAT_RSPFIFO_UNCORR_ERR,
    412 	ZCP_STAT_BUFFER_OVERFLOW,
    413 	ZCP_STAT_STAT_TBL_PERR,
    414 	ZCP_STAT_DYN_TBL_PERR,
    415 	ZCP_STAT_BUF_TBL_PERR,
    416 	ZCP_STAT_TT_PROGRAM_ERR,
    417 	ZCP_STAT_RSP_TT_INDEX_ERR,
    418 	ZCP_STAT_SLV_TT_INDEX_ERR,
    419 	ZCP_STAT_ZCP_TT_INDEX_ERR,
    420 	ZCP_STAT_ZCP_ACCESS_FAIL,
    421 	ZCP_CFIFO_ECC,
    422 	ZCP_STAT_END
    423 } nxge_zcp_stat_index_t;
    424 
    425 nxge_kstat_index_t nxge_zcp_stats[] = {
    426 	{ZCP_STAT_ERRORS, KSTAT_DATA_ULONG, "zcp_erros"},
    427 	{ZCP_STAT_INITS, KSTAT_DATA_ULONG, "zcp_inits"},
    428 	{ZCP_STAT_RRFIFO_UNDERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_underrun"},
    429 	{ZCP_STAT_RRFIFO_OVERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_overrun"},
    430 	{ZCP_STAT_RSPFIFO_UNCORR_ERR, KSTAT_DATA_ULONG,
    431 	"zcp_rspfifo_uncorr_err"},
    432 	{ZCP_STAT_BUFFER_OVERFLOW, KSTAT_DATA_ULONG, "zcp_buffer_overflow"},
    433 	{ZCP_STAT_STAT_TBL_PERR, KSTAT_DATA_ULONG, "zcp_stat_tbl_perr"},
    434 	{ZCP_STAT_DYN_TBL_PERR, KSTAT_DATA_ULONG, "zcp_dyn_tbl_perr"},
    435 	{ZCP_STAT_BUF_TBL_PERR, KSTAT_DATA_ULONG, "zcp_buf_tbl_perr"},
    436 	{ZCP_STAT_TT_PROGRAM_ERR, KSTAT_DATA_ULONG, "zcp_tt_program_err"},
    437 	{ZCP_STAT_RSP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_rsp_tt_index_err"},
    438 	{ZCP_STAT_SLV_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_slv_tt_index_err"},
    439 	{ZCP_STAT_ZCP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_zcp_tt_index_err"},
    440 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_access_fail"},
    441 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_cfifo_ecc"},
    442 	{ZCP_STAT_END, NULL, NULL}
    443 };
    444 
    445 typedef enum {
    446 	FFLP_STAT_TCAM_PERR,
    447 	FFLP_STAT_TCAM_ECC_ERR,
    448 	FFLP_STAT_VLAN_PERR,
    449 	FFLP_STAT_HASH_LOOKUP_ERR,
    450 	FFLP_STAT_HASH_P0_PIO_ERR,
    451 	FFLP_STAT_HASH_P1_PIO_ERR,
    452 	FFLP_STAT_HASH_P2_PIO_ERR,
    453 	FFLP_STAT_HASH_P3_PIO_ERR,
    454 	FFLP_STAT_HASH_P4_PIO_ERR,
    455 	FFLP_STAT_HASH_P5_PIO_ERR,
    456 	FFLP_STAT_HASH_P6_PIO_ERR,
    457 	FFLP_STAT_HASH_P7_PIO_ERR,
    458 	FFLP_STAT_END
    459 } nxge_fflp_stat_index_t;
    460 
    461 nxge_kstat_index_t nxge_fflp_stats[] = {
    462 	{FFLP_STAT_TCAM_PERR, KSTAT_DATA_ULONG, "fflp_tcam_perr"},
    463 	{FFLP_STAT_TCAM_ECC_ERR, KSTAT_DATA_ULONG, "fflp_tcam_ecc_err"},
    464 	{FFLP_STAT_VLAN_PERR, KSTAT_DATA_ULONG, "fflp_vlan_perr"},
    465 	{FFLP_STAT_HASH_LOOKUP_ERR, KSTAT_DATA_ULONG, "fflp_hash_lookup_err"},
    466 	{FFLP_STAT_HASH_P0_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p0_pio_err"},
    467 	{FFLP_STAT_HASH_P1_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p1_pio_err"},
    468 	{FFLP_STAT_HASH_P2_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p2_pio_err"},
    469 	{FFLP_STAT_HASH_P3_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p3_pio_err"},
    470 	{FFLP_STAT_HASH_P4_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p4_pio_err"},
    471 	{FFLP_STAT_HASH_P5_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p5_pio_err"},
    472 	{FFLP_STAT_HASH_P6_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p6_pio_err"},
    473 	{FFLP_STAT_HASH_P7_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p7_pio_err"},
    474 	{FFLP_STAT_END, NULL, NULL}
    475 };
    476 
    477 typedef enum {
    478 	MMAC_MAX_ADDR,
    479 	MMAC_AVAIL_ADDR,
    480 	MMAC_ADDR_POOL1,
    481 	MMAC_ADDR_POOL2,
    482 	MMAC_ADDR_POOL3,
    483 	MMAC_ADDR_POOL4,
    484 	MMAC_ADDR_POOL5,
    485 	MMAC_ADDR_POOL6,
    486 	MMAC_ADDR_POOL7,
    487 	MMAC_ADDR_POOL8,
    488 	MMAC_ADDR_POOL9,
    489 	MMAC_ADDR_POOL10,
    490 	MMAC_ADDR_POOL11,
    491 	MMAC_ADDR_POOL12,
    492 	MMAC_ADDR_POOL13,
    493 	MMAC_ADDR_POOL14,
    494 	MMAC_ADDR_POOL15,
    495 	MMAC_ADDR_POOL16,
    496 	MMAC_STATS_END
    497 } nxge_mmac_stat_index_t;
    498 
    499 nxge_kstat_index_t nxge_mmac_stats[] = {
    500 	{MMAC_MAX_ADDR, KSTAT_DATA_UINT64, "max_mmac_addr"},
    501 	{MMAC_AVAIL_ADDR, KSTAT_DATA_UINT64, "avail_mmac_addr"},
    502 	{MMAC_ADDR_POOL1, KSTAT_DATA_UINT64, "mmac_addr_1"},
    503 	{MMAC_ADDR_POOL2, KSTAT_DATA_UINT64, "mmac_addr_2"},
    504 	{MMAC_ADDR_POOL3, KSTAT_DATA_UINT64, "mmac_addr_3"},
    505 	{MMAC_ADDR_POOL4, KSTAT_DATA_UINT64, "mmac_addr_4"},
    506 	{MMAC_ADDR_POOL5, KSTAT_DATA_UINT64, "mmac_addr_5"},
    507 	{MMAC_ADDR_POOL6, KSTAT_DATA_UINT64, "mmac_addr_6"},
    508 	{MMAC_ADDR_POOL7, KSTAT_DATA_UINT64, "mmac_addr_7"},
    509 	{MMAC_ADDR_POOL8, KSTAT_DATA_UINT64, "mmac_addr_8"},
    510 	{MMAC_ADDR_POOL9, KSTAT_DATA_UINT64, "mmac_addr_9"},
    511 	{MMAC_ADDR_POOL10, KSTAT_DATA_UINT64, "mmac_addr_10"},
    512 	{MMAC_ADDR_POOL11, KSTAT_DATA_UINT64, "mmac_addr_11"},
    513 	{MMAC_ADDR_POOL12, KSTAT_DATA_UINT64, "mmac_addr_12"},
    514 	{MMAC_ADDR_POOL13, KSTAT_DATA_UINT64, "mmac_addr_13"},
    515 	{MMAC_ADDR_POOL14, KSTAT_DATA_UINT64, "mmac_addr_14"},
    516 	{MMAC_ADDR_POOL15, KSTAT_DATA_UINT64, "mmac_addr_15"},
    517 	{MMAC_ADDR_POOL16, KSTAT_DATA_UINT64, "mmac_addr_16"},
    518 	{MMAC_STATS_END, NULL, NULL},
    519 };
    520 
    521 /* ARGSUSED */
    522 int
    523 nxge_tdc_stat_update(kstat_t *ksp, int rw)
    524 {
    525 	p_nxge_t nxgep;
    526 	p_nxge_tdc_kstat_t tdc_kstatsp;
    527 	p_nxge_tx_ring_stats_t statsp;
    528 	int channel;
    529 	char *ch_name, *end;
    530 
    531 	nxgep = (p_nxge_t)ksp->ks_private;
    532 	if (nxgep == NULL)
    533 		return (-1);
    534 
    535 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rxstat_update"));
    536 
    537 	ch_name = ksp->ks_name;
    538 	ch_name += strlen(TDC_NAME_FORMAT1);
    539 	channel = mi_strtol(ch_name, &end, 10);
    540 
    541 	tdc_kstatsp = (p_nxge_tdc_kstat_t)ksp->ks_data;
    542 	statsp = (p_nxge_tx_ring_stats_t)&nxgep->statsp->tdc_stats[channel];
    543 
    544 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
    545 	    "nxge_tdc_stat_update data $%p statsp $%p channel %d",
    546 	    ksp->ks_data, statsp, channel));
    547 
    548 	if (rw == KSTAT_WRITE) {
    549 		statsp->opackets = tdc_kstatsp->opackets.value.ull;
    550 		statsp->obytes = tdc_kstatsp->obytes.value.ull;
    551 		statsp->oerrors = tdc_kstatsp->oerrors.value.ull;
    552 		statsp->mbox_err = tdc_kstatsp->mbox_err.value.ul;
    553 		statsp->pkt_size_err = tdc_kstatsp->pkt_size_err.value.ul;
    554 		statsp->tx_ring_oflow = tdc_kstatsp->tx_ring_oflow.value.ul;
    555 		statsp->pre_buf_par_err =
    556 		    tdc_kstatsp->pref_buf_ecc_err.value.ul;
    557 		statsp->nack_pref = tdc_kstatsp->nack_pref.value.ul;
    558 		statsp->nack_pkt_rd = tdc_kstatsp->nack_pkt_rd.value.ul;
    559 		statsp->conf_part_err = tdc_kstatsp->conf_part_err.value.ul;
    560 		statsp->pkt_part_err = tdc_kstatsp->pkt_prt_err.value.ul;
    561 	} else {
    562 		tdc_kstatsp->opackets.value.ull = statsp->opackets;
    563 		tdc_kstatsp->obytes.value.ull = statsp->obytes;
    564 		tdc_kstatsp->oerrors.value.ull = statsp->oerrors;
    565 		tdc_kstatsp->tx_hdr_pkts.value.ull = statsp->tx_hdr_pkts;
    566 		tdc_kstatsp->tx_ddi_pkts.value.ull = statsp->tx_ddi_pkts;
    567 		tdc_kstatsp->tx_dvma_pkts.value.ull = statsp->tx_dvma_pkts;
    568 		tdc_kstatsp->tx_max_pend.value.ull = statsp->tx_max_pend;
    569 		tdc_kstatsp->mbox_err.value.ul = statsp->mbox_err;
    570 		tdc_kstatsp->pkt_size_err.value.ul = statsp->pkt_size_err;
    571 		tdc_kstatsp->tx_ring_oflow.value.ul = statsp->tx_ring_oflow;
    572 		tdc_kstatsp->pref_buf_ecc_err.value.ul =
    573 		    statsp->pre_buf_par_err;
    574 		tdc_kstatsp->nack_pref.value.ul = statsp->nack_pref;
    575 		tdc_kstatsp->nack_pkt_rd.value.ul = statsp->nack_pkt_rd;
    576 		tdc_kstatsp->conf_part_err.value.ul = statsp->conf_part_err;
    577 		tdc_kstatsp->pkt_prt_err.value.ul = statsp->pkt_part_err;
    578 		tdc_kstatsp->tx_starts.value.ul = statsp->tx_starts;
    579 		tdc_kstatsp->tx_nocanput.value.ul = statsp->tx_nocanput;
    580 		tdc_kstatsp->tx_msgdup_fail.value.ul = statsp->tx_msgdup_fail;
    581 		tdc_kstatsp->tx_allocb_fail.value.ul = statsp->tx_allocb_fail;
    582 		tdc_kstatsp->tx_no_desc.value.ul = statsp->tx_no_desc;
    583 		tdc_kstatsp->tx_dma_bind_fail.value.ul =
    584 		    statsp->tx_dma_bind_fail;
    585 	}
    586 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_tdc_stat_update"));
    587 	return (0);
    588 }
    589 
    590 /* ARGSUSED */
    591 int
    592 nxge_rdc_stat_update(kstat_t *ksp, int rw)
    593 {
    594 	p_nxge_t nxgep;
    595 	p_nxge_rdc_kstat_t rdc_kstatsp;
    596 	p_nxge_rx_ring_stats_t statsp;
    597 	int channel;
    598 	char *ch_name, *end;
    599 
    600 	nxgep = (p_nxge_t)ksp->ks_private;
    601 	if (nxgep == NULL)
    602 		return (-1);
    603 
    604 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_stat_update"));
    605 
    606 	ch_name = ksp->ks_name;
    607 	ch_name += strlen(RDC_NAME_FORMAT1);
    608 	channel = mi_strtol(ch_name, &end, 10);
    609 
    610 	rdc_kstatsp = (p_nxge_rdc_kstat_t)ksp->ks_data;
    611 	statsp = (p_nxge_rx_ring_stats_t)&nxgep->statsp->rdc_stats[channel];
    612 
    613 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
    614 	    "nxge_rdc_stat_update $%p statsp $%p channel %d",
    615 	    ksp->ks_data, statsp, channel));
    616 
    617 	if (rw == KSTAT_WRITE) {
    618 		statsp->dcf_err = rdc_kstatsp->dcf_err.value.ul;
    619 		statsp->rcr_ack_err = rdc_kstatsp->rcr_ack_err.value.ul;
    620 		statsp->dc_fifo_err = rdc_kstatsp->dc_fifoflow_err.value.ul;
    621 		statsp->rcr_sha_par = rdc_kstatsp->rcr_sha_par_err.value.ul;
    622 		statsp->rbr_pre_par = rdc_kstatsp->rbr_pre_par_err.value.ul;
    623 		statsp->wred_drop = rdc_kstatsp->wred_drop.value.ul;
    624 		statsp->rbr_pre_empty = rdc_kstatsp->rbr_pre_emty.value.ul;
    625 		statsp->rcr_shadow_full = rdc_kstatsp->rcr_shadow_full.value.ul;
    626 		statsp->rx_rbr_tmout = rdc_kstatsp->rbr_tmout.value.ul;
    627 		statsp->rsp_cnt_err = rdc_kstatsp->rsp_cnt_err.value.ul;
    628 		statsp->byte_en_bus = rdc_kstatsp->byte_en_bus.value.ul;
    629 		statsp->rsp_dat_err = rdc_kstatsp->rsp_dat_err.value.ul;
    630 		statsp->pkt_too_long_err =
    631 		    rdc_kstatsp->pkt_too_long_err.value.ul;
    632 		statsp->l2_err = rdc_kstatsp->compl_l2_err.value.ul;
    633 		statsp->l4_cksum_err = rdc_kstatsp->compl_l4_cksum_err.value.ul;
    634 		statsp->fflp_soft_err =
    635 		    rdc_kstatsp->compl_fflp_soft_err.value.ul;
    636 		statsp->zcp_soft_err = rdc_kstatsp->compl_zcp_soft_err.value.ul;
    637 		statsp->config_err = rdc_kstatsp->config_err.value.ul;
    638 		statsp->rcrincon = rdc_kstatsp->rcrincon.value.ul;
    639 		statsp->rcrfull = rdc_kstatsp->rcrfull.value.ul;
    640 		statsp->rbr_empty = rdc_kstatsp->rbr_empty.value.ul;
    641 		statsp->rbrfull = rdc_kstatsp->rbrfull.value.ul;
    642 		statsp->rbrlogpage = rdc_kstatsp->rbrlogpage.value.ul;
    643 		statsp->cfiglogpage = rdc_kstatsp->cfiglogpage.value.ul;
    644 	} else {
    645 		rdc_kstatsp->ipackets.value.ull = statsp->ipackets;
    646 		rdc_kstatsp->rbytes.value.ull = statsp->ibytes;
    647 		rdc_kstatsp->errors.value.ul = statsp->ierrors;
    648 		rdc_kstatsp->dcf_err.value.ul = statsp->dcf_err;
    649 		rdc_kstatsp->rcr_ack_err.value.ul = statsp->rcr_ack_err;
    650 		rdc_kstatsp->dc_fifoflow_err.value.ul = statsp->dc_fifo_err;
    651 		rdc_kstatsp->rcr_sha_par_err.value.ul = statsp->rcr_sha_par;
    652 		rdc_kstatsp->rbr_pre_par_err.value.ul = statsp->rbr_pre_par;
    653 		rdc_kstatsp->wred_drop.value.ul = statsp->wred_drop;
    654 		rdc_kstatsp->port_drop_pkt.value.ul = statsp->port_drop_pkt;
    655 		rdc_kstatsp->rbr_pre_emty.value.ul = statsp->rbr_pre_empty;
    656 		rdc_kstatsp->rcr_shadow_full.value.ul = statsp->rcr_shadow_full;
    657 		rdc_kstatsp->rbr_tmout.value.ul = statsp->rx_rbr_tmout;
    658 		rdc_kstatsp->rsp_cnt_err.value.ul = statsp->rsp_cnt_err;
    659 		rdc_kstatsp->byte_en_bus.value.ul = statsp->byte_en_bus;
    660 		rdc_kstatsp->rsp_dat_err.value.ul = statsp->rsp_dat_err;
    661 		rdc_kstatsp->pkt_too_long_err.value.ul =
    662 		    statsp->pkt_too_long_err;
    663 		rdc_kstatsp->compl_l2_err.value.ul = statsp->l2_err;
    664 		rdc_kstatsp->compl_l4_cksum_err.value.ul = statsp->l4_cksum_err;
    665 		rdc_kstatsp->compl_fflp_soft_err.value.ul =
    666 		    statsp->fflp_soft_err;
    667 		rdc_kstatsp->compl_zcp_soft_err.value.ul = statsp->zcp_soft_err;
    668 		rdc_kstatsp->config_err.value.ul = statsp->config_err;
    669 		rdc_kstatsp->rcrincon.value.ul = statsp->rcrincon;
    670 		rdc_kstatsp->rcrfull.value.ul = statsp->rcrfull;
    671 		rdc_kstatsp->rbr_empty.value.ul = statsp->rbr_empty;
    672 		rdc_kstatsp->rbrfull.value.ul = statsp->rbrfull;
    673 		rdc_kstatsp->rbrlogpage.value.ul = statsp->rbrlogpage;
    674 		rdc_kstatsp->cfiglogpage.value.ul = statsp->cfiglogpage;
    675 	}
    676 
    677 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_stat_update"));
    678 	return (0);
    679 }
    680 
    681 /* ARGSUSED */
    682 int
    683 nxge_rdc_sys_stat_update(kstat_t *ksp, int rw)
    684 {
    685 	p_nxge_t nxgep;
    686 	p_nxge_rdc_sys_kstat_t rdc_sys_kstatsp;
    687 	p_nxge_rdc_sys_stats_t statsp;
    688 
    689 	nxgep = (p_nxge_t)ksp->ks_private;
    690 	if (nxgep == NULL)
    691 		return (-1);
    692 
    693 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_sys_stat_update"));
    694 
    695 	rdc_sys_kstatsp = (p_nxge_rdc_sys_kstat_t)ksp->ks_data;
    696 	statsp = (p_nxge_rdc_sys_stats_t)&nxgep->statsp->rdc_sys_stats;
    697 
    698 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "nxge_rdc_sys_stat_update %llx",
    699 	    ksp->ks_data));
    700 
    701 	if (rw == KSTAT_WRITE) {
    702 		statsp->id_mismatch = rdc_sys_kstatsp->id_mismatch.value.ul;
    703 		statsp->ipp_eop_err = rdc_sys_kstatsp->ipp_eop_err.value.ul;
    704 		statsp->zcp_eop_err = rdc_sys_kstatsp->zcp_eop_err.value.ul;
    705 	} else {
    706 		rdc_sys_kstatsp->id_mismatch.value.ul = statsp->id_mismatch;
    707 		rdc_sys_kstatsp->ipp_eop_err.value.ul = statsp->ipp_eop_err;
    708 		rdc_sys_kstatsp->zcp_eop_err.value.ul = statsp->zcp_eop_err;
    709 	}
    710 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_sys_stat_update"));
    711 	return (0);
    712 }
    713 
    714 /* ARGSUSED */
    715 static int
    716 nxge_txc_stat_update(kstat_t *ksp, int rw)
    717 {
    718 	p_nxge_t nxgep;
    719 	p_nxge_txc_kstat_t txc_kstatsp;
    720 	p_nxge_txc_stats_t statsp;
    721 
    722 	nxgep = (p_nxge_t)ksp->ks_private;
    723 
    724 	if (nxgep == NULL)
    725 		return (-1);
    726 
    727 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_txc_stat_update"));
    728 
    729 	txc_kstatsp = (p_nxge_txc_kstat_t)ksp->ks_data;
    730 	statsp = (p_nxge_txc_stats_t)&nxgep->statsp->txc_stats;
    731 
    732 	if (rw == KSTAT_WRITE) {
    733 		statsp->pkt_stuffed = txc_kstatsp->pkt_stuffed.value.ul;
    734 		statsp->pkt_xmit = txc_kstatsp->pkt_xmit.value.ul;
    735 		statsp->ro_correct_err = txc_kstatsp->ro_correct_err.value.ul;
    736 		statsp->ro_uncorrect_err =
    737 		    txc_kstatsp->ro_uncorrect_err.value.ul;
    738 		statsp->sf_correct_err = txc_kstatsp->sf_correct_err.value.ul;
    739 		statsp->sf_uncorrect_err =
    740 		    txc_kstatsp->sf_uncorrect_err.value.ul;
    741 		statsp->address_failed = txc_kstatsp->address_failed.value.ul;
    742 		statsp->dma_failed = txc_kstatsp->dma_failed.value.ul;
    743 		statsp->length_failed = txc_kstatsp->length_failed.value.ul;
    744 		statsp->pkt_assy_dead = txc_kstatsp->pkt_assy_dead.value.ul;
    745 		statsp->reorder_err = txc_kstatsp->reorder_err.value.ul;
    746 	} else {
    747 		txc_kstatsp->pkt_stuffed.value.ul = statsp->pkt_stuffed;
    748 		txc_kstatsp->pkt_xmit.value.ul = statsp->pkt_xmit;
    749 		txc_kstatsp->ro_correct_err.value.ul = statsp->ro_correct_err;
    750 		txc_kstatsp->ro_uncorrect_err.value.ul =
    751 		    statsp->ro_uncorrect_err;
    752 		txc_kstatsp->sf_correct_err.value.ul = statsp->sf_correct_err;
    753 		txc_kstatsp->sf_uncorrect_err.value.ul =
    754 		    statsp->sf_uncorrect_err;
    755 		txc_kstatsp->address_failed.value.ul = statsp->address_failed;
    756 		txc_kstatsp->dma_failed.value.ul = statsp->dma_failed;
    757 		txc_kstatsp->length_failed.value.ul = statsp->length_failed;
    758 		txc_kstatsp->pkt_assy_dead.value.ul = statsp->pkt_assy_dead;
    759 		txc_kstatsp->reorder_err.value.ul = statsp->reorder_err;
    760 	}
    761 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_txc_stat_update"));
    762 	return (0);
    763 }
    764 
    765 /* ARGSUSED */
    766 int
    767 nxge_ipp_stat_update(kstat_t *ksp, int rw)
    768 {
    769 	p_nxge_t nxgep;
    770 	p_nxge_ipp_kstat_t ipp_kstatsp;
    771 	p_nxge_ipp_stats_t statsp;
    772 
    773 	nxgep = (p_nxge_t)ksp->ks_private;
    774 	if (nxgep == NULL)
    775 		return (-1);
    776 
    777 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_ipp_stat_update"));
    778 
    779 	ipp_kstatsp = (p_nxge_ipp_kstat_t)ksp->ks_data;
    780 	statsp = (p_nxge_ipp_stats_t)&nxgep->statsp->ipp_stats;
    781 
    782 	if (rw == KSTAT_WRITE) {
    783 		statsp->eop_miss = ipp_kstatsp->eop_miss.value.ul;
    784 		statsp->sop_miss = ipp_kstatsp->sop_miss.value.ul;
    785 		statsp->dfifo_ue = ipp_kstatsp->dfifo_ue.value.ul;
    786 		statsp->ecc_err_cnt = ipp_kstatsp->ecc_err_cnt.value.ul;
    787 		statsp->pfifo_perr = ipp_kstatsp->pfifo_perr.value.ul;
    788 		statsp->pfifo_over = ipp_kstatsp->pfifo_over.value.ul;
    789 		statsp->pfifo_und = ipp_kstatsp->pfifo_und.value.ul;
    790 		statsp->bad_cs_cnt = ipp_kstatsp->bad_cs_cnt.value.ul;
    791 		statsp->pkt_dis_cnt = ipp_kstatsp->pkt_dis_cnt.value.ul;
    792 	} else {
    793 		ipp_kstatsp->eop_miss.value.ul = statsp->eop_miss;
    794 		ipp_kstatsp->sop_miss.value.ul = statsp->sop_miss;
    795 		ipp_kstatsp->dfifo_ue.value.ul = statsp->dfifo_ue;
    796 		ipp_kstatsp->ecc_err_cnt.value.ul = statsp->ecc_err_cnt;
    797 		ipp_kstatsp->pfifo_perr.value.ul = statsp->pfifo_perr;
    798 		ipp_kstatsp->pfifo_over.value.ul = statsp->pfifo_over;
    799 		ipp_kstatsp->pfifo_und.value.ul = statsp->pfifo_und;
    800 		ipp_kstatsp->bad_cs_cnt.value.ul = statsp->bad_cs_cnt;
    801 		ipp_kstatsp->pkt_dis_cnt.value.ul = statsp->pkt_dis_cnt;
    802 	}
    803 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_ipp_stat_update"));
    804 	return (0);
    805 }
    806 
    807 /* ARGSUSED */
    808 int
    809 nxge_xmac_stat_update(kstat_t *ksp, int rw)
    810 {
    811 	p_nxge_t nxgep;
    812 	p_nxge_xmac_kstat_t xmac_kstatsp;
    813 	p_nxge_xmac_stats_t statsp;
    814 
    815 	nxgep = (p_nxge_t)ksp->ks_private;
    816 	if (nxgep == NULL)
    817 		return (-1);
    818 
    819 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_xmac_stat_update"));
    820 
    821 	xmac_kstatsp = (p_nxge_xmac_kstat_t)ksp->ks_data;
    822 	statsp = (p_nxge_xmac_stats_t)&nxgep->statsp->xmac_stats;
    823 
    824 	if (rw == KSTAT_WRITE) {
    825 		statsp->tx_frame_cnt = xmac_kstatsp->tx_frame_cnt.value.ul;
    826 		statsp->tx_underflow_err =
    827 		    xmac_kstatsp->tx_underflow_err.value.ul;
    828 		statsp->tx_maxpktsize_err =
    829 		    xmac_kstatsp->tx_maxpktsize_err.value.ul;
    830 		statsp->tx_overflow_err =
    831 		    xmac_kstatsp->tx_overflow_err.value.ul;
    832 		statsp->tx_fifo_xfr_err =
    833 		    xmac_kstatsp->tx_fifo_xfr_err.value.ul;
    834 		statsp->tx_byte_cnt = xmac_kstatsp->tx_byte_cnt.value.ul;
    835 		statsp->rx_underflow_err =
    836 		    xmac_kstatsp->rx_underflow_err.value.ul;
    837 		statsp->rx_overflow_err =
    838 		    xmac_kstatsp->rx_overflow_err.value.ul;
    839 		statsp->rx_crc_err_cnt = xmac_kstatsp->rx_crc_err_cnt.value.ul;
    840 		statsp->rx_len_err_cnt = xmac_kstatsp->rx_len_err_cnt.value.ul;
    841 		statsp->rx_viol_err_cnt =
    842 		    xmac_kstatsp->rx_viol_err_cnt.value.ul;
    843 		statsp->rx_byte_cnt = xmac_kstatsp->rx_byte_cnt.value.ul;
    844 		statsp->rx_frame_cnt = xmac_kstatsp->rx_frame_cnt.value.ul;
    845 		statsp->rx_hist1_cnt = xmac_kstatsp->rx_hist1_cnt.value.ul;
    846 		statsp->rx_hist2_cnt = xmac_kstatsp->rx_hist2_cnt.value.ul;
    847 		statsp->rx_hist3_cnt = xmac_kstatsp->rx_hist3_cnt.value.ul;
    848 		statsp->rx_hist4_cnt = xmac_kstatsp->rx_hist4_cnt.value.ul;
    849 		statsp->rx_hist5_cnt = xmac_kstatsp->rx_hist5_cnt.value.ul;
    850 		statsp->rx_hist6_cnt = xmac_kstatsp->rx_hist6_cnt.value.ul;
    851 		statsp->rx_hist7_cnt = xmac_kstatsp->rx_hist7_cnt.value.ul;
    852 		statsp->rx_mult_cnt = xmac_kstatsp->rx_mult_cnt.value.ul;
    853 		statsp->rx_frag_cnt = xmac_kstatsp->rx_frag_cnt.value.ul;
    854 		statsp->rx_frame_align_err_cnt =
    855 		    xmac_kstatsp->rx_frame_align_err_cnt.value.ul;
    856 		statsp->rx_linkfault_err_cnt =
    857 		    xmac_kstatsp->rx_linkfault_err_cnt.value.ul;
    858 		statsp->rx_localfault_err =
    859 		    xmac_kstatsp->rx_local_fault_err_cnt.value.ul;
    860 		statsp->rx_remotefault_err =
    861 		    xmac_kstatsp->rx_remote_fault_err_cnt.value.ul;
    862 		statsp->xpcs_deskew_err_cnt =
    863 		    xmac_kstatsp->xpcs_deskew_err_cnt.value.ul;
    864 #ifdef	NXGE_DEBUG_SYMBOL_ERR
    865 		statsp->xpcs_ln0_symbol_err_cnt =
    866 		    xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul;
    867 		statsp->xpcs_ln1_symbol_err_cnt =
    868 		    xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul;
    869 		statsp->xpcs_ln2_symbol_err_cnt =
    870 		    xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul;
    871 		statsp->xpcs_ln3_symbol_err_cnt =
    872 		    xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul;
    873 #endif
    874 	} else {
    875 		xmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
    876 		xmac_kstatsp->tx_underflow_err.value.ul =
    877 		    statsp->tx_underflow_err;
    878 		xmac_kstatsp->tx_maxpktsize_err.value.ul =
    879 		    statsp->tx_maxpktsize_err;
    880 		xmac_kstatsp->tx_overflow_err.value.ul =
    881 		    statsp->tx_overflow_err;
    882 		xmac_kstatsp->tx_fifo_xfr_err.value.ul =
    883 		    statsp->tx_fifo_xfr_err;
    884 		xmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
    885 		xmac_kstatsp->rx_underflow_err.value.ul =
    886 		    statsp->rx_underflow_err;
    887 		xmac_kstatsp->rx_overflow_err.value.ul =
    888 		    statsp->rx_overflow_err;
    889 		xmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
    890 		xmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
    891 		xmac_kstatsp->rx_viol_err_cnt.value.ul =
    892 		    statsp->rx_viol_err_cnt;
    893 		xmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
    894 		xmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
    895 		xmac_kstatsp->rx_hist1_cnt.value.ul = statsp->rx_hist1_cnt;
    896 		xmac_kstatsp->rx_hist2_cnt.value.ul = statsp->rx_hist2_cnt;
    897 		xmac_kstatsp->rx_hist3_cnt.value.ul = statsp->rx_hist3_cnt;
    898 		xmac_kstatsp->rx_hist4_cnt.value.ul = statsp->rx_hist4_cnt;
    899 		xmac_kstatsp->rx_hist5_cnt.value.ul = statsp->rx_hist5_cnt;
    900 		xmac_kstatsp->rx_hist6_cnt.value.ul = statsp->rx_hist6_cnt;
    901 		xmac_kstatsp->rx_hist7_cnt.value.ul = statsp->rx_hist7_cnt;
    902 		xmac_kstatsp->rx_mult_cnt.value.ul = statsp->rx_mult_cnt;
    903 		xmac_kstatsp->rx_frag_cnt.value.ul = statsp->rx_frag_cnt;
    904 		xmac_kstatsp->rx_frame_align_err_cnt.value.ul =
    905 		    statsp->rx_frame_align_err_cnt;
    906 		xmac_kstatsp->rx_linkfault_err_cnt.value.ul =
    907 		    statsp->rx_linkfault_err_cnt;
    908 		xmac_kstatsp->rx_local_fault_err_cnt.value.ul =
    909 		    statsp->rx_localfault_err;
    910 		xmac_kstatsp->rx_remote_fault_err_cnt.value.ul =
    911 		    statsp->rx_remotefault_err;
    912 		xmac_kstatsp->xpcs_deskew_err_cnt.value.ul =
    913 		    statsp->xpcs_deskew_err_cnt;
    914 #ifdef	NXGE_DEBUG_SYMBOL_ERR
    915 		xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul =
    916 		    statsp->xpcs_ln0_symbol_err_cnt;
    917 		xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul =
    918 		    statsp->xpcs_ln1_symbol_err_cnt;
    919 		xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul =
    920 		    statsp->xpcs_ln2_symbol_err_cnt;
    921 		xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul =
    922 		    statsp->xpcs_ln3_symbol_err_cnt;
    923 #endif
    924 	}
    925 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_xmac_stat_update"));
    926 	return (0);
    927 }
    928 
    929 /* ARGSUSED */
    930 int
    931 nxge_bmac_stat_update(kstat_t *ksp, int rw)
    932 {
    933 	p_nxge_t nxgep;
    934 	p_nxge_bmac_kstat_t bmac_kstatsp;
    935 	p_nxge_bmac_stats_t statsp;
    936 
    937 	nxgep = (p_nxge_t)ksp->ks_private;
    938 	if (nxgep == NULL)
    939 		return (-1);
    940 
    941 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_bmac_stat_update"));
    942 
    943 	bmac_kstatsp = (p_nxge_bmac_kstat_t)ksp->ks_data;
    944 	statsp = (p_nxge_bmac_stats_t)&nxgep->statsp->bmac_stats;
    945 
    946 	if (rw == KSTAT_WRITE) {
    947 		statsp->tx_frame_cnt = bmac_kstatsp->tx_frame_cnt.value.ul;
    948 		statsp->tx_underrun_err =
    949 		    bmac_kstatsp->tx_underrun_err.value.ul;
    950 		statsp->tx_max_pkt_err = bmac_kstatsp->tx_max_pkt_err.value.ul;
    951 		statsp->tx_byte_cnt = bmac_kstatsp->tx_byte_cnt.value.ul;
    952 		statsp->rx_frame_cnt = bmac_kstatsp->rx_frame_cnt.value.ul;
    953 		statsp->rx_byte_cnt = bmac_kstatsp->rx_byte_cnt.value.ul;
    954 		statsp->rx_overflow_err =
    955 		    bmac_kstatsp->rx_overflow_err.value.ul;
    956 		statsp->rx_align_err_cnt =
    957 		    bmac_kstatsp->rx_align_err_cnt.value.ul;
    958 		statsp->rx_crc_err_cnt = bmac_kstatsp->rx_crc_err_cnt.value.ul;
    959 		statsp->rx_len_err_cnt = bmac_kstatsp->rx_len_err_cnt.value.ul;
    960 		statsp->rx_viol_err_cnt =
    961 		    bmac_kstatsp->rx_viol_err_cnt.value.ul;
    962 	} else {
    963 		bmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
    964 		bmac_kstatsp->tx_underrun_err.value.ul =
    965 		    statsp->tx_underrun_err;
    966 		bmac_kstatsp->tx_max_pkt_err.value.ul = statsp->tx_max_pkt_err;
    967 		bmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
    968 		bmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
    969 		bmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
    970 		bmac_kstatsp->rx_overflow_err.value.ul =
    971 		    statsp->rx_overflow_err;
    972 		bmac_kstatsp->rx_align_err_cnt.value.ul =
    973 		    statsp->rx_align_err_cnt;
    974 		bmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
    975 		bmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
    976 		bmac_kstatsp->rx_viol_err_cnt.value.ul =
    977 		    statsp->rx_viol_err_cnt;
    978 	}
    979 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_bmac_stat_update"));
    980 	return (0);
    981 }
    982 
    983 /* ARGSUSED */
    984 int
    985 nxge_zcp_stat_update(kstat_t *ksp, int rw)
    986 {
    987 	p_nxge_t nxgep;
    988 	p_nxge_zcp_kstat_t zcp_kstatsp;
    989 	p_nxge_zcp_stats_t statsp;
    990 
    991 	nxgep = (p_nxge_t)ksp->ks_private;
    992 	if (nxgep == NULL)
    993 		return (-1);
    994 
    995 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_zcp_stat_update"));
    996 
    997 	zcp_kstatsp = (p_nxge_zcp_kstat_t)ksp->ks_data;
    998 	statsp = (p_nxge_zcp_stats_t)&nxgep->statsp->zcp_stats;
    999 
   1000 	if (rw == KSTAT_WRITE) {
   1001 		statsp->rrfifo_underrun = zcp_kstatsp->rrfifo_underrun.value.ul;
   1002 		statsp->rrfifo_overrun = zcp_kstatsp->rrfifo_overrun.value.ul;
   1003 		statsp->rspfifo_uncorr_err =
   1004 		    zcp_kstatsp->rspfifo_uncorr_err.value.ul;
   1005 		statsp->buffer_overflow = zcp_kstatsp->buffer_overflow.value.ul;
   1006 		statsp->stat_tbl_perr = zcp_kstatsp->stat_tbl_perr.value.ul;
   1007 		statsp->dyn_tbl_perr = zcp_kstatsp->dyn_tbl_perr.value.ul;
   1008 		statsp->buf_tbl_perr = zcp_kstatsp->buf_tbl_perr.value.ul;
   1009 		statsp->tt_program_err = zcp_kstatsp->tt_program_err.value.ul;
   1010 		statsp->rsp_tt_index_err =
   1011 		    zcp_kstatsp->rsp_tt_index_err.value.ul;
   1012 		statsp->slv_tt_index_err =
   1013 		    zcp_kstatsp->slv_tt_index_err.value.ul;
   1014 		statsp->zcp_tt_index_err =
   1015 		    zcp_kstatsp->zcp_tt_index_err.value.ul;
   1016 		statsp->cfifo_ecc = zcp_kstatsp->cfifo_ecc.value.ul;
   1017 	} else {
   1018 		zcp_kstatsp->rrfifo_underrun.value.ul = statsp->rrfifo_underrun;
   1019 		zcp_kstatsp->rrfifo_overrun.value.ul = statsp->rrfifo_overrun;
   1020 		zcp_kstatsp->rspfifo_uncorr_err.value.ul =
   1021 		    statsp->rspfifo_uncorr_err;
   1022 		zcp_kstatsp->buffer_overflow.value.ul =
   1023 		    statsp->buffer_overflow;
   1024 		zcp_kstatsp->stat_tbl_perr.value.ul = statsp->stat_tbl_perr;
   1025 		zcp_kstatsp->dyn_tbl_perr.value.ul = statsp->dyn_tbl_perr;
   1026 		zcp_kstatsp->buf_tbl_perr.value.ul = statsp->buf_tbl_perr;
   1027 		zcp_kstatsp->tt_program_err.value.ul = statsp->tt_program_err;
   1028 		zcp_kstatsp->rsp_tt_index_err.value.ul =
   1029 		    statsp->rsp_tt_index_err;
   1030 		zcp_kstatsp->slv_tt_index_err.value.ul =
   1031 		    statsp->slv_tt_index_err;
   1032 		zcp_kstatsp->zcp_tt_index_err.value.ul =
   1033 		    statsp->zcp_tt_index_err;
   1034 		zcp_kstatsp->cfifo_ecc.value.ul = statsp->cfifo_ecc;
   1035 	}
   1036 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_zcp_stat_update"));
   1037 	return (0);
   1038 }
   1039 
   1040 /* ARGSUSED */
   1041 int
   1042 nxge_fflp_stat_update(kstat_t *ksp, int rw)
   1043 {
   1044 	p_nxge_t nxgep;
   1045 	p_nxge_fflp_kstat_t fflp_kstatsp;
   1046 	p_nxge_fflp_stats_t statsp;
   1047 	int ldc_grp;
   1048 
   1049 	nxgep = (p_nxge_t)ksp->ks_private;
   1050 	if (nxgep == NULL)
   1051 		return (-1);
   1052 
   1053 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_fflp_stat_update"));
   1054 
   1055 	fflp_kstatsp = (p_nxge_fflp_kstat_t)ksp->ks_data;
   1056 	statsp = (p_nxge_fflp_stats_t)&nxgep->statsp->fflp_stats;
   1057 
   1058 	if (rw == KSTAT_WRITE) {
   1059 		statsp->tcam_parity_err = fflp_kstatsp->fflp_tcam_perr.value.ul;
   1060 		statsp->tcam_ecc_err = fflp_kstatsp->fflp_tcam_ecc_err.value.ul;
   1061 		statsp->vlan_parity_err = fflp_kstatsp->fflp_vlan_perr.value.ul;
   1062 		statsp->hash_lookup_err =
   1063 		    fflp_kstatsp->fflp_hasht_lookup_err.value.ul;
   1064 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
   1065 			statsp->hash_pio_err[ldc_grp] =
   1066 			    fflp_kstatsp->fflp_hasht_data_err[ldc_grp].
   1067 			    value.ul;
   1068 		}
   1069 	} else {
   1070 		fflp_kstatsp->fflp_tcam_perr.value.ul =
   1071 		    fflp_kstatsp->fflp_tcam_perr.value.ul;
   1072 		fflp_kstatsp->fflp_tcam_ecc_err.value.ul = statsp->tcam_ecc_err;
   1073 		fflp_kstatsp->fflp_vlan_perr.value.ul = statsp->vlan_parity_err;
   1074 		fflp_kstatsp->fflp_hasht_lookup_err.value.ul =
   1075 		    statsp->hash_lookup_err;
   1076 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
   1077 			fflp_kstatsp->fflp_hasht_data_err[ldc_grp].value.ul =
   1078 			    statsp->hash_pio_err[ldc_grp];
   1079 		}
   1080 	}
   1081 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_fflp_stat_update"));
   1082 	return (0);
   1083 }
   1084 
   1085 /* ARGSUSED */
   1086 static uint64_t
   1087 nxge_mac_octet_to_u64(struct ether_addr addr)
   1088 {
   1089 	int i;
   1090 	uint64_t addr64 = 0;
   1091 
   1092 	for (i = ETHERADDRL - 1; i >= 0; i--) {
   1093 		addr64 <<= 8;
   1094 		addr64 |= addr.ether_addr_octet[i];
   1095 	}
   1096 	return (addr64);
   1097 }
   1098 
   1099 /* ARGSUSED */
   1100 int
   1101 nxge_mmac_stat_update(kstat_t *ksp, int rw)
   1102 {
   1103 	p_nxge_t nxgep;
   1104 	p_nxge_mmac_kstat_t mmac_kstatsp;
   1105 	p_nxge_mmac_stats_t statsp;
   1106 
   1107 	nxgep = (p_nxge_t)ksp->ks_private;
   1108 	if (nxgep == NULL)
   1109 		return (-1);
   1110 
   1111 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_mmac_stat_update"));
   1112 
   1113 	mmac_kstatsp = (p_nxge_mmac_kstat_t)ksp->ks_data;
   1114 	statsp = (p_nxge_mmac_stats_t)&nxgep->statsp->mmac_stats;
   1115 
   1116 	if (rw == KSTAT_WRITE) {
   1117 		cmn_err(CE_WARN, "Can not write mmac stats");
   1118 	} else {
   1119 		mmac_kstatsp->mmac_max_addr_cnt.value.ul =
   1120 		    statsp->mmac_max_cnt;
   1121 		mmac_kstatsp->mmac_avail_addr_cnt.value.ul =
   1122 		    statsp->mmac_avail_cnt;
   1123 		mmac_kstatsp->mmac_addr1.value.ul =
   1124 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[0]);
   1125 		mmac_kstatsp->mmac_addr2.value.ul =
   1126 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[1]);
   1127 		mmac_kstatsp->mmac_addr3.value.ul =
   1128 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[2]);
   1129 		mmac_kstatsp->mmac_addr4.value.ul =
   1130 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[3]);
   1131 		mmac_kstatsp->mmac_addr5.value.ul =
   1132 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[4]);
   1133 		mmac_kstatsp->mmac_addr6.value.ul =
   1134 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[5]);
   1135 		mmac_kstatsp->mmac_addr7.value.ul =
   1136 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[6]);
   1137 		mmac_kstatsp->mmac_addr8.value.ul =
   1138 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[7]);
   1139 		mmac_kstatsp->mmac_addr9.value.ul =
   1140 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[8]);
   1141 		mmac_kstatsp->mmac_addr10.value.ul =
   1142 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[9]);
   1143 		mmac_kstatsp->mmac_addr11.value.ul =
   1144 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[10]);
   1145 		mmac_kstatsp->mmac_addr12.value.ul =
   1146 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[11]);
   1147 		mmac_kstatsp->mmac_addr13.value.ul =
   1148 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[12]);
   1149 		mmac_kstatsp->mmac_addr14.value.ul =
   1150 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[13]);
   1151 		mmac_kstatsp->mmac_addr15.value.ul =
   1152 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[14]);
   1153 		mmac_kstatsp->mmac_addr16.value.ul =
   1154 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[15]);
   1155 	}
   1156 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_mmac_stat_update"));
   1157 	return (0);
   1158 }
   1159 
   1160 /* ARGSUSED */
   1161 static kstat_t *
   1162 nxge_setup_local_kstat(p_nxge_t nxgep, int instance, char *name,
   1163 	const nxge_kstat_index_t *ksip, size_t count,
   1164 	int (*update) (kstat_t *, int))
   1165 {
   1166 	kstat_t *ksp;
   1167 	kstat_named_t *knp;
   1168 	int i;
   1169 
   1170 	ksp = kstat_create(NXGE_DRIVER_NAME, instance, name, "net",
   1171 	    KSTAT_TYPE_NAMED, count, 0);
   1172 	if (ksp == NULL)
   1173 		return (NULL);
   1174 
   1175 	ksp->ks_private = (void *)nxgep;
   1176 	ksp->ks_update = update;
   1177 	knp = ksp->ks_data;
   1178 
   1179 	for (i = 0; ksip[i].name != NULL; i++) {
   1180 		kstat_named_init(&knp[i], ksip[i].name, ksip[i].type);
   1181 	}
   1182 
   1183 	kstat_install(ksp);
   1184 	return (ksp);
   1185 }
   1186 
   1187 /* ARGSUSED */
   1188 void
   1189 nxge_setup_rdc_kstats(p_nxge_t nxgep, int channel)
   1190 {
   1191 	char stat_name[64];
   1192 
   1193 	/* Setup RDC statistics */
   1194 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
   1195 	    RDC_NAME_FORMAT1, channel);
   1196 	nxgep->statsp->rdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
   1197 	    nxgep->instance,
   1198 	    stat_name,
   1199 	    nxge_rdc_stats,
   1200 	    RDC_STAT_END,
   1201 	    nxge_rdc_stat_update);
   1202 #ifdef	NXGE_DEBUG_ERROR
   1203 	if (nxgep->statsp->rdc_ksp[channel] == NULL)
   1204 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
   1205 		    "kstat_create failed for rdc channel %d", channel));
   1206 #endif
   1207 }
   1208 
   1209 void
   1210 nxge_setup_tdc_kstats(p_nxge_t nxgep, int channel)
   1211 {
   1212 	char stat_name[64];
   1213 
   1214 	/* Setup TDC statistics */
   1215 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
   1216 	    TDC_NAME_FORMAT1, channel);
   1217 	nxgep->statsp->tdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
   1218 	    nxgep->instance,
   1219 	    stat_name,
   1220 	    nxge_tdc_stats,
   1221 	    TDC_STAT_END,
   1222 	    nxge_tdc_stat_update);
   1223 #ifdef	NXGE_DEBUG_ERROR
   1224 	if (nxgep->statsp->tdc_ksp[channel] == NULL) {
   1225 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
   1226 		    "kstat_create failed for tdc channel %d", channel));
   1227 	}
   1228 #endif
   1229 }
   1230 
   1231 void
   1232 nxge_setup_kstats(p_nxge_t nxgep)
   1233 {
   1234 	struct kstat *ksp;
   1235 	p_nxge_port_kstat_t nxgekp;
   1236 	size_t nxge_kstat_sz;
   1237 	char mmac_name[64];
   1238 
   1239 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_setup_kstats"));
   1240 
   1241 	/* Setup RDC System statistics */
   1242 	nxgep->statsp->rdc_sys_ksp = nxge_setup_local_kstat(nxgep,
   1243 	    nxgep->instance,
   1244 	    "RDC System Stats",
   1245 	    &nxge_rdc_sys_stats[0],
   1246 	    RDC_SYS_STAT_END,
   1247 	    nxge_rdc_sys_stat_update);
   1248 
   1249 	/* Setup IPP statistics */
   1250 	nxgep->statsp->ipp_ksp = nxge_setup_local_kstat(nxgep,
   1251 	    nxgep->instance,
   1252 	    "IPP Stats",
   1253 	    &nxge_ipp_stats[0],
   1254 	    IPP_STAT_END,
   1255 	    nxge_ipp_stat_update);
   1256 #ifdef	NXGE_DEBUG_ERROR
   1257 	if (nxgep->istatsp->pp_ksp == NULL)
   1258 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for ipp"));
   1259 #endif
   1260 
   1261 	/* Setup TXC statistics */
   1262 	nxgep->statsp->txc_ksp = nxge_setup_local_kstat(nxgep,
   1263 	    nxgep->instance, "TXC Stats", &nxge_txc_stats[0],
   1264 	    TXC_STAT_END, nxge_txc_stat_update);
   1265 #ifdef	NXGE_DEBUG_ERROR
   1266 	if (nxgep->statsp->txc_ksp == NULL)
   1267 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for txc"));
   1268 #endif
   1269 
   1270 	/* Setup ZCP statistics */
   1271 	nxgep->statsp->zcp_ksp = nxge_setup_local_kstat(nxgep,
   1272 	    nxgep->instance, "ZCP Stats", &nxge_zcp_stats[0],
   1273 	    ZCP_STAT_END, nxge_zcp_stat_update);
   1274 #ifdef	NXGE_DEBUG_ERROR
   1275 	if (nxgep->statsp->zcp_ksp == NULL)
   1276 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for zcp"));
   1277 #endif
   1278 
   1279 	/* Setup FFLP statistics */
   1280 	nxgep->statsp->fflp_ksp[0] = nxge_setup_local_kstat(nxgep,
   1281 	    nxgep->instance, "FFLP Stats", &nxge_fflp_stats[0],
   1282 	    FFLP_STAT_END, nxge_fflp_stat_update);
   1283 
   1284 #ifdef	NXGE_DEBUG_ERROR
   1285 	if (nxgep->statsp->fflp_ksp == NULL)
   1286 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
   1287 		    "kstat_create failed for fflp"));
   1288 #endif
   1289 
   1290 	(void) sprintf(mmac_name, "MMAC Stats%d", nxgep->instance);
   1291 	nxgep->statsp->mmac_ksp = nxge_setup_local_kstat(nxgep,
   1292 	    nxgep->instance, "MMAC Stats", &nxge_mmac_stats[0],
   1293 	    MMAC_STATS_END, nxge_mmac_stat_update);
   1294 
   1295 	nxge_kstat_sz = sizeof (nxge_port_kstat_t) +
   1296 	    sizeof (nxge_mac_kstat_t) - sizeof (kstat_named_t);
   1297 
   1298 	if ((ksp = kstat_create(NXGE_DRIVER_NAME, nxgep->instance,
   1299 	    "Port Stats", "net", KSTAT_TYPE_NAMED,
   1300 	    nxge_kstat_sz / sizeof (kstat_named_t), 0)) == NULL) {
   1301 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed"));
   1302 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
   1303 		return;
   1304 	}
   1305 
   1306 	/*
   1307 	 * kstats
   1308 	 */
   1309 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
   1310 
   1311 	/*
   1312 	 * transceiver state informations.
   1313 	 */
   1314 	kstat_named_init(&nxgekp->xcvr_inits, "xcvr_inits",
   1315 	    KSTAT_DATA_ULONG);
   1316 	kstat_named_init(&nxgekp->xcvr_inuse, "xcvr_inuse",
   1317 	    KSTAT_DATA_ULONG);
   1318 	kstat_named_init(&nxgekp->xcvr_addr, "xcvr_addr",
   1319 	    KSTAT_DATA_ULONG);
   1320 	kstat_named_init(&nxgekp->xcvr_id, "xcvr_id",
   1321 	    KSTAT_DATA_ULONG);
   1322 	kstat_named_init(&nxgekp->cap_autoneg, "cap_autoneg",
   1323 	    KSTAT_DATA_ULONG);
   1324 	kstat_named_init(&nxgekp->cap_10gfdx, "cap_10gfdx",
   1325 	    KSTAT_DATA_ULONG);
   1326 	kstat_named_init(&nxgekp->cap_10ghdx, "cap_10ghdx",
   1327 	    KSTAT_DATA_ULONG);
   1328 	kstat_named_init(&nxgekp->cap_1000fdx, "cap_1000fdx",
   1329 	    KSTAT_DATA_ULONG);
   1330 	kstat_named_init(&nxgekp->cap_1000hdx, "cap_1000hdx",
   1331 	    KSTAT_DATA_ULONG);
   1332 	kstat_named_init(&nxgekp->cap_100T4, "cap_100T4",
   1333 	    KSTAT_DATA_ULONG);
   1334 	kstat_named_init(&nxgekp->cap_100fdx, "cap_100fdx",
   1335 	    KSTAT_DATA_ULONG);
   1336 	kstat_named_init(&nxgekp->cap_100hdx, "cap_100hdx",
   1337 	    KSTAT_DATA_ULONG);
   1338 	kstat_named_init(&nxgekp->cap_10fdx, "cap_10fdx",
   1339 	    KSTAT_DATA_ULONG);
   1340 	kstat_named_init(&nxgekp->cap_10hdx, "cap_10hdx",
   1341 	    KSTAT_DATA_ULONG);
   1342 	kstat_named_init(&nxgekp->cap_asmpause, "cap_asmpause",
   1343 	    KSTAT_DATA_ULONG);
   1344 	kstat_named_init(&nxgekp->cap_pause, "cap_pause",
   1345 	    KSTAT_DATA_ULONG);
   1346 
   1347 	/*
   1348 	 * Link partner capabilities.
   1349 	 */
   1350 	kstat_named_init(&nxgekp->lp_cap_autoneg, "lp_cap_autoneg",
   1351 	    KSTAT_DATA_ULONG);
   1352 	kstat_named_init(&nxgekp->lp_cap_10gfdx, "lp_cap_10gfdx",
   1353 	    KSTAT_DATA_ULONG);
   1354 	kstat_named_init(&nxgekp->lp_cap_10ghdx, "lp_cap_10ghdx",
   1355 	    KSTAT_DATA_ULONG);
   1356 	kstat_named_init(&nxgekp->lp_cap_1000fdx, "lp_cap_1000fdx",
   1357 	    KSTAT_DATA_ULONG);
   1358 	kstat_named_init(&nxgekp->lp_cap_1000hdx, "lp_cap_1000hdx",
   1359 	    KSTAT_DATA_ULONG);
   1360 	kstat_named_init(&nxgekp->lp_cap_100T4, "lp_cap_100T4",
   1361 	    KSTAT_DATA_ULONG);
   1362 	kstat_named_init(&nxgekp->lp_cap_100fdx, "lp_cap_100fdx",
   1363 	    KSTAT_DATA_ULONG);
   1364 	kstat_named_init(&nxgekp->lp_cap_100hdx, "lp_cap_100hdx",
   1365 	    KSTAT_DATA_ULONG);
   1366 	kstat_named_init(&nxgekp->lp_cap_10fdx, "lp_cap_10fdx",
   1367 	    KSTAT_DATA_ULONG);
   1368 	kstat_named_init(&nxgekp->lp_cap_10hdx, "lp_cap_10hdx",
   1369 	    KSTAT_DATA_ULONG);
   1370 	kstat_named_init(&nxgekp->lp_cap_asmpause, "lp_cap_asmpause",
   1371 	    KSTAT_DATA_ULONG);
   1372 	kstat_named_init(&nxgekp->lp_cap_pause, "lp_cap_pause",
   1373 	    KSTAT_DATA_ULONG);
   1374 	/*
   1375 	 * Shared link setup.
   1376 	 */
   1377 	kstat_named_init(&nxgekp->link_T4, "link_T4",
   1378 	    KSTAT_DATA_ULONG);
   1379 	kstat_named_init(&nxgekp->link_speed, "link_speed",
   1380 	    KSTAT_DATA_ULONG);
   1381 	kstat_named_init(&nxgekp->link_duplex, "link_duplex",
   1382 	    KSTAT_DATA_CHAR);
   1383 	kstat_named_init(&nxgekp->link_asmpause, "link_asmpause",
   1384 	    KSTAT_DATA_ULONG);
   1385 	kstat_named_init(&nxgekp->link_pause, "link_pause",
   1386 	    KSTAT_DATA_ULONG);
   1387 	kstat_named_init(&nxgekp->link_up, "link_up",
   1388 	    KSTAT_DATA_ULONG);
   1389 
   1390 	/*
   1391 	 * Let the user know the MTU currently in use by the physical MAC
   1392 	 * port.
   1393 	 */
   1394 	kstat_named_init(&nxgekp->mac_mtu, "mac_mtu",
   1395 	    KSTAT_DATA_ULONG);
   1396 
   1397 	/*
   1398 	 * Loopback statistics.
   1399 	 */
   1400 	kstat_named_init(&nxgekp->lb_mode, "lb_mode",
   1401 	    KSTAT_DATA_ULONG);
   1402 
   1403 	/*
   1404 	 * This tells the user whether the driver is in QOS mode or not.
   1405 	 */
   1406 	kstat_named_init(&nxgekp->qos_mode, "qos_mode",
   1407 	    KSTAT_DATA_ULONG);
   1408 
   1409 	/*
   1410 	 * This tells whether the instance is trunked or not
   1411 	 */
   1412 	kstat_named_init(&nxgekp->trunk_mode, "trunk_mode",
   1413 	    KSTAT_DATA_ULONG);
   1414 
   1415 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
   1416 	kstat_named_init(&nxgekp->mdt_reqs, "mdt_reqs",
   1417 	    KSTAT_DATA_ULONG);
   1418 	kstat_named_init(&nxgekp->mdt_hdr_bufs, "mdt_hdr_bufs",
   1419 	    KSTAT_DATA_ULONG);
   1420 	kstat_named_init(&nxgekp->mdt_pld_bufs, "mdt_pld_bufs",
   1421 	    KSTAT_DATA_ULONG);
   1422 	kstat_named_init(&nxgekp->mdt_pkts, "mdt_pkts",
   1423 	    KSTAT_DATA_ULONG);
   1424 	kstat_named_init(&nxgekp->mdt_hdrs, "mdt_hdrs",
   1425 	    KSTAT_DATA_ULONG);
   1426 	kstat_named_init(&nxgekp->mdt_plds, "mdt_plds",
   1427 	    KSTAT_DATA_ULONG);
   1428 	kstat_named_init(&nxgekp->mdt_hdr_bind_fail, "mdt_hdr_bind_fail",
   1429 	    KSTAT_DATA_ULONG);
   1430 	kstat_named_init(&nxgekp->mdt_pld_bind_fail, "mdt_pld_bind_fail",
   1431 	    KSTAT_DATA_ULONG);
   1432 #endif
   1433 #ifdef ACCEPT_JUMBO
   1434 	kstat_named_init(&nxgekp->tx_jumbo_pkts, "tx_jumbo_pkts",
   1435 	    KSTAT_DATA_ULONG);
   1436 #endif
   1437 
   1438 	/*
   1439 	 * Rx Statistics.
   1440 	 */
   1441 #ifdef ACCEPT_JUMBO
   1442 	kstat_named_init(&nxgekp->rx_jumbo_pkts, "rx_jumbo_pkts",
   1443 	    KSTAT_DATA_ULONG);
   1444 #endif
   1445 	/* General MAC statistics */
   1446 	kstat_named_init(&nxgekp->ifspeed, "ifspeed",
   1447 	    KSTAT_DATA_UINT64);
   1448 	kstat_named_init(&nxgekp->promisc, "promisc",
   1449 	    KSTAT_DATA_CHAR);
   1450 	kstat_named_init(&nxgekp->rev_id, "rev_id",
   1451 	    KSTAT_DATA_ULONG);
   1452 
   1453 	ksp->ks_update = nxge_port_kstat_update;
   1454 	ksp->ks_private = (void *) nxgep;
   1455 	if (nxgep->mac.porttype == PORT_TYPE_XMAC)
   1456 		nxge_xmac_init_kstats(ksp);
   1457 	else
   1458 		nxge_bmac_init_kstats(ksp);
   1459 	kstat_install(ksp);
   1460 	nxgep->statsp->port_ksp = ksp;
   1461 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
   1462 }
   1463 
   1464 /* ARGSUSED */
   1465 void
   1466 nxge_xmac_init_kstats(struct kstat *ksp)
   1467 {
   1468 	p_nxge_xmac_kstat_t nxgekp;
   1469 
   1470 	nxgekp = (p_nxge_xmac_kstat_t)ksp->ks_data;
   1471 
   1472 	/*
   1473 	 * Transmit MAC statistics.
   1474 	 */
   1475 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
   1476 	    KSTAT_DATA_ULONG);
   1477 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
   1478 	    KSTAT_DATA_ULONG);
   1479 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
   1480 	    KSTAT_DATA_ULONG);
   1481 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
   1482 	    KSTAT_DATA_ULONG);
   1483 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
   1484 	    KSTAT_DATA_ULONG);
   1485 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
   1486 	    KSTAT_DATA_ULONG);
   1487 
   1488 	/* Receive MAC statistics */
   1489 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
   1490 	    KSTAT_DATA_ULONG);
   1491 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
   1492 	    KSTAT_DATA_ULONG);
   1493 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
   1494 	    KSTAT_DATA_ULONG);
   1495 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
   1496 	    KSTAT_DATA_ULONG);
   1497 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
   1498 	    KSTAT_DATA_ULONG);
   1499 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
   1500 	    KSTAT_DATA_ULONG);
   1501 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
   1502 	    KSTAT_DATA_ULONG);
   1503 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
   1504 	    "rxmac_alignment_err",
   1505 	    KSTAT_DATA_ULONG);
   1506 	kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
   1507 	    KSTAT_DATA_ULONG);
   1508 	kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
   1509 	    KSTAT_DATA_ULONG);
   1510 	kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
   1511 	    KSTAT_DATA_ULONG);
   1512 	kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
   1513 	    KSTAT_DATA_ULONG);
   1514 	kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
   1515 	    KSTAT_DATA_ULONG);
   1516 	kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
   1517 	    KSTAT_DATA_ULONG);
   1518 	kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
   1519 	    KSTAT_DATA_ULONG);
   1520 	kstat_named_init(&nxgekp->rx_broadcast_cnt, "rxmac_broadcast_cnt",
   1521 	    KSTAT_DATA_ULONG);
   1522 	kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
   1523 	    KSTAT_DATA_ULONG);
   1524 	kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
   1525 	    KSTAT_DATA_ULONG);
   1526 	kstat_named_init(&nxgekp->rx_linkfault_err_cnt, "rxmac_linkfault_errs",
   1527 	    KSTAT_DATA_ULONG);
   1528 	kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
   1529 	    "rxmac_remote_faults",
   1530 	    KSTAT_DATA_ULONG);
   1531 	kstat_named_init(&nxgekp->rx_local_fault_err_cnt, "rxmac_local_faults",
   1532 	    KSTAT_DATA_ULONG);
   1533 
   1534 	/* XPCS statistics */
   1535 
   1536 	kstat_named_init(&nxgekp->xpcs_deskew_err_cnt, "xpcs_deskew_err_cnt",
   1537 	    KSTAT_DATA_ULONG);
   1538 #ifdef	NXGE_DEBUG_SYMBOL_ERR
   1539 	kstat_named_init(&nxgekp->xpcs_ln0_symbol_err_cnt,
   1540 	    "xpcs_ln0_symbol_err_cnt",
   1541 	    KSTAT_DATA_ULONG);
   1542 	kstat_named_init(&nxgekp->xpcs_ln1_symbol_err_cnt,
   1543 	    "xpcs_ln1_symbol_err_cnt",
   1544 	    KSTAT_DATA_ULONG);
   1545 	kstat_named_init(&nxgekp->xpcs_ln2_symbol_err_cnt,
   1546 	    "xpcs_ln2_symbol_err_cnt",
   1547 	    KSTAT_DATA_ULONG);
   1548 	kstat_named_init(&nxgekp->xpcs_ln3_symbol_err_cnt,
   1549 	    "xpcs_ln3_symbol_err_cnt",
   1550 	    KSTAT_DATA_ULONG);
   1551 #endif
   1552 }
   1553 
   1554 /* ARGSUSED */
   1555 void
   1556 nxge_bmac_init_kstats(struct kstat *ksp)
   1557 {
   1558 	p_nxge_bmac_kstat_t nxgekp;
   1559 
   1560 	nxgekp = (p_nxge_bmac_kstat_t)ksp->ks_data;
   1561 
   1562 	/*
   1563 	 * Transmit MAC statistics.
   1564 	 */
   1565 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
   1566 	    KSTAT_DATA_ULONG);
   1567 	kstat_named_init(&nxgekp->tx_underrun_err, "txmac_underflow_err",
   1568 	    KSTAT_DATA_ULONG);
   1569 	kstat_named_init(&nxgekp->tx_max_pkt_err, "txmac_maxpktsize_err",
   1570 	    KSTAT_DATA_ULONG);
   1571 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
   1572 	    KSTAT_DATA_ULONG);
   1573 
   1574 	/* Receive MAC statistics */
   1575 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
   1576 	    KSTAT_DATA_ULONG);
   1577 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
   1578 	    KSTAT_DATA_ULONG);
   1579 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
   1580 	    KSTAT_DATA_ULONG);
   1581 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
   1582 	    KSTAT_DATA_ULONG);
   1583 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
   1584 	    KSTAT_DATA_ULONG);
   1585 	kstat_named_init(&nxgekp->rx_align_err_cnt, "rxmac_alignment_err",
   1586 	    KSTAT_DATA_ULONG);
   1587 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
   1588 	    KSTAT_DATA_ULONG);
   1589 }
   1590 
   1591 /* ARGSUSED */
   1592 void
   1593 nxge_mac_init_kstats(p_nxge_t nxgep, struct kstat *ksp)
   1594 {
   1595 	p_nxge_mac_kstat_t nxgekp;
   1596 
   1597 	nxgekp = (p_nxge_mac_kstat_t)ksp->ks_data;
   1598 
   1599 	/*
   1600 	 * Transmit MAC statistics.
   1601 	 */
   1602 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
   1603 	    KSTAT_DATA_ULONG);
   1604 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
   1605 	    KSTAT_DATA_ULONG);
   1606 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
   1607 	    KSTAT_DATA_ULONG);
   1608 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
   1609 	    KSTAT_DATA_ULONG);
   1610 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
   1611 	    KSTAT_DATA_ULONG);
   1612 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
   1613 	    KSTAT_DATA_ULONG);
   1614 
   1615 	/*
   1616 	 * Receive MAC statistics
   1617 	 */
   1618 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
   1619 	    KSTAT_DATA_ULONG);
   1620 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
   1621 	    KSTAT_DATA_ULONG);
   1622 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
   1623 	    KSTAT_DATA_ULONG);
   1624 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
   1625 	    KSTAT_DATA_ULONG);
   1626 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
   1627 	    KSTAT_DATA_ULONG);
   1628 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
   1629 	    KSTAT_DATA_ULONG);
   1630 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
   1631 	    "rxmac_alignment_err",
   1632 	    KSTAT_DATA_ULONG);
   1633 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
   1634 	    KSTAT_DATA_ULONG);
   1635 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   1636 		kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
   1637 		    KSTAT_DATA_ULONG);
   1638 		kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
   1639 		    KSTAT_DATA_ULONG);
   1640 		kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
   1641 		    KSTAT_DATA_ULONG);
   1642 		kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
   1643 		    KSTAT_DATA_ULONG);
   1644 		kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
   1645 		    KSTAT_DATA_ULONG);
   1646 		kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
   1647 		    KSTAT_DATA_ULONG);
   1648 		kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
   1649 		    KSTAT_DATA_ULONG);
   1650 		kstat_named_init(&nxgekp->rx_broadcast_cnt,
   1651 		    "rxmac_broadcast_cnt",
   1652 		    KSTAT_DATA_ULONG);
   1653 		kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
   1654 		    KSTAT_DATA_ULONG);
   1655 		kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
   1656 		    KSTAT_DATA_ULONG);
   1657 		kstat_named_init(&nxgekp->rx_linkfault_err_cnt,
   1658 		    "rxmac_linkfault_errs",
   1659 		    KSTAT_DATA_ULONG);
   1660 		kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
   1661 		    "rxmac_remote_faults",
   1662 		    KSTAT_DATA_ULONG);
   1663 		kstat_named_init(&nxgekp->rx_local_fault_err_cnt,
   1664 		    "rxmac_local_faults",
   1665 		    KSTAT_DATA_ULONG);
   1666 	}
   1667 }
   1668 
   1669 /* ARGSUSED */
   1670 void
   1671 nxge_destroy_kstats(p_nxge_t nxgep)
   1672 {
   1673 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_destroy_kstats"));
   1674 
   1675 	if (nxgep->statsp == NULL)
   1676 		return;
   1677 	if (nxgep->statsp->ksp)
   1678 		kstat_delete(nxgep->statsp->ksp);
   1679 
   1680 	if (nxgep->statsp->rdc_sys_ksp)
   1681 		kstat_delete(nxgep->statsp->rdc_sys_ksp);
   1682 	if (nxgep->statsp->fflp_ksp[0])
   1683 		kstat_delete(nxgep->statsp->fflp_ksp[0]);
   1684 	if (nxgep->statsp->ipp_ksp)
   1685 		kstat_delete(nxgep->statsp->ipp_ksp);
   1686 	if (nxgep->statsp->txc_ksp)
   1687 		kstat_delete(nxgep->statsp->txc_ksp);
   1688 	if (nxgep->statsp->mac_ksp)
   1689 		kstat_delete(nxgep->statsp->mac_ksp);
   1690 	if (nxgep->statsp->zcp_ksp)
   1691 		kstat_delete(nxgep->statsp->zcp_ksp);
   1692 	if (nxgep->statsp->port_ksp)
   1693 		kstat_delete(nxgep->statsp->port_ksp);
   1694 	if (nxgep->statsp->mmac_ksp)
   1695 		kstat_delete(nxgep->statsp->mmac_ksp);
   1696 	if (nxgep->statsp)
   1697 		KMEM_FREE(nxgep->statsp, nxgep->statsp->stats_size);
   1698 
   1699 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_destroy_kstats"));
   1700 }
   1701 
   1702 /* ARGSUSED */
   1703 int
   1704 nxge_port_kstat_update(kstat_t *ksp, int rw)
   1705 {
   1706 	p_nxge_t nxgep;
   1707 	p_nxge_stats_t statsp;
   1708 	p_nxge_port_kstat_t nxgekp;
   1709 
   1710 	nxgep = (p_nxge_t)ksp->ks_private;
   1711 	if (nxgep == NULL)
   1712 		return (-1);
   1713 
   1714 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_port_kstat_update"));
   1715 	statsp = (p_nxge_stats_t)nxgep->statsp;
   1716 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
   1717 	nxge_save_cntrs(nxgep);
   1718 
   1719 	if (rw == KSTAT_WRITE) {
   1720 		/*
   1721 		 * transceiver state informations.
   1722 		 */
   1723 		statsp->mac_stats.xcvr_inits = nxgekp->xcvr_inits.value.ul;
   1724 
   1725 		/*
   1726 		 * Tx Statistics.
   1727 		 */
   1728 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
   1729 		statsp->port_stats.mdt_reqs = nxgekp->mdt_reqs.value.ul;
   1730 		statsp->port_stats.mdt_hdr_bufs = nxgekp->mdt_hdr_bufs.value.ul;
   1731 		statsp->port_stats.mdt_pld_bufs = nxgekp->mdt_pld_bufs.value.ul;
   1732 		statsp->port_stats.mdt_pkts = nxgekp->mdt_pkts.value.ul;
   1733 		statsp->port_stats.mdt_hdrs = nxgekp->mdt_hdrs.value.ul;
   1734 		statsp->port_stats.mdt_plds = nxgekp->mdt_plds.value.ul;
   1735 		statsp->port_stats.mdt_hdr_bind_fail =
   1736 		    nxgekp->mdt_hdr_bind_fail.value.ul;
   1737 		statsp->port_stats.mdt_pld_bind_fail =
   1738 		    nxgekp->mdt_pld_bind_fail.value.ul;
   1739 #endif
   1740 #ifdef ACCEPT_JUMBO
   1741 		statsp->port_stats.tx_jumbo_pkts =
   1742 		    nxgekp->tx_jumbo_pkts.value.ul;
   1743 #endif
   1744 		/*
   1745 		 * Rx Statistics.
   1746 		 */
   1747 #ifdef ACCEPT_JUMBO
   1748 		statsp->port_stats.rx_jumbo_pkts =
   1749 		    nxgekp->rx_jumbo_pkts.value.ul;
   1750 #endif
   1751 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   1752 			(void) nxge_xmac_stat_update(ksp, KSTAT_WRITE);
   1753 		} else {
   1754 			(void) nxge_bmac_stat_update(ksp, KSTAT_WRITE);
   1755 		}
   1756 		return (0);
   1757 	} else {
   1758 		if (nxgep->filter.all_phys_cnt)
   1759 			(void) strcpy(nxgekp->promisc.value.c, "phys");
   1760 		else if (nxgep->filter.all_multicast_cnt)
   1761 			(void) strcpy(nxgekp->promisc.value.c, "multi");
   1762 		else
   1763 			(void) strcpy(nxgekp->promisc.value.c, "off");
   1764 		nxgekp->ifspeed.value.ul =
   1765 		    statsp->mac_stats.link_speed * 1000000ULL;
   1766 		nxgekp->rev_id.value.ul = statsp->mac_stats.rev_id;
   1767 
   1768 		/*
   1769 		 * transceiver state informations.
   1770 		 */
   1771 		nxgekp->xcvr_inits.value.ul = statsp->mac_stats.xcvr_inits;
   1772 		nxgekp->xcvr_inuse.value.ul = statsp->mac_stats.xcvr_inuse;
   1773 		nxgekp->xcvr_addr.value.ul = statsp->mac_stats.xcvr_portn;
   1774 		nxgekp->xcvr_id.value.ul = statsp->mac_stats.xcvr_id;
   1775 		nxgekp->cap_autoneg.value.ul = statsp->mac_stats.cap_autoneg;
   1776 		nxgekp->cap_10gfdx.value.ul = statsp->mac_stats.cap_10gfdx;
   1777 		nxgekp->cap_10ghdx.value.ul = statsp->mac_stats.cap_10ghdx;
   1778 		nxgekp->cap_1000fdx.value.ul = statsp->mac_stats.cap_1000fdx;
   1779 		nxgekp->cap_1000hdx.value.ul = statsp->mac_stats.cap_1000hdx;
   1780 		nxgekp->cap_100T4.value.ul = statsp->mac_stats.cap_100T4;
   1781 		nxgekp->cap_100fdx.value.ul = statsp->mac_stats.cap_100fdx;
   1782 		nxgekp->cap_100hdx.value.ul = statsp->mac_stats.cap_100hdx;
   1783 		nxgekp->cap_10fdx.value.ul = statsp->mac_stats.cap_10fdx;
   1784 		nxgekp->cap_10hdx.value.ul = statsp->mac_stats.cap_10hdx;
   1785 		nxgekp->cap_asmpause.value.ul =
   1786 		    statsp->mac_stats.cap_asmpause;
   1787 		nxgekp->cap_pause.value.ul = statsp->mac_stats.cap_pause;
   1788 
   1789 		/*
   1790 		 * Link partner capabilities.
   1791 		 */
   1792 		nxgekp->lp_cap_autoneg.value.ul =
   1793 		    statsp->mac_stats.lp_cap_autoneg;
   1794 		nxgekp->lp_cap_10gfdx.value.ul =
   1795 		    statsp->mac_stats.lp_cap_10gfdx;
   1796 		nxgekp->lp_cap_10ghdx.value.ul =
   1797 		    statsp->mac_stats.lp_cap_10ghdx;
   1798 		nxgekp->lp_cap_1000fdx.value.ul =
   1799 		    statsp->mac_stats.lp_cap_1000fdx;
   1800 		nxgekp->lp_cap_1000hdx.value.ul =
   1801 		    statsp->mac_stats.lp_cap_1000hdx;
   1802 		nxgekp->lp_cap_100T4.value.ul =
   1803 		    statsp->mac_stats.lp_cap_100T4;
   1804 		nxgekp->lp_cap_100fdx.value.ul =
   1805 		    statsp->mac_stats.lp_cap_100fdx;
   1806 		nxgekp->lp_cap_100hdx.value.ul =
   1807 		    statsp->mac_stats.lp_cap_100hdx;
   1808 		nxgekp->lp_cap_10fdx.value.ul =
   1809 		    statsp->mac_stats.lp_cap_10fdx;
   1810 		nxgekp->lp_cap_10hdx.value.ul =
   1811 		    statsp->mac_stats.lp_cap_10hdx;
   1812 		nxgekp->lp_cap_asmpause.value.ul =
   1813 		    statsp->mac_stats.lp_cap_asmpause;
   1814 		nxgekp->lp_cap_pause.value.ul =
   1815 		    statsp->mac_stats.lp_cap_pause;
   1816 
   1817 		/*
   1818 		 * Physical link statistics.
   1819 		 */
   1820 		nxgekp->link_T4.value.ul = statsp->mac_stats.link_T4;
   1821 		nxgekp->link_speed.value.ul = statsp->mac_stats.link_speed;
   1822 		if (statsp->mac_stats.link_duplex == 2)
   1823 			(void) strcpy(nxgekp->link_duplex.value.c, "full");
   1824 		else if (statsp->mac_stats.link_duplex == 1)
   1825 			(void) strcpy(nxgekp->link_duplex.value.c, "half");
   1826 		else
   1827 			(void) strcpy(nxgekp->link_duplex.value.c, "unknown");
   1828 		nxgekp->link_asmpause.value.ul =
   1829 		    statsp->mac_stats.link_asmpause;
   1830 		nxgekp->link_pause.value.ul = statsp->mac_stats.link_pause;
   1831 		nxgekp->link_up.value.ul = statsp->mac_stats.link_up;
   1832 
   1833 		/*
   1834 		 * Lets the user know the MTU currently in use by the physical
   1835 		 * MAC port.
   1836 		 */
   1837 		nxgekp->mac_mtu.value.ul = statsp->mac_stats.mac_mtu;
   1838 
   1839 		/*
   1840 		 * Loopback statistics.
   1841 		 */
   1842 		nxgekp->lb_mode.value.ul = statsp->port_stats.lb_mode;
   1843 
   1844 		/*
   1845 		 * This tells the user whether the driver is in QOS mode or
   1846 		 * not.
   1847 		 */
   1848 		nxgekp->qos_mode.value.ul = statsp->port_stats.qos_mode;
   1849 
   1850 		/*
   1851 		 * This tells whether the instance is trunked or not
   1852 		 */
   1853 		nxgekp->trunk_mode.value.ul = statsp->port_stats.trunk_mode;
   1854 
   1855 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
   1856 		nxgekp->mdt_reqs.value.ul = statsp->port_stats.mdt_reqs;
   1857 		nxgekp->mdt_hdr_bufs.value.ul =
   1858 		    statsp->port_stats.mdt_hdr_bufs;
   1859 		nxgekp->mdt_pld_bufs.value.ul =
   1860 		    statsp->port_stats.mdt_pld_bufs;
   1861 		nxgekp->mdt_pkts.value.ul = statsp->port_stats.mdt_pkts;
   1862 		nxgekp->mdt_hdrs.value.ul = statsp->port_stats.mdt_hdrs;
   1863 		nxgekp->mdt_plds.value.ul = statsp->port_stats.mdt_plds;
   1864 		nxgekp->mdt_hdr_bind_fail.value.ul =
   1865 		    statsp->port_stats.mdt_hdr_bind_fail;
   1866 		nxgekp->mdt_pld_bind_fail.value.ul =
   1867 		    statsp->port_stats.mdt_pld_bind_fail;
   1868 #endif
   1869 #ifdef ACCEPT_JUMBO
   1870 		nxgekp->tx_jumbo_pkts.value.ul =
   1871 		    statsp->port_stats.tx_jumbo_pkts;
   1872 #endif
   1873 #ifdef TX_MBLK_DEST
   1874 		nxgekp->tx_1_desc.value.ul = statsp->port_stats.tx_1_desc;
   1875 		nxgekp->tx_2_desc.value.ul = statsp->port_stats.tx_2_desc;
   1876 		nxgekp->tx_3_desc.value.ul = statsp->port_stats.tx_3_desc;
   1877 		nxgekp->tx_4_desc.value.ul = statsp->port_stats.tx_4_desc;
   1878 		nxgekp->tx_5_desc.value.ul = statsp->port_stats.tx_5_desc;
   1879 		nxgekp->tx_6_desc.value.ul = statsp->port_stats.tx_6_desc;
   1880 		nxgekp->tx_7_desc.value.ul = statsp->port_stats.tx_7_desc;
   1881 		nxgekp->tx_8_desc.value.ul = statsp->port_stats.tx_8_desc;
   1882 		nxgekp->tx_max_desc.value.ul =
   1883 		    statsp->port_stats.tx_max_desc;
   1884 #endif
   1885 		/*
   1886 		 * Rx Statistics.
   1887 		 */
   1888 #ifdef ACCEPT_JUMBO
   1889 		nxgekp->rx_jumbo_pkts.value.ul =
   1890 		    statsp->port_stats.rx_jumbo_pkts;
   1891 #endif
   1892 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   1893 			(void) nxge_xmac_stat_update(ksp, KSTAT_READ);
   1894 		} else {
   1895 			(void) nxge_bmac_stat_update(ksp, KSTAT_READ);
   1896 		}
   1897 	}
   1898 
   1899 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_port_kstat_update"));
   1900 	return (0);
   1901 }
   1902 
   1903 /*
   1904  * if this is the first init do not bother to save the
   1905  * counters.
   1906  */
   1907 /* ARGSUSED */
   1908 void
   1909 nxge_save_cntrs(p_nxge_t nxgep)
   1910 {
   1911 	p_nxge_stats_t statsp;
   1912 	uint64_t val;
   1913 	npi_handle_t handle;
   1914 	uint8_t portn;
   1915 	uint8_t cnt8;
   1916 	uint16_t cnt16;
   1917 	uint32_t cnt32;
   1918 
   1919 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_save_cntrs"));
   1920 
   1921 	statsp = (p_nxge_stats_t)nxgep->statsp;
   1922 	handle = nxgep->npi_handle;
   1923 	portn = nxgep->mac.portnum;
   1924 
   1925 	MUTEX_ENTER(&nxgep->ouraddr_lock);
   1926 
   1927 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   1928 		/*
   1929 		 * Transmit MAC statistics.
   1930 		 */
   1931 		XMAC_REG_RD(handle, portn, XTXMAC_FRM_CNT_REG, &val);
   1932 		statsp->xmac_stats.tx_frame_cnt += (val & XTXMAC_FRM_CNT_MASK);
   1933 		XMAC_REG_RD(handle, portn, XTXMAC_BYTE_CNT_REG, &val);
   1934 		statsp->xmac_stats.tx_byte_cnt += (val & XTXMAC_BYTE_CNT_MASK);
   1935 		/*
   1936 		 * Receive XMAC statistics.
   1937 		 */
   1938 		XMAC_REG_RD(handle, portn, XRXMAC_CRC_ER_CNT_REG, &val);
   1939 		statsp->xmac_stats.rx_crc_err_cnt +=
   1940 		    (val & XRXMAC_CRC_ER_CNT_MASK);
   1941 
   1942 		XMAC_REG_RD(handle, portn, XRXMAC_MPSZER_CNT_REG, &val);
   1943 		statsp->xmac_stats.rx_len_err_cnt +=
   1944 		    (val & XRXMAC_MPSZER_CNT_MASK);
   1945 
   1946 		XMAC_REG_RD(handle, portn, XRXMAC_CD_VIO_CNT_REG, &val);
   1947 		statsp->xmac_stats.rx_viol_err_cnt +=
   1948 		    (val & XRXMAC_CD_VIO_CNT_MASK);
   1949 
   1950 		XMAC_REG_RD(handle, portn, XRXMAC_BT_CNT_REG, &val);
   1951 		statsp->xmac_stats.rx_byte_cnt += (val & XRXMAC_BT_CNT_MASK);
   1952 
   1953 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT1_REG, &val);
   1954 		statsp->xmac_stats.rx_hist1_cnt +=
   1955 		    (val & XRXMAC_HIST_CNT1_MASK);
   1956 		statsp->xmac_stats.rx_frame_cnt +=
   1957 		    (val & XRXMAC_HIST_CNT1_MASK);
   1958 
   1959 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT2_REG, &val);
   1960 		statsp->xmac_stats.rx_hist2_cnt +=
   1961 		    (val & XRXMAC_HIST_CNT2_MASK);
   1962 		statsp->xmac_stats.rx_frame_cnt +=
   1963 		    (val & XRXMAC_HIST_CNT2_MASK);
   1964 
   1965 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT3_REG, &val);
   1966 		statsp->xmac_stats.rx_hist3_cnt +=
   1967 		    (val & XRXMAC_HIST_CNT3_MASK);
   1968 		statsp->xmac_stats.rx_frame_cnt +=
   1969 		    (val & XRXMAC_HIST_CNT3_MASK);
   1970 
   1971 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT4_REG, &val);
   1972 		statsp->xmac_stats.rx_hist4_cnt +=
   1973 		    (val & XRXMAC_HIST_CNT4_MASK);
   1974 		statsp->xmac_stats.rx_frame_cnt +=
   1975 		    (val & XRXMAC_HIST_CNT4_MASK);
   1976 
   1977 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT5_REG, &val);
   1978 		statsp->xmac_stats.rx_hist5_cnt +=
   1979 		    (val & XRXMAC_HIST_CNT5_MASK);
   1980 		statsp->xmac_stats.rx_frame_cnt +=
   1981 		    (val & XRXMAC_HIST_CNT5_MASK);
   1982 
   1983 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT6_REG, &val);
   1984 		statsp->xmac_stats.rx_hist6_cnt +=
   1985 		    (val & XRXMAC_HIST_CNT6_MASK);
   1986 		statsp->xmac_stats.rx_frame_cnt +=
   1987 		    (val & XRXMAC_HIST_CNT6_MASK);
   1988 
   1989 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT7_REG, &val);
   1990 		statsp->xmac_stats.rx_hist7_cnt +=
   1991 		    (val & XRXMAC_HIST_CNT7_MASK);
   1992 		statsp->xmac_stats.rx_frame_cnt +=
   1993 		    (val & XRXMAC_HIST_CNT7_MASK);
   1994 
   1995 		XMAC_REG_RD(handle, portn, XRXMAC_BC_FRM_CNT_REG, &val);
   1996 		statsp->xmac_stats.rx_broadcast_cnt +=
   1997 		    (val & XRXMAC_BC_FRM_CNT_MASK);
   1998 
   1999 		XMAC_REG_RD(handle, portn, XRXMAC_MC_FRM_CNT_REG, &val);
   2000 		statsp->xmac_stats.rx_mult_cnt +=
   2001 		    (val & XRXMAC_MC_FRM_CNT_MASK);
   2002 
   2003 		XMAC_REG_RD(handle, portn, XRXMAC_FRAG_CNT_REG, &val);
   2004 		statsp->xmac_stats.rx_frag_cnt += (val & XRXMAC_FRAG_CNT_MASK);
   2005 
   2006 		XMAC_REG_RD(handle, portn, XRXMAC_AL_ER_CNT_REG, &val);
   2007 		statsp->xmac_stats.rx_frame_align_err_cnt +=
   2008 		    (val & XRXMAC_AL_ER_CNT_MASK);
   2009 
   2010 		XMAC_REG_RD(handle, portn, XMAC_LINK_FLT_CNT_REG, &val);
   2011 		statsp->xmac_stats.rx_linkfault_err_cnt +=
   2012 		    (val & XMAC_LINK_FLT_CNT_MASK);
   2013 
   2014 		(void) npi_xmac_xpcs_read(handle, portn,
   2015 		    XPCS_REG_DESCWERR_COUNTER, &cnt32);
   2016 		statsp->xmac_stats.xpcs_deskew_err_cnt +=
   2017 		    (val & XMAC_XPCS_DESKEW_ERR_CNT_MASK);
   2018 
   2019 #ifdef	NXGE_DEBUG_SYMBOL_ERR
   2020 		(void) npi_xmac_xpcs_read(handle, portn,
   2021 		    XPCS_REG_SYMBOL_ERR_L0_1_COUNTER, &cnt32);
   2022 		statsp->xmac_stats.xpcs_ln0_symbol_err_cnt +=
   2023 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L0_MASK);
   2024 		statsp->xmac_stats.xpcs_ln1_symbol_err_cnt +=
   2025 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L1_MASK) >>
   2026 		    XMAC_XPCS_SYM_ERR_CNT_L1_SHIFT);
   2027 		(void) npi_xmac_xpcs_read(handle, portn,
   2028 		    XPCS_REG_SYMBOL_ERR_L2_3_COUNTER, &cnt32);
   2029 		statsp->xmac_stats.xpcs_ln2_symbol_err_cnt +=
   2030 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L2_MASK);
   2031 		statsp->xmac_stats.xpcs_ln3_symbol_err_cnt +=
   2032 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L3_MASK) >>
   2033 		    XMAC_XPCS_SYM_ERR_CNT_L3_SHIFT);
   2034 #endif
   2035 	} else if (nxgep->mac.porttype == PORT_TYPE_BMAC) {
   2036 		/*
   2037 		 * Transmit MAC statistics.
   2038 		 */
   2039 		BMAC_REG_RD(handle, portn, BTXMAC_FRM_CNT_REG, &val);
   2040 		statsp->bmac_stats.tx_frame_cnt += (val & BTXMAC_FRM_CNT_MASK);
   2041 		/* Clear register as it is not auto clear on read */
   2042 		BMAC_REG_WR(handle, portn, BTXMAC_FRM_CNT_REG, 0);
   2043 
   2044 		BMAC_REG_RD(handle, portn, BTXMAC_BYTE_CNT_REG, &val);
   2045 		statsp->bmac_stats.tx_byte_cnt += (val & BTXMAC_BYTE_CNT_MASK);
   2046 		/* Clear register as it is not auto clear on read */
   2047 		BMAC_REG_WR(handle, portn, BTXMAC_BYTE_CNT_REG, 0);
   2048 
   2049 		/*
   2050 		 * Receive MAC statistics.
   2051 		 */
   2052 		BMAC_REG_RD(handle, portn, RXMAC_FRM_CNT_REG, &val);
   2053 		statsp->bmac_stats.rx_frame_cnt += (val & RXMAC_FRM_CNT_MASK);
   2054 		/* Clear register as it is not auto clear on read */
   2055 		BMAC_REG_WR(handle, portn, RXMAC_FRM_CNT_REG, 0);
   2056 
   2057 		BMAC_REG_RD(handle, portn, BRXMAC_BYTE_CNT_REG, &val);
   2058 		statsp->bmac_stats.rx_byte_cnt += (val & BRXMAC_BYTE_CNT_MASK);
   2059 		/* Clear register as it is not auto clear on read */
   2060 		BMAC_REG_WR(handle, portn, BRXMAC_BYTE_CNT_REG, 0);
   2061 
   2062 		BMAC_REG_RD(handle, portn, BMAC_AL_ER_CNT_REG, &val);
   2063 		statsp->bmac_stats.rx_align_err_cnt +=
   2064 		    (val & BMAC_AL_ER_CNT_MASK);
   2065 		/* Clear register as it is not auto clear on read */
   2066 		BMAC_REG_WR(handle, portn, BMAC_AL_ER_CNT_REG, 0);
   2067 
   2068 		BMAC_REG_RD(handle, portn, MAC_LEN_ER_CNT_REG, &val);
   2069 		statsp->bmac_stats.rx_len_err_cnt +=
   2070 		    (val & MAC_LEN_ER_CNT_MASK);
   2071 		/* Clear register as it is not auto clear on read */
   2072 		BMAC_REG_WR(handle, portn, MAC_LEN_ER_CNT_REG, 0);
   2073 
   2074 		BMAC_REG_RD(handle, portn, BMAC_CRC_ER_CNT_REG, &val);
   2075 		statsp->bmac_stats.rx_crc_err_cnt +=
   2076 		    (val & BMAC_CRC_ER_CNT_MASK);
   2077 		/* Clear register as it is not auto clear on read */
   2078 		BMAC_REG_WR(handle, portn, BMAC_CRC_ER_CNT_REG, 0);
   2079 
   2080 		BMAC_REG_RD(handle, portn, BMAC_CD_VIO_CNT_REG, &val);
   2081 		statsp->bmac_stats.rx_viol_err_cnt +=
   2082 		    (val & BMAC_CD_VIO_CNT_MASK);
   2083 		/* Clear register as it is not auto clear on read */
   2084 		BMAC_REG_WR(handle, portn, BMAC_CD_VIO_CNT_REG, 0);
   2085 	}
   2086 	if (isLDOMguest(nxgep)) {
   2087 		MUTEX_EXIT(&nxgep->ouraddr_lock);
   2088 		goto nxge_save_cntrs_exit;
   2089 	}
   2090 	/* Update IPP counters */
   2091 	(void) npi_ipp_get_ecc_err_count(handle, portn, &cnt8);
   2092 	statsp->ipp_stats.ecc_err_cnt += cnt8;
   2093 	(void) npi_ipp_get_pkt_dis_count(handle, portn, &cnt16);
   2094 	statsp->ipp_stats.pkt_dis_cnt += cnt16;
   2095 	(void) npi_ipp_get_cs_err_count(handle, portn, &cnt16);
   2096 	statsp->ipp_stats.bad_cs_cnt += cnt16;
   2097 
   2098 	MUTEX_EXIT(&nxgep->ouraddr_lock);
   2099 
   2100 nxge_save_cntrs_exit:
   2101 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_save_cntrs"));
   2102 }
   2103 
   2104 uint64_t
   2105 nxge_m_rx_stat(
   2106 	nxge_t *nxgep,
   2107 	uint_t stat)
   2108 {
   2109 	p_nxge_stats_t statsp;
   2110 	nxge_grp_set_t *rx_set;
   2111 	int8_t set[NXGE_MAX_RDCS];
   2112 	int i, cursor;
   2113 
   2114 	uint64_t val = 0;
   2115 
   2116 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_rx_stat"));
   2117 	statsp = (p_nxge_stats_t)nxgep->statsp;
   2118 
   2119 	rx_set = &nxgep->rx_set;
   2120 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
   2121 		if ((1 << i) & rx_set->owned.map) {
   2122 			set[cursor++] = (uint8_t)i;
   2123 		}
   2124 	}
   2125 
   2126 	for (i = 0; i < cursor; i++) {
   2127 		int rdc = set[i];
   2128 		switch (stat) {
   2129 		case MAC_STAT_IERRORS:
   2130 		case ETHER_STAT_MACRCV_ERRORS:
   2131 			val += statsp->rdc_stats[rdc].ierrors;
   2132 			break;
   2133 
   2134 		case MAC_STAT_RBYTES:
   2135 			val += statsp->rdc_stats[rdc].ibytes;
   2136 			break;
   2137 
   2138 		case MAC_STAT_IPACKETS:
   2139 			val += statsp->rdc_stats[rdc].ipackets;
   2140 			break;
   2141 
   2142 		default:
   2143 			break;
   2144 		}
   2145 	}
   2146 
   2147 	return (val);
   2148 }
   2149 
   2150 uint64_t
   2151 nxge_m_tx_stat(
   2152 	nxge_t *nxgep,
   2153 	uint_t stat)
   2154 {
   2155 	p_nxge_stats_t statsp;
   2156 	nxge_grp_set_t *tx_set;
   2157 	int8_t set[NXGE_MAX_TDCS];
   2158 	int i, cursor;
   2159 
   2160 	uint64_t val = 0;
   2161 
   2162 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_tx_stat"));
   2163 	statsp = (p_nxge_stats_t)nxgep->statsp;
   2164 
   2165 	tx_set = &nxgep->tx_set;
   2166 	for (i = 0, cursor = 0; i < NXGE_MAX_TDCS; i++) {
   2167 		if ((1 << i) & tx_set->owned.map) {
   2168 			set[cursor++] = (uint8_t)i;
   2169 		}
   2170 	}
   2171 
   2172 	for (i = 0; i < cursor; i++) {
   2173 		int tdc = set[i];
   2174 		switch (stat) {
   2175 		case MAC_STAT_OERRORS:
   2176 			val += statsp->tdc_stats[tdc].oerrors;
   2177 			break;
   2178 
   2179 		case MAC_STAT_OBYTES:
   2180 			val += statsp->tdc_stats[tdc].obytes;
   2181 			break;
   2182 
   2183 		case MAC_STAT_OPACKETS:
   2184 			val += statsp->tdc_stats[tdc].opackets;
   2185 			break;
   2186 
   2187 		default:
   2188 			break;
   2189 		}
   2190 	}
   2191 
   2192 	return (val);
   2193 }
   2194 
   2195 /* ARGSUSED */
   2196 int
   2197 nxge_m_stat(void *arg, uint_t stat, uint64_t *value)
   2198 {
   2199 	p_nxge_t nxgep = (p_nxge_t)arg;
   2200 	p_nxge_stats_t statsp;
   2201 	uint64_t val = 0;
   2202 
   2203 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_stat"));
   2204 	statsp = (p_nxge_stats_t)nxgep->statsp;
   2205 
   2206 	switch (stat) {
   2207 	case MAC_STAT_IFSPEED:
   2208 		val = statsp->mac_stats.link_speed * 1000000ull;
   2209 		break;
   2210 
   2211 	case MAC_STAT_MULTIRCV:
   2212 		val = statsp->port_stats.multircv;
   2213 		break;
   2214 
   2215 	case MAC_STAT_BRDCSTRCV:
   2216 		val = statsp->port_stats.brdcstrcv;
   2217 		break;
   2218 
   2219 	case MAC_STAT_MULTIXMT:
   2220 		val = statsp->port_stats.multixmt;
   2221 		break;
   2222 
   2223 	case MAC_STAT_BRDCSTXMT:
   2224 		val = statsp->port_stats.brdcstxmt;
   2225 		break;
   2226 
   2227 	case MAC_STAT_NORCVBUF:
   2228 		val = statsp->port_stats.norcvbuf;
   2229 		break;
   2230 
   2231 	case MAC_STAT_IERRORS:
   2232 	case ETHER_STAT_MACRCV_ERRORS:
   2233 		val = nxge_m_rx_stat(nxgep, stat);
   2234 		break;
   2235 
   2236 	case MAC_STAT_OERRORS:
   2237 		val = nxge_m_tx_stat(nxgep, stat);
   2238 		break;
   2239 
   2240 	case MAC_STAT_NOXMTBUF:
   2241 		val = statsp->port_stats.noxmtbuf;
   2242 		break;
   2243 
   2244 	case MAC_STAT_COLLISIONS:
   2245 		val = 0;
   2246 		break;
   2247 
   2248 	case MAC_STAT_RBYTES:
   2249 		val = nxge_m_rx_stat(nxgep, stat);
   2250 		break;
   2251 
   2252 	case MAC_STAT_IPACKETS:
   2253 		val = nxge_m_rx_stat(nxgep, stat);
   2254 		break;
   2255 
   2256 	case MAC_STAT_OBYTES:
   2257 		val = nxge_m_tx_stat(nxgep, stat);
   2258 		break;
   2259 
   2260 	case MAC_STAT_OPACKETS:
   2261 		val = nxge_m_tx_stat(nxgep, stat);
   2262 		break;
   2263 	case MAC_STAT_LINK_STATE:
   2264 		val = statsp->mac_stats.link_duplex;
   2265 		break;
   2266 	case MAC_STAT_LINK_UP:
   2267 		val = statsp->mac_stats.link_up;
   2268 		break;
   2269 	case MAC_STAT_PROMISC:
   2270 		val = statsp->mac_stats.promisc;
   2271 		break;
   2272 	case ETHER_STAT_SQE_ERRORS:
   2273 		val = 0;
   2274 		break;
   2275 
   2276 	case ETHER_STAT_ALIGN_ERRORS:
   2277 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
   2278 			val = statsp->xmac_stats.rx_frame_align_err_cnt;
   2279 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
   2280 			val = statsp->bmac_stats.rx_align_err_cnt;
   2281 		else
   2282 			val = 0;
   2283 		break;
   2284 
   2285 	case ETHER_STAT_FCS_ERRORS:
   2286 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
   2287 			val = statsp->xmac_stats.rx_crc_err_cnt;
   2288 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
   2289 			val = statsp->bmac_stats.rx_crc_err_cnt;
   2290 		else
   2291 			val = 0;
   2292 		break;
   2293 
   2294 	case ETHER_STAT_FIRST_COLLISIONS:
   2295 		val = 0;
   2296 		break;
   2297 
   2298 	case ETHER_STAT_MULTI_COLLISIONS:
   2299 		val = 0;
   2300 		break;
   2301 
   2302 	case ETHER_STAT_TX_LATE_COLLISIONS:
   2303 		val = 0;
   2304 		break;
   2305 
   2306 	case ETHER_STAT_EX_COLLISIONS:
   2307 		val = 0;
   2308 		break;
   2309 
   2310 	case ETHER_STAT_DEFER_XMTS:
   2311 		val = 0;
   2312 		break;
   2313 
   2314 	case ETHER_STAT_MACXMT_ERRORS:
   2315 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   2316 			val = statsp->xmac_stats.tx_underflow_err +
   2317 			    statsp->xmac_stats.tx_maxpktsize_err +
   2318 			    statsp->xmac_stats.tx_overflow_err +
   2319 			    statsp->xmac_stats.tx_fifo_xfr_err;
   2320 		} else {
   2321 			val = statsp->bmac_stats.tx_underrun_err +
   2322 			    statsp->bmac_stats.tx_max_pkt_err;
   2323 		}
   2324 		break;
   2325 
   2326 	case ETHER_STAT_CARRIER_ERRORS:
   2327 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   2328 			val = statsp->xmac_stats.rx_linkfault_err_cnt;
   2329 		} else {
   2330 			val = statsp->mac_stats.xcvr_inits +
   2331 			    statsp->mac_stats.serdes_inits;
   2332 		}
   2333 		break;
   2334 
   2335 	case ETHER_STAT_TOOLONG_ERRORS:
   2336 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
   2337 			val = statsp->xmac_stats.tx_maxpktsize_err +
   2338 			    statsp->xmac_stats.rx_len_err_cnt;
   2339 
   2340 		} else {
   2341 			val = statsp->bmac_stats.rx_len_err_cnt +
   2342 			    statsp->bmac_stats.tx_max_pkt_err;
   2343 		}
   2344 		break;
   2345 
   2346 
   2347 	case ETHER_STAT_XCVR_ADDR:
   2348 		val = statsp->mac_stats.xcvr_portn;
   2349 		break;
   2350 	case ETHER_STAT_XCVR_ID:
   2351 		val = statsp->mac_stats.xcvr_id;
   2352 		break;
   2353 
   2354 	case ETHER_STAT_XCVR_INUSE:
   2355 		val = statsp->mac_stats.xcvr_inuse;
   2356 		break;
   2357 
   2358 	case ETHER_STAT_CAP_1000FDX:
   2359 		val = statsp->mac_stats.cap_1000fdx;
   2360 		break;
   2361 
   2362 	case ETHER_STAT_CAP_1000HDX:
   2363 		val = statsp->mac_stats.cap_1000hdx;
   2364 		break;
   2365 
   2366 	case ETHER_STAT_CAP_100FDX:
   2367 		val = statsp->mac_stats.cap_100fdx;
   2368 		break;
   2369 
   2370 	case ETHER_STAT_CAP_100HDX:
   2371 		val = statsp->mac_stats.cap_100hdx;
   2372 		break;
   2373 
   2374 	case ETHER_STAT_CAP_10FDX:
   2375 		val = statsp->mac_stats.cap_10fdx;
   2376 		break;
   2377 
   2378 	case ETHER_STAT_CAP_10HDX:
   2379 		val = statsp->mac_stats.cap_10hdx;
   2380 		break;
   2381 
   2382 	case ETHER_STAT_CAP_ASMPAUSE:
   2383 		val = statsp->mac_stats.cap_asmpause;
   2384 		val = 1;
   2385 		break;
   2386 
   2387 	case ETHER_STAT_CAP_PAUSE:
   2388 		val = statsp->mac_stats.cap_pause;
   2389 		break;
   2390 
   2391 	case ETHER_STAT_CAP_AUTONEG:
   2392 		val = statsp->mac_stats.cap_autoneg;
   2393 		break;
   2394 
   2395 	case ETHER_STAT_ADV_CAP_1000FDX:
   2396 		val = statsp->mac_stats.adv_cap_1000fdx;
   2397 		break;
   2398 
   2399 	case ETHER_STAT_ADV_CAP_1000HDX:
   2400 		val = statsp->mac_stats.adv_cap_1000hdx;
   2401 		break;
   2402 
   2403 	case ETHER_STAT_ADV_CAP_100FDX:
   2404 		val = statsp->mac_stats.adv_cap_100fdx;
   2405 		break;
   2406 
   2407 	case ETHER_STAT_ADV_CAP_100HDX:
   2408 		val = statsp->mac_stats.adv_cap_100hdx;
   2409 		break;
   2410 
   2411 	case ETHER_STAT_ADV_CAP_10FDX:
   2412 		val = statsp->mac_stats.adv_cap_10fdx;
   2413 		break;
   2414 
   2415 	case ETHER_STAT_ADV_CAP_10HDX:
   2416 		val = statsp->mac_stats.adv_cap_10hdx;
   2417 		break;
   2418 
   2419 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
   2420 		val = statsp->mac_stats.adv_cap_asmpause;
   2421 		break;
   2422 
   2423 	case ETHER_STAT_ADV_CAP_PAUSE:
   2424 		val = statsp->mac_stats.adv_cap_pause;
   2425 		break;
   2426 
   2427 	case ETHER_STAT_ADV_CAP_AUTONEG:
   2428 		val = statsp->mac_stats.adv_cap_autoneg;
   2429 		break;
   2430 
   2431 	case ETHER_STAT_LP_CAP_1000FDX:
   2432 		val = statsp->mac_stats.lp_cap_1000fdx;
   2433 		break;
   2434 
   2435 	case ETHER_STAT_LP_CAP_1000HDX:
   2436 		val = statsp->mac_stats.lp_cap_1000hdx;
   2437 		break;
   2438 
   2439 	case ETHER_STAT_LP_CAP_100FDX:
   2440 		val = statsp->mac_stats.lp_cap_100fdx;
   2441 		break;
   2442 
   2443 	case ETHER_STAT_LP_CAP_100HDX:
   2444 		val = statsp->mac_stats.lp_cap_100hdx;
   2445 		break;
   2446 
   2447 	case ETHER_STAT_LP_CAP_10FDX:
   2448 		val = statsp->mac_stats.lp_cap_10fdx;
   2449 		break;
   2450 
   2451 	case ETHER_STAT_LP_CAP_10HDX:
   2452 		val = statsp->mac_stats.lp_cap_10hdx;
   2453 		break;
   2454 
   2455 	case ETHER_STAT_LP_CAP_ASMPAUSE:
   2456 		val = statsp->mac_stats.lp_cap_asmpause;
   2457 		break;
   2458 
   2459 	case ETHER_STAT_LP_CAP_PAUSE:
   2460 		val = statsp->mac_stats.lp_cap_pause;
   2461 		break;
   2462 
   2463 	case ETHER_STAT_LP_CAP_AUTONEG:
   2464 		val = statsp->mac_stats.lp_cap_autoneg;
   2465 		break;
   2466 
   2467 	case ETHER_STAT_LINK_ASMPAUSE:
   2468 		val = statsp->mac_stats.link_asmpause;
   2469 		break;
   2470 
   2471 	case ETHER_STAT_LINK_PAUSE:
   2472 		val = statsp->mac_stats.link_pause;
   2473 		break;
   2474 
   2475 	case ETHER_STAT_LINK_AUTONEG:
   2476 		val = statsp->mac_stats.cap_autoneg;
   2477 		break;
   2478 
   2479 	case ETHER_STAT_LINK_DUPLEX:
   2480 		val = statsp->mac_stats.link_duplex;
   2481 		break;
   2482 
   2483 	default:
   2484 		/*
   2485 		 * Shouldn't reach here...
   2486 		 */
   2487 #ifdef NXGE_DEBUG
   2488 		NXGE_ERROR_MSG((nxgep, KST_CTL,
   2489 		    "nxge_m_stat: unrecognized parameter value = 0x%x",
   2490 		    stat));
   2491 #endif
   2492 
   2493 		return (ENOTSUP);
   2494 	}
   2495 	*value = val;
   2496 	return (0);
   2497 }
   2498