144961713Sgirish /*
244961713Sgirish  * CDDL HEADER START
344961713Sgirish  *
444961713Sgirish  * The contents of this file are subject to the terms of the
544961713Sgirish  * Common Development and Distribution License (the "License").
644961713Sgirish  * You may not use this file except in compliance with the License.
744961713Sgirish  *
844961713Sgirish  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
944961713Sgirish  * or http://www.opensolaris.org/os/licensing.
1044961713Sgirish  * See the License for the specific language governing permissions
1144961713Sgirish  * and limitations under the License.
1244961713Sgirish  *
1344961713Sgirish  * When distributing Covered Code, include this CDDL HEADER in each
1444961713Sgirish  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1544961713Sgirish  * If applicable, add the following below this CDDL HEADER, with the
1644961713Sgirish  * fields enclosed by brackets "[]" replaced with your own identifying
1744961713Sgirish  * information: Portions Copyright [yyyy] [name of copyright owner]
1844961713Sgirish  *
1944961713Sgirish  * CDDL HEADER END
2044961713Sgirish  */
2144961713Sgirish /*
220dc2366fSVenugopal Iyer  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2344961713Sgirish  * Use is subject to license terms.
2444961713Sgirish  */
2544961713Sgirish 
26a3c5bd6dSspeer #include <sys/nxge/nxge_impl.h>
27678453a8Sspeer #include <sys/nxge/nxge_hio.h>
28678453a8Sspeer 
2944961713Sgirish #include <inet/mi.h>
30a3c5bd6dSspeer 
3144961713Sgirish #define	RDC_NAME_FORMAT1	"RDC Channel"
3244961713Sgirish #define	TDC_NAME_FORMAT1	"TDC Channel"
3344961713Sgirish #define	CH_NAME_FORMAT		" %d Stats"
3444961713Sgirish #define	TDC_NAME_FORMAT		"TDC Channel %d Stats"
3544961713Sgirish #define	RDC_NAME_FORMAT		"RDC Channel %d Stats"
3644961713Sgirish 
3744961713Sgirish void nxge_mac_init_kstats(p_nxge_t, struct kstat *);
3844961713Sgirish void nxge_xmac_init_kstats(struct kstat *);
3944961713Sgirish void nxge_bmac_init_kstats(struct kstat *);
4044961713Sgirish 
41a3c5bd6dSspeer /* ARGSUSED */
4244961713Sgirish void
nxge_init_statsp(p_nxge_t nxgep)4344961713Sgirish nxge_init_statsp(p_nxge_t nxgep)
4444961713Sgirish {
4544961713Sgirish 	size_t stats_size;
4644961713Sgirish 
4744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_init_statsp"));
4844961713Sgirish 
4944961713Sgirish 	stats_size = sizeof (nxge_stats_t);
5044961713Sgirish 	nxgep->statsp = KMEM_ZALLOC(stats_size, KM_SLEEP);
5144961713Sgirish 	nxgep->statsp->stats_size = stats_size;
5244961713Sgirish 
5344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_init_statsp"));
5444961713Sgirish }
5544961713Sgirish 
5644961713Sgirish typedef struct {
57a3c5bd6dSspeer 	uint8_t index;
58a3c5bd6dSspeer 	uint8_t type;
59a3c5bd6dSspeer 	char *name;
6044961713Sgirish } nxge_kstat_index_t;
6144961713Sgirish 
62a3c5bd6dSspeer typedef enum {
6344961713Sgirish 	RDC_STAT_PACKETS = 0,
6444961713Sgirish 	RDC_STAT_BYTES,
6544961713Sgirish 	RDC_STAT_ERRORS,
6644961713Sgirish 	RDC_STAT_DCF_ERR,
6744961713Sgirish 	RDC_STAT_RCR_ACK_ERR,
6844961713Sgirish 	RDC_STAT_RCR_DC_FIFOFLOW_ERR,
6944961713Sgirish 	RDC_STAT_RCR_SHA_PAR_ERR,
7044961713Sgirish 	RDC_STAT_RBR_PRE_PAR_ERR,
7144961713Sgirish 	RDC_STAT_WRED_DROP,
7244961713Sgirish 	RDC_STAT_RBR_PRE_EMTY,
7344961713Sgirish 	RDC_STAT_RCR_SHADOW_FULL,
7444961713Sgirish 	RDC_STAT_RBR_TMOUT,
7544961713Sgirish 	RDC_STAT_RSP_CNT_ERR,
7644961713Sgirish 	RDC_STAT_BYTE_EN_BUS,
7744961713Sgirish 	RDC_STAT_RSP_DAT_ERR,
784202ea4bSsbehera 	RDC_STAT_PKT_TOO_LONG_ERR,
7944961713Sgirish 	RDC_STAT_COMPL_L2_ERR,
8044961713Sgirish 	RDC_STAT_COMPL_L4_CKSUM_ERR,
8144961713Sgirish 	RDC_STAT_COMPL_ZCP_SOFT_ERR,
8244961713Sgirish 	RDC_STAT_COMPL_FFLP_SOFT_ERR,
8344961713Sgirish 	RDC_STAT_CONFIG_ERR,
8444961713Sgirish 	RDC_STAT_RCRINCON,
8544961713Sgirish 	RDC_STAT_RCRFULL,
8644961713Sgirish 	RDC_STAT_RBR_EMPTY,
8744961713Sgirish 	RDC_STAT_RBR_FULL,
8844961713Sgirish 	RDC_STAT_RBRLOGPAGE,
8944961713Sgirish 	RDC_STAT_CFIGLOGPAGE,
9044961713Sgirish 	RDC_STAT_PORT_DROP_PKT,
9144961713Sgirish 	RDC_STAT_RCRTO,
9244961713Sgirish 	RDC_STAT_RCRTHRES,
9344961713Sgirish 	RDC_STAT_MEX,
9444961713Sgirish 	RDC_STAT_ID_MIS,
9544961713Sgirish 	RDC_STAT_ZCP_EOP,
9644961713Sgirish 	RDC_STAT_IPP_EOP,
9744961713Sgirish 	RDC_STAT_END
9844961713Sgirish } nxge_rdc_stat_index_t;
9944961713Sgirish 
10044961713Sgirish nxge_kstat_index_t nxge_rdc_stats[] = {
101a3c5bd6dSspeer 	{RDC_STAT_PACKETS, KSTAT_DATA_UINT64, "rdc_packets"},
102a3c5bd6dSspeer 	{RDC_STAT_BYTES, KSTAT_DATA_UINT64, "rdc_bytes"},
103a3c5bd6dSspeer 	{RDC_STAT_ERRORS, KSTAT_DATA_ULONG, "rdc_errors"},
104a3c5bd6dSspeer 	{RDC_STAT_DCF_ERR, KSTAT_DATA_ULONG, "rdc_dcf_err"},
105a3c5bd6dSspeer 	{RDC_STAT_RCR_ACK_ERR, KSTAT_DATA_ULONG, "rdc_rcr_ack_err"},
106a3c5bd6dSspeer 	{RDC_STAT_RCR_DC_FIFOFLOW_ERR, KSTAT_DATA_ULONG, "rdc_dc_fifoflow_err"},
107a3c5bd6dSspeer 	{RDC_STAT_RCR_SHA_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rcr_sha_par_err"},
108a3c5bd6dSspeer 	{RDC_STAT_RBR_PRE_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rbr_pre_par_err"},
109a3c5bd6dSspeer 	{RDC_STAT_WRED_DROP, KSTAT_DATA_ULONG, "rdc_wred_drop"},
110a3c5bd6dSspeer 	{RDC_STAT_RBR_PRE_EMTY, KSTAT_DATA_ULONG, "rdc_rbr_pre_empty"},
111a3c5bd6dSspeer 	{RDC_STAT_RCR_SHADOW_FULL, KSTAT_DATA_ULONG, "rdc_rcr_shadow_full"},
112a3c5bd6dSspeer 	{RDC_STAT_RBR_TMOUT, KSTAT_DATA_ULONG, "rdc_rbr_tmout"},
113a3c5bd6dSspeer 	{RDC_STAT_RSP_CNT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_cnt_err"},
114a3c5bd6dSspeer 	{RDC_STAT_BYTE_EN_BUS, KSTAT_DATA_ULONG, "rdc_byte_en_bus"},
115a3c5bd6dSspeer 	{RDC_STAT_RSP_DAT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_dat_err"},
1164202ea4bSsbehera 	{RDC_STAT_PKT_TOO_LONG_ERR, KSTAT_DATA_ULONG, "rdc_pkt_too_long_err"},
117a3c5bd6dSspeer 	{RDC_STAT_COMPL_L2_ERR, KSTAT_DATA_ULONG, "rdc_compl_l2_err"},
118a3c5bd6dSspeer 	{RDC_STAT_COMPL_L4_CKSUM_ERR, KSTAT_DATA_ULONG, "rdc_compl_l4_cksum"},
119a3c5bd6dSspeer 	{RDC_STAT_COMPL_ZCP_SOFT_ERR, KSTAT_DATA_ULONG,
120a3c5bd6dSspeer 		"rdc_compl_zcp_soft_err"},
121a3c5bd6dSspeer 	{RDC_STAT_COMPL_FFLP_SOFT_ERR, KSTAT_DATA_ULONG,
122a3c5bd6dSspeer 		"rdc_compl_fflp_soft_err"},
123a3c5bd6dSspeer 	{RDC_STAT_CONFIG_ERR, KSTAT_DATA_ULONG, "rdc_config_err"},
124a3c5bd6dSspeer 	{RDC_STAT_RCRINCON, KSTAT_DATA_ULONG, "rdc_rcrincon"},
125a3c5bd6dSspeer 	{RDC_STAT_RCRFULL, KSTAT_DATA_ULONG, "rdc_rcrfull"},
126a3c5bd6dSspeer 	{RDC_STAT_RBR_EMPTY, KSTAT_DATA_ULONG, "rdc_rbr_empty"},
127a3c5bd6dSspeer 	{RDC_STAT_RBR_FULL, KSTAT_DATA_ULONG, "rdc_rbrfull"},
128a3c5bd6dSspeer 	{RDC_STAT_RBRLOGPAGE, KSTAT_DATA_ULONG, "rdc_rbrlogpage"},
129a3c5bd6dSspeer 	{RDC_STAT_CFIGLOGPAGE, KSTAT_DATA_ULONG, "rdc_cfiglogpage"},
130a3c5bd6dSspeer 	{RDC_STAT_PORT_DROP_PKT, KSTAT_DATA_ULONG, "rdc_port_drop_pkt"},
131a3c5bd6dSspeer 	{RDC_STAT_RCRTO, KSTAT_DATA_ULONG, "rdc_rcrto"},
132a3c5bd6dSspeer 	{RDC_STAT_RCRTHRES, KSTAT_DATA_ULONG, "rdc_rcrthres"},
133a3c5bd6dSspeer 	{RDC_STAT_MEX, KSTAT_DATA_ULONG, "rdc_mex"},
134a3c5bd6dSspeer 	{RDC_STAT_ID_MIS, KSTAT_DATA_ULONG, "rdc_id_mismatch"},
135a3c5bd6dSspeer 	{RDC_STAT_ZCP_EOP, KSTAT_DATA_ULONG, "rdc_zcp_eop"},
136a3c5bd6dSspeer 	{RDC_STAT_IPP_EOP, KSTAT_DATA_ULONG, "rdc_ipp_eop"},
137*b37cc459SToomas Soome 	{RDC_STAT_END, KSTAT_DATA_ULONG, NULL}
13844961713Sgirish };
13944961713Sgirish 
14044961713Sgirish typedef enum {
14144961713Sgirish 	RDC_SYS_STAT_PRE_PAR_ERR = 0,
14244961713Sgirish 	RDC_SYS_STAT_SHA_PAR_ERR,
14344961713Sgirish 	RDC_SYS_STAT_ID_MISMATCH,
14444961713Sgirish 	RDC_SYS_STAT_IPP_EOP_ERR,
14544961713Sgirish 	RDC_SYS_STAT_ZCP_EOP_ERR,
14644961713Sgirish 	RDC_SYS_STAT_END
14744961713Sgirish } nxge_rdc_sys_stat_idx_t;
14844961713Sgirish 
14944961713Sgirish nxge_kstat_index_t nxge_rdc_sys_stats[] = {
150a3c5bd6dSspeer 	{RDC_SYS_STAT_PRE_PAR_ERR, KSTAT_DATA_UINT64, "rdc_pre_par_err"},
151a3c5bd6dSspeer 	{RDC_SYS_STAT_SHA_PAR_ERR, KSTAT_DATA_UINT64, "rdc_sha_par_err"},
152a3c5bd6dSspeer 	{RDC_SYS_STAT_ID_MISMATCH, KSTAT_DATA_UINT64, "rdc_stat_id_mismatch"},
153a3c5bd6dSspeer 	{RDC_SYS_STAT_IPP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_ipp_eop_err"},
154a3c5bd6dSspeer 	{RDC_SYS_STAT_ZCP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_zcp_eop_err"},
155*b37cc459SToomas Soome 	{RDC_SYS_STAT_END, KSTAT_DATA_UINT64, NULL}
15644961713Sgirish };
15744961713Sgirish 
158a3c5bd6dSspeer typedef enum {
15944961713Sgirish 	TDC_STAT_PACKETS = 0,
16044961713Sgirish 	TDC_STAT_BYTES,
16144961713Sgirish 	TDC_STAT_ERRORS,
16244961713Sgirish 	TDC_STAT_TX_INITS,
16344961713Sgirish 	TDC_STAT_TX_NO_BUF,
16444961713Sgirish 	TDC_STAT_MBOX_ERR,
16544961713Sgirish 	TDC_STAT_PKT_SIZE_ERR,
16644961713Sgirish 	TDC_STAT_TX_RING_OFLOW,
16744961713Sgirish 	TDC_STAT_PREF_BUF_ECC_ERR,
16844961713Sgirish 	TDC_STAT_NACK_PREF,
16944961713Sgirish 	TDC_STAT_NACK_PKT_RD,
17044961713Sgirish 	TDC_STAT_CONF_PART_ERR,
17144961713Sgirish 	TDC_STAT_PKT_PRT_ERR,
17244961713Sgirish 	TDC_STAT_RESET_FAIL,
17344961713Sgirish 	TDC_STAT_TX_STARTS,
17444961713Sgirish 	TDC_STAT_TX_NOCANPUT,
17544961713Sgirish 	TDC_STAT_TX_MSGDUP_FAIL,
17644961713Sgirish 	TDC_STAT_TX_ALLOCB_FAIL,
17744961713Sgirish 	TDC_STAT_TX_NO_DESC,
17844961713Sgirish 	TDC_STAT_TX_DMA_BIND_FAIL,
17944961713Sgirish 	TDC_STAT_TX_UFLOW,
18044961713Sgirish 	TDC_STAT_TX_HDR_PKTS,
18144961713Sgirish 	TDC_STAT_TX_DDI_PKTS,
18244961713Sgirish 	TDC_STAT_TX_DVMA_PKTS,
18344961713Sgirish 	TDC_STAT_TX_MAX_PEND,
18444961713Sgirish 	TDC_STAT_END
18544961713Sgirish } nxge_tdc_stats_index_t;
18644961713Sgirish 
18744961713Sgirish nxge_kstat_index_t nxge_tdc_stats[] = {
188a3c5bd6dSspeer 	{TDC_STAT_PACKETS, KSTAT_DATA_UINT64, "tdc_packets"},
189a3c5bd6dSspeer 	{TDC_STAT_BYTES, KSTAT_DATA_UINT64, "tdc_bytes"},
190a3c5bd6dSspeer 	{TDC_STAT_ERRORS, KSTAT_DATA_UINT64, "tdc_errors"},
191a3c5bd6dSspeer 	{TDC_STAT_TX_INITS, KSTAT_DATA_ULONG, "tdc_tx_inits"},
192a3c5bd6dSspeer 	{TDC_STAT_TX_NO_BUF, KSTAT_DATA_ULONG, "tdc_tx_no_buf"},
193a3c5bd6dSspeer 	{TDC_STAT_MBOX_ERR, KSTAT_DATA_ULONG, "tdc_mbox_err"},
194a3c5bd6dSspeer 	{TDC_STAT_PKT_SIZE_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_err"},
19544961713Sgirish 	{TDC_STAT_TX_RING_OFLOW,
196a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_tx_ring_oflow"},
19744961713Sgirish 	{TDC_STAT_PREF_BUF_ECC_ERR,
198a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_pref_buf_err_err"},
199a3c5bd6dSspeer 	{TDC_STAT_NACK_PREF, KSTAT_DATA_ULONG, "tdc_nack_pref"},
200a3c5bd6dSspeer 	{TDC_STAT_NACK_PKT_RD, KSTAT_DATA_ULONG, "tdc_nack_pkt_rd"},
20144961713Sgirish 	{TDC_STAT_CONF_PART_ERR,
202a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_conf_part_err"},
203a3c5bd6dSspeer 	{TDC_STAT_PKT_PRT_ERR, KSTAT_DATA_ULONG, "tdc_pkt_prt_err"},
204a3c5bd6dSspeer 	{TDC_STAT_RESET_FAIL, KSTAT_DATA_ULONG, "tdc_reset_fail"},
205a3c5bd6dSspeer 	{TDC_STAT_TX_STARTS, KSTAT_DATA_ULONG, "tdc_tx_starts"},
206a3c5bd6dSspeer 	{TDC_STAT_TX_NOCANPUT, KSTAT_DATA_ULONG, "tdc_tx_nocanput"},
20744961713Sgirish 	{TDC_STAT_TX_MSGDUP_FAIL, KSTAT_DATA_ULONG, "tdc_tx_msgdup_fail"},
20844961713Sgirish 	{TDC_STAT_TX_ALLOCB_FAIL, KSTAT_DATA_ULONG, "tdc_tx_allocb_fail"},
20944961713Sgirish 	{TDC_STAT_TX_NO_DESC, KSTAT_DATA_ULONG, "tdc_tx_no_desc"},
21044961713Sgirish 	{TDC_STAT_TX_DMA_BIND_FAIL, KSTAT_DATA_ULONG, "tdc_tx_dma_bind_fail"},
211a3c5bd6dSspeer 	{TDC_STAT_TX_UFLOW, KSTAT_DATA_ULONG, "tdc_tx_uflow"},
212a3c5bd6dSspeer 	{TDC_STAT_TX_HDR_PKTS, KSTAT_DATA_ULONG, "tdc_tx_hdr_pkts"},
213a3c5bd6dSspeer 	{TDC_STAT_TX_DDI_PKTS, KSTAT_DATA_ULONG, "tdc_tx_ddi_pkts"},
214a3c5bd6dSspeer 	{TDC_STAT_TX_DVMA_PKTS, KSTAT_DATA_ULONG, "tdc_tx_dvma_pkts"},
215a3c5bd6dSspeer 	{TDC_STAT_TX_MAX_PEND, KSTAT_DATA_ULONG, "tdc_tx_max_pend"},
216*b37cc459SToomas Soome 	{TDC_STAT_END, KSTAT_DATA_ULONG, NULL}
21744961713Sgirish };
21844961713Sgirish 
21944961713Sgirish /* IPP Statistics definitions */
220a3c5bd6dSspeer typedef enum {
22144961713Sgirish 	IPP_STAT_EOP_MISS = 0,
22244961713Sgirish 	IPP_STAT_SOP_MISS,
22344961713Sgirish 	IPP_STAT_DFIFO_UE,
22444961713Sgirish 	IPP_STAT_ECC_ERR,
225846a903dSml 	IPP_STAT_PFIFO_PERR,
22644961713Sgirish 	IPP_STAT_PFIFO_OVER,
22744961713Sgirish 	IPP_STAT_PFIFO_UND,
22844961713Sgirish 	IPP_STAT_BAD_CS,
22944961713Sgirish 	IPP_STAT_BAD_DIS,
23044961713Sgirish 	IPP_STAT_END
23144961713Sgirish } nxge_ipp_stat_index_t;
23244961713Sgirish 
23344961713Sgirish nxge_kstat_index_t nxge_ipp_stats[] = {
234a3c5bd6dSspeer 	{IPP_STAT_EOP_MISS, KSTAT_DATA_ULONG, "rxipp_eop_miss"},
235a3c5bd6dSspeer 	{IPP_STAT_SOP_MISS, KSTAT_DATA_ULONG, "rxipp_sop_miss"},
236a3c5bd6dSspeer 	{IPP_STAT_DFIFO_UE, KSTAT_DATA_ULONG, "rxipp_dfifo_ue"},
237a3c5bd6dSspeer 	{IPP_STAT_ECC_ERR, KSTAT_DATA_ULONG, "rxipp_ecc_err"},
238846a903dSml 	{IPP_STAT_PFIFO_PERR, KSTAT_DATA_ULONG, "rxipp_pfifo_perr"},
239a3c5bd6dSspeer 	{IPP_STAT_PFIFO_OVER, KSTAT_DATA_ULONG, "rxipp_pfifo_over"},
240a3c5bd6dSspeer 	{IPP_STAT_PFIFO_UND, KSTAT_DATA_ULONG, "rxipp_pfifo_und"},
241a3c5bd6dSspeer 	{IPP_STAT_BAD_CS, KSTAT_DATA_ULONG, "rxipp_bad_cs"},
242a3c5bd6dSspeer 	{IPP_STAT_BAD_DIS, KSTAT_DATA_ULONG, "rxipp_bad_dis"},
243*b37cc459SToomas Soome 	{IPP_STAT_END, KSTAT_DATA_ULONG, NULL}
24444961713Sgirish };
24544961713Sgirish 
24644961713Sgirish /* TXC Statistics definitions */
247a3c5bd6dSspeer typedef enum {
24844961713Sgirish 	TXC_STAT_PKT_STUFFED = 0,
24944961713Sgirish 	TXC_STAT_PKT_XMIT,
25044961713Sgirish 	TXC_STAT_RO_CORRECT_ERR,
25144961713Sgirish 	TXC_STAT_RO_UNCORRECT_ERR,
25244961713Sgirish 	TXC_STAT_SF_CORRECT_ERR,
25344961713Sgirish 	TXC_STAT_SF_UNCORRECT_ERR,
25444961713Sgirish 	TXC_STAT_ADDRESS_FAILED,
25544961713Sgirish 	TXC_STAT_DMA_FAILED,
25644961713Sgirish 	TXC_STAT_LENGTH_FAILED,
25744961713Sgirish 	TXC_STAT_PKT_ASSY_DEAD,
25844961713Sgirish 	TXC_STAT_REORDER_ERR,
25944961713Sgirish 	TXC_STAT_END
26044961713Sgirish } nxge_txc_stat_index_t;
26144961713Sgirish 
26244961713Sgirish nxge_kstat_index_t nxge_txc_stats[] = {
263a3c5bd6dSspeer 	{TXC_STAT_PKT_STUFFED, KSTAT_DATA_ULONG, "txc_pkt_stuffed"},
264a3c5bd6dSspeer 	{TXC_STAT_PKT_XMIT, KSTAT_DATA_ULONG, "txc_pkt_xmit"},
265a3c5bd6dSspeer 	{TXC_STAT_RO_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_correct_err"},
266a3c5bd6dSspeer 	{TXC_STAT_RO_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_uncorrect_err"},
267a3c5bd6dSspeer 	{TXC_STAT_SF_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_correct_err"},
268a3c5bd6dSspeer 	{TXC_STAT_SF_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_uncorrect_err"},
269a3c5bd6dSspeer 	{TXC_STAT_ADDRESS_FAILED, KSTAT_DATA_ULONG, "txc_address_failed"},
270a3c5bd6dSspeer 	{TXC_STAT_DMA_FAILED, KSTAT_DATA_ULONG, "txc_dma_failed"},
271a3c5bd6dSspeer 	{TXC_STAT_LENGTH_FAILED, KSTAT_DATA_ULONG, "txc_length_failed"},
272a3c5bd6dSspeer 	{TXC_STAT_PKT_ASSY_DEAD, KSTAT_DATA_ULONG, "txc_pkt_assy_dead"},
273a3c5bd6dSspeer 	{TXC_STAT_REORDER_ERR, KSTAT_DATA_ULONG, "txc_reorder_err"},
274*b37cc459SToomas Soome 	{TXC_STAT_END, KSTAT_DATA_ULONG, NULL}
27544961713Sgirish };
27644961713Sgirish 
277a3c5bd6dSspeer typedef enum {
27844961713Sgirish 	XMAC_STAT_TX_FRAME_CNT = 0,
27944961713Sgirish 	XMAC_STAT_TX_UNDERFLOW_ERR,
28044961713Sgirish 	XMAC_STAT_TX_MAXPKTSIZE_ERR,
28144961713Sgirish 	XMAC_STAT_TX_OVERFLOW_ERR,
28244961713Sgirish 	XMAC_STAT_TX_FIFO_XFR_ERR,
28344961713Sgirish 	XMAC_STAT_TX_BYTE_CNT,
28444961713Sgirish 	XMAC_STAT_RX_FRAME_CNT,
28544961713Sgirish 	XMAC_STAT_RX_UNDERFLOW_ERR,
28644961713Sgirish 	XMAC_STAT_RX_OVERFLOW_ERR,
28744961713Sgirish 	XMAC_STAT_RX_CRC_ERR_CNT,
28844961713Sgirish 	XMAC_STAT_RX_LEN_ERR_CNT,
28944961713Sgirish 	XMAC_STAT_RX_VIOL_ERR_CNT,
29044961713Sgirish 	XMAC_STAT_RX_BYTE_CNT,
29144961713Sgirish 	XMAC_STAT_RX_HIST1_CNT,
29244961713Sgirish 	XMAC_STAT_RX_HIST2_CNT,
29344961713Sgirish 	XMAC_STAT_RX_HIST3_CNT,
29444961713Sgirish 	XMAC_STAT_RX_HIST4_CNT,
29544961713Sgirish 	XMAC_STAT_RX_HIST5_CNT,
29644961713Sgirish 	XMAC_STAT_RX_HIST6_CNT,
29744961713Sgirish 	XMAC_STAT_RX_HIST7_CNT,
29844961713Sgirish 	XMAC_STAT_RX_BROADCAST_CNT,
29944961713Sgirish 	XMAC_STAT_RX_MULT_CNT,
30044961713Sgirish 	XMAC_STAT_RX_FRAG_CNT,
30144961713Sgirish 	XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
30244961713Sgirish 	XMAC_STAT_RX_LINKFAULT_ERR_CNT,
30344961713Sgirish 	XMAC_STAT_RX_REMOTEFAULT_ERR,
30444961713Sgirish 	XMAC_STAT_RX_LOCALFAULT_ERR,
30544961713Sgirish 	XMAC_STAT_RX_PAUSE_CNT,
30644961713Sgirish 	XMAC_STAT_TX_PAUSE_STATE,
30744961713Sgirish 	XMAC_STAT_TX_NOPAUSE_STATE,
30844961713Sgirish 	XMAC_STAT_XPCS_DESKEW_ERR_CNT,
30914ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
31044961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
31144961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
31244961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
31344961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
31414ea4bb7Ssd #endif
31544961713Sgirish 	XMAC_STAT_END
31644961713Sgirish } nxge_xmac_stat_index_t;
31744961713Sgirish 
31844961713Sgirish nxge_kstat_index_t nxge_xmac_stats[] = {
319a3c5bd6dSspeer 	{XMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
320a3c5bd6dSspeer 	{XMAC_STAT_TX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "tmac_underflow_err"},
321a3c5bd6dSspeer 	{XMAC_STAT_TX_MAXPKTSIZE_ERR, KSTAT_DATA_ULONG, "txmac_maxpktsize_err"},
322a3c5bd6dSspeer 	{XMAC_STAT_TX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "txmac_overflow_err"},
323a3c5bd6dSspeer 	{XMAC_STAT_TX_FIFO_XFR_ERR, KSTAT_DATA_ULONG, "txmac_fifo_xfr_err"},
324a3c5bd6dSspeer 	{XMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
325a3c5bd6dSspeer 	{XMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
326a3c5bd6dSspeer 	{XMAC_STAT_RX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_underflow_err"},
327a3c5bd6dSspeer 	{XMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
328a3c5bd6dSspeer 	{XMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err"},
329a3c5bd6dSspeer 	{XMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_length_err"},
33044961713Sgirish 	{XMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_code_violations"},
331a3c5bd6dSspeer 	{XMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
332a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST1_CNT, KSTAT_DATA_ULONG, "rxmac_64_cnt"},
333a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST2_CNT, KSTAT_DATA_ULONG, "rxmac_65_127_cnt"},
334a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST3_CNT, KSTAT_DATA_ULONG, "rxmac_128_255_cnt"},
335a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST4_CNT, KSTAT_DATA_ULONG, "rxmac_256_511_cnt"},
336a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST5_CNT, KSTAT_DATA_ULONG, "rxmac_512_1023_cnt"},
337a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST6_CNT, KSTAT_DATA_ULONG, "rxmac_1024_1522_cnt"},
338a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST7_CNT, KSTAT_DATA_ULONG, "rxmac_jumbo_cnt"},
339a3c5bd6dSspeer 	{XMAC_STAT_RX_BROADCAST_CNT, KSTAT_DATA_ULONG, "rxmac_broadcast_cnt"},
340a3c5bd6dSspeer 	{XMAC_STAT_RX_MULT_CNT, KSTAT_DATA_ULONG, "rxmac_multicast_cnt"},
341a3c5bd6dSspeer 	{XMAC_STAT_RX_FRAG_CNT, KSTAT_DATA_ULONG, "rxmac_fragment_cnt"},
34244961713Sgirish 	{XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
343a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_alignment_err"},
34444961713Sgirish 	{XMAC_STAT_RX_LINKFAULT_ERR_CNT,
345a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_linkfault_errs"},
34644961713Sgirish 	{XMAC_STAT_RX_REMOTEFAULT_ERR,
347a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_remote_faults"},
34844961713Sgirish 	{XMAC_STAT_RX_LOCALFAULT_ERR,
349a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_local_faults"},
350a3c5bd6dSspeer 	{XMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
351a3c5bd6dSspeer 	{XMAC_STAT_TX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
352a3c5bd6dSspeer 	{XMAC_STAT_TX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "txmac_nopause_state"},
35344961713Sgirish 	{XMAC_STAT_XPCS_DESKEW_ERR_CNT,
354a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_deskew_err_cnt"},
35514ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
35644961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
357a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln0_symbol_err_cnt"},
35844961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
359a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln1_symbol_err_cnt"},
36044961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
361a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln2_symbol_err_cnt"},
36244961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
363a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln3_symbol_err_cnt"},
36414ea4bb7Ssd #endif
365*b37cc459SToomas Soome 	{XMAC_STAT_END, KSTAT_DATA_ULONG, NULL}
36644961713Sgirish };
36744961713Sgirish 
368a3c5bd6dSspeer typedef enum {
36944961713Sgirish 	BMAC_STAT_TX_FRAME_CNT = 0,
37044961713Sgirish 	BMAC_STAT_TX_UNDERRUN_ERR,
37144961713Sgirish 	BMAC_STAT_TX_MAX_PKT_ERR,
37244961713Sgirish 	BMAC_STAT_TX_BYTE_CNT,
37344961713Sgirish 	BMAC_STAT_RX_FRAME_CNT,
37444961713Sgirish 	BMAC_STAT_RX_BYTE_CNT,
37544961713Sgirish 	BMAC_STAT_RX_OVERFLOW_ERR,
37644961713Sgirish 	BMAC_STAT_RX_ALIGN_ERR_CNT,
37744961713Sgirish 	BMAC_STAT_RX_CRC_ERR_CNT,
37844961713Sgirish 	BMAC_STAT_RX_LEN_ERR_CNT,
37944961713Sgirish 	BMAC_STAT_RX_VIOL_ERR_CNT,
38044961713Sgirish 	BMAC_STAT_RX_PAUSE_CNT,
38144961713Sgirish 	BMAC_STAT_RX_PAUSE_STATE,
38244961713Sgirish 	BMAC_STAT_RX_NOPAUSE_STATE,
38344961713Sgirish 	BMAC_STAT_END
38444961713Sgirish } nxge_bmac_stat_index_t;
38544961713Sgirish 
38644961713Sgirish nxge_kstat_index_t nxge_bmac_stats[] = {
387a3c5bd6dSspeer 	{BMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
388a3c5bd6dSspeer 	{BMAC_STAT_TX_UNDERRUN_ERR, KSTAT_DATA_ULONG, "txmac_underrun_err"},
389a3c5bd6dSspeer 	{BMAC_STAT_TX_MAX_PKT_ERR, KSTAT_DATA_ULONG, "txmac_max_pkt_err"},
390a3c5bd6dSspeer 	{BMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
391a3c5bd6dSspeer 	{BMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
392a3c5bd6dSspeer 	{BMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
393a3c5bd6dSspeer 	{BMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
394a3c5bd6dSspeer 	{BMAC_STAT_RX_ALIGN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_align_err_cnt"},
395a3c5bd6dSspeer 	{BMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err_cnt"},
396a3c5bd6dSspeer 	{BMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_len_err_cnt"},
397a3c5bd6dSspeer 	{BMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_viol_err_cnt"},
398a3c5bd6dSspeer 	{BMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
399a3c5bd6dSspeer 	{BMAC_STAT_RX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
400a3c5bd6dSspeer 	{BMAC_STAT_RX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "tx_nopause_state"},
401*b37cc459SToomas Soome 	{BMAC_STAT_END, KSTAT_DATA_ULONG, NULL}
40244961713Sgirish };
40344961713Sgirish 
404a3c5bd6dSspeer typedef enum {
40544961713Sgirish 	ZCP_STAT_ERRORS,
40644961713Sgirish 	ZCP_STAT_INITS,
40744961713Sgirish 	ZCP_STAT_RRFIFO_UNDERRUN,
40844961713Sgirish 	ZCP_STAT_RRFIFO_OVERRUN,
40944961713Sgirish 	ZCP_STAT_RSPFIFO_UNCORR_ERR,
41044961713Sgirish 	ZCP_STAT_BUFFER_OVERFLOW,
41144961713Sgirish 	ZCP_STAT_STAT_TBL_PERR,
41244961713Sgirish 	ZCP_STAT_DYN_TBL_PERR,
41344961713Sgirish 	ZCP_STAT_BUF_TBL_PERR,
41444961713Sgirish 	ZCP_STAT_TT_PROGRAM_ERR,
41544961713Sgirish 	ZCP_STAT_RSP_TT_INDEX_ERR,
41644961713Sgirish 	ZCP_STAT_SLV_TT_INDEX_ERR,
41744961713Sgirish 	ZCP_STAT_ZCP_TT_INDEX_ERR,
41844961713Sgirish 	ZCP_STAT_ZCP_ACCESS_FAIL,
41944961713Sgirish 	ZCP_CFIFO_ECC,
42044961713Sgirish 	ZCP_STAT_END
42144961713Sgirish } nxge_zcp_stat_index_t;
42244961713Sgirish 
42344961713Sgirish nxge_kstat_index_t nxge_zcp_stats[] = {
424a3c5bd6dSspeer 	{ZCP_STAT_ERRORS, KSTAT_DATA_ULONG, "zcp_erros"},
425a3c5bd6dSspeer 	{ZCP_STAT_INITS, KSTAT_DATA_ULONG, "zcp_inits"},
426a3c5bd6dSspeer 	{ZCP_STAT_RRFIFO_UNDERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_underrun"},
427a3c5bd6dSspeer 	{ZCP_STAT_RRFIFO_OVERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_overrun"},
42844961713Sgirish 	{ZCP_STAT_RSPFIFO_UNCORR_ERR, KSTAT_DATA_ULONG,
429a3c5bd6dSspeer 	"zcp_rspfifo_uncorr_err"},
430a3c5bd6dSspeer 	{ZCP_STAT_BUFFER_OVERFLOW, KSTAT_DATA_ULONG, "zcp_buffer_overflow"},
431a3c5bd6dSspeer 	{ZCP_STAT_STAT_TBL_PERR, KSTAT_DATA_ULONG, "zcp_stat_tbl_perr"},
432a3c5bd6dSspeer 	{ZCP_STAT_DYN_TBL_PERR, KSTAT_DATA_ULONG, "zcp_dyn_tbl_perr"},
433a3c5bd6dSspeer 	{ZCP_STAT_BUF_TBL_PERR, KSTAT_DATA_ULONG, "zcp_buf_tbl_perr"},
434a3c5bd6dSspeer 	{ZCP_STAT_TT_PROGRAM_ERR, KSTAT_DATA_ULONG, "zcp_tt_program_err"},
435a3c5bd6dSspeer 	{ZCP_STAT_RSP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_rsp_tt_index_err"},
436a3c5bd6dSspeer 	{ZCP_STAT_SLV_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_slv_tt_index_err"},
437a3c5bd6dSspeer 	{ZCP_STAT_ZCP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_zcp_tt_index_err"},
438a3c5bd6dSspeer 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_access_fail"},
439a3c5bd6dSspeer 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_cfifo_ecc"},
440*b37cc459SToomas Soome 	{ZCP_STAT_END, KSTAT_DATA_ULONG, NULL}
44144961713Sgirish };
44244961713Sgirish 
443a3c5bd6dSspeer typedef enum {
44444961713Sgirish 	FFLP_STAT_TCAM_PERR,
44544961713Sgirish 	FFLP_STAT_TCAM_ECC_ERR,
44644961713Sgirish 	FFLP_STAT_VLAN_PERR,
44744961713Sgirish 	FFLP_STAT_HASH_LOOKUP_ERR,
44844961713Sgirish 	FFLP_STAT_HASH_P0_PIO_ERR,
44944961713Sgirish 	FFLP_STAT_HASH_P1_PIO_ERR,
45044961713Sgirish 	FFLP_STAT_HASH_P2_PIO_ERR,
45144961713Sgirish 	FFLP_STAT_HASH_P3_PIO_ERR,
45244961713Sgirish 	FFLP_STAT_HASH_P4_PIO_ERR,
45344961713Sgirish 	FFLP_STAT_HASH_P5_PIO_ERR,
45444961713Sgirish 	FFLP_STAT_HASH_P6_PIO_ERR,
45544961713Sgirish 	FFLP_STAT_HASH_P7_PIO_ERR,
45644961713Sgirish 	FFLP_STAT_END
45744961713Sgirish } nxge_fflp_stat_index_t;
45844961713Sgirish 
45944961713Sgirish nxge_kstat_index_t nxge_fflp_stats[] = {
460a3c5bd6dSspeer 	{FFLP_STAT_TCAM_PERR, KSTAT_DATA_ULONG, "fflp_tcam_perr"},
461a3c5bd6dSspeer 	{FFLP_STAT_TCAM_ECC_ERR, KSTAT_DATA_ULONG, "fflp_tcam_ecc_err"},
462a3c5bd6dSspeer 	{FFLP_STAT_VLAN_PERR, KSTAT_DATA_ULONG, "fflp_vlan_perr"},
463a3c5bd6dSspeer 	{FFLP_STAT_HASH_LOOKUP_ERR, KSTAT_DATA_ULONG, "fflp_hash_lookup_err"},
464a3c5bd6dSspeer 	{FFLP_STAT_HASH_P0_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p0_pio_err"},
465a3c5bd6dSspeer 	{FFLP_STAT_HASH_P1_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p1_pio_err"},
466a3c5bd6dSspeer 	{FFLP_STAT_HASH_P2_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p2_pio_err"},
467a3c5bd6dSspeer 	{FFLP_STAT_HASH_P3_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p3_pio_err"},
468a3c5bd6dSspeer 	{FFLP_STAT_HASH_P4_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p4_pio_err"},
469a3c5bd6dSspeer 	{FFLP_STAT_HASH_P5_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p5_pio_err"},
470a3c5bd6dSspeer 	{FFLP_STAT_HASH_P6_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p6_pio_err"},
471a3c5bd6dSspeer 	{FFLP_STAT_HASH_P7_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p7_pio_err"},
472*b37cc459SToomas Soome 	{FFLP_STAT_END, KSTAT_DATA_ULONG, NULL}
47344961713Sgirish };
47444961713Sgirish 
47544961713Sgirish typedef enum {
47644961713Sgirish 	MMAC_MAX_ADDR,
47744961713Sgirish 	MMAC_AVAIL_ADDR,
47844961713Sgirish 	MMAC_ADDR_POOL1,
47944961713Sgirish 	MMAC_ADDR_POOL2,
48044961713Sgirish 	MMAC_ADDR_POOL3,
48144961713Sgirish 	MMAC_ADDR_POOL4,
48244961713Sgirish 	MMAC_ADDR_POOL5,
48344961713Sgirish 	MMAC_ADDR_POOL6,
48444961713Sgirish 	MMAC_ADDR_POOL7,
48544961713Sgirish 	MMAC_ADDR_POOL8,
48644961713Sgirish 	MMAC_ADDR_POOL9,
48744961713Sgirish 	MMAC_ADDR_POOL10,
48844961713Sgirish 	MMAC_ADDR_POOL11,
48944961713Sgirish 	MMAC_ADDR_POOL12,
49044961713Sgirish 	MMAC_ADDR_POOL13,
49144961713Sgirish 	MMAC_ADDR_POOL14,
49244961713Sgirish 	MMAC_ADDR_POOL15,
49344961713Sgirish 	MMAC_ADDR_POOL16,
49444961713Sgirish 	MMAC_STATS_END
49544961713Sgirish } nxge_mmac_stat_index_t;
49644961713Sgirish 
49744961713Sgirish nxge_kstat_index_t nxge_mmac_stats[] = {
49858324dfcSspeer 	{MMAC_MAX_ADDR, KSTAT_DATA_UINT64, "max_mmac_addr"},
49958324dfcSspeer 	{MMAC_AVAIL_ADDR, KSTAT_DATA_UINT64, "avail_mmac_addr"},
50044961713Sgirish 	{MMAC_ADDR_POOL1, KSTAT_DATA_UINT64, "mmac_addr_1"},
50144961713Sgirish 	{MMAC_ADDR_POOL2, KSTAT_DATA_UINT64, "mmac_addr_2"},
50244961713Sgirish 	{MMAC_ADDR_POOL3, KSTAT_DATA_UINT64, "mmac_addr_3"},
50344961713Sgirish 	{MMAC_ADDR_POOL4, KSTAT_DATA_UINT64, "mmac_addr_4"},
50444961713Sgirish 	{MMAC_ADDR_POOL5, KSTAT_DATA_UINT64, "mmac_addr_5"},
50544961713Sgirish 	{MMAC_ADDR_POOL6, KSTAT_DATA_UINT64, "mmac_addr_6"},
50644961713Sgirish 	{MMAC_ADDR_POOL7, KSTAT_DATA_UINT64, "mmac_addr_7"},
50744961713Sgirish 	{MMAC_ADDR_POOL8, KSTAT_DATA_UINT64, "mmac_addr_8"},
50844961713Sgirish 	{MMAC_ADDR_POOL9, KSTAT_DATA_UINT64, "mmac_addr_9"},
50944961713Sgirish 	{MMAC_ADDR_POOL10, KSTAT_DATA_UINT64, "mmac_addr_10"},
51044961713Sgirish 	{MMAC_ADDR_POOL11, KSTAT_DATA_UINT64, "mmac_addr_11"},
51144961713Sgirish 	{MMAC_ADDR_POOL12, KSTAT_DATA_UINT64, "mmac_addr_12"},
51244961713Sgirish 	{MMAC_ADDR_POOL13, KSTAT_DATA_UINT64, "mmac_addr_13"},
51344961713Sgirish 	{MMAC_ADDR_POOL14, KSTAT_DATA_UINT64, "mmac_addr_14"},
51444961713Sgirish 	{MMAC_ADDR_POOL15, KSTAT_DATA_UINT64, "mmac_addr_15"},
51544961713Sgirish 	{MMAC_ADDR_POOL16, KSTAT_DATA_UINT64, "mmac_addr_16"},
516*b37cc459SToomas Soome 	{MMAC_STATS_END, KSTAT_DATA_UINT64, NULL},
51744961713Sgirish };
51844961713Sgirish 
519a3c5bd6dSspeer /* ARGSUSED */
52044961713Sgirish int
nxge_tdc_stat_update(kstat_t * ksp,int rw)52144961713Sgirish nxge_tdc_stat_update(kstat_t *ksp, int rw)
52244961713Sgirish {
523a3c5bd6dSspeer 	p_nxge_t nxgep;
524a3c5bd6dSspeer 	p_nxge_tdc_kstat_t tdc_kstatsp;
525a3c5bd6dSspeer 	p_nxge_tx_ring_stats_t statsp;
526a3c5bd6dSspeer 	int channel;
527a3c5bd6dSspeer 	char *ch_name, *end;
52844961713Sgirish 
52944961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
53044961713Sgirish 	if (nxgep == NULL)
53144961713Sgirish 		return (-1);
532a3c5bd6dSspeer 
53344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rxstat_update"));
53444961713Sgirish 
53544961713Sgirish 	ch_name = ksp->ks_name;
53644961713Sgirish 	ch_name += strlen(TDC_NAME_FORMAT1);
53744961713Sgirish 	channel = mi_strtol(ch_name, &end, 10);
53844961713Sgirish 
53944961713Sgirish 	tdc_kstatsp = (p_nxge_tdc_kstat_t)ksp->ks_data;
54044961713Sgirish 	statsp = (p_nxge_tx_ring_stats_t)&nxgep->statsp->tdc_stats[channel];
54144961713Sgirish 
54244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
54371cd5202Smisaki 	    "nxge_tdc_stat_update data $%p statsp $%p channel %d",
54471cd5202Smisaki 	    ksp->ks_data, statsp, channel));
54544961713Sgirish 
54644961713Sgirish 	if (rw == KSTAT_WRITE) {
54744961713Sgirish 		statsp->opackets = tdc_kstatsp->opackets.value.ull;
54844961713Sgirish 		statsp->obytes = tdc_kstatsp->obytes.value.ull;
54944961713Sgirish 		statsp->oerrors = tdc_kstatsp->oerrors.value.ull;
55044961713Sgirish 		statsp->mbox_err = tdc_kstatsp->mbox_err.value.ul;
55144961713Sgirish 		statsp->pkt_size_err = tdc_kstatsp->pkt_size_err.value.ul;
55244961713Sgirish 		statsp->tx_ring_oflow = tdc_kstatsp->tx_ring_oflow.value.ul;
55344961713Sgirish 		statsp->pre_buf_par_err =
55471cd5202Smisaki 		    tdc_kstatsp->pref_buf_ecc_err.value.ul;
55544961713Sgirish 		statsp->nack_pref = tdc_kstatsp->nack_pref.value.ul;
55644961713Sgirish 		statsp->nack_pkt_rd = tdc_kstatsp->nack_pkt_rd.value.ul;
55744961713Sgirish 		statsp->conf_part_err = tdc_kstatsp->conf_part_err.value.ul;
55844961713Sgirish 		statsp->pkt_part_err = tdc_kstatsp->pkt_prt_err.value.ul;
55944961713Sgirish 	} else {
56044961713Sgirish 		tdc_kstatsp->opackets.value.ull = statsp->opackets;
56144961713Sgirish 		tdc_kstatsp->obytes.value.ull = statsp->obytes;
56244961713Sgirish 		tdc_kstatsp->oerrors.value.ull = statsp->oerrors;
56344961713Sgirish 		tdc_kstatsp->tx_hdr_pkts.value.ull = statsp->tx_hdr_pkts;
56444961713Sgirish 		tdc_kstatsp->tx_ddi_pkts.value.ull = statsp->tx_ddi_pkts;
56544961713Sgirish 		tdc_kstatsp->tx_dvma_pkts.value.ull = statsp->tx_dvma_pkts;
56644961713Sgirish 		tdc_kstatsp->tx_max_pend.value.ull = statsp->tx_max_pend;
56744961713Sgirish 		tdc_kstatsp->mbox_err.value.ul = statsp->mbox_err;
56844961713Sgirish 		tdc_kstatsp->pkt_size_err.value.ul = statsp->pkt_size_err;
56944961713Sgirish 		tdc_kstatsp->tx_ring_oflow.value.ul = statsp->tx_ring_oflow;
57044961713Sgirish 		tdc_kstatsp->pref_buf_ecc_err.value.ul =
57171cd5202Smisaki 		    statsp->pre_buf_par_err;
57244961713Sgirish 		tdc_kstatsp->nack_pref.value.ul = statsp->nack_pref;
57344961713Sgirish 		tdc_kstatsp->nack_pkt_rd.value.ul = statsp->nack_pkt_rd;
57444961713Sgirish 		tdc_kstatsp->conf_part_err.value.ul = statsp->conf_part_err;
57544961713Sgirish 		tdc_kstatsp->pkt_prt_err.value.ul = statsp->pkt_part_err;
57644961713Sgirish 		tdc_kstatsp->tx_starts.value.ul = statsp->tx_starts;
57744961713Sgirish 		tdc_kstatsp->tx_nocanput.value.ul = statsp->tx_nocanput;
57844961713Sgirish 		tdc_kstatsp->tx_msgdup_fail.value.ul = statsp->tx_msgdup_fail;
57944961713Sgirish 		tdc_kstatsp->tx_allocb_fail.value.ul = statsp->tx_allocb_fail;
58044961713Sgirish 		tdc_kstatsp->tx_no_desc.value.ul = statsp->tx_no_desc;
58144961713Sgirish 		tdc_kstatsp->tx_dma_bind_fail.value.ul =
58271cd5202Smisaki 		    statsp->tx_dma_bind_fail;
58344961713Sgirish 	}
58444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_tdc_stat_update"));
58544961713Sgirish 	return (0);
58644961713Sgirish }
58744961713Sgirish 
588a3c5bd6dSspeer /* ARGSUSED */
58944961713Sgirish int
nxge_rdc_stat_update(kstat_t * ksp,int rw)59044961713Sgirish nxge_rdc_stat_update(kstat_t *ksp, int rw)
59144961713Sgirish {
592a3c5bd6dSspeer 	p_nxge_t nxgep;
593a3c5bd6dSspeer 	p_nxge_rdc_kstat_t rdc_kstatsp;
594a3c5bd6dSspeer 	p_nxge_rx_ring_stats_t statsp;
595a3c5bd6dSspeer 	int channel;
59644961713Sgirish 	char *ch_name, *end;
59744961713Sgirish 
59844961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
59944961713Sgirish 	if (nxgep == NULL)
60044961713Sgirish 		return (-1);
601a3c5bd6dSspeer 
60244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_stat_update"));
60344961713Sgirish 
60444961713Sgirish 	ch_name = ksp->ks_name;
60544961713Sgirish 	ch_name += strlen(RDC_NAME_FORMAT1);
60644961713Sgirish 	channel = mi_strtol(ch_name, &end, 10);
60744961713Sgirish 
60844961713Sgirish 	rdc_kstatsp = (p_nxge_rdc_kstat_t)ksp->ks_data;
60944961713Sgirish 	statsp = (p_nxge_rx_ring_stats_t)&nxgep->statsp->rdc_stats[channel];
61044961713Sgirish 
61144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
61271cd5202Smisaki 	    "nxge_rdc_stat_update $%p statsp $%p channel %d",
61371cd5202Smisaki 	    ksp->ks_data, statsp, channel));
61444961713Sgirish 
61544961713Sgirish 	if (rw == KSTAT_WRITE) {
61644961713Sgirish 		statsp->dcf_err = rdc_kstatsp->dcf_err.value.ul;
61744961713Sgirish 		statsp->rcr_ack_err = rdc_kstatsp->rcr_ack_err.value.ul;
61844961713Sgirish 		statsp->dc_fifo_err = rdc_kstatsp->dc_fifoflow_err.value.ul;
61944961713Sgirish 		statsp->rcr_sha_par = rdc_kstatsp->rcr_sha_par_err.value.ul;
62044961713Sgirish 		statsp->rbr_pre_par = rdc_kstatsp->rbr_pre_par_err.value.ul;
62144961713Sgirish 		statsp->wred_drop = rdc_kstatsp->wred_drop.value.ul;
62244961713Sgirish 		statsp->rbr_pre_empty = rdc_kstatsp->rbr_pre_emty.value.ul;
62344961713Sgirish 		statsp->rcr_shadow_full = rdc_kstatsp->rcr_shadow_full.value.ul;
62444961713Sgirish 		statsp->rx_rbr_tmout = rdc_kstatsp->rbr_tmout.value.ul;
62544961713Sgirish 		statsp->rsp_cnt_err = rdc_kstatsp->rsp_cnt_err.value.ul;
62644961713Sgirish 		statsp->byte_en_bus = rdc_kstatsp->byte_en_bus.value.ul;
62744961713Sgirish 		statsp->rsp_dat_err = rdc_kstatsp->rsp_dat_err.value.ul;
6284202ea4bSsbehera 		statsp->pkt_too_long_err =
6294202ea4bSsbehera 		    rdc_kstatsp->pkt_too_long_err.value.ul;
63044961713Sgirish 		statsp->l2_err = rdc_kstatsp->compl_l2_err.value.ul;
63144961713Sgirish 		statsp->l4_cksum_err = rdc_kstatsp->compl_l4_cksum_err.value.ul;
63244961713Sgirish 		statsp->fflp_soft_err =
63371cd5202Smisaki 		    rdc_kstatsp->compl_fflp_soft_err.value.ul;
63444961713Sgirish 		statsp->zcp_soft_err = rdc_kstatsp->compl_zcp_soft_err.value.ul;
63544961713Sgirish 		statsp->config_err = rdc_kstatsp->config_err.value.ul;
63644961713Sgirish 		statsp->rcrincon = rdc_kstatsp->rcrincon.value.ul;
63744961713Sgirish 		statsp->rcrfull = rdc_kstatsp->rcrfull.value.ul;
63844961713Sgirish 		statsp->rbr_empty = rdc_kstatsp->rbr_empty.value.ul;
63944961713Sgirish 		statsp->rbrfull = rdc_kstatsp->rbrfull.value.ul;
64044961713Sgirish 		statsp->rbrlogpage = rdc_kstatsp->rbrlogpage.value.ul;
64144961713Sgirish 		statsp->cfiglogpage = rdc_kstatsp->cfiglogpage.value.ul;
64244961713Sgirish 	} else {
64344961713Sgirish 		rdc_kstatsp->ipackets.value.ull = statsp->ipackets;
64444961713Sgirish 		rdc_kstatsp->rbytes.value.ull = statsp->ibytes;
64544961713Sgirish 		rdc_kstatsp->errors.value.ul = statsp->ierrors;
64644961713Sgirish 		rdc_kstatsp->dcf_err.value.ul = statsp->dcf_err;
64744961713Sgirish 		rdc_kstatsp->rcr_ack_err.value.ul = statsp->rcr_ack_err;
64844961713Sgirish 		rdc_kstatsp->dc_fifoflow_err.value.ul = statsp->dc_fifo_err;
64944961713Sgirish 		rdc_kstatsp->rcr_sha_par_err.value.ul = statsp->rcr_sha_par;
65044961713Sgirish 		rdc_kstatsp->rbr_pre_par_err.value.ul = statsp->rbr_pre_par;
651a3c5bd6dSspeer 		rdc_kstatsp->wred_drop.value.ul = statsp->wred_drop;
652a3c5bd6dSspeer 		rdc_kstatsp->port_drop_pkt.value.ul = statsp->port_drop_pkt;
65344961713Sgirish 		rdc_kstatsp->rbr_pre_emty.value.ul = statsp->rbr_pre_empty;
65444961713Sgirish 		rdc_kstatsp->rcr_shadow_full.value.ul = statsp->rcr_shadow_full;
65544961713Sgirish 		rdc_kstatsp->rbr_tmout.value.ul = statsp->rx_rbr_tmout;
65644961713Sgirish 		rdc_kstatsp->rsp_cnt_err.value.ul = statsp->rsp_cnt_err;
65744961713Sgirish 		rdc_kstatsp->byte_en_bus.value.ul = statsp->byte_en_bus;
65844961713Sgirish 		rdc_kstatsp->rsp_dat_err.value.ul = statsp->rsp_dat_err;
6594202ea4bSsbehera 		rdc_kstatsp->pkt_too_long_err.value.ul =
6604202ea4bSsbehera 		    statsp->pkt_too_long_err;
66144961713Sgirish 		rdc_kstatsp->compl_l2_err.value.ul = statsp->l2_err;
66244961713Sgirish 		rdc_kstatsp->compl_l4_cksum_err.value.ul = statsp->l4_cksum_err;
66344961713Sgirish 		rdc_kstatsp->compl_fflp_soft_err.value.ul =
66471cd5202Smisaki 		    statsp->fflp_soft_err;
66544961713Sgirish 		rdc_kstatsp->compl_zcp_soft_err.value.ul = statsp->zcp_soft_err;
66644961713Sgirish 		rdc_kstatsp->config_err.value.ul = statsp->config_err;
66744961713Sgirish 		rdc_kstatsp->rcrincon.value.ul = statsp->rcrincon;
66844961713Sgirish 		rdc_kstatsp->rcrfull.value.ul = statsp->rcrfull;
66944961713Sgirish 		rdc_kstatsp->rbr_empty.value.ul = statsp->rbr_empty;
67044961713Sgirish 		rdc_kstatsp->rbrfull.value.ul = statsp->rbrfull;
67144961713Sgirish 		rdc_kstatsp->rbrlogpage.value.ul = statsp->rbrlogpage;
67244961713Sgirish 		rdc_kstatsp->cfiglogpage.value.ul = statsp->cfiglogpage;
67344961713Sgirish 	}
674a3c5bd6dSspeer 
67544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_stat_update"));
67644961713Sgirish 	return (0);
67744961713Sgirish }
67844961713Sgirish 
679a3c5bd6dSspeer /* ARGSUSED */
68044961713Sgirish int
nxge_rdc_sys_stat_update(kstat_t * ksp,int rw)68144961713Sgirish nxge_rdc_sys_stat_update(kstat_t *ksp, int rw)
68244961713Sgirish {
683a3c5bd6dSspeer 	p_nxge_t nxgep;
684a3c5bd6dSspeer 	p_nxge_rdc_sys_kstat_t rdc_sys_kstatsp;
685a3c5bd6dSspeer 	p_nxge_rdc_sys_stats_t statsp;
68644961713Sgirish 
68744961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
68844961713Sgirish 	if (nxgep == NULL)
68944961713Sgirish 		return (-1);
690a3c5bd6dSspeer 
69144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_sys_stat_update"));
69244961713Sgirish 
69344961713Sgirish 	rdc_sys_kstatsp = (p_nxge_rdc_sys_kstat_t)ksp->ks_data;
69444961713Sgirish 	statsp = (p_nxge_rdc_sys_stats_t)&nxgep->statsp->rdc_sys_stats;
69544961713Sgirish 
69644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "nxge_rdc_sys_stat_update %llx",
69771cd5202Smisaki 	    ksp->ks_data));
69844961713Sgirish 
69944961713Sgirish 	if (rw == KSTAT_WRITE) {
70044961713Sgirish 		statsp->id_mismatch = rdc_sys_kstatsp->id_mismatch.value.ul;
70144961713Sgirish 		statsp->ipp_eop_err = rdc_sys_kstatsp->ipp_eop_err.value.ul;
70244961713Sgirish 		statsp->zcp_eop_err = rdc_sys_kstatsp->zcp_eop_err.value.ul;
70344961713Sgirish 	} else {
70444961713Sgirish 		rdc_sys_kstatsp->id_mismatch.value.ul = statsp->id_mismatch;
70544961713Sgirish 		rdc_sys_kstatsp->ipp_eop_err.value.ul = statsp->ipp_eop_err;
70644961713Sgirish 		rdc_sys_kstatsp->zcp_eop_err.value.ul = statsp->zcp_eop_err;
70744961713Sgirish 	}
70844961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_sys_stat_update"));
70944961713Sgirish 	return (0);
71044961713Sgirish }
71144961713Sgirish 
712a3c5bd6dSspeer /* ARGSUSED */
71344961713Sgirish static int
nxge_txc_stat_update(kstat_t * ksp,int rw)71444961713Sgirish nxge_txc_stat_update(kstat_t *ksp, int rw)
71544961713Sgirish {
716a3c5bd6dSspeer 	p_nxge_t nxgep;
717a3c5bd6dSspeer 	p_nxge_txc_kstat_t txc_kstatsp;
718a3c5bd6dSspeer 	p_nxge_txc_stats_t statsp;
71944961713Sgirish 
72044961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
72144961713Sgirish 
72244961713Sgirish 	if (nxgep == NULL)
72344961713Sgirish 		return (-1);
72444961713Sgirish 
72544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_txc_stat_update"));
72644961713Sgirish 
72744961713Sgirish 	txc_kstatsp = (p_nxge_txc_kstat_t)ksp->ks_data;
72844961713Sgirish 	statsp = (p_nxge_txc_stats_t)&nxgep->statsp->txc_stats;
72944961713Sgirish 
73044961713Sgirish 	if (rw == KSTAT_WRITE) {
73144961713Sgirish 		statsp->pkt_stuffed = txc_kstatsp->pkt_stuffed.value.ul;
73244961713Sgirish 		statsp->pkt_xmit = txc_kstatsp->pkt_xmit.value.ul;
73344961713Sgirish 		statsp->ro_correct_err = txc_kstatsp->ro_correct_err.value.ul;
73444961713Sgirish 		statsp->ro_uncorrect_err =
73571cd5202Smisaki 		    txc_kstatsp->ro_uncorrect_err.value.ul;
73644961713Sgirish 		statsp->sf_correct_err = txc_kstatsp->sf_correct_err.value.ul;
73744961713Sgirish 		statsp->sf_uncorrect_err =
73871cd5202Smisaki 		    txc_kstatsp->sf_uncorrect_err.value.ul;
73944961713Sgirish 		statsp->address_failed = txc_kstatsp->address_failed.value.ul;
74044961713Sgirish 		statsp->dma_failed = txc_kstatsp->dma_failed.value.ul;
74144961713Sgirish 		statsp->length_failed = txc_kstatsp->length_failed.value.ul;
74244961713Sgirish 		statsp->pkt_assy_dead = txc_kstatsp->pkt_assy_dead.value.ul;
74344961713Sgirish 		statsp->reorder_err = txc_kstatsp->reorder_err.value.ul;
74444961713Sgirish 	} else {
74544961713Sgirish 		txc_kstatsp->pkt_stuffed.value.ul = statsp->pkt_stuffed;
74644961713Sgirish 		txc_kstatsp->pkt_xmit.value.ul = statsp->pkt_xmit;
74744961713Sgirish 		txc_kstatsp->ro_correct_err.value.ul = statsp->ro_correct_err;
74844961713Sgirish 		txc_kstatsp->ro_uncorrect_err.value.ul =
74971cd5202Smisaki 		    statsp->ro_uncorrect_err;
75044961713Sgirish 		txc_kstatsp->sf_correct_err.value.ul = statsp->sf_correct_err;
75144961713Sgirish 		txc_kstatsp->sf_uncorrect_err.value.ul =
75271cd5202Smisaki 		    statsp->sf_uncorrect_err;
75344961713Sgirish 		txc_kstatsp->address_failed.value.ul = statsp->address_failed;
75444961713Sgirish 		txc_kstatsp->dma_failed.value.ul = statsp->dma_failed;
75544961713Sgirish 		txc_kstatsp->length_failed.value.ul = statsp->length_failed;
75644961713Sgirish 		txc_kstatsp->pkt_assy_dead.value.ul = statsp->pkt_assy_dead;
75744961713Sgirish 		txc_kstatsp->reorder_err.value.ul = statsp->reorder_err;
75844961713Sgirish 	}
75944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_txc_stat_update"));
76044961713Sgirish 	return (0);
76144961713Sgirish }
76244961713Sgirish 
763a3c5bd6dSspeer /* ARGSUSED */
76444961713Sgirish int
nxge_ipp_stat_update(kstat_t * ksp,int rw)76544961713Sgirish nxge_ipp_stat_update(kstat_t *ksp, int rw)
76644961713Sgirish {
767a3c5bd6dSspeer 	p_nxge_t nxgep;
768a3c5bd6dSspeer 	p_nxge_ipp_kstat_t ipp_kstatsp;
769a3c5bd6dSspeer 	p_nxge_ipp_stats_t statsp;
77044961713Sgirish 
77144961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
77244961713Sgirish 	if (nxgep == NULL)
77344961713Sgirish 		return (-1);
77444961713Sgirish 
77544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_ipp_stat_update"));
77644961713Sgirish 
77744961713Sgirish 	ipp_kstatsp = (p_nxge_ipp_kstat_t)ksp->ks_data;
77844961713Sgirish 	statsp = (p_nxge_ipp_stats_t)&nxgep->statsp->ipp_stats;
77944961713Sgirish 
78044961713Sgirish 	if (rw == KSTAT_WRITE) {
78144961713Sgirish 		statsp->eop_miss = ipp_kstatsp->eop_miss.value.ul;
78244961713Sgirish 		statsp->sop_miss = ipp_kstatsp->sop_miss.value.ul;
78344961713Sgirish 		statsp->dfifo_ue = ipp_kstatsp->dfifo_ue.value.ul;
78444961713Sgirish 		statsp->ecc_err_cnt = ipp_kstatsp->ecc_err_cnt.value.ul;
785846a903dSml 		statsp->pfifo_perr = ipp_kstatsp->pfifo_perr.value.ul;
78644961713Sgirish 		statsp->pfifo_over = ipp_kstatsp->pfifo_over.value.ul;
78744961713Sgirish 		statsp->pfifo_und = ipp_kstatsp->pfifo_und.value.ul;
78844961713Sgirish 		statsp->bad_cs_cnt = ipp_kstatsp->bad_cs_cnt.value.ul;
78944961713Sgirish 		statsp->pkt_dis_cnt = ipp_kstatsp->pkt_dis_cnt.value.ul;
79044961713Sgirish 	} else {
79144961713Sgirish 		ipp_kstatsp->eop_miss.value.ul = statsp->eop_miss;
79244961713Sgirish 		ipp_kstatsp->sop_miss.value.ul = statsp->sop_miss;
79344961713Sgirish 		ipp_kstatsp->dfifo_ue.value.ul = statsp->dfifo_ue;
79444961713Sgirish 		ipp_kstatsp->ecc_err_cnt.value.ul = statsp->ecc_err_cnt;
795846a903dSml 		ipp_kstatsp->pfifo_perr.value.ul = statsp->pfifo_perr;
79644961713Sgirish 		ipp_kstatsp->pfifo_over.value.ul = statsp->pfifo_over;
79744961713Sgirish 		ipp_kstatsp->pfifo_und.value.ul = statsp->pfifo_und;
79844961713Sgirish 		ipp_kstatsp->bad_cs_cnt.value.ul = statsp->bad_cs_cnt;
79944961713Sgirish 		ipp_kstatsp->pkt_dis_cnt.value.ul = statsp->pkt_dis_cnt;
80044961713Sgirish 	}
80144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_ipp_stat_update"));
80244961713Sgirish 	return (0);
80344961713Sgirish }
80444961713Sgirish 
805a3c5bd6dSspeer /* ARGSUSED */
80644961713Sgirish int
nxge_xmac_stat_update(kstat_t * ksp,int rw)80744961713Sgirish nxge_xmac_stat_update(kstat_t *ksp, int rw)
80844961713Sgirish {
809a3c5bd6dSspeer 	p_nxge_t nxgep;
810a3c5bd6dSspeer 	p_nxge_xmac_kstat_t xmac_kstatsp;
811a3c5bd6dSspeer 	p_nxge_xmac_stats_t statsp;
81244961713Sgirish 
81344961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
81444961713Sgirish 	if (nxgep == NULL)
81544961713Sgirish 		return (-1);
81644961713Sgirish 
81744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_xmac_stat_update"));
81844961713Sgirish 
81944961713Sgirish 	xmac_kstatsp = (p_nxge_xmac_kstat_t)ksp->ks_data;
82044961713Sgirish 	statsp = (p_nxge_xmac_stats_t)&nxgep->statsp->xmac_stats;
82144961713Sgirish 
82244961713Sgirish 	if (rw == KSTAT_WRITE) {
82344961713Sgirish 		statsp->tx_frame_cnt = xmac_kstatsp->tx_frame_cnt.value.ul;
82444961713Sgirish 		statsp->tx_underflow_err =
82571cd5202Smisaki 		    xmac_kstatsp->tx_underflow_err.value.ul;
82644961713Sgirish 		statsp->tx_maxpktsize_err =
82771cd5202Smisaki 		    xmac_kstatsp->tx_maxpktsize_err.value.ul;
82844961713Sgirish 		statsp->tx_overflow_err =
82971cd5202Smisaki 		    xmac_kstatsp->tx_overflow_err.value.ul;
83044961713Sgirish 		statsp->tx_fifo_xfr_err =
83171cd5202Smisaki 		    xmac_kstatsp->tx_fifo_xfr_err.value.ul;
83244961713Sgirish 		statsp->tx_byte_cnt = xmac_kstatsp->tx_byte_cnt.value.ul;
83344961713Sgirish 		statsp->rx_underflow_err =
83471cd5202Smisaki 		    xmac_kstatsp->rx_underflow_err.value.ul;
83544961713Sgirish 		statsp->rx_overflow_err =
83671cd5202Smisaki 		    xmac_kstatsp->rx_overflow_err.value.ul;
83744961713Sgirish 		statsp->rx_crc_err_cnt = xmac_kstatsp->rx_crc_err_cnt.value.ul;
83844961713Sgirish 		statsp->rx_len_err_cnt = xmac_kstatsp->rx_len_err_cnt.value.ul;
83944961713Sgirish 		statsp->rx_viol_err_cnt =
84071cd5202Smisaki 		    xmac_kstatsp->rx_viol_err_cnt.value.ul;
84144961713Sgirish 		statsp->rx_byte_cnt = xmac_kstatsp->rx_byte_cnt.value.ul;
842321febdeSsbehera 		statsp->rx_frame_cnt = xmac_kstatsp->rx_frame_cnt.value.ul;
84344961713Sgirish 		statsp->rx_hist1_cnt = xmac_kstatsp->rx_hist1_cnt.value.ul;
84444961713Sgirish 		statsp->rx_hist2_cnt = xmac_kstatsp->rx_hist2_cnt.value.ul;
84544961713Sgirish 		statsp->rx_hist3_cnt = xmac_kstatsp->rx_hist3_cnt.value.ul;
84644961713Sgirish 		statsp->rx_hist4_cnt = xmac_kstatsp->rx_hist4_cnt.value.ul;
84744961713Sgirish 		statsp->rx_hist5_cnt = xmac_kstatsp->rx_hist5_cnt.value.ul;
84844961713Sgirish 		statsp->rx_hist6_cnt = xmac_kstatsp->rx_hist6_cnt.value.ul;
849321febdeSsbehera 		statsp->rx_hist7_cnt = xmac_kstatsp->rx_hist7_cnt.value.ul;
85044961713Sgirish 		statsp->rx_mult_cnt = xmac_kstatsp->rx_mult_cnt.value.ul;
85144961713Sgirish 		statsp->rx_frag_cnt = xmac_kstatsp->rx_frag_cnt.value.ul;
85244961713Sgirish 		statsp->rx_frame_align_err_cnt =
85371cd5202Smisaki 		    xmac_kstatsp->rx_frame_align_err_cnt.value.ul;
85444961713Sgirish 		statsp->rx_linkfault_err_cnt =
85571cd5202Smisaki 		    xmac_kstatsp->rx_linkfault_err_cnt.value.ul;
85644961713Sgirish 		statsp->rx_localfault_err =
85771cd5202Smisaki 		    xmac_kstatsp->rx_local_fault_err_cnt.value.ul;
85844961713Sgirish 		statsp->rx_remotefault_err =
85971cd5202Smisaki 		    xmac_kstatsp->rx_remote_fault_err_cnt.value.ul;
86044961713Sgirish 		statsp->xpcs_deskew_err_cnt =
86171cd5202Smisaki 		    xmac_kstatsp->xpcs_deskew_err_cnt.value.ul;
86214ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
86344961713Sgirish 		statsp->xpcs_ln0_symbol_err_cnt =
86471cd5202Smisaki 		    xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul;
86544961713Sgirish 		statsp->xpcs_ln1_symbol_err_cnt =
86671cd5202Smisaki 		    xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul;
86744961713Sgirish 		statsp->xpcs_ln2_symbol_err_cnt =
86871cd5202Smisaki 		    xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul;
86944961713Sgirish 		statsp->xpcs_ln3_symbol_err_cnt =
87071cd5202Smisaki 		    xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul;
87114ea4bb7Ssd #endif
87244961713Sgirish 	} else {
87344961713Sgirish 		xmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
87444961713Sgirish 		xmac_kstatsp->tx_underflow_err.value.ul =
87571cd5202Smisaki 		    statsp->tx_underflow_err;
87644961713Sgirish 		xmac_kstatsp->tx_maxpktsize_err.value.ul =
87771cd5202Smisaki 		    statsp->tx_maxpktsize_err;
87844961713Sgirish 		xmac_kstatsp->tx_overflow_err.value.ul =
87971cd5202Smisaki 		    statsp->tx_overflow_err;
88044961713Sgirish 		xmac_kstatsp->tx_fifo_xfr_err.value.ul =
88171cd5202Smisaki 		    statsp->tx_fifo_xfr_err;
88244961713Sgirish 		xmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
88344961713Sgirish 		xmac_kstatsp->rx_underflow_err.value.ul =
88471cd5202Smisaki 		    statsp->rx_underflow_err;
88544961713Sgirish 		xmac_kstatsp->rx_overflow_err.value.ul =
88671cd5202Smisaki 		    statsp->rx_overflow_err;
88744961713Sgirish 		xmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
88844961713Sgirish 		xmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
88944961713Sgirish 		xmac_kstatsp->rx_viol_err_cnt.value.ul =
89071cd5202Smisaki 		    statsp->rx_viol_err_cnt;
89144961713Sgirish 		xmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
892321febdeSsbehera 		xmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
89344961713Sgirish 		xmac_kstatsp->rx_hist1_cnt.value.ul = statsp->rx_hist1_cnt;
89444961713Sgirish 		xmac_kstatsp->rx_hist2_cnt.value.ul = statsp->rx_hist2_cnt;
89544961713Sgirish 		xmac_kstatsp->rx_hist3_cnt.value.ul = statsp->rx_hist3_cnt;
89644961713Sgirish 		xmac_kstatsp->rx_hist4_cnt.value.ul = statsp->rx_hist4_cnt;
89744961713Sgirish 		xmac_kstatsp->rx_hist5_cnt.value.ul = statsp->rx_hist5_cnt;
89844961713Sgirish 		xmac_kstatsp->rx_hist6_cnt.value.ul = statsp->rx_hist6_cnt;
899321febdeSsbehera 		xmac_kstatsp->rx_hist7_cnt.value.ul = statsp->rx_hist7_cnt;
90044961713Sgirish 		xmac_kstatsp->rx_mult_cnt.value.ul = statsp->rx_mult_cnt;
90144961713Sgirish 		xmac_kstatsp->rx_frag_cnt.value.ul = statsp->rx_frag_cnt;
90244961713Sgirish 		xmac_kstatsp->rx_frame_align_err_cnt.value.ul =
90371cd5202Smisaki 		    statsp->rx_frame_align_err_cnt;
90444961713Sgirish 		xmac_kstatsp->rx_linkfault_err_cnt.value.ul =
90571cd5202Smisaki 		    statsp->rx_linkfault_err_cnt;
90644961713Sgirish 		xmac_kstatsp->rx_local_fault_err_cnt.value.ul =
90771cd5202Smisaki 		    statsp->rx_localfault_err;
90844961713Sgirish 		xmac_kstatsp->rx_remote_fault_err_cnt.value.ul =
90971cd5202Smisaki 		    statsp->rx_remotefault_err;
91044961713Sgirish 		xmac_kstatsp->xpcs_deskew_err_cnt.value.ul =
91171cd5202Smisaki 		    statsp->xpcs_deskew_err_cnt;
91214ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
91344961713Sgirish 		xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul =
91471cd5202Smisaki 		    statsp->xpcs_ln0_symbol_err_cnt;
91544961713Sgirish 		xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul =
91671cd5202Smisaki 		    statsp->xpcs_ln1_symbol_err_cnt;
91744961713Sgirish 		xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul =
91871cd5202Smisaki 		    statsp->xpcs_ln2_symbol_err_cnt;
91944961713Sgirish 		xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul =
92071cd5202Smisaki 		    statsp->xpcs_ln3_symbol_err_cnt;
92114ea4bb7Ssd #endif
92244961713Sgirish 	}
92344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_xmac_stat_update"));
92444961713Sgirish 	return (0);
92544961713Sgirish }
92644961713Sgirish 
927a3c5bd6dSspeer /* ARGSUSED */
92844961713Sgirish int
nxge_bmac_stat_update(kstat_t * ksp,int rw)92944961713Sgirish nxge_bmac_stat_update(kstat_t *ksp, int rw)
93044961713Sgirish {
931a3c5bd6dSspeer 	p_nxge_t nxgep;
932a3c5bd6dSspeer 	p_nxge_bmac_kstat_t bmac_kstatsp;
933a3c5bd6dSspeer 	p_nxge_bmac_stats_t statsp;
93444961713Sgirish 
93544961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
93644961713Sgirish 	if (nxgep == NULL)
93744961713Sgirish 		return (-1);
93844961713Sgirish 
93944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_bmac_stat_update"));
94044961713Sgirish 
94144961713Sgirish 	bmac_kstatsp = (p_nxge_bmac_kstat_t)ksp->ks_data;
94244961713Sgirish 	statsp = (p_nxge_bmac_stats_t)&nxgep->statsp->bmac_stats;
94344961713Sgirish 
94444961713Sgirish 	if (rw == KSTAT_WRITE) {
94544961713Sgirish 		statsp->tx_frame_cnt = bmac_kstatsp->tx_frame_cnt.value.ul;
94644961713Sgirish 		statsp->tx_underrun_err =
94771cd5202Smisaki 		    bmac_kstatsp->tx_underrun_err.value.ul;
94844961713Sgirish 		statsp->tx_max_pkt_err = bmac_kstatsp->tx_max_pkt_err.value.ul;
94944961713Sgirish 		statsp->tx_byte_cnt = bmac_kstatsp->tx_byte_cnt.value.ul;
95044961713Sgirish 		statsp->rx_frame_cnt = bmac_kstatsp->rx_frame_cnt.value.ul;
95144961713Sgirish 		statsp->rx_byte_cnt = bmac_kstatsp->rx_byte_cnt.value.ul;
95244961713Sgirish 		statsp->rx_overflow_err =
95371cd5202Smisaki 		    bmac_kstatsp->rx_overflow_err.value.ul;
95444961713Sgirish 		statsp->rx_align_err_cnt =
95571cd5202Smisaki 		    bmac_kstatsp->rx_align_err_cnt.value.ul;
95644961713Sgirish 		statsp->rx_crc_err_cnt = bmac_kstatsp->rx_crc_err_cnt.value.ul;
95744961713Sgirish 		statsp->rx_len_err_cnt = bmac_kstatsp->rx_len_err_cnt.value.ul;
95844961713Sgirish 		statsp->rx_viol_err_cnt =
95971cd5202Smisaki 		    bmac_kstatsp->rx_viol_err_cnt.value.ul;
96044961713Sgirish 	} else {
96144961713Sgirish 		bmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
96244961713Sgirish 		bmac_kstatsp->tx_underrun_err.value.ul =
96371cd5202Smisaki 		    statsp->tx_underrun_err;
96444961713Sgirish 		bmac_kstatsp->tx_max_pkt_err.value.ul = statsp->tx_max_pkt_err;
96544961713Sgirish 		bmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
96644961713Sgirish 		bmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
96744961713Sgirish 		bmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
96844961713Sgirish 		bmac_kstatsp->rx_overflow_err.value.ul =
96971cd5202Smisaki 		    statsp->rx_overflow_err;
97044961713Sgirish 		bmac_kstatsp->rx_align_err_cnt.value.ul =
97171cd5202Smisaki 		    statsp->rx_align_err_cnt;
97244961713Sgirish 		bmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
97344961713Sgirish 		bmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
97444961713Sgirish 		bmac_kstatsp->rx_viol_err_cnt.value.ul =
97571cd5202Smisaki 		    statsp->rx_viol_err_cnt;
97644961713Sgirish 	}
97744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_bmac_stat_update"));
97844961713Sgirish 	return (0);
97944961713Sgirish }
98044961713Sgirish 
981a3c5bd6dSspeer /* ARGSUSED */
98244961713Sgirish int
nxge_zcp_stat_update(kstat_t * ksp,int rw)98344961713Sgirish nxge_zcp_stat_update(kstat_t *ksp, int rw)
98444961713Sgirish {
985a3c5bd6dSspeer 	p_nxge_t nxgep;
986a3c5bd6dSspeer 	p_nxge_zcp_kstat_t zcp_kstatsp;
987a3c5bd6dSspeer 	p_nxge_zcp_stats_t statsp;
98844961713Sgirish 
98944961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
99044961713Sgirish 	if (nxgep == NULL)
99144961713Sgirish 		return (-1);
99244961713Sgirish 
99344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_zcp_stat_update"));
99444961713Sgirish 
99544961713Sgirish 	zcp_kstatsp = (p_nxge_zcp_kstat_t)ksp->ks_data;
99644961713Sgirish 	statsp = (p_nxge_zcp_stats_t)&nxgep->statsp->zcp_stats;
99744961713Sgirish 
99844961713Sgirish 	if (rw == KSTAT_WRITE) {
99944961713Sgirish 		statsp->rrfifo_underrun = zcp_kstatsp->rrfifo_underrun.value.ul;
100044961713Sgirish 		statsp->rrfifo_overrun = zcp_kstatsp->rrfifo_overrun.value.ul;
100144961713Sgirish 		statsp->rspfifo_uncorr_err =
100271cd5202Smisaki 		    zcp_kstatsp->rspfifo_uncorr_err.value.ul;
100344961713Sgirish 		statsp->buffer_overflow = zcp_kstatsp->buffer_overflow.value.ul;
100444961713Sgirish 		statsp->stat_tbl_perr = zcp_kstatsp->stat_tbl_perr.value.ul;
100544961713Sgirish 		statsp->dyn_tbl_perr = zcp_kstatsp->dyn_tbl_perr.value.ul;
100644961713Sgirish 		statsp->buf_tbl_perr = zcp_kstatsp->buf_tbl_perr.value.ul;
100744961713Sgirish 		statsp->tt_program_err = zcp_kstatsp->tt_program_err.value.ul;
100844961713Sgirish 		statsp->rsp_tt_index_err =
100971cd5202Smisaki 		    zcp_kstatsp->rsp_tt_index_err.value.ul;
101044961713Sgirish 		statsp->slv_tt_index_err =
101171cd5202Smisaki 		    zcp_kstatsp->slv_tt_index_err.value.ul;
101244961713Sgirish 		statsp->zcp_tt_index_err =
101371cd5202Smisaki 		    zcp_kstatsp->zcp_tt_index_err.value.ul;
101444961713Sgirish 		statsp->cfifo_ecc = zcp_kstatsp->cfifo_ecc.value.ul;
101544961713Sgirish 	} else {
101644961713Sgirish 		zcp_kstatsp->rrfifo_underrun.value.ul = statsp->rrfifo_underrun;
101744961713Sgirish 		zcp_kstatsp->rrfifo_overrun.value.ul = statsp->rrfifo_overrun;
101844961713Sgirish 		zcp_kstatsp->rspfifo_uncorr_err.value.ul =
101971cd5202Smisaki 		    statsp->rspfifo_uncorr_err;
102044961713Sgirish 		zcp_kstatsp->buffer_overflow.value.ul =
102171cd5202Smisaki 		    statsp->buffer_overflow;
102244961713Sgirish 		zcp_kstatsp->stat_tbl_perr.value.ul = statsp->stat_tbl_perr;
102344961713Sgirish 		zcp_kstatsp->dyn_tbl_perr.value.ul = statsp->dyn_tbl_perr;
1024a3c5bd6dSspeer 		zcp_kstatsp->buf_tbl_perr.value.ul = statsp->buf_tbl_perr;
102544961713Sgirish 		zcp_kstatsp->tt_program_err.value.ul = statsp->tt_program_err;
102644961713Sgirish 		zcp_kstatsp->rsp_tt_index_err.value.ul =
102771cd5202Smisaki 		    statsp->rsp_tt_index_err;
102844961713Sgirish 		zcp_kstatsp->slv_tt_index_err.value.ul =
102971cd5202Smisaki 		    statsp->slv_tt_index_err;
103044961713Sgirish 		zcp_kstatsp->zcp_tt_index_err.value.ul =
103171cd5202Smisaki 		    statsp->zcp_tt_index_err;
1032a3c5bd6dSspeer 		zcp_kstatsp->cfifo_ecc.value.ul = statsp->cfifo_ecc;
103344961713Sgirish 	}
103444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_zcp_stat_update"));
103544961713Sgirish 	return (0);
103644961713Sgirish }
103744961713Sgirish 
1038a3c5bd6dSspeer /* ARGSUSED */
103944961713Sgirish int
nxge_fflp_stat_update(kstat_t * ksp,int rw)104044961713Sgirish nxge_fflp_stat_update(kstat_t *ksp, int rw)
104144961713Sgirish {
1042a3c5bd6dSspeer 	p_nxge_t nxgep;
1043a3c5bd6dSspeer 	p_nxge_fflp_kstat_t fflp_kstatsp;
1044a3c5bd6dSspeer 	p_nxge_fflp_stats_t statsp;
1045a3c5bd6dSspeer 	int ldc_grp;
104644961713Sgirish 
104744961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
104844961713Sgirish 	if (nxgep == NULL)
104944961713Sgirish 		return (-1);
105044961713Sgirish 
105144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_fflp_stat_update"));
105244961713Sgirish 
105344961713Sgirish 	fflp_kstatsp = (p_nxge_fflp_kstat_t)ksp->ks_data;
105444961713Sgirish 	statsp = (p_nxge_fflp_stats_t)&nxgep->statsp->fflp_stats;
105544961713Sgirish 
105644961713Sgirish 	if (rw == KSTAT_WRITE) {
105744961713Sgirish 		statsp->tcam_parity_err = fflp_kstatsp->fflp_tcam_perr.value.ul;
105844961713Sgirish 		statsp->tcam_ecc_err = fflp_kstatsp->fflp_tcam_ecc_err.value.ul;
105944961713Sgirish 		statsp->vlan_parity_err = fflp_kstatsp->fflp_vlan_perr.value.ul;
106044961713Sgirish 		statsp->hash_lookup_err =
106171cd5202Smisaki 		    fflp_kstatsp->fflp_hasht_lookup_err.value.ul;
106244961713Sgirish 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
106344961713Sgirish 			statsp->hash_pio_err[ldc_grp] =
106471cd5202Smisaki 			    fflp_kstatsp->fflp_hasht_data_err[ldc_grp].
106571cd5202Smisaki 			    value.ul;
106644961713Sgirish 		}
106744961713Sgirish 	} else {
106844961713Sgirish 		fflp_kstatsp->fflp_tcam_perr.value.ul =
106971cd5202Smisaki 		    fflp_kstatsp->fflp_tcam_perr.value.ul;
107044961713Sgirish 		fflp_kstatsp->fflp_tcam_ecc_err.value.ul = statsp->tcam_ecc_err;
107144961713Sgirish 		fflp_kstatsp->fflp_vlan_perr.value.ul = statsp->vlan_parity_err;
107244961713Sgirish 		fflp_kstatsp->fflp_hasht_lookup_err.value.ul =
107371cd5202Smisaki 		    statsp->hash_lookup_err;
107444961713Sgirish 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
107544961713Sgirish 			fflp_kstatsp->fflp_hasht_data_err[ldc_grp].value.ul =
107671cd5202Smisaki 			    statsp->hash_pio_err[ldc_grp];
107744961713Sgirish 		}
107844961713Sgirish 	}
107944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_fflp_stat_update"));
108044961713Sgirish 	return (0);
108144961713Sgirish }
108244961713Sgirish 
1083a3c5bd6dSspeer /* ARGSUSED */
108444961713Sgirish static uint64_t
nxge_mac_octet_to_u64(struct ether_addr addr)108544961713Sgirish nxge_mac_octet_to_u64(struct ether_addr addr)
108644961713Sgirish {
108744961713Sgirish 	int i;
108844961713Sgirish 	uint64_t addr64 = 0;
1089a3c5bd6dSspeer 
109044961713Sgirish 	for (i = ETHERADDRL - 1; i >= 0; i--) {
109144961713Sgirish 		addr64 <<= 8;
109244961713Sgirish 		addr64 |= addr.ether_addr_octet[i];
109344961713Sgirish 	}
109444961713Sgirish 	return (addr64);
109544961713Sgirish }
109644961713Sgirish 
1097a3c5bd6dSspeer /* ARGSUSED */
109844961713Sgirish int
nxge_mmac_stat_update(kstat_t * ksp,int rw)109944961713Sgirish nxge_mmac_stat_update(kstat_t *ksp, int rw)
110044961713Sgirish {
1101a3c5bd6dSspeer 	p_nxge_t nxgep;
1102a3c5bd6dSspeer 	p_nxge_mmac_kstat_t mmac_kstatsp;
1103a3c5bd6dSspeer 	p_nxge_mmac_stats_t statsp;
110444961713Sgirish 
110544961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
110644961713Sgirish 	if (nxgep == NULL)
110744961713Sgirish 		return (-1);
110844961713Sgirish 
110944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_mmac_stat_update"));
111044961713Sgirish 
111144961713Sgirish 	mmac_kstatsp = (p_nxge_mmac_kstat_t)ksp->ks_data;
111244961713Sgirish 	statsp = (p_nxge_mmac_stats_t)&nxgep->statsp->mmac_stats;
111344961713Sgirish 
111444961713Sgirish 	if (rw == KSTAT_WRITE) {
111544961713Sgirish 		cmn_err(CE_WARN, "Can not write mmac stats");
111644961713Sgirish 	} else {
111744961713Sgirish 		mmac_kstatsp->mmac_max_addr_cnt.value.ul =
111871cd5202Smisaki 		    statsp->mmac_max_cnt;
111944961713Sgirish 		mmac_kstatsp->mmac_avail_addr_cnt.value.ul =
112071cd5202Smisaki 		    statsp->mmac_avail_cnt;
112144961713Sgirish 		mmac_kstatsp->mmac_addr1.value.ul =
112271cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[0]);
112344961713Sgirish 		mmac_kstatsp->mmac_addr2.value.ul =
112471cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[1]);
112544961713Sgirish 		mmac_kstatsp->mmac_addr3.value.ul =
112671cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[2]);
112744961713Sgirish 		mmac_kstatsp->mmac_addr4.value.ul =
112871cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[3]);
112944961713Sgirish 		mmac_kstatsp->mmac_addr5.value.ul =
113071cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[4]);
113144961713Sgirish 		mmac_kstatsp->mmac_addr6.value.ul =
113271cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[5]);
113344961713Sgirish 		mmac_kstatsp->mmac_addr7.value.ul =
113471cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[6]);
113544961713Sgirish 		mmac_kstatsp->mmac_addr8.value.ul =
113671cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[7]);
113744961713Sgirish 		mmac_kstatsp->mmac_addr9.value.ul =
113871cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[8]);
113944961713Sgirish 		mmac_kstatsp->mmac_addr10.value.ul =
114071cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[9]);
114144961713Sgirish 		mmac_kstatsp->mmac_addr11.value.ul =
114271cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[10]);
114344961713Sgirish 		mmac_kstatsp->mmac_addr12.value.ul =
114471cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[11]);
114544961713Sgirish 		mmac_kstatsp->mmac_addr13.value.ul =
114671cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[12]);
114744961713Sgirish 		mmac_kstatsp->mmac_addr14.value.ul =
114871cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[13]);
114944961713Sgirish 		mmac_kstatsp->mmac_addr15.value.ul =
115071cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[14]);
115144961713Sgirish 		mmac_kstatsp->mmac_addr16.value.ul =
115271cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[15]);
115344961713Sgirish 	}
115444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_mmac_stat_update"));
115544961713Sgirish 	return (0);
115644961713Sgirish }
115744961713Sgirish 
1158a3c5bd6dSspeer /* ARGSUSED */
115944961713Sgirish static kstat_t *
nxge_setup_local_kstat(p_nxge_t nxgep,int instance,char * name,const nxge_kstat_index_t * ksip,size_t count,int (* update)(kstat_t *,int))116044961713Sgirish nxge_setup_local_kstat(p_nxge_t nxgep, int instance, char *name,
1161a3c5bd6dSspeer 	const nxge_kstat_index_t *ksip, size_t count,
1162a3c5bd6dSspeer 	int (*update) (kstat_t *, int))
116344961713Sgirish {
116444961713Sgirish 	kstat_t *ksp;
116544961713Sgirish 	kstat_named_t *knp;
116644961713Sgirish 	int i;
1167a3c5bd6dSspeer 
116844961713Sgirish 	ksp = kstat_create(NXGE_DRIVER_NAME, instance, name, "net",
116971cd5202Smisaki 	    KSTAT_TYPE_NAMED, count, 0);
117044961713Sgirish 	if (ksp == NULL)
117144961713Sgirish 		return (NULL);
117244961713Sgirish 
117344961713Sgirish 	ksp->ks_private = (void *)nxgep;
117444961713Sgirish 	ksp->ks_update = update;
117544961713Sgirish 	knp = ksp->ks_data;
117644961713Sgirish 
117744961713Sgirish 	for (i = 0; ksip[i].name != NULL; i++) {
117844961713Sgirish 		kstat_named_init(&knp[i], ksip[i].name, ksip[i].type);
117944961713Sgirish 	}
118044961713Sgirish 
118144961713Sgirish 	kstat_install(ksp);
118244961713Sgirish 	return (ksp);
118344961713Sgirish }
118444961713Sgirish 
1185a3c5bd6dSspeer /* ARGSUSED */
1186678453a8Sspeer void
nxge_setup_rdc_kstats(p_nxge_t nxgep,int channel)1187678453a8Sspeer nxge_setup_rdc_kstats(p_nxge_t nxgep, int channel)
1188678453a8Sspeer {
1189678453a8Sspeer 	char stat_name[64];
1190678453a8Sspeer 
1191678453a8Sspeer 	/* Setup RDC statistics */
1192678453a8Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
1193678453a8Sspeer 	    RDC_NAME_FORMAT1, channel);
1194678453a8Sspeer 	nxgep->statsp->rdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
1195678453a8Sspeer 	    nxgep->instance,
1196678453a8Sspeer 	    stat_name,
1197678453a8Sspeer 	    nxge_rdc_stats,
1198678453a8Sspeer 	    RDC_STAT_END,
1199678453a8Sspeer 	    nxge_rdc_stat_update);
1200678453a8Sspeer #ifdef	NXGE_DEBUG_ERROR
1201678453a8Sspeer 	if (nxgep->statsp->rdc_ksp[channel] == NULL)
1202678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
120371cd5202Smisaki 		    "kstat_create failed for rdc channel %d", channel));
1204678453a8Sspeer #endif
1205678453a8Sspeer }
1206678453a8Sspeer 
1207678453a8Sspeer void
nxge_setup_tdc_kstats(p_nxge_t nxgep,int channel)1208678453a8Sspeer nxge_setup_tdc_kstats(p_nxge_t nxgep, int channel)
1209678453a8Sspeer {
1210678453a8Sspeer 	char stat_name[64];
1211678453a8Sspeer 
1212678453a8Sspeer 	/* Setup TDC statistics */
1213678453a8Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
1214678453a8Sspeer 	    TDC_NAME_FORMAT1, channel);
1215678453a8Sspeer 	nxgep->statsp->tdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
1216678453a8Sspeer 	    nxgep->instance,
1217678453a8Sspeer 	    stat_name,
1218678453a8Sspeer 	    nxge_tdc_stats,
1219678453a8Sspeer 	    TDC_STAT_END,
1220678453a8Sspeer 	    nxge_tdc_stat_update);
1221678453a8Sspeer #ifdef	NXGE_DEBUG_ERROR
1222678453a8Sspeer 	if (nxgep->statsp->tdc_ksp[channel] == NULL) {
1223678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
122471cd5202Smisaki 		    "kstat_create failed for tdc channel %d", channel));
1225678453a8Sspeer 	}
1226678453a8Sspeer #endif
1227678453a8Sspeer }
1228678453a8Sspeer 
122944961713Sgirish void
nxge_setup_kstats(p_nxge_t nxgep)123044961713Sgirish nxge_setup_kstats(p_nxge_t nxgep)
123144961713Sgirish {
123244961713Sgirish 	struct kstat *ksp;
123344961713Sgirish 	p_nxge_port_kstat_t nxgekp;
123444961713Sgirish 	size_t nxge_kstat_sz;
123544961713Sgirish 	char mmac_name[64];
1236a3c5bd6dSspeer 
123744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_setup_kstats"));
123844961713Sgirish 
123944961713Sgirish 	/* Setup RDC System statistics */
124044961713Sgirish 	nxgep->statsp->rdc_sys_ksp = nxge_setup_local_kstat(nxgep,
124171cd5202Smisaki 	    nxgep->instance,
124271cd5202Smisaki 	    "RDC System Stats",
124371cd5202Smisaki 	    &nxge_rdc_sys_stats[0],
124471cd5202Smisaki 	    RDC_SYS_STAT_END,
124571cd5202Smisaki 	    nxge_rdc_sys_stat_update);
124644961713Sgirish 
124744961713Sgirish 	/* Setup IPP statistics */
124844961713Sgirish 	nxgep->statsp->ipp_ksp = nxge_setup_local_kstat(nxgep,
124971cd5202Smisaki 	    nxgep->instance,
125071cd5202Smisaki 	    "IPP Stats",
125171cd5202Smisaki 	    &nxge_ipp_stats[0],
125271cd5202Smisaki 	    IPP_STAT_END,
125371cd5202Smisaki 	    nxge_ipp_stat_update);
125444961713Sgirish #ifdef	NXGE_DEBUG_ERROR
125544961713Sgirish 	if (nxgep->istatsp->pp_ksp == NULL)
125644961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for ipp"));
125744961713Sgirish #endif
125844961713Sgirish 
125944961713Sgirish 	/* Setup TXC statistics */
126044961713Sgirish 	nxgep->statsp->txc_ksp = nxge_setup_local_kstat(nxgep,
126171cd5202Smisaki 	    nxgep->instance, "TXC Stats", &nxge_txc_stats[0],
126271cd5202Smisaki 	    TXC_STAT_END, nxge_txc_stat_update);
126344961713Sgirish #ifdef	NXGE_DEBUG_ERROR
126444961713Sgirish 	if (nxgep->statsp->txc_ksp == NULL)
126544961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for txc"));
126644961713Sgirish #endif
126744961713Sgirish 
126844961713Sgirish 	/* Setup ZCP statistics */
126944961713Sgirish 	nxgep->statsp->zcp_ksp = nxge_setup_local_kstat(nxgep,
127071cd5202Smisaki 	    nxgep->instance, "ZCP Stats", &nxge_zcp_stats[0],
127171cd5202Smisaki 	    ZCP_STAT_END, nxge_zcp_stat_update);
127244961713Sgirish #ifdef	NXGE_DEBUG_ERROR
127344961713Sgirish 	if (nxgep->statsp->zcp_ksp == NULL)
127444961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for zcp"));
127544961713Sgirish #endif
127644961713Sgirish 
127744961713Sgirish 	/* Setup FFLP statistics */
127844961713Sgirish 	nxgep->statsp->fflp_ksp[0] = nxge_setup_local_kstat(nxgep,
127971cd5202Smisaki 	    nxgep->instance, "FFLP Stats", &nxge_fflp_stats[0],
128071cd5202Smisaki 	    FFLP_STAT_END, nxge_fflp_stat_update);
128144961713Sgirish 
128244961713Sgirish #ifdef	NXGE_DEBUG_ERROR
128344961713Sgirish 	if (nxgep->statsp->fflp_ksp == NULL)
128444961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
128571cd5202Smisaki 		    "kstat_create failed for fflp"));
128644961713Sgirish #endif
128744961713Sgirish 
128844961713Sgirish 	(void) sprintf(mmac_name, "MMAC Stats%d", nxgep->instance);
128944961713Sgirish 	nxgep->statsp->mmac_ksp = nxge_setup_local_kstat(nxgep,
129071cd5202Smisaki 	    nxgep->instance, "MMAC Stats", &nxge_mmac_stats[0],
129171cd5202Smisaki 	    MMAC_STATS_END, nxge_mmac_stat_update);
129244961713Sgirish 
129344961713Sgirish 	nxge_kstat_sz = sizeof (nxge_port_kstat_t) +
129471cd5202Smisaki 	    sizeof (nxge_mac_kstat_t) - sizeof (kstat_named_t);
129544961713Sgirish 
129644961713Sgirish 	if ((ksp = kstat_create(NXGE_DRIVER_NAME, nxgep->instance,
129771cd5202Smisaki 	    "Port Stats", "net", KSTAT_TYPE_NAMED,
129871cd5202Smisaki 	    nxge_kstat_sz / sizeof (kstat_named_t), 0)) == NULL) {
129944961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed"));
130044961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
130144961713Sgirish 		return;
130244961713Sgirish 	}
130344961713Sgirish 
130444961713Sgirish 	/*
1305a3c5bd6dSspeer 	 * kstats
130644961713Sgirish 	 */
1307a3c5bd6dSspeer 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
130844961713Sgirish 
130944961713Sgirish 	/*
131044961713Sgirish 	 * transceiver state informations.
131144961713Sgirish 	 */
1312a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_inits, "xcvr_inits",
131371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1314a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_inuse, "xcvr_inuse",
131571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1316a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_addr, "xcvr_addr",
131771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1318a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_id, "xcvr_id",
131971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1320a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_autoneg, "cap_autoneg",
132171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1322a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10gfdx, "cap_10gfdx",
132371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1324a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10ghdx, "cap_10ghdx",
132571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1326a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_1000fdx, "cap_1000fdx",
132771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1328a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_1000hdx, "cap_1000hdx",
132971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1330a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100T4, "cap_100T4",
133171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1332a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100fdx, "cap_100fdx",
133371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1334a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100hdx, "cap_100hdx",
133571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1336a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10fdx, "cap_10fdx",
133771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1338a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10hdx, "cap_10hdx",
133971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1340a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_asmpause, "cap_asmpause",
134171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1342a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_pause, "cap_pause",
134371cd5202Smisaki 	    KSTAT_DATA_ULONG);
134444961713Sgirish 
134544961713Sgirish 	/*
134644961713Sgirish 	 * Link partner capabilities.
134744961713Sgirish 	 */
1348a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_autoneg, "lp_cap_autoneg",
134971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1350a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10gfdx, "lp_cap_10gfdx",
135171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1352a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10ghdx, "lp_cap_10ghdx",
135371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1354a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_1000fdx, "lp_cap_1000fdx",
135571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1356a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_1000hdx, "lp_cap_1000hdx",
135771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1358a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100T4, "lp_cap_100T4",
135971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1360a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100fdx, "lp_cap_100fdx",
136171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1362a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100hdx, "lp_cap_100hdx",
136371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1364a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10fdx, "lp_cap_10fdx",
136571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1366a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10hdx, "lp_cap_10hdx",
136771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1368a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_asmpause, "lp_cap_asmpause",
136971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1370a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_pause, "lp_cap_pause",
137171cd5202Smisaki 	    KSTAT_DATA_ULONG);
137244961713Sgirish 	/*
137344961713Sgirish 	 * Shared link setup.
137444961713Sgirish 	 */
1375a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_T4, "link_T4",
137671cd5202Smisaki 	    KSTAT_DATA_ULONG);
1377a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_speed, "link_speed",
137871cd5202Smisaki 	    KSTAT_DATA_ULONG);
1379a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_duplex, "link_duplex",
138071cd5202Smisaki 	    KSTAT_DATA_CHAR);
1381a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_asmpause, "link_asmpause",
138271cd5202Smisaki 	    KSTAT_DATA_ULONG);
1383a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_pause, "link_pause",
138471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1385a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_up, "link_up",
138671cd5202Smisaki 	    KSTAT_DATA_ULONG);
138744961713Sgirish 
138844961713Sgirish 	/*
1389a3c5bd6dSspeer 	 * Let the user know the MTU currently in use by the physical MAC
1390a3c5bd6dSspeer 	 * port.
139144961713Sgirish 	 */
1392a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mac_mtu, "mac_mtu",
139371cd5202Smisaki 	    KSTAT_DATA_ULONG);
139444961713Sgirish 
139544961713Sgirish 	/*
139644961713Sgirish 	 * Loopback statistics.
139744961713Sgirish 	 */
1398a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lb_mode, "lb_mode",
139971cd5202Smisaki 	    KSTAT_DATA_ULONG);
140044961713Sgirish 
140144961713Sgirish 	/*
1402a3c5bd6dSspeer 	 * This tells the user whether the driver is in QOS mode or not.
140344961713Sgirish 	 */
1404a3c5bd6dSspeer 	kstat_named_init(&nxgekp->qos_mode, "qos_mode",
140571cd5202Smisaki 	    KSTAT_DATA_ULONG);
140644961713Sgirish 
140744961713Sgirish 	/*
140844961713Sgirish 	 * This tells whether the instance is trunked or not
140944961713Sgirish 	 */
1410a3c5bd6dSspeer 	kstat_named_init(&nxgekp->trunk_mode, "trunk_mode",
141171cd5202Smisaki 	    KSTAT_DATA_ULONG);
141244961713Sgirish 
141344961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1414a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_reqs, "mdt_reqs",
141571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1416a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdr_bufs, "mdt_hdr_bufs",
141771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1418a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pld_bufs, "mdt_pld_bufs",
141971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1420a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pkts, "mdt_pkts",
142171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1422a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdrs, "mdt_hdrs",
142371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1424a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_plds, "mdt_plds",
142571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1426a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdr_bind_fail, "mdt_hdr_bind_fail",
142771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1428a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pld_bind_fail, "mdt_pld_bind_fail",
142971cd5202Smisaki 	    KSTAT_DATA_ULONG);
143044961713Sgirish #endif
1431321febdeSsbehera #ifdef ACCEPT_JUMBO
1432a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_jumbo_pkts, "tx_jumbo_pkts",
143371cd5202Smisaki 	    KSTAT_DATA_ULONG);
143444961713Sgirish #endif
143544961713Sgirish 
143644961713Sgirish 	/*
143744961713Sgirish 	 * Rx Statistics.
143844961713Sgirish 	 */
1439321febdeSsbehera #ifdef ACCEPT_JUMBO
1440a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_jumbo_pkts, "rx_jumbo_pkts",
144171cd5202Smisaki 	    KSTAT_DATA_ULONG);
144244961713Sgirish #endif
144344961713Sgirish 	/* General MAC statistics */
1444a3c5bd6dSspeer 	kstat_named_init(&nxgekp->ifspeed, "ifspeed",
144571cd5202Smisaki 	    KSTAT_DATA_UINT64);
1446a3c5bd6dSspeer 	kstat_named_init(&nxgekp->promisc, "promisc",
144771cd5202Smisaki 	    KSTAT_DATA_CHAR);
1448a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rev_id, "rev_id",
144971cd5202Smisaki 	    KSTAT_DATA_ULONG);
145044961713Sgirish 
145144961713Sgirish 	ksp->ks_update = nxge_port_kstat_update;
145244961713Sgirish 	ksp->ks_private = (void *) nxgep;
145344961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC)
145444961713Sgirish 		nxge_xmac_init_kstats(ksp);
145544961713Sgirish 	else
145644961713Sgirish 		nxge_bmac_init_kstats(ksp);
145744961713Sgirish 	kstat_install(ksp);
145844961713Sgirish 	nxgep->statsp->port_ksp = ksp;
145944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
146044961713Sgirish }
146144961713Sgirish 
1462a3c5bd6dSspeer /* ARGSUSED */
146344961713Sgirish void
nxge_xmac_init_kstats(struct kstat * ksp)146444961713Sgirish nxge_xmac_init_kstats(struct kstat *ksp)
146544961713Sgirish {
1466a3c5bd6dSspeer 	p_nxge_xmac_kstat_t nxgekp;
146744961713Sgirish 
146844961713Sgirish 	nxgekp = (p_nxge_xmac_kstat_t)ksp->ks_data;
146944961713Sgirish 
147044961713Sgirish 	/*
147144961713Sgirish 	 * Transmit MAC statistics.
147244961713Sgirish 	 */
1473a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
147471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1475a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
147671cd5202Smisaki 	    KSTAT_DATA_ULONG);
1477a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
147871cd5202Smisaki 	    KSTAT_DATA_ULONG);
1479a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
148071cd5202Smisaki 	    KSTAT_DATA_ULONG);
1481a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
148271cd5202Smisaki 	    KSTAT_DATA_ULONG);
1483a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
148471cd5202Smisaki 	    KSTAT_DATA_ULONG);
148544961713Sgirish 
148644961713Sgirish 	/* Receive MAC statistics */
1487321febdeSsbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
1488321febdeSsbehera 	    KSTAT_DATA_ULONG);
1489a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
149071cd5202Smisaki 	    KSTAT_DATA_ULONG);
1491a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
149271cd5202Smisaki 	    KSTAT_DATA_ULONG);
1493a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
149471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1495a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
149671cd5202Smisaki 	    KSTAT_DATA_ULONG);
1497a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
149871cd5202Smisaki 	    KSTAT_DATA_ULONG);
1499a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
150071cd5202Smisaki 	    KSTAT_DATA_ULONG);
150144961713Sgirish 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
150271cd5202Smisaki 	    "rxmac_alignment_err",
150371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1504a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
150571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1506a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
150771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1508a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
150971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1510a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
151171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1512a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
151371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1514a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
151571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1516321febdeSsbehera 	kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
1517321febdeSsbehera 	    KSTAT_DATA_ULONG);
1518a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_broadcast_cnt, "rxmac_broadcast_cnt",
151971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1520a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
152171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1522a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
152371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1524a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_linkfault_err_cnt, "rxmac_linkfault_errs",
152571cd5202Smisaki 	    KSTAT_DATA_ULONG);
152644961713Sgirish 	kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
152771cd5202Smisaki 	    "rxmac_remote_faults",
152871cd5202Smisaki 	    KSTAT_DATA_ULONG);
152944961713Sgirish 	kstat_named_init(&nxgekp->rx_local_fault_err_cnt, "rxmac_local_faults",
153071cd5202Smisaki 	    KSTAT_DATA_ULONG);
153144961713Sgirish 
153244961713Sgirish 	/* XPCS statistics */
153344961713Sgirish 
1534a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xpcs_deskew_err_cnt, "xpcs_deskew_err_cnt",
153571cd5202Smisaki 	    KSTAT_DATA_ULONG);
153614ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
153744961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln0_symbol_err_cnt,
153871cd5202Smisaki 	    "xpcs_ln0_symbol_err_cnt",
153971cd5202Smisaki 	    KSTAT_DATA_ULONG);
154044961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln1_symbol_err_cnt,
154171cd5202Smisaki 	    "xpcs_ln1_symbol_err_cnt",
154271cd5202Smisaki 	    KSTAT_DATA_ULONG);
154344961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln2_symbol_err_cnt,
154471cd5202Smisaki 	    "xpcs_ln2_symbol_err_cnt",
154571cd5202Smisaki 	    KSTAT_DATA_ULONG);
154644961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln3_symbol_err_cnt,
154771cd5202Smisaki 	    "xpcs_ln3_symbol_err_cnt",
154871cd5202Smisaki 	    KSTAT_DATA_ULONG);
154914ea4bb7Ssd #endif
155044961713Sgirish }
155144961713Sgirish 
1552a3c5bd6dSspeer /* ARGSUSED */
155344961713Sgirish void
nxge_bmac_init_kstats(struct kstat * ksp)155444961713Sgirish nxge_bmac_init_kstats(struct kstat *ksp)
155544961713Sgirish {
1556a3c5bd6dSspeer 	p_nxge_bmac_kstat_t nxgekp;
155744961713Sgirish 
155844961713Sgirish 	nxgekp = (p_nxge_bmac_kstat_t)ksp->ks_data;
155944961713Sgirish 
156044961713Sgirish 	/*
156144961713Sgirish 	 * Transmit MAC statistics.
156244961713Sgirish 	 */
1563a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
156471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1565a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underrun_err, "txmac_underflow_err",
156671cd5202Smisaki 	    KSTAT_DATA_ULONG);
1567a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_max_pkt_err, "txmac_maxpktsize_err",
156871cd5202Smisaki 	    KSTAT_DATA_ULONG);
1569a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
157071cd5202Smisaki 	    KSTAT_DATA_ULONG);
157144961713Sgirish 
157244961713Sgirish 	/* Receive MAC statistics */
1573a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
157471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1575a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
157671cd5202Smisaki 	    KSTAT_DATA_ULONG);
1577a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
157871cd5202Smisaki 	    KSTAT_DATA_ULONG);
1579a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
158071cd5202Smisaki 	    KSTAT_DATA_ULONG);
1581a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
158271cd5202Smisaki 	    KSTAT_DATA_ULONG);
1583a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_align_err_cnt, "rxmac_alignment_err",
158471cd5202Smisaki 	    KSTAT_DATA_ULONG);
1585a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
158671cd5202Smisaki 	    KSTAT_DATA_ULONG);
158744961713Sgirish }
158844961713Sgirish 
1589a3c5bd6dSspeer /* ARGSUSED */
159044961713Sgirish void
nxge_mac_init_kstats(p_nxge_t nxgep,struct kstat * ksp)159144961713Sgirish nxge_mac_init_kstats(p_nxge_t nxgep, struct kstat *ksp)
159244961713Sgirish {
1593a3c5bd6dSspeer 	p_nxge_mac_kstat_t nxgekp;
159444961713Sgirish 
159544961713Sgirish 	nxgekp = (p_nxge_mac_kstat_t)ksp->ks_data;
159644961713Sgirish 
159744961713Sgirish 	/*
159844961713Sgirish 	 * Transmit MAC statistics.
159944961713Sgirish 	 */
1600a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
160171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1602a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
160371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1604a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
160571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1606a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
160771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1608a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
160971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1610a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
161171cd5202Smisaki 	    KSTAT_DATA_ULONG);
161244961713Sgirish 
1613a3c5bd6dSspeer 	/*
1614a3c5bd6dSspeer 	 * Receive MAC statistics
1615a3c5bd6dSspeer 	 */
1616a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
161771cd5202Smisaki 	    KSTAT_DATA_ULONG);
1618a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
161971cd5202Smisaki 	    KSTAT_DATA_ULONG);
1620a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
162171cd5202Smisaki 	    KSTAT_DATA_ULONG);
1622a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
162371cd5202Smisaki 	    KSTAT_DATA_ULONG);
1624a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
162571cd5202Smisaki 	    KSTAT_DATA_ULONG);
1626a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
162771cd5202Smisaki 	    KSTAT_DATA_ULONG);
162844961713Sgirish 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
162971cd5202Smisaki 	    "rxmac_alignment_err",
163071cd5202Smisaki 	    KSTAT_DATA_ULONG);
1631321febdeSsbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
1632321febdeSsbehera 	    KSTAT_DATA_ULONG);
163344961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
163444961713Sgirish 		kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
163571cd5202Smisaki 		    KSTAT_DATA_ULONG);
163644961713Sgirish 		kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
163771cd5202Smisaki 		    KSTAT_DATA_ULONG);
163844961713Sgirish 		kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
163971cd5202Smisaki 		    KSTAT_DATA_ULONG);
164044961713Sgirish 		kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
164171cd5202Smisaki 		    KSTAT_DATA_ULONG);
164244961713Sgirish 		kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
164371cd5202Smisaki 		    KSTAT_DATA_ULONG);
1644a3c5bd6dSspeer 		kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
164571cd5202Smisaki 		    KSTAT_DATA_ULONG);
1646321febdeSsbehera 		kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
1647321febdeSsbehera 		    KSTAT_DATA_ULONG);
164844961713Sgirish 		kstat_named_init(&nxgekp->rx_broadcast_cnt,
164971cd5202Smisaki 		    "rxmac_broadcast_cnt",
165071cd5202Smisaki 		    KSTAT_DATA_ULONG);
165144961713Sgirish 		kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
165271cd5202Smisaki 		    KSTAT_DATA_ULONG);
165344961713Sgirish 		kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
165471cd5202Smisaki 		    KSTAT_DATA_ULONG);
165544961713Sgirish 		kstat_named_init(&nxgekp->rx_linkfault_err_cnt,
165671cd5202Smisaki 		    "rxmac_linkfault_errs",
165771cd5202Smisaki 		    KSTAT_DATA_ULONG);
165844961713Sgirish 		kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
165971cd5202Smisaki 		    "rxmac_remote_faults",
166071cd5202Smisaki 		    KSTAT_DATA_ULONG);
166144961713Sgirish 		kstat_named_init(&nxgekp->rx_local_fault_err_cnt,
166271cd5202Smisaki 		    "rxmac_local_faults",
166371cd5202Smisaki 		    KSTAT_DATA_ULONG);
166444961713Sgirish 	}
166544961713Sgirish }
166644961713Sgirish 
1667a3c5bd6dSspeer /* ARGSUSED */
166844961713Sgirish void
nxge_destroy_kstats(p_nxge_t nxgep)166944961713Sgirish nxge_destroy_kstats(p_nxge_t nxgep)
167044961713Sgirish {
167144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_destroy_kstats"));
1672a3c5bd6dSspeer 
1673a3c5bd6dSspeer 	if (nxgep->statsp == NULL)
167444961713Sgirish 		return;
1675a3c5bd6dSspeer 	if (nxgep->statsp->ksp)
167644961713Sgirish 		kstat_delete(nxgep->statsp->ksp);
167744961713Sgirish 
167844961713Sgirish 	if (nxgep->statsp->rdc_sys_ksp)
167944961713Sgirish 		kstat_delete(nxgep->statsp->rdc_sys_ksp);
1680a3c5bd6dSspeer 	if (nxgep->statsp->fflp_ksp[0])
168144961713Sgirish 		kstat_delete(nxgep->statsp->fflp_ksp[0]);
168244961713Sgirish 	if (nxgep->statsp->ipp_ksp)
168344961713Sgirish 		kstat_delete(nxgep->statsp->ipp_ksp);
168444961713Sgirish 	if (nxgep->statsp->txc_ksp)
168544961713Sgirish 		kstat_delete(nxgep->statsp->txc_ksp);
168644961713Sgirish 	if (nxgep->statsp->mac_ksp)
168744961713Sgirish 		kstat_delete(nxgep->statsp->mac_ksp);
168844961713Sgirish 	if (nxgep->statsp->zcp_ksp)
168944961713Sgirish 		kstat_delete(nxgep->statsp->zcp_ksp);
169044961713Sgirish 	if (nxgep->statsp->port_ksp)
169144961713Sgirish 		kstat_delete(nxgep->statsp->port_ksp);
169244961713Sgirish 	if (nxgep->statsp->mmac_ksp)
169344961713Sgirish 		kstat_delete(nxgep->statsp->mmac_ksp);
1694a3c5bd6dSspeer 	if (nxgep->statsp)
169544961713Sgirish 		KMEM_FREE(nxgep->statsp, nxgep->statsp->stats_size);
1696a3c5bd6dSspeer 
169744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_destroy_kstats"));
169844961713Sgirish }
169944961713Sgirish 
1700a3c5bd6dSspeer /* ARGSUSED */
170144961713Sgirish int
nxge_port_kstat_update(kstat_t * ksp,int rw)170244961713Sgirish nxge_port_kstat_update(kstat_t *ksp, int rw)
170344961713Sgirish {
170444961713Sgirish 	p_nxge_t nxgep;
170544961713Sgirish 	p_nxge_stats_t statsp;
170644961713Sgirish 	p_nxge_port_kstat_t nxgekp;
1707a3c5bd6dSspeer 
170844961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
170944961713Sgirish 	if (nxgep == NULL)
171044961713Sgirish 		return (-1);
171144961713Sgirish 
171244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_port_kstat_update"));
171344961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
171444961713Sgirish 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
171544961713Sgirish 	nxge_save_cntrs(nxgep);
171644961713Sgirish 
171744961713Sgirish 	if (rw == KSTAT_WRITE) {
171844961713Sgirish 		/*
171944961713Sgirish 		 * transceiver state informations.
172044961713Sgirish 		 */
1721a3c5bd6dSspeer 		statsp->mac_stats.xcvr_inits = nxgekp->xcvr_inits.value.ul;
172244961713Sgirish 
172344961713Sgirish 		/*
172444961713Sgirish 		 * Tx Statistics.
172544961713Sgirish 		 */
172644961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1727a3c5bd6dSspeer 		statsp->port_stats.mdt_reqs = nxgekp->mdt_reqs.value.ul;
1728a3c5bd6dSspeer 		statsp->port_stats.mdt_hdr_bufs = nxgekp->mdt_hdr_bufs.value.ul;
1729a3c5bd6dSspeer 		statsp->port_stats.mdt_pld_bufs = nxgekp->mdt_pld_bufs.value.ul;
1730a3c5bd6dSspeer 		statsp->port_stats.mdt_pkts = nxgekp->mdt_pkts.value.ul;
1731a3c5bd6dSspeer 		statsp->port_stats.mdt_hdrs = nxgekp->mdt_hdrs.value.ul;
1732a3c5bd6dSspeer 		statsp->port_stats.mdt_plds = nxgekp->mdt_plds.value.ul;
173344961713Sgirish 		statsp->port_stats.mdt_hdr_bind_fail =
173471cd5202Smisaki 		    nxgekp->mdt_hdr_bind_fail.value.ul;
173544961713Sgirish 		statsp->port_stats.mdt_pld_bind_fail =
173671cd5202Smisaki 		    nxgekp->mdt_pld_bind_fail.value.ul;
173744961713Sgirish #endif
173844961713Sgirish #ifdef ACCEPT_JUMBO
173944961713Sgirish 		statsp->port_stats.tx_jumbo_pkts =
174071cd5202Smisaki 		    nxgekp->tx_jumbo_pkts.value.ul;
174144961713Sgirish #endif
174244961713Sgirish 		/*
174344961713Sgirish 		 * Rx Statistics.
174444961713Sgirish 		 */
1745321febdeSsbehera #ifdef ACCEPT_JUMBO
174644961713Sgirish 		statsp->port_stats.rx_jumbo_pkts =
174771cd5202Smisaki 		    nxgekp->rx_jumbo_pkts.value.ul;
174844961713Sgirish #endif
1749321febdeSsbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
1750321febdeSsbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_WRITE);
1751321febdeSsbehera 		} else {
1752321febdeSsbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_WRITE);
1753321febdeSsbehera 		}
175444961713Sgirish 		return (0);
175544961713Sgirish 	} else {
175644961713Sgirish 		if (nxgep->filter.all_phys_cnt)
175744961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "phys");
175844961713Sgirish 		else if (nxgep->filter.all_multicast_cnt)
175944961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "multi");
176044961713Sgirish 		else
176144961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "off");
1762a3c5bd6dSspeer 		nxgekp->ifspeed.value.ul =
176371cd5202Smisaki 		    statsp->mac_stats.link_speed * 1000000ULL;
1764a3c5bd6dSspeer 		nxgekp->rev_id.value.ul = statsp->mac_stats.rev_id;
176544961713Sgirish 
176644961713Sgirish 		/*
176744961713Sgirish 		 * transceiver state informations.
176844961713Sgirish 		 */
1769a3c5bd6dSspeer 		nxgekp->xcvr_inits.value.ul = statsp->mac_stats.xcvr_inits;
1770a3c5bd6dSspeer 		nxgekp->xcvr_inuse.value.ul = statsp->mac_stats.xcvr_inuse;
1771a3c5bd6dSspeer 		nxgekp->xcvr_addr.value.ul = statsp->mac_stats.xcvr_portn;
1772a3c5bd6dSspeer 		nxgekp->xcvr_id.value.ul = statsp->mac_stats.xcvr_id;
1773a3c5bd6dSspeer 		nxgekp->cap_autoneg.value.ul = statsp->mac_stats.cap_autoneg;
1774a3c5bd6dSspeer 		nxgekp->cap_10gfdx.value.ul = statsp->mac_stats.cap_10gfdx;
1775a3c5bd6dSspeer 		nxgekp->cap_10ghdx.value.ul = statsp->mac_stats.cap_10ghdx;
1776a3c5bd6dSspeer 		nxgekp->cap_1000fdx.value.ul = statsp->mac_stats.cap_1000fdx;
1777a3c5bd6dSspeer 		nxgekp->cap_1000hdx.value.ul = statsp->mac_stats.cap_1000hdx;
1778a3c5bd6dSspeer 		nxgekp->cap_100T4.value.ul = statsp->mac_stats.cap_100T4;
1779a3c5bd6dSspeer 		nxgekp->cap_100fdx.value.ul = statsp->mac_stats.cap_100fdx;
1780a3c5bd6dSspeer 		nxgekp->cap_100hdx.value.ul = statsp->mac_stats.cap_100hdx;
1781a3c5bd6dSspeer 		nxgekp->cap_10fdx.value.ul = statsp->mac_stats.cap_10fdx;
1782a3c5bd6dSspeer 		nxgekp->cap_10hdx.value.ul = statsp->mac_stats.cap_10hdx;
1783a3c5bd6dSspeer 		nxgekp->cap_asmpause.value.ul =
178471cd5202Smisaki 		    statsp->mac_stats.cap_asmpause;
1785a3c5bd6dSspeer 		nxgekp->cap_pause.value.ul = statsp->mac_stats.cap_pause;
178644961713Sgirish 
178744961713Sgirish 		/*
178844961713Sgirish 		 * Link partner capabilities.
178944961713Sgirish 		 */
1790a3c5bd6dSspeer 		nxgekp->lp_cap_autoneg.value.ul =
179171cd5202Smisaki 		    statsp->mac_stats.lp_cap_autoneg;
179244961713Sgirish 		nxgekp->lp_cap_10gfdx.value.ul =
179371cd5202Smisaki 		    statsp->mac_stats.lp_cap_10gfdx;
179444961713Sgirish 		nxgekp->lp_cap_10ghdx.value.ul =
179571cd5202Smisaki 		    statsp->mac_stats.lp_cap_10ghdx;
1796a3c5bd6dSspeer 		nxgekp->lp_cap_1000fdx.value.ul =
179771cd5202Smisaki 		    statsp->mac_stats.lp_cap_1000fdx;
1798a3c5bd6dSspeer 		nxgekp->lp_cap_1000hdx.value.ul =
179971cd5202Smisaki 		    statsp->mac_stats.lp_cap_1000hdx;
1800a3c5bd6dSspeer 		nxgekp->lp_cap_100T4.value.ul =
180171cd5202Smisaki 		    statsp->mac_stats.lp_cap_100T4;
1802a3c5bd6dSspeer 		nxgekp->lp_cap_100fdx.value.ul =
180371cd5202Smisaki 		    statsp->mac_stats.lp_cap_100fdx;
1804a3c5bd6dSspeer 		nxgekp->lp_cap_100hdx.value.ul =
180571cd5202Smisaki 		    statsp->mac_stats.lp_cap_100hdx;
1806a3c5bd6dSspeer 		nxgekp->lp_cap_10fdx.value.ul =
180771cd5202Smisaki 		    statsp->mac_stats.lp_cap_10fdx;
1808a3c5bd6dSspeer 		nxgekp->lp_cap_10hdx.value.ul =
180971cd5202Smisaki 		    statsp->mac_stats.lp_cap_10hdx;
181044961713Sgirish 		nxgekp->lp_cap_asmpause.value.ul =
181171cd5202Smisaki 		    statsp->mac_stats.lp_cap_asmpause;
1812a3c5bd6dSspeer 		nxgekp->lp_cap_pause.value.ul =
181371cd5202Smisaki 		    statsp->mac_stats.lp_cap_pause;
181444961713Sgirish 
181544961713Sgirish 		/*
181644961713Sgirish 		 * Physical link statistics.
181744961713Sgirish 		 */
1818a3c5bd6dSspeer 		nxgekp->link_T4.value.ul = statsp->mac_stats.link_T4;
1819a3c5bd6dSspeer 		nxgekp->link_speed.value.ul = statsp->mac_stats.link_speed;
182044961713Sgirish 		if (statsp->mac_stats.link_duplex == 2)
182144961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "full");
182244961713Sgirish 		else if (statsp->mac_stats.link_duplex == 1)
182344961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "half");
182444961713Sgirish 		else
182544961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "unknown");
1826a3c5bd6dSspeer 		nxgekp->link_asmpause.value.ul =
182771cd5202Smisaki 		    statsp->mac_stats.link_asmpause;
1828a3c5bd6dSspeer 		nxgekp->link_pause.value.ul = statsp->mac_stats.link_pause;
1829a3c5bd6dSspeer 		nxgekp->link_up.value.ul = statsp->mac_stats.link_up;
183044961713Sgirish 
183144961713Sgirish 		/*
1832a3c5bd6dSspeer 		 * Lets the user know the MTU currently in use by the physical
1833a3c5bd6dSspeer 		 * MAC port.
183444961713Sgirish 		 */
1835a3c5bd6dSspeer 		nxgekp->mac_mtu.value.ul = statsp->mac_stats.mac_mtu;
183644961713Sgirish 
183744961713Sgirish 		/*
183844961713Sgirish 		 * Loopback statistics.
183944961713Sgirish 		 */
1840a3c5bd6dSspeer 		nxgekp->lb_mode.value.ul = statsp->port_stats.lb_mode;
184144961713Sgirish 
184244961713Sgirish 		/*
1843a3c5bd6dSspeer 		 * This tells the user whether the driver is in QOS mode or
1844a3c5bd6dSspeer 		 * not.
184544961713Sgirish 		 */
1846a3c5bd6dSspeer 		nxgekp->qos_mode.value.ul = statsp->port_stats.qos_mode;
184744961713Sgirish 
184844961713Sgirish 		/*
184944961713Sgirish 		 * This tells whether the instance is trunked or not
185044961713Sgirish 		 */
1851a3c5bd6dSspeer 		nxgekp->trunk_mode.value.ul = statsp->port_stats.trunk_mode;
185244961713Sgirish 
185344961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1854a3c5bd6dSspeer 		nxgekp->mdt_reqs.value.ul = statsp->port_stats.mdt_reqs;
1855a3c5bd6dSspeer 		nxgekp->mdt_hdr_bufs.value.ul =
185671cd5202Smisaki 		    statsp->port_stats.mdt_hdr_bufs;
1857a3c5bd6dSspeer 		nxgekp->mdt_pld_bufs.value.ul =
185871cd5202Smisaki 		    statsp->port_stats.mdt_pld_bufs;
1859a3c5bd6dSspeer 		nxgekp->mdt_pkts.value.ul = statsp->port_stats.mdt_pkts;
1860a3c5bd6dSspeer 		nxgekp->mdt_hdrs.value.ul = statsp->port_stats.mdt_hdrs;
1861a3c5bd6dSspeer 		nxgekp->mdt_plds.value.ul = statsp->port_stats.mdt_plds;
186244961713Sgirish 		nxgekp->mdt_hdr_bind_fail.value.ul =
186371cd5202Smisaki 		    statsp->port_stats.mdt_hdr_bind_fail;
186444961713Sgirish 		nxgekp->mdt_pld_bind_fail.value.ul =
186571cd5202Smisaki 		    statsp->port_stats.mdt_pld_bind_fail;
186644961713Sgirish #endif
186744961713Sgirish #ifdef ACCEPT_JUMBO
1868a3c5bd6dSspeer 		nxgekp->tx_jumbo_pkts.value.ul =
186971cd5202Smisaki 		    statsp->port_stats.tx_jumbo_pkts;
187044961713Sgirish #endif
187144961713Sgirish #ifdef TX_MBLK_DEST
1872a3c5bd6dSspeer 		nxgekp->tx_1_desc.value.ul = statsp->port_stats.tx_1_desc;
1873a3c5bd6dSspeer 		nxgekp->tx_2_desc.value.ul = statsp->port_stats.tx_2_desc;
1874a3c5bd6dSspeer 		nxgekp->tx_3_desc.value.ul = statsp->port_stats.tx_3_desc;
1875a3c5bd6dSspeer 		nxgekp->tx_4_desc.value.ul = statsp->port_stats.tx_4_desc;
1876a3c5bd6dSspeer 		nxgekp->tx_5_desc.value.ul = statsp->port_stats.tx_5_desc;
1877a3c5bd6dSspeer 		nxgekp->tx_6_desc.value.ul = statsp->port_stats.tx_6_desc;
1878a3c5bd6dSspeer 		nxgekp->tx_7_desc.value.ul = statsp->port_stats.tx_7_desc;
1879a3c5bd6dSspeer 		nxgekp->tx_8_desc.value.ul = statsp->port_stats.tx_8_desc;
1880a3c5bd6dSspeer 		nxgekp->tx_max_desc.value.ul =
188171cd5202Smisaki 		    statsp->port_stats.tx_max_desc;
188244961713Sgirish #endif
188344961713Sgirish 		/*
188444961713Sgirish 		 * Rx Statistics.
188544961713Sgirish 		 */
188644961713Sgirish #ifdef ACCEPT_JUMBO
1887a3c5bd6dSspeer 		nxgekp->rx_jumbo_pkts.value.ul =
188871cd5202Smisaki 		    statsp->port_stats.rx_jumbo_pkts;
188944961713Sgirish #endif
1890321febdeSsbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
1891321febdeSsbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_READ);
1892321febdeSsbehera 		} else {
1893321febdeSsbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_READ);
1894321febdeSsbehera 		}
189544961713Sgirish 	}
1896a3c5bd6dSspeer 
189744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_port_kstat_update"));
189844961713Sgirish 	return (0);
189944961713Sgirish }
190044961713Sgirish 
190144961713Sgirish /*
190244961713Sgirish  * if this is the first init do not bother to save the
190344961713Sgirish  * counters.
190444961713Sgirish  */
1905a3c5bd6dSspeer /* ARGSUSED */
190644961713Sgirish void
nxge_save_cntrs(p_nxge_t nxgep)190744961713Sgirish nxge_save_cntrs(p_nxge_t nxgep)
190844961713Sgirish {
1909a3c5bd6dSspeer 	p_nxge_stats_t statsp;
1910a3c5bd6dSspeer 	uint64_t val;
1911a3c5bd6dSspeer 	npi_handle_t handle;
1912a3c5bd6dSspeer 	uint8_t portn;
1913a3c5bd6dSspeer 	uint8_t cnt8;
1914a3c5bd6dSspeer 	uint16_t cnt16;
1915a3c5bd6dSspeer 	uint32_t cnt32;
191644961713Sgirish 
191744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_save_cntrs"));
191844961713Sgirish 
191944961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
192044961713Sgirish 	handle = nxgep->npi_handle;
192144961713Sgirish 	portn = nxgep->mac.portnum;
192244961713Sgirish 
192344961713Sgirish 	MUTEX_ENTER(&nxgep->ouraddr_lock);
192444961713Sgirish 
192544961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
192644961713Sgirish 		/*
192744961713Sgirish 		 * Transmit MAC statistics.
192844961713Sgirish 		 */
192944961713Sgirish 		XMAC_REG_RD(handle, portn, XTXMAC_FRM_CNT_REG, &val);
193044961713Sgirish 		statsp->xmac_stats.tx_frame_cnt += (val & XTXMAC_FRM_CNT_MASK);
193144961713Sgirish 		XMAC_REG_RD(handle, portn, XTXMAC_BYTE_CNT_REG, &val);
193244961713Sgirish 		statsp->xmac_stats.tx_byte_cnt += (val & XTXMAC_BYTE_CNT_MASK);
193344961713Sgirish 		/*
193444961713Sgirish 		 * Receive XMAC statistics.
193544961713Sgirish 		 */
193644961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_CRC_ER_CNT_REG, &val);
193744961713Sgirish 		statsp->xmac_stats.rx_crc_err_cnt +=
193871cd5202Smisaki 		    (val & XRXMAC_CRC_ER_CNT_MASK);
1939321febdeSsbehera 
194044961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_MPSZER_CNT_REG, &val);
194144961713Sgirish 		statsp->xmac_stats.rx_len_err_cnt +=
194271cd5202Smisaki 		    (val & XRXMAC_MPSZER_CNT_MASK);
1943321febdeSsbehera 
194444961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_CD_VIO_CNT_REG, &val);
194544961713Sgirish 		statsp->xmac_stats.rx_viol_err_cnt +=
194671cd5202Smisaki 		    (val & XRXMAC_CD_VIO_CNT_MASK);
1947321febdeSsbehera 
194844961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_BT_CNT_REG, &val);
194944961713Sgirish 		statsp->xmac_stats.rx_byte_cnt += (val & XRXMAC_BT_CNT_MASK);
1950321febdeSsbehera 
195144961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT1_REG, &val);
195244961713Sgirish 		statsp->xmac_stats.rx_hist1_cnt +=
195371cd5202Smisaki 		    (val & XRXMAC_HIST_CNT1_MASK);
1954321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1955321febdeSsbehera 		    (val & XRXMAC_HIST_CNT1_MASK);
1956321febdeSsbehera 
195744961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT2_REG, &val);
195844961713Sgirish 		statsp->xmac_stats.rx_hist2_cnt +=
195971cd5202Smisaki 		    (val & XRXMAC_HIST_CNT2_MASK);
1960321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1961321febdeSsbehera 		    (val & XRXMAC_HIST_CNT2_MASK);
1962321febdeSsbehera 
196344961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT3_REG, &val);
196444961713Sgirish 		statsp->xmac_stats.rx_hist3_cnt +=
196571cd5202Smisaki 		    (val & XRXMAC_HIST_CNT3_MASK);
1966321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1967321febdeSsbehera 		    (val & XRXMAC_HIST_CNT3_MASK);
1968321febdeSsbehera 
196944961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT4_REG, &val);
197044961713Sgirish 		statsp->xmac_stats.rx_hist4_cnt +=
197171cd5202Smisaki 		    (val & XRXMAC_HIST_CNT4_MASK);
1972321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1973321febdeSsbehera 		    (val & XRXMAC_HIST_CNT4_MASK);
1974321febdeSsbehera 
197544961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT5_REG, &val);
197644961713Sgirish 		statsp->xmac_stats.rx_hist5_cnt +=
197771cd5202Smisaki 		    (val & XRXMAC_HIST_CNT5_MASK);
1978321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1979321febdeSsbehera 		    (val & XRXMAC_HIST_CNT5_MASK);
1980321febdeSsbehera 
198144961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT6_REG, &val);
198244961713Sgirish 		statsp->xmac_stats.rx_hist6_cnt +=
198371cd5202Smisaki 		    (val & XRXMAC_HIST_CNT6_MASK);
1984321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1985321febdeSsbehera 		    (val & XRXMAC_HIST_CNT6_MASK);
1986321febdeSsbehera 
1987321febdeSsbehera 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT7_REG, &val);
1988321febdeSsbehera 		statsp->xmac_stats.rx_hist7_cnt +=
1989321febdeSsbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
1990321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1991321febdeSsbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
1992321febdeSsbehera 
199344961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_BC_FRM_CNT_REG, &val);
199444961713Sgirish 		statsp->xmac_stats.rx_broadcast_cnt +=
199571cd5202Smisaki 		    (val & XRXMAC_BC_FRM_CNT_MASK);
1996321febdeSsbehera 
199744961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_MC_FRM_CNT_REG, &val);
199844961713Sgirish 		statsp->xmac_stats.rx_mult_cnt +=
199971cd5202Smisaki 		    (val & XRXMAC_MC_FRM_CNT_MASK);
2000321febdeSsbehera 
200144961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_FRAG_CNT_REG, &val);
200244961713Sgirish 		statsp->xmac_stats.rx_frag_cnt += (val & XRXMAC_FRAG_CNT_MASK);
2003321febdeSsbehera 
200444961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_AL_ER_CNT_REG, &val);
200544961713Sgirish 		statsp->xmac_stats.rx_frame_align_err_cnt +=
200671cd5202Smisaki 		    (val & XRXMAC_AL_ER_CNT_MASK);
2007321febdeSsbehera 
200844961713Sgirish 		XMAC_REG_RD(handle, portn, XMAC_LINK_FLT_CNT_REG, &val);
200944961713Sgirish 		statsp->xmac_stats.rx_linkfault_err_cnt +=
201071cd5202Smisaki 		    (val & XMAC_LINK_FLT_CNT_MASK);
2011321febdeSsbehera 
201244961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
201371cd5202Smisaki 		    XPCS_REG_DESCWERR_COUNTER, &cnt32);
201444961713Sgirish 		statsp->xmac_stats.xpcs_deskew_err_cnt +=
201571cd5202Smisaki 		    (val & XMAC_XPCS_DESKEW_ERR_CNT_MASK);
2016321febdeSsbehera 
201714ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
201844961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
201971cd5202Smisaki 		    XPCS_REG_SYMBOL_ERR_L0_1_COUNTER, &cnt32);
202044961713Sgirish 		statsp->xmac_stats.xpcs_ln0_symbol_err_cnt +=
202171cd5202Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L0_MASK);
202244961713Sgirish 		statsp->xmac_stats.xpcs_ln1_symbol_err_cnt +=
202371cd5202Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L1_MASK) >>
202471cd5202Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L1_SHIFT);
202544961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
202671cd5202Smisaki 		    XPCS_REG_SYMBOL_ERR_L2_3_COUNTER, &cnt32);
202744961713Sgirish 		statsp->xmac_stats.xpcs_ln2_symbol_err_cnt +=
202871cd5202Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L2_MASK);
202944961713Sgirish 		statsp->xmac_stats.xpcs_ln3_symbol_err_cnt +=
203071cd5202Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L3_MASK) >>
203171cd5202Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L3_SHIFT);
203214ea4bb7Ssd #endif
203344961713Sgirish 	} else if (nxgep->mac.porttype == PORT_TYPE_BMAC) {
203444961713Sgirish 		/*
203544961713Sgirish 		 * Transmit MAC statistics.
203644961713Sgirish 		 */
203744961713Sgirish 		BMAC_REG_RD(handle, portn, BTXMAC_FRM_CNT_REG, &val);
203844961713Sgirish 		statsp->bmac_stats.tx_frame_cnt += (val & BTXMAC_FRM_CNT_MASK);
2039321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2040321febdeSsbehera 		BMAC_REG_WR(handle, portn, BTXMAC_FRM_CNT_REG, 0);
2041321febdeSsbehera 
2042321febdeSsbehera 		BMAC_REG_RD(handle, portn, BTXMAC_BYTE_CNT_REG, &val);
204344961713Sgirish 		statsp->bmac_stats.tx_byte_cnt += (val & BTXMAC_BYTE_CNT_MASK);
2044321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2045321febdeSsbehera 		BMAC_REG_WR(handle, portn, BTXMAC_BYTE_CNT_REG, 0);
204644961713Sgirish 
204744961713Sgirish 		/*
204844961713Sgirish 		 * Receive MAC statistics.
204944961713Sgirish 		 */
2050321febdeSsbehera 		BMAC_REG_RD(handle, portn, RXMAC_FRM_CNT_REG, &val);
205144961713Sgirish 		statsp->bmac_stats.rx_frame_cnt += (val & RXMAC_FRM_CNT_MASK);
2052321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2053321febdeSsbehera 		BMAC_REG_WR(handle, portn, RXMAC_FRM_CNT_REG, 0);
2054321febdeSsbehera 
2055321febdeSsbehera 		BMAC_REG_RD(handle, portn, BRXMAC_BYTE_CNT_REG, &val);
205644961713Sgirish 		statsp->bmac_stats.rx_byte_cnt += (val & BRXMAC_BYTE_CNT_MASK);
2057321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2058321febdeSsbehera 		BMAC_REG_WR(handle, portn, BRXMAC_BYTE_CNT_REG, 0);
2059321febdeSsbehera 
2060321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_AL_ER_CNT_REG, &val);
206144961713Sgirish 		statsp->bmac_stats.rx_align_err_cnt +=
206271cd5202Smisaki 		    (val & BMAC_AL_ER_CNT_MASK);
2063321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2064321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_AL_ER_CNT_REG, 0);
2065321febdeSsbehera 
2066321febdeSsbehera 		BMAC_REG_RD(handle, portn, MAC_LEN_ER_CNT_REG, &val);
206744961713Sgirish 		statsp->bmac_stats.rx_len_err_cnt +=
206871cd5202Smisaki 		    (val & MAC_LEN_ER_CNT_MASK);
2069321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2070321febdeSsbehera 		BMAC_REG_WR(handle, portn, MAC_LEN_ER_CNT_REG, 0);
2071321febdeSsbehera 
2072321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_CRC_ER_CNT_REG, &val);
207344961713Sgirish 		statsp->bmac_stats.rx_crc_err_cnt +=
207471cd5202Smisaki 		    (val & BMAC_CRC_ER_CNT_MASK);
2075321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2076321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_CRC_ER_CNT_REG, 0);
2077321febdeSsbehera 
2078321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_CD_VIO_CNT_REG, &val);
207944961713Sgirish 		statsp->bmac_stats.rx_viol_err_cnt +=
208071cd5202Smisaki 		    (val & BMAC_CD_VIO_CNT_MASK);
2081321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2082321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_CD_VIO_CNT_REG, 0);
208344961713Sgirish 	}
2084678453a8Sspeer 	if (isLDOMguest(nxgep)) {
2085678453a8Sspeer 		MUTEX_EXIT(&nxgep->ouraddr_lock);
2086678453a8Sspeer 		goto nxge_save_cntrs_exit;
2087678453a8Sspeer 	}
208844961713Sgirish 	/* Update IPP counters */
208944961713Sgirish 	(void) npi_ipp_get_ecc_err_count(handle, portn, &cnt8);
209044961713Sgirish 	statsp->ipp_stats.ecc_err_cnt += cnt8;
209144961713Sgirish 	(void) npi_ipp_get_pkt_dis_count(handle, portn, &cnt16);
209244961713Sgirish 	statsp->ipp_stats.pkt_dis_cnt += cnt16;
209344961713Sgirish 	(void) npi_ipp_get_cs_err_count(handle, portn, &cnt16);
209444961713Sgirish 	statsp->ipp_stats.bad_cs_cnt += cnt16;
209544961713Sgirish 
209644961713Sgirish 	MUTEX_EXIT(&nxgep->ouraddr_lock);
209744961713Sgirish 
209844961713Sgirish nxge_save_cntrs_exit:
209944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_save_cntrs"));
210044961713Sgirish }
210144961713Sgirish 
2102678453a8Sspeer uint64_t
nxge_m_rx_stat(nxge_t * nxgep,uint_t stat)2103678453a8Sspeer nxge_m_rx_stat(
2104678453a8Sspeer 	nxge_t *nxgep,
2105678453a8Sspeer 	uint_t stat)
2106678453a8Sspeer {
2107678453a8Sspeer 	p_nxge_stats_t statsp;
2108678453a8Sspeer 	nxge_grp_set_t *rx_set;
2109678453a8Sspeer 	int8_t set[NXGE_MAX_RDCS];
2110678453a8Sspeer 	int i, cursor;
2111678453a8Sspeer 
2112678453a8Sspeer 	uint64_t val = 0;
2113678453a8Sspeer 
2114678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_rx_stat"));
2115678453a8Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
2116678453a8Sspeer 
2117678453a8Sspeer 	rx_set = &nxgep->rx_set;
2118678453a8Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
2119678453a8Sspeer 		if ((1 << i) & rx_set->owned.map) {
2120678453a8Sspeer 			set[cursor++] = (uint8_t)i;
2121678453a8Sspeer 		}
2122678453a8Sspeer 	}
2123678453a8Sspeer 
2124678453a8Sspeer 	for (i = 0; i < cursor; i++) {
2125678453a8Sspeer 		int rdc = set[i];
2126678453a8Sspeer 		switch (stat) {
2127678453a8Sspeer 		case MAC_STAT_IERRORS:
2128678453a8Sspeer 		case ETHER_STAT_MACRCV_ERRORS:
2129678453a8Sspeer 			val += statsp->rdc_stats[rdc].ierrors;
2130678453a8Sspeer 			break;
2131678453a8Sspeer 
2132678453a8Sspeer 		case MAC_STAT_RBYTES:
2133678453a8Sspeer 			val += statsp->rdc_stats[rdc].ibytes;
2134678453a8Sspeer 			break;
2135678453a8Sspeer 
2136678453a8Sspeer 		case MAC_STAT_IPACKETS:
2137678453a8Sspeer 			val += statsp->rdc_stats[rdc].ipackets;
2138678453a8Sspeer 			break;
2139678453a8Sspeer 
2140678453a8Sspeer 		default:
2141678453a8Sspeer 			break;
2142678453a8Sspeer 		}
2143678453a8Sspeer 	}
2144678453a8Sspeer 
2145678453a8Sspeer 	return (val);
2146678453a8Sspeer }
2147678453a8Sspeer 
2148678453a8Sspeer uint64_t
nxge_m_tx_stat(nxge_t * nxgep,uint_t stat)2149678453a8Sspeer nxge_m_tx_stat(
2150678453a8Sspeer 	nxge_t *nxgep,
2151678453a8Sspeer 	uint_t stat)
2152678453a8Sspeer {
2153678453a8Sspeer 	p_nxge_stats_t statsp;
2154678453a8Sspeer 	nxge_grp_set_t *tx_set;
2155678453a8Sspeer 	int8_t set[NXGE_MAX_TDCS];
2156678453a8Sspeer 	int i, cursor;
2157678453a8Sspeer 
2158678453a8Sspeer 	uint64_t val = 0;
2159678453a8Sspeer 
2160678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_tx_stat"));
2161678453a8Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
2162678453a8Sspeer 
2163678453a8Sspeer 	tx_set = &nxgep->tx_set;
2164d6d3405fSml 	for (i = 0, cursor = 0; i < NXGE_MAX_TDCS; i++) {
2165678453a8Sspeer 		if ((1 << i) & tx_set->owned.map) {
2166678453a8Sspeer 			set[cursor++] = (uint8_t)i;
2167678453a8Sspeer 		}
2168678453a8Sspeer 	}
2169678453a8Sspeer 
2170678453a8Sspeer 	for (i = 0; i < cursor; i++) {
2171678453a8Sspeer 		int tdc = set[i];
2172678453a8Sspeer 		switch (stat) {
2173678453a8Sspeer 		case MAC_STAT_OERRORS:
2174678453a8Sspeer 			val += statsp->tdc_stats[tdc].oerrors;
2175678453a8Sspeer 			break;
2176678453a8Sspeer 
2177678453a8Sspeer 		case MAC_STAT_OBYTES:
2178678453a8Sspeer 			val += statsp->tdc_stats[tdc].obytes;
2179678453a8Sspeer 			break;
2180678453a8Sspeer 
2181678453a8Sspeer 		case MAC_STAT_OPACKETS:
2182678453a8Sspeer 			val += statsp->tdc_stats[tdc].opackets;
2183678453a8Sspeer 			break;
2184678453a8Sspeer 
2185678453a8Sspeer 		default:
2186678453a8Sspeer 			break;
2187678453a8Sspeer 		}
2188678453a8Sspeer 	}
2189678453a8Sspeer 
2190678453a8Sspeer 	return (val);
2191678453a8Sspeer }
2192678453a8Sspeer 
21930dc2366fSVenugopal Iyer /*
21940dc2366fSVenugopal Iyer  * Retrieve a value for one of the statistics for a particular rx ring
21950dc2366fSVenugopal Iyer  */
21960dc2366fSVenugopal Iyer int
nxge_rx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)21970dc2366fSVenugopal Iyer nxge_rx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
21980dc2366fSVenugopal Iyer {
21990dc2366fSVenugopal Iyer 	p_nxge_ring_handle_t    rhp = (p_nxge_ring_handle_t)rdriver;
22000dc2366fSVenugopal Iyer 	p_nxge_t		nxgep = rhp->nxgep;
22010dc2366fSVenugopal Iyer 	int			r_index;
22020dc2366fSVenugopal Iyer 	p_nxge_stats_t 		statsp;
22030dc2366fSVenugopal Iyer 
22040dc2366fSVenugopal Iyer 	ASSERT(nxgep != NULL);
22050dc2366fSVenugopal Iyer 	statsp = (p_nxge_stats_t)nxgep->statsp;
22060dc2366fSVenugopal Iyer 	ASSERT(statsp != NULL);
22070dc2366fSVenugopal Iyer 	r_index = rhp->index + nxgep->pt_config.hw_config.start_rdc;
22080dc2366fSVenugopal Iyer 
22090dc2366fSVenugopal Iyer 	if (statsp->rdc_ksp[r_index] == NULL)
22100dc2366fSVenugopal Iyer 		return (0);
22110dc2366fSVenugopal Iyer 
22120dc2366fSVenugopal Iyer 	switch (stat) {
22130dc2366fSVenugopal Iyer 	case MAC_STAT_IERRORS:
22140dc2366fSVenugopal Iyer 		*val = statsp->rdc_stats[r_index].ierrors;
22150dc2366fSVenugopal Iyer 		break;
22160dc2366fSVenugopal Iyer 
22170dc2366fSVenugopal Iyer 	case MAC_STAT_RBYTES:
22180dc2366fSVenugopal Iyer 		*val = statsp->rdc_stats[r_index].ibytes;
22190dc2366fSVenugopal Iyer 		break;
22200dc2366fSVenugopal Iyer 
22210dc2366fSVenugopal Iyer 	case MAC_STAT_IPACKETS:
22220dc2366fSVenugopal Iyer 		*val = statsp->rdc_stats[r_index].ipackets;
22230dc2366fSVenugopal Iyer 		break;
22240dc2366fSVenugopal Iyer 
22250dc2366fSVenugopal Iyer 	default:
22260dc2366fSVenugopal Iyer 		*val = 0;
22270dc2366fSVenugopal Iyer 		return (ENOTSUP);
22280dc2366fSVenugopal Iyer 	}
22290dc2366fSVenugopal Iyer 
22300dc2366fSVenugopal Iyer 	return (0);
22310dc2366fSVenugopal Iyer }
22320dc2366fSVenugopal Iyer 
22330dc2366fSVenugopal Iyer /*
22340dc2366fSVenugopal Iyer  * Retrieve a value for one of the statistics for a particular tx ring
22350dc2366fSVenugopal Iyer  */
22360dc2366fSVenugopal Iyer int
nxge_tx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)22370dc2366fSVenugopal Iyer nxge_tx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
22380dc2366fSVenugopal Iyer {
22390dc2366fSVenugopal Iyer 	p_nxge_ring_handle_t    rhp = (p_nxge_ring_handle_t)rdriver;
22400dc2366fSVenugopal Iyer 	p_nxge_t		nxgep = rhp->nxgep;
22410dc2366fSVenugopal Iyer 	int			r_index;
22420dc2366fSVenugopal Iyer 	p_nxge_stats_t 		statsp;
22430dc2366fSVenugopal Iyer 
22440dc2366fSVenugopal Iyer 	ASSERT(nxgep != NULL);
22450dc2366fSVenugopal Iyer 	statsp = (p_nxge_stats_t)nxgep->statsp;
22460dc2366fSVenugopal Iyer 	ASSERT(statsp != NULL);
22470dc2366fSVenugopal Iyer 	r_index = nxgep->pt_config.hw_config.tdc.start + rhp->index;
22480dc2366fSVenugopal Iyer 
22490dc2366fSVenugopal Iyer 	if (statsp->tdc_ksp[r_index] == NULL)
22500dc2366fSVenugopal Iyer 		return (0);
22510dc2366fSVenugopal Iyer 
22520dc2366fSVenugopal Iyer 	switch (stat) {
22530dc2366fSVenugopal Iyer 	case MAC_STAT_OERRORS:
22540dc2366fSVenugopal Iyer 		*val = statsp->tdc_stats[r_index].oerrors;
22550dc2366fSVenugopal Iyer 		break;
22560dc2366fSVenugopal Iyer 
22570dc2366fSVenugopal Iyer 	case MAC_STAT_OBYTES:
22580dc2366fSVenugopal Iyer 		*val = statsp->tdc_stats[r_index].obytes;
22590dc2366fSVenugopal Iyer 		break;
22600dc2366fSVenugopal Iyer 
22610dc2366fSVenugopal Iyer 	case MAC_STAT_OPACKETS:
22620dc2366fSVenugopal Iyer 		*val = statsp->tdc_stats[r_index].opackets;
22630dc2366fSVenugopal Iyer 		break;
22640dc2366fSVenugopal Iyer 
22650dc2366fSVenugopal Iyer 	default:
22660dc2366fSVenugopal Iyer 		*val = 0;
22670dc2366fSVenugopal Iyer 		return (ENOTSUP);
22680dc2366fSVenugopal Iyer 	}
22690dc2366fSVenugopal Iyer 
22700dc2366fSVenugopal Iyer 	return (0);
22710dc2366fSVenugopal Iyer }
22720dc2366fSVenugopal Iyer 
2273a3c5bd6dSspeer /* ARGSUSED */
227444961713Sgirish int
nxge_m_stat(void * arg,uint_t stat,uint64_t * value)227544961713Sgirish nxge_m_stat(void *arg, uint_t stat, uint64_t *value)
227644961713Sgirish {
2277a3c5bd6dSspeer 	p_nxge_t nxgep = (p_nxge_t)arg;
2278a3c5bd6dSspeer 	p_nxge_stats_t statsp;
2279a3c5bd6dSspeer 	uint64_t val = 0;
228044961713Sgirish 
228144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_stat"));
228244961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
228344961713Sgirish 
228444961713Sgirish 	switch (stat) {
228544961713Sgirish 	case MAC_STAT_IFSPEED:
228644961713Sgirish 		val = statsp->mac_stats.link_speed * 1000000ull;
228744961713Sgirish 		break;
228844961713Sgirish 
228944961713Sgirish 	case MAC_STAT_MULTIRCV:
229044961713Sgirish 		val = statsp->port_stats.multircv;
229144961713Sgirish 		break;
229244961713Sgirish 
229344961713Sgirish 	case MAC_STAT_BRDCSTRCV:
229444961713Sgirish 		val = statsp->port_stats.brdcstrcv;
229544961713Sgirish 		break;
229644961713Sgirish 
229744961713Sgirish 	case MAC_STAT_MULTIXMT:
229844961713Sgirish 		val = statsp->port_stats.multixmt;
229944961713Sgirish 		break;
230044961713Sgirish 
230144961713Sgirish 	case MAC_STAT_BRDCSTXMT:
230244961713Sgirish 		val = statsp->port_stats.brdcstxmt;
230344961713Sgirish 		break;
230444961713Sgirish 
230544961713Sgirish 	case MAC_STAT_NORCVBUF:
230644961713Sgirish 		val = statsp->port_stats.norcvbuf;
230744961713Sgirish 		break;
230844961713Sgirish 
230944961713Sgirish 	case MAC_STAT_IERRORS:
231044961713Sgirish 	case ETHER_STAT_MACRCV_ERRORS:
2311678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
231244961713Sgirish 		break;
231344961713Sgirish 
231444961713Sgirish 	case MAC_STAT_OERRORS:
2315678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
2316678453a8Sspeer 		break;
231744961713Sgirish 
2318678453a8Sspeer 	case MAC_STAT_NOXMTBUF:
2319678453a8Sspeer 		val = statsp->port_stats.noxmtbuf;
232044961713Sgirish 		break;
232144961713Sgirish 
232244961713Sgirish 	case MAC_STAT_COLLISIONS:
232344961713Sgirish 		val = 0;
232444961713Sgirish 		break;
232544961713Sgirish 
232644961713Sgirish 	case MAC_STAT_RBYTES:
2327678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
232844961713Sgirish 		break;
232944961713Sgirish 
233044961713Sgirish 	case MAC_STAT_IPACKETS:
2331678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
233244961713Sgirish 		break;
233344961713Sgirish 
233444961713Sgirish 	case MAC_STAT_OBYTES:
2335678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
233644961713Sgirish 		break;
233744961713Sgirish 
233844961713Sgirish 	case MAC_STAT_OPACKETS:
2339678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
234044961713Sgirish 		break;
234144961713Sgirish 	case MAC_STAT_LINK_STATE:
234244961713Sgirish 		val = statsp->mac_stats.link_duplex;
234344961713Sgirish 		break;
234444961713Sgirish 	case MAC_STAT_LINK_UP:
234544961713Sgirish 		val = statsp->mac_stats.link_up;
234644961713Sgirish 		break;
234744961713Sgirish 	case MAC_STAT_PROMISC:
234844961713Sgirish 		val = statsp->mac_stats.promisc;
234944961713Sgirish 		break;
235044961713Sgirish 	case ETHER_STAT_SQE_ERRORS:
235144961713Sgirish 		val = 0;
235244961713Sgirish 		break;
235344961713Sgirish 
235444961713Sgirish 	case ETHER_STAT_ALIGN_ERRORS:
235544961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
235644961713Sgirish 			val = statsp->xmac_stats.rx_frame_align_err_cnt;
235744961713Sgirish 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
235844961713Sgirish 			val = statsp->bmac_stats.rx_align_err_cnt;
235944961713Sgirish 		else
236044961713Sgirish 			val = 0;
236144961713Sgirish 		break;
236244961713Sgirish 
236344961713Sgirish 	case ETHER_STAT_FCS_ERRORS:
236444961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
236544961713Sgirish 			val = statsp->xmac_stats.rx_crc_err_cnt;
236644961713Sgirish 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
236744961713Sgirish 			val = statsp->bmac_stats.rx_crc_err_cnt;
236844961713Sgirish 		else
236944961713Sgirish 			val = 0;
237044961713Sgirish 		break;
237144961713Sgirish 
237244961713Sgirish 	case ETHER_STAT_FIRST_COLLISIONS:
237344961713Sgirish 		val = 0;
237444961713Sgirish 		break;
237544961713Sgirish 
237644961713Sgirish 	case ETHER_STAT_MULTI_COLLISIONS:
237744961713Sgirish 		val = 0;
237844961713Sgirish 		break;
237944961713Sgirish 
238044961713Sgirish 	case ETHER_STAT_TX_LATE_COLLISIONS:
238144961713Sgirish 		val = 0;
238244961713Sgirish 		break;
238344961713Sgirish 
238444961713Sgirish 	case ETHER_STAT_EX_COLLISIONS:
238544961713Sgirish 		val = 0;
238644961713Sgirish 		break;
238744961713Sgirish 
238844961713Sgirish 	case ETHER_STAT_DEFER_XMTS:
238944961713Sgirish 		val = 0;
239044961713Sgirish 		break;
239144961713Sgirish 
239244961713Sgirish 	case ETHER_STAT_MACXMT_ERRORS:
239344961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
239444961713Sgirish 			val = statsp->xmac_stats.tx_underflow_err +
239571cd5202Smisaki 			    statsp->xmac_stats.tx_maxpktsize_err +
239671cd5202Smisaki 			    statsp->xmac_stats.tx_overflow_err +
239771cd5202Smisaki 			    statsp->xmac_stats.tx_fifo_xfr_err;
239844961713Sgirish 		} else {
239944961713Sgirish 			val = statsp->bmac_stats.tx_underrun_err +
240071cd5202Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
240144961713Sgirish 		}
240244961713Sgirish 		break;
240344961713Sgirish 
240444961713Sgirish 	case ETHER_STAT_CARRIER_ERRORS:
240544961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
240644961713Sgirish 			val = statsp->xmac_stats.rx_linkfault_err_cnt;
240744961713Sgirish 		} else {
240844961713Sgirish 			val = statsp->mac_stats.xcvr_inits +
240971cd5202Smisaki 			    statsp->mac_stats.serdes_inits;
241044961713Sgirish 		}
241144961713Sgirish 		break;
241244961713Sgirish 
241344961713Sgirish 	case ETHER_STAT_TOOLONG_ERRORS:
241444961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
241544961713Sgirish 			val = statsp->xmac_stats.tx_maxpktsize_err +
241671cd5202Smisaki 			    statsp->xmac_stats.rx_len_err_cnt;
241744961713Sgirish 
241844961713Sgirish 		} else {
241944961713Sgirish 			val = statsp->bmac_stats.rx_len_err_cnt +
242071cd5202Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
242144961713Sgirish 		}
242244961713Sgirish 		break;
242344961713Sgirish 
242444961713Sgirish 
242544961713Sgirish 	case ETHER_STAT_XCVR_ADDR:
242644961713Sgirish 		val = statsp->mac_stats.xcvr_portn;
242744961713Sgirish 		break;
242844961713Sgirish 	case ETHER_STAT_XCVR_ID:
242944961713Sgirish 		val = statsp->mac_stats.xcvr_id;
243044961713Sgirish 		break;
243144961713Sgirish 
243244961713Sgirish 	case ETHER_STAT_XCVR_INUSE:
243344961713Sgirish 		val = statsp->mac_stats.xcvr_inuse;
243444961713Sgirish 		break;
243544961713Sgirish 
243644961713Sgirish 	case ETHER_STAT_CAP_1000FDX:
243744961713Sgirish 		val = statsp->mac_stats.cap_1000fdx;
243844961713Sgirish 		break;
243944961713Sgirish 
244044961713Sgirish 	case ETHER_STAT_CAP_1000HDX:
244144961713Sgirish 		val = statsp->mac_stats.cap_1000hdx;
244244961713Sgirish 		break;
244344961713Sgirish 
244444961713Sgirish 	case ETHER_STAT_CAP_100FDX:
244544961713Sgirish 		val = statsp->mac_stats.cap_100fdx;
244644961713Sgirish 		break;
244744961713Sgirish 
244844961713Sgirish 	case ETHER_STAT_CAP_100HDX:
244944961713Sgirish 		val = statsp->mac_stats.cap_100hdx;
245044961713Sgirish 		break;
245144961713Sgirish 
245244961713Sgirish 	case ETHER_STAT_CAP_10FDX:
245344961713Sgirish 		val = statsp->mac_stats.cap_10fdx;
245444961713Sgirish 		break;
245544961713Sgirish 
245644961713Sgirish 	case ETHER_STAT_CAP_10HDX:
245744961713Sgirish 		val = statsp->mac_stats.cap_10hdx;
245844961713Sgirish 		break;
245944961713Sgirish 
246044961713Sgirish 	case ETHER_STAT_CAP_ASMPAUSE:
246144961713Sgirish 		val = statsp->mac_stats.cap_asmpause;
246244961713Sgirish 		val = 1;
246344961713Sgirish 		break;
246444961713Sgirish 
246544961713Sgirish 	case ETHER_STAT_CAP_PAUSE:
246644961713Sgirish 		val = statsp->mac_stats.cap_pause;
246744961713Sgirish 		break;
246844961713Sgirish 
246944961713Sgirish 	case ETHER_STAT_CAP_AUTONEG:
247044961713Sgirish 		val = statsp->mac_stats.cap_autoneg;
247144961713Sgirish 		break;
247244961713Sgirish 
247344961713Sgirish 	case ETHER_STAT_ADV_CAP_1000FDX:
247444961713Sgirish 		val = statsp->mac_stats.adv_cap_1000fdx;
247544961713Sgirish 		break;
247644961713Sgirish 
247744961713Sgirish 	case ETHER_STAT_ADV_CAP_1000HDX:
247844961713Sgirish 		val = statsp->mac_stats.adv_cap_1000hdx;
247944961713Sgirish 		break;
248044961713Sgirish 
248144961713Sgirish 	case ETHER_STAT_ADV_CAP_100FDX:
248244961713Sgirish 		val = statsp->mac_stats.adv_cap_100fdx;
248344961713Sgirish 		break;
248444961713Sgirish 
248544961713Sgirish 	case ETHER_STAT_ADV_CAP_100HDX:
248644961713Sgirish 		val = statsp->mac_stats.adv_cap_100hdx;
248744961713Sgirish 		break;
248844961713Sgirish 
248944961713Sgirish 	case ETHER_STAT_ADV_CAP_10FDX:
249044961713Sgirish 		val = statsp->mac_stats.adv_cap_10fdx;
249144961713Sgirish 		break;
249244961713Sgirish 
249344961713Sgirish 	case ETHER_STAT_ADV_CAP_10HDX:
249444961713Sgirish 		val = statsp->mac_stats.adv_cap_10hdx;
249544961713Sgirish 		break;
249644961713Sgirish 
249744961713Sgirish 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
249844961713Sgirish 		val = statsp->mac_stats.adv_cap_asmpause;
249944961713Sgirish 		break;
250044961713Sgirish 
250144961713Sgirish 	case ETHER_STAT_ADV_CAP_PAUSE:
250244961713Sgirish 		val = statsp->mac_stats.adv_cap_pause;
250344961713Sgirish 		break;
250444961713Sgirish 
250544961713Sgirish 	case ETHER_STAT_ADV_CAP_AUTONEG:
250644961713Sgirish 		val = statsp->mac_stats.adv_cap_autoneg;
250744961713Sgirish 		break;
250844961713Sgirish 
250944961713Sgirish 	case ETHER_STAT_LP_CAP_1000FDX:
251044961713Sgirish 		val = statsp->mac_stats.lp_cap_1000fdx;
251144961713Sgirish 		break;
251244961713Sgirish 
251344961713Sgirish 	case ETHER_STAT_LP_CAP_1000HDX:
251444961713Sgirish 		val = statsp->mac_stats.lp_cap_1000hdx;
251544961713Sgirish 		break;
251644961713Sgirish 
251744961713Sgirish 	case ETHER_STAT_LP_CAP_100FDX:
251844961713Sgirish 		val = statsp->mac_stats.lp_cap_100fdx;
251944961713Sgirish 		break;
252044961713Sgirish 
252144961713Sgirish 	case ETHER_STAT_LP_CAP_100HDX:
252244961713Sgirish 		val = statsp->mac_stats.lp_cap_100hdx;
252344961713Sgirish 		break;
252444961713Sgirish 
252544961713Sgirish 	case ETHER_STAT_LP_CAP_10FDX:
252644961713Sgirish 		val = statsp->mac_stats.lp_cap_10fdx;
252744961713Sgirish 		break;
252844961713Sgirish 
252944961713Sgirish 	case ETHER_STAT_LP_CAP_10HDX:
253044961713Sgirish 		val = statsp->mac_stats.lp_cap_10hdx;
253144961713Sgirish 		break;
253244961713Sgirish 
253344961713Sgirish 	case ETHER_STAT_LP_CAP_ASMPAUSE:
253444961713Sgirish 		val = statsp->mac_stats.lp_cap_asmpause;
253544961713Sgirish 		break;
253644961713Sgirish 
253744961713Sgirish 	case ETHER_STAT_LP_CAP_PAUSE:
253844961713Sgirish 		val = statsp->mac_stats.lp_cap_pause;
253944961713Sgirish 		break;
254044961713Sgirish 
254144961713Sgirish 	case ETHER_STAT_LP_CAP_AUTONEG:
254244961713Sgirish 		val = statsp->mac_stats.lp_cap_autoneg;
254344961713Sgirish 		break;
254444961713Sgirish 
254544961713Sgirish 	case ETHER_STAT_LINK_ASMPAUSE:
254644961713Sgirish 		val = statsp->mac_stats.link_asmpause;
254744961713Sgirish 		break;
254844961713Sgirish 
254944961713Sgirish 	case ETHER_STAT_LINK_PAUSE:
255044961713Sgirish 		val = statsp->mac_stats.link_pause;
255144961713Sgirish 		break;
255244961713Sgirish 
255344961713Sgirish 	case ETHER_STAT_LINK_AUTONEG:
255444961713Sgirish 		val = statsp->mac_stats.cap_autoneg;
255544961713Sgirish 		break;
255644961713Sgirish 
255744961713Sgirish 	case ETHER_STAT_LINK_DUPLEX:
255844961713Sgirish 		val = statsp->mac_stats.link_duplex;
255944961713Sgirish 		break;
256044961713Sgirish 
256144961713Sgirish 	default:
256244961713Sgirish 		/*
256344961713Sgirish 		 * Shouldn't reach here...
256444961713Sgirish 		 */
256544961713Sgirish #ifdef NXGE_DEBUG
256644961713Sgirish 		NXGE_ERROR_MSG((nxgep, KST_CTL,
256771cd5202Smisaki 		    "nxge_m_stat: unrecognized parameter value = 0x%x",
256871cd5202Smisaki 		    stat));
256944961713Sgirish #endif
257044961713Sgirish 
257144961713Sgirish 		return (ENOTSUP);
257244961713Sgirish 	}
257344961713Sgirish 	*value = val;
257444961713Sgirish 	return (0);
257544961713Sgirish }
2576