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 /*
224202ea4bSsbehera  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2344961713Sgirish  * Use is subject to license terms.
2444961713Sgirish  */
2544961713Sgirish 
2644961713Sgirish #pragma ident	"%Z%%M%	%I%	%E% SMI"
2744961713Sgirish 
28a3c5bd6dSspeer #include <sys/nxge/nxge_impl.h>
29678453a8Sspeer #include <sys/nxge/nxge_hio.h>
30678453a8Sspeer 
3144961713Sgirish #include <inet/mi.h>
32a3c5bd6dSspeer 
3344961713Sgirish #define	RDC_NAME_FORMAT1	"RDC Channel"
3444961713Sgirish #define	TDC_NAME_FORMAT1	"TDC Channel"
3544961713Sgirish #define	CH_NAME_FORMAT		" %d Stats"
3644961713Sgirish #define	TDC_NAME_FORMAT		"TDC Channel %d Stats"
3744961713Sgirish #define	RDC_NAME_FORMAT		"RDC Channel %d Stats"
3844961713Sgirish 
3944961713Sgirish void nxge_mac_init_kstats(p_nxge_t, struct kstat *);
4044961713Sgirish void nxge_xmac_init_kstats(struct kstat *);
4144961713Sgirish void nxge_bmac_init_kstats(struct kstat *);
4244961713Sgirish 
43a3c5bd6dSspeer /* ARGSUSED */
4444961713Sgirish void
4544961713Sgirish nxge_init_statsp(p_nxge_t nxgep)
4644961713Sgirish {
4744961713Sgirish 	size_t stats_size;
4844961713Sgirish 
4944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_init_statsp"));
5044961713Sgirish 
5144961713Sgirish 	stats_size = sizeof (nxge_stats_t);
5244961713Sgirish 	nxgep->statsp = KMEM_ZALLOC(stats_size, KM_SLEEP);
5344961713Sgirish 	nxgep->statsp->stats_size = stats_size;
5444961713Sgirish 
5544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_init_statsp"));
5644961713Sgirish }
5744961713Sgirish 
5844961713Sgirish typedef struct {
59a3c5bd6dSspeer 	uint8_t index;
60a3c5bd6dSspeer 	uint8_t type;
61a3c5bd6dSspeer 	char *name;
6244961713Sgirish } nxge_kstat_index_t;
6344961713Sgirish 
64a3c5bd6dSspeer typedef enum {
6544961713Sgirish 	RDC_STAT_PACKETS = 0,
6644961713Sgirish 	RDC_STAT_BYTES,
6744961713Sgirish 	RDC_STAT_ERRORS,
6844961713Sgirish 	RDC_STAT_DCF_ERR,
6944961713Sgirish 	RDC_STAT_RCR_ACK_ERR,
7044961713Sgirish 	RDC_STAT_RCR_DC_FIFOFLOW_ERR,
7144961713Sgirish 	RDC_STAT_RCR_SHA_PAR_ERR,
7244961713Sgirish 	RDC_STAT_RBR_PRE_PAR_ERR,
7344961713Sgirish 	RDC_STAT_WRED_DROP,
7444961713Sgirish 	RDC_STAT_RBR_PRE_EMTY,
7544961713Sgirish 	RDC_STAT_RCR_SHADOW_FULL,
7644961713Sgirish 	RDC_STAT_RBR_TMOUT,
7744961713Sgirish 	RDC_STAT_RSP_CNT_ERR,
7844961713Sgirish 	RDC_STAT_BYTE_EN_BUS,
7944961713Sgirish 	RDC_STAT_RSP_DAT_ERR,
804202ea4bSsbehera 	RDC_STAT_PKT_TOO_LONG_ERR,
8144961713Sgirish 	RDC_STAT_COMPL_L2_ERR,
8244961713Sgirish 	RDC_STAT_COMPL_L4_CKSUM_ERR,
8344961713Sgirish 	RDC_STAT_COMPL_ZCP_SOFT_ERR,
8444961713Sgirish 	RDC_STAT_COMPL_FFLP_SOFT_ERR,
8544961713Sgirish 	RDC_STAT_CONFIG_ERR,
8644961713Sgirish 	RDC_STAT_RCRINCON,
8744961713Sgirish 	RDC_STAT_RCRFULL,
8844961713Sgirish 	RDC_STAT_RBR_EMPTY,
8944961713Sgirish 	RDC_STAT_RBR_FULL,
9044961713Sgirish 	RDC_STAT_RBRLOGPAGE,
9144961713Sgirish 	RDC_STAT_CFIGLOGPAGE,
9244961713Sgirish 	RDC_STAT_PORT_DROP_PKT,
9344961713Sgirish 	RDC_STAT_RCRTO,
9444961713Sgirish 	RDC_STAT_RCRTHRES,
9544961713Sgirish 	RDC_STAT_MEX,
9644961713Sgirish 	RDC_STAT_ID_MIS,
9744961713Sgirish 	RDC_STAT_ZCP_EOP,
9844961713Sgirish 	RDC_STAT_IPP_EOP,
9944961713Sgirish 	RDC_STAT_END
10044961713Sgirish } nxge_rdc_stat_index_t;
10144961713Sgirish 
10244961713Sgirish nxge_kstat_index_t nxge_rdc_stats[] = {
103a3c5bd6dSspeer 	{RDC_STAT_PACKETS, KSTAT_DATA_UINT64, "rdc_packets"},
104a3c5bd6dSspeer 	{RDC_STAT_BYTES, KSTAT_DATA_UINT64, "rdc_bytes"},
105a3c5bd6dSspeer 	{RDC_STAT_ERRORS, KSTAT_DATA_ULONG, "rdc_errors"},
106a3c5bd6dSspeer 	{RDC_STAT_DCF_ERR, KSTAT_DATA_ULONG, "rdc_dcf_err"},
107a3c5bd6dSspeer 	{RDC_STAT_RCR_ACK_ERR, KSTAT_DATA_ULONG, "rdc_rcr_ack_err"},
108a3c5bd6dSspeer 	{RDC_STAT_RCR_DC_FIFOFLOW_ERR, KSTAT_DATA_ULONG, "rdc_dc_fifoflow_err"},
109a3c5bd6dSspeer 	{RDC_STAT_RCR_SHA_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rcr_sha_par_err"},
110a3c5bd6dSspeer 	{RDC_STAT_RBR_PRE_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rbr_pre_par_err"},
111a3c5bd6dSspeer 	{RDC_STAT_WRED_DROP, KSTAT_DATA_ULONG, "rdc_wred_drop"},
112a3c5bd6dSspeer 	{RDC_STAT_RBR_PRE_EMTY, KSTAT_DATA_ULONG, "rdc_rbr_pre_empty"},
113a3c5bd6dSspeer 	{RDC_STAT_RCR_SHADOW_FULL, KSTAT_DATA_ULONG, "rdc_rcr_shadow_full"},
114a3c5bd6dSspeer 	{RDC_STAT_RBR_TMOUT, KSTAT_DATA_ULONG, "rdc_rbr_tmout"},
115a3c5bd6dSspeer 	{RDC_STAT_RSP_CNT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_cnt_err"},
116a3c5bd6dSspeer 	{RDC_STAT_BYTE_EN_BUS, KSTAT_DATA_ULONG, "rdc_byte_en_bus"},
117a3c5bd6dSspeer 	{RDC_STAT_RSP_DAT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_dat_err"},
1184202ea4bSsbehera 	{RDC_STAT_PKT_TOO_LONG_ERR, KSTAT_DATA_ULONG, "rdc_pkt_too_long_err"},
119a3c5bd6dSspeer 	{RDC_STAT_COMPL_L2_ERR, KSTAT_DATA_ULONG, "rdc_compl_l2_err"},
120a3c5bd6dSspeer 	{RDC_STAT_COMPL_L4_CKSUM_ERR, KSTAT_DATA_ULONG, "rdc_compl_l4_cksum"},
121a3c5bd6dSspeer 	{RDC_STAT_COMPL_ZCP_SOFT_ERR, KSTAT_DATA_ULONG,
122a3c5bd6dSspeer 		"rdc_compl_zcp_soft_err"},
123a3c5bd6dSspeer 	{RDC_STAT_COMPL_FFLP_SOFT_ERR, KSTAT_DATA_ULONG,
124a3c5bd6dSspeer 		"rdc_compl_fflp_soft_err"},
125a3c5bd6dSspeer 	{RDC_STAT_CONFIG_ERR, KSTAT_DATA_ULONG, "rdc_config_err"},
126a3c5bd6dSspeer 	{RDC_STAT_RCRINCON, KSTAT_DATA_ULONG, "rdc_rcrincon"},
127a3c5bd6dSspeer 	{RDC_STAT_RCRFULL, KSTAT_DATA_ULONG, "rdc_rcrfull"},
128a3c5bd6dSspeer 	{RDC_STAT_RBR_EMPTY, KSTAT_DATA_ULONG, "rdc_rbr_empty"},
129a3c5bd6dSspeer 	{RDC_STAT_RBR_FULL, KSTAT_DATA_ULONG, "rdc_rbrfull"},
130a3c5bd6dSspeer 	{RDC_STAT_RBRLOGPAGE, KSTAT_DATA_ULONG, "rdc_rbrlogpage"},
131a3c5bd6dSspeer 	{RDC_STAT_CFIGLOGPAGE, KSTAT_DATA_ULONG, "rdc_cfiglogpage"},
132a3c5bd6dSspeer 	{RDC_STAT_PORT_DROP_PKT, KSTAT_DATA_ULONG, "rdc_port_drop_pkt"},
133a3c5bd6dSspeer 	{RDC_STAT_RCRTO, KSTAT_DATA_ULONG, "rdc_rcrto"},
134a3c5bd6dSspeer 	{RDC_STAT_RCRTHRES, KSTAT_DATA_ULONG, "rdc_rcrthres"},
135a3c5bd6dSspeer 	{RDC_STAT_MEX, KSTAT_DATA_ULONG, "rdc_mex"},
136a3c5bd6dSspeer 	{RDC_STAT_ID_MIS, KSTAT_DATA_ULONG, "rdc_id_mismatch"},
137a3c5bd6dSspeer 	{RDC_STAT_ZCP_EOP, KSTAT_DATA_ULONG, "rdc_zcp_eop"},
138a3c5bd6dSspeer 	{RDC_STAT_IPP_EOP, KSTAT_DATA_ULONG, "rdc_ipp_eop"},
139a3c5bd6dSspeer 	{RDC_STAT_END, NULL, NULL}
14044961713Sgirish };
14144961713Sgirish 
14244961713Sgirish typedef enum {
14344961713Sgirish 	RDC_SYS_STAT_PRE_PAR_ERR = 0,
14444961713Sgirish 	RDC_SYS_STAT_SHA_PAR_ERR,
14544961713Sgirish 	RDC_SYS_STAT_ID_MISMATCH,
14644961713Sgirish 	RDC_SYS_STAT_IPP_EOP_ERR,
14744961713Sgirish 	RDC_SYS_STAT_ZCP_EOP_ERR,
14844961713Sgirish 	RDC_SYS_STAT_END
14944961713Sgirish } nxge_rdc_sys_stat_idx_t;
15044961713Sgirish 
15144961713Sgirish nxge_kstat_index_t nxge_rdc_sys_stats[] = {
152a3c5bd6dSspeer 	{RDC_SYS_STAT_PRE_PAR_ERR, KSTAT_DATA_UINT64, "rdc_pre_par_err"},
153a3c5bd6dSspeer 	{RDC_SYS_STAT_SHA_PAR_ERR, KSTAT_DATA_UINT64, "rdc_sha_par_err"},
154a3c5bd6dSspeer 	{RDC_SYS_STAT_ID_MISMATCH, KSTAT_DATA_UINT64, "rdc_stat_id_mismatch"},
155a3c5bd6dSspeer 	{RDC_SYS_STAT_IPP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_ipp_eop_err"},
156a3c5bd6dSspeer 	{RDC_SYS_STAT_ZCP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_zcp_eop_err"},
157a3c5bd6dSspeer 	{RDC_SYS_STAT_END, NULL, NULL}
15844961713Sgirish };
15944961713Sgirish 
160a3c5bd6dSspeer typedef enum {
16144961713Sgirish 	TDC_STAT_PACKETS = 0,
16244961713Sgirish 	TDC_STAT_BYTES,
16344961713Sgirish 	TDC_STAT_ERRORS,
16444961713Sgirish 	TDC_STAT_TX_INITS,
16544961713Sgirish 	TDC_STAT_TX_NO_BUF,
16644961713Sgirish 	TDC_STAT_MBOX_ERR,
16744961713Sgirish 	TDC_STAT_PKT_SIZE_ERR,
16844961713Sgirish 	TDC_STAT_TX_RING_OFLOW,
16944961713Sgirish 	TDC_STAT_PREF_BUF_ECC_ERR,
17044961713Sgirish 	TDC_STAT_NACK_PREF,
17144961713Sgirish 	TDC_STAT_NACK_PKT_RD,
17244961713Sgirish 	TDC_STAT_CONF_PART_ERR,
17344961713Sgirish 	TDC_STAT_PKT_PRT_ERR,
17444961713Sgirish 	TDC_STAT_RESET_FAIL,
17544961713Sgirish 	TDC_STAT_TX_STARTS,
17644961713Sgirish 	TDC_STAT_TX_NOCANPUT,
17744961713Sgirish 	TDC_STAT_TX_MSGDUP_FAIL,
17844961713Sgirish 	TDC_STAT_TX_ALLOCB_FAIL,
17944961713Sgirish 	TDC_STAT_TX_NO_DESC,
18044961713Sgirish 	TDC_STAT_TX_DMA_BIND_FAIL,
18144961713Sgirish 	TDC_STAT_TX_UFLOW,
18244961713Sgirish 	TDC_STAT_TX_HDR_PKTS,
18344961713Sgirish 	TDC_STAT_TX_DDI_PKTS,
18444961713Sgirish 	TDC_STAT_TX_DVMA_PKTS,
18544961713Sgirish 	TDC_STAT_TX_MAX_PEND,
18644961713Sgirish 	TDC_STAT_END
18744961713Sgirish } nxge_tdc_stats_index_t;
18844961713Sgirish 
18944961713Sgirish nxge_kstat_index_t nxge_tdc_stats[] = {
190a3c5bd6dSspeer 	{TDC_STAT_PACKETS, KSTAT_DATA_UINT64, "tdc_packets"},
191a3c5bd6dSspeer 	{TDC_STAT_BYTES, KSTAT_DATA_UINT64, "tdc_bytes"},
192a3c5bd6dSspeer 	{TDC_STAT_ERRORS, KSTAT_DATA_UINT64, "tdc_errors"},
193a3c5bd6dSspeer 	{TDC_STAT_TX_INITS, KSTAT_DATA_ULONG, "tdc_tx_inits"},
194a3c5bd6dSspeer 	{TDC_STAT_TX_NO_BUF, KSTAT_DATA_ULONG, "tdc_tx_no_buf"},
195a3c5bd6dSspeer 	{TDC_STAT_MBOX_ERR, KSTAT_DATA_ULONG, "tdc_mbox_err"},
196a3c5bd6dSspeer 	{TDC_STAT_PKT_SIZE_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_err"},
19744961713Sgirish 	{TDC_STAT_TX_RING_OFLOW,
198a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_tx_ring_oflow"},
19944961713Sgirish 	{TDC_STAT_PREF_BUF_ECC_ERR,
200a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_pref_buf_err_err"},
201a3c5bd6dSspeer 	{TDC_STAT_NACK_PREF, KSTAT_DATA_ULONG, "tdc_nack_pref"},
202a3c5bd6dSspeer 	{TDC_STAT_NACK_PKT_RD, KSTAT_DATA_ULONG, "tdc_nack_pkt_rd"},
20344961713Sgirish 	{TDC_STAT_CONF_PART_ERR,
204a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "tdc_conf_part_err"},
205a3c5bd6dSspeer 	{TDC_STAT_PKT_PRT_ERR, KSTAT_DATA_ULONG, "tdc_pkt_prt_err"},
206a3c5bd6dSspeer 	{TDC_STAT_RESET_FAIL, KSTAT_DATA_ULONG, "tdc_reset_fail"},
207a3c5bd6dSspeer 	{TDC_STAT_TX_STARTS, KSTAT_DATA_ULONG, "tdc_tx_starts"},
208a3c5bd6dSspeer 	{TDC_STAT_TX_NOCANPUT, KSTAT_DATA_ULONG, "tdc_tx_nocanput"},
20944961713Sgirish 	{TDC_STAT_TX_MSGDUP_FAIL, KSTAT_DATA_ULONG, "tdc_tx_msgdup_fail"},
21044961713Sgirish 	{TDC_STAT_TX_ALLOCB_FAIL, KSTAT_DATA_ULONG, "tdc_tx_allocb_fail"},
21144961713Sgirish 	{TDC_STAT_TX_NO_DESC, KSTAT_DATA_ULONG, "tdc_tx_no_desc"},
21244961713Sgirish 	{TDC_STAT_TX_DMA_BIND_FAIL, KSTAT_DATA_ULONG, "tdc_tx_dma_bind_fail"},
213a3c5bd6dSspeer 	{TDC_STAT_TX_UFLOW, KSTAT_DATA_ULONG, "tdc_tx_uflow"},
214a3c5bd6dSspeer 	{TDC_STAT_TX_HDR_PKTS, KSTAT_DATA_ULONG, "tdc_tx_hdr_pkts"},
215a3c5bd6dSspeer 	{TDC_STAT_TX_DDI_PKTS, KSTAT_DATA_ULONG, "tdc_tx_ddi_pkts"},
216a3c5bd6dSspeer 	{TDC_STAT_TX_DVMA_PKTS, KSTAT_DATA_ULONG, "tdc_tx_dvma_pkts"},
217a3c5bd6dSspeer 	{TDC_STAT_TX_MAX_PEND, KSTAT_DATA_ULONG, "tdc_tx_max_pend"},
218a3c5bd6dSspeer 	{TDC_STAT_END, NULL, NULL}
21944961713Sgirish };
22044961713Sgirish 
22144961713Sgirish /* IPP Statistics definitions */
222a3c5bd6dSspeer typedef enum {
22344961713Sgirish 	IPP_STAT_EOP_MISS = 0,
22444961713Sgirish 	IPP_STAT_SOP_MISS,
22544961713Sgirish 	IPP_STAT_DFIFO_UE,
22644961713Sgirish 	IPP_STAT_ECC_ERR,
227846a903dSml 	IPP_STAT_PFIFO_PERR,
22844961713Sgirish 	IPP_STAT_PFIFO_OVER,
22944961713Sgirish 	IPP_STAT_PFIFO_UND,
23044961713Sgirish 	IPP_STAT_BAD_CS,
23144961713Sgirish 	IPP_STAT_BAD_DIS,
23244961713Sgirish 	IPP_STAT_END
23344961713Sgirish } nxge_ipp_stat_index_t;
23444961713Sgirish 
23544961713Sgirish nxge_kstat_index_t nxge_ipp_stats[] = {
236a3c5bd6dSspeer 	{IPP_STAT_EOP_MISS, KSTAT_DATA_ULONG, "rxipp_eop_miss"},
237a3c5bd6dSspeer 	{IPP_STAT_SOP_MISS, KSTAT_DATA_ULONG, "rxipp_sop_miss"},
238a3c5bd6dSspeer 	{IPP_STAT_DFIFO_UE, KSTAT_DATA_ULONG, "rxipp_dfifo_ue"},
239a3c5bd6dSspeer 	{IPP_STAT_ECC_ERR, KSTAT_DATA_ULONG, "rxipp_ecc_err"},
240846a903dSml 	{IPP_STAT_PFIFO_PERR, KSTAT_DATA_ULONG, "rxipp_pfifo_perr"},
241a3c5bd6dSspeer 	{IPP_STAT_PFIFO_OVER, KSTAT_DATA_ULONG, "rxipp_pfifo_over"},
242a3c5bd6dSspeer 	{IPP_STAT_PFIFO_UND, KSTAT_DATA_ULONG, "rxipp_pfifo_und"},
243a3c5bd6dSspeer 	{IPP_STAT_BAD_CS, KSTAT_DATA_ULONG, "rxipp_bad_cs"},
244a3c5bd6dSspeer 	{IPP_STAT_BAD_DIS, KSTAT_DATA_ULONG, "rxipp_bad_dis"},
245a3c5bd6dSspeer 	{IPP_STAT_END, NULL, NULL}
24644961713Sgirish };
24744961713Sgirish 
24844961713Sgirish /* TXC Statistics definitions */
249a3c5bd6dSspeer typedef enum {
25044961713Sgirish 	TXC_STAT_PKT_STUFFED = 0,
25144961713Sgirish 	TXC_STAT_PKT_XMIT,
25244961713Sgirish 	TXC_STAT_RO_CORRECT_ERR,
25344961713Sgirish 	TXC_STAT_RO_UNCORRECT_ERR,
25444961713Sgirish 	TXC_STAT_SF_CORRECT_ERR,
25544961713Sgirish 	TXC_STAT_SF_UNCORRECT_ERR,
25644961713Sgirish 	TXC_STAT_ADDRESS_FAILED,
25744961713Sgirish 	TXC_STAT_DMA_FAILED,
25844961713Sgirish 	TXC_STAT_LENGTH_FAILED,
25944961713Sgirish 	TXC_STAT_PKT_ASSY_DEAD,
26044961713Sgirish 	TXC_STAT_REORDER_ERR,
26144961713Sgirish 	TXC_STAT_END
26244961713Sgirish } nxge_txc_stat_index_t;
26344961713Sgirish 
26444961713Sgirish nxge_kstat_index_t nxge_txc_stats[] = {
265a3c5bd6dSspeer 	{TXC_STAT_PKT_STUFFED, KSTAT_DATA_ULONG, "txc_pkt_stuffed"},
266a3c5bd6dSspeer 	{TXC_STAT_PKT_XMIT, KSTAT_DATA_ULONG, "txc_pkt_xmit"},
267a3c5bd6dSspeer 	{TXC_STAT_RO_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_correct_err"},
268a3c5bd6dSspeer 	{TXC_STAT_RO_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_uncorrect_err"},
269a3c5bd6dSspeer 	{TXC_STAT_SF_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_correct_err"},
270a3c5bd6dSspeer 	{TXC_STAT_SF_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_uncorrect_err"},
271a3c5bd6dSspeer 	{TXC_STAT_ADDRESS_FAILED, KSTAT_DATA_ULONG, "txc_address_failed"},
272a3c5bd6dSspeer 	{TXC_STAT_DMA_FAILED, KSTAT_DATA_ULONG, "txc_dma_failed"},
273a3c5bd6dSspeer 	{TXC_STAT_LENGTH_FAILED, KSTAT_DATA_ULONG, "txc_length_failed"},
274a3c5bd6dSspeer 	{TXC_STAT_PKT_ASSY_DEAD, KSTAT_DATA_ULONG, "txc_pkt_assy_dead"},
275a3c5bd6dSspeer 	{TXC_STAT_REORDER_ERR, KSTAT_DATA_ULONG, "txc_reorder_err"},
276a3c5bd6dSspeer 	{TXC_STAT_END, NULL, NULL}
27744961713Sgirish };
27844961713Sgirish 
279a3c5bd6dSspeer typedef enum {
28044961713Sgirish 	XMAC_STAT_TX_FRAME_CNT = 0,
28144961713Sgirish 	XMAC_STAT_TX_UNDERFLOW_ERR,
28244961713Sgirish 	XMAC_STAT_TX_MAXPKTSIZE_ERR,
28344961713Sgirish 	XMAC_STAT_TX_OVERFLOW_ERR,
28444961713Sgirish 	XMAC_STAT_TX_FIFO_XFR_ERR,
28544961713Sgirish 	XMAC_STAT_TX_BYTE_CNT,
28644961713Sgirish 	XMAC_STAT_RX_FRAME_CNT,
28744961713Sgirish 	XMAC_STAT_RX_UNDERFLOW_ERR,
28844961713Sgirish 	XMAC_STAT_RX_OVERFLOW_ERR,
28944961713Sgirish 	XMAC_STAT_RX_CRC_ERR_CNT,
29044961713Sgirish 	XMAC_STAT_RX_LEN_ERR_CNT,
29144961713Sgirish 	XMAC_STAT_RX_VIOL_ERR_CNT,
29244961713Sgirish 	XMAC_STAT_RX_BYTE_CNT,
29344961713Sgirish 	XMAC_STAT_RX_HIST1_CNT,
29444961713Sgirish 	XMAC_STAT_RX_HIST2_CNT,
29544961713Sgirish 	XMAC_STAT_RX_HIST3_CNT,
29644961713Sgirish 	XMAC_STAT_RX_HIST4_CNT,
29744961713Sgirish 	XMAC_STAT_RX_HIST5_CNT,
29844961713Sgirish 	XMAC_STAT_RX_HIST6_CNT,
29944961713Sgirish 	XMAC_STAT_RX_HIST7_CNT,
30044961713Sgirish 	XMAC_STAT_RX_BROADCAST_CNT,
30144961713Sgirish 	XMAC_STAT_RX_MULT_CNT,
30244961713Sgirish 	XMAC_STAT_RX_FRAG_CNT,
30344961713Sgirish 	XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
30444961713Sgirish 	XMAC_STAT_RX_LINKFAULT_ERR_CNT,
30544961713Sgirish 	XMAC_STAT_RX_REMOTEFAULT_ERR,
30644961713Sgirish 	XMAC_STAT_RX_LOCALFAULT_ERR,
30744961713Sgirish 	XMAC_STAT_RX_PAUSE_CNT,
30844961713Sgirish 	XMAC_STAT_TX_PAUSE_STATE,
30944961713Sgirish 	XMAC_STAT_TX_NOPAUSE_STATE,
31044961713Sgirish 	XMAC_STAT_XPCS_DESKEW_ERR_CNT,
31114ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
31244961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
31344961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
31444961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
31544961713Sgirish 	XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
31614ea4bb7Ssd #endif
31744961713Sgirish 	XMAC_STAT_END
31844961713Sgirish } nxge_xmac_stat_index_t;
31944961713Sgirish 
32044961713Sgirish nxge_kstat_index_t nxge_xmac_stats[] = {
321a3c5bd6dSspeer 	{XMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
322a3c5bd6dSspeer 	{XMAC_STAT_TX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "tmac_underflow_err"},
323a3c5bd6dSspeer 	{XMAC_STAT_TX_MAXPKTSIZE_ERR, KSTAT_DATA_ULONG, "txmac_maxpktsize_err"},
324a3c5bd6dSspeer 	{XMAC_STAT_TX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "txmac_overflow_err"},
325a3c5bd6dSspeer 	{XMAC_STAT_TX_FIFO_XFR_ERR, KSTAT_DATA_ULONG, "txmac_fifo_xfr_err"},
326a3c5bd6dSspeer 	{XMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
327a3c5bd6dSspeer 	{XMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
328a3c5bd6dSspeer 	{XMAC_STAT_RX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_underflow_err"},
329a3c5bd6dSspeer 	{XMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
330a3c5bd6dSspeer 	{XMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err"},
331a3c5bd6dSspeer 	{XMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_length_err"},
33244961713Sgirish 	{XMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_code_violations"},
333a3c5bd6dSspeer 	{XMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
334a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST1_CNT, KSTAT_DATA_ULONG, "rxmac_64_cnt"},
335a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST2_CNT, KSTAT_DATA_ULONG, "rxmac_65_127_cnt"},
336a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST3_CNT, KSTAT_DATA_ULONG, "rxmac_128_255_cnt"},
337a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST4_CNT, KSTAT_DATA_ULONG, "rxmac_256_511_cnt"},
338a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST5_CNT, KSTAT_DATA_ULONG, "rxmac_512_1023_cnt"},
339a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST6_CNT, KSTAT_DATA_ULONG, "rxmac_1024_1522_cnt"},
340a3c5bd6dSspeer 	{XMAC_STAT_RX_HIST7_CNT, KSTAT_DATA_ULONG, "rxmac_jumbo_cnt"},
341a3c5bd6dSspeer 	{XMAC_STAT_RX_BROADCAST_CNT, KSTAT_DATA_ULONG, "rxmac_broadcast_cnt"},
342a3c5bd6dSspeer 	{XMAC_STAT_RX_MULT_CNT, KSTAT_DATA_ULONG, "rxmac_multicast_cnt"},
343a3c5bd6dSspeer 	{XMAC_STAT_RX_FRAG_CNT, KSTAT_DATA_ULONG, "rxmac_fragment_cnt"},
34444961713Sgirish 	{XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
345a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_alignment_err"},
34644961713Sgirish 	{XMAC_STAT_RX_LINKFAULT_ERR_CNT,
347a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_linkfault_errs"},
34844961713Sgirish 	{XMAC_STAT_RX_REMOTEFAULT_ERR,
349a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_remote_faults"},
35044961713Sgirish 	{XMAC_STAT_RX_LOCALFAULT_ERR,
351a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "rxmac_local_faults"},
352a3c5bd6dSspeer 	{XMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
353a3c5bd6dSspeer 	{XMAC_STAT_TX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
354a3c5bd6dSspeer 	{XMAC_STAT_TX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "txmac_nopause_state"},
35544961713Sgirish 	{XMAC_STAT_XPCS_DESKEW_ERR_CNT,
356a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_deskew_err_cnt"},
35714ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
35844961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
359a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln0_symbol_err_cnt"},
36044961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
361a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln1_symbol_err_cnt"},
36244961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
363a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln2_symbol_err_cnt"},
36444961713Sgirish 	{XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
365a3c5bd6dSspeer 		KSTAT_DATA_ULONG, "xpcs_ln3_symbol_err_cnt"},
36614ea4bb7Ssd #endif
367a3c5bd6dSspeer 	{XMAC_STAT_END, NULL, NULL}
36844961713Sgirish };
36944961713Sgirish 
370a3c5bd6dSspeer typedef enum {
37144961713Sgirish 	BMAC_STAT_TX_FRAME_CNT = 0,
37244961713Sgirish 	BMAC_STAT_TX_UNDERRUN_ERR,
37344961713Sgirish 	BMAC_STAT_TX_MAX_PKT_ERR,
37444961713Sgirish 	BMAC_STAT_TX_BYTE_CNT,
37544961713Sgirish 	BMAC_STAT_RX_FRAME_CNT,
37644961713Sgirish 	BMAC_STAT_RX_BYTE_CNT,
37744961713Sgirish 	BMAC_STAT_RX_OVERFLOW_ERR,
37844961713Sgirish 	BMAC_STAT_RX_ALIGN_ERR_CNT,
37944961713Sgirish 	BMAC_STAT_RX_CRC_ERR_CNT,
38044961713Sgirish 	BMAC_STAT_RX_LEN_ERR_CNT,
38144961713Sgirish 	BMAC_STAT_RX_VIOL_ERR_CNT,
38244961713Sgirish 	BMAC_STAT_RX_PAUSE_CNT,
38344961713Sgirish 	BMAC_STAT_RX_PAUSE_STATE,
38444961713Sgirish 	BMAC_STAT_RX_NOPAUSE_STATE,
38544961713Sgirish 	BMAC_STAT_END
38644961713Sgirish } nxge_bmac_stat_index_t;
38744961713Sgirish 
38844961713Sgirish nxge_kstat_index_t nxge_bmac_stats[] = {
389a3c5bd6dSspeer 	{BMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
390a3c5bd6dSspeer 	{BMAC_STAT_TX_UNDERRUN_ERR, KSTAT_DATA_ULONG, "txmac_underrun_err"},
391a3c5bd6dSspeer 	{BMAC_STAT_TX_MAX_PKT_ERR, KSTAT_DATA_ULONG, "txmac_max_pkt_err"},
392a3c5bd6dSspeer 	{BMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
393a3c5bd6dSspeer 	{BMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
394a3c5bd6dSspeer 	{BMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
395a3c5bd6dSspeer 	{BMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
396a3c5bd6dSspeer 	{BMAC_STAT_RX_ALIGN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_align_err_cnt"},
397a3c5bd6dSspeer 	{BMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err_cnt"},
398a3c5bd6dSspeer 	{BMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_len_err_cnt"},
399a3c5bd6dSspeer 	{BMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_viol_err_cnt"},
400a3c5bd6dSspeer 	{BMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
401a3c5bd6dSspeer 	{BMAC_STAT_RX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
402a3c5bd6dSspeer 	{BMAC_STAT_RX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "tx_nopause_state"},
403a3c5bd6dSspeer 	{BMAC_STAT_END, NULL, NULL}
40444961713Sgirish };
40544961713Sgirish 
406a3c5bd6dSspeer typedef enum {
40744961713Sgirish 	ZCP_STAT_ERRORS,
40844961713Sgirish 	ZCP_STAT_INITS,
40944961713Sgirish 	ZCP_STAT_RRFIFO_UNDERRUN,
41044961713Sgirish 	ZCP_STAT_RRFIFO_OVERRUN,
41144961713Sgirish 	ZCP_STAT_RSPFIFO_UNCORR_ERR,
41244961713Sgirish 	ZCP_STAT_BUFFER_OVERFLOW,
41344961713Sgirish 	ZCP_STAT_STAT_TBL_PERR,
41444961713Sgirish 	ZCP_STAT_DYN_TBL_PERR,
41544961713Sgirish 	ZCP_STAT_BUF_TBL_PERR,
41644961713Sgirish 	ZCP_STAT_TT_PROGRAM_ERR,
41744961713Sgirish 	ZCP_STAT_RSP_TT_INDEX_ERR,
41844961713Sgirish 	ZCP_STAT_SLV_TT_INDEX_ERR,
41944961713Sgirish 	ZCP_STAT_ZCP_TT_INDEX_ERR,
42044961713Sgirish 	ZCP_STAT_ZCP_ACCESS_FAIL,
42144961713Sgirish 	ZCP_CFIFO_ECC,
42244961713Sgirish 	ZCP_STAT_END
42344961713Sgirish } nxge_zcp_stat_index_t;
42444961713Sgirish 
42544961713Sgirish nxge_kstat_index_t nxge_zcp_stats[] = {
426a3c5bd6dSspeer 	{ZCP_STAT_ERRORS, KSTAT_DATA_ULONG, "zcp_erros"},
427a3c5bd6dSspeer 	{ZCP_STAT_INITS, KSTAT_DATA_ULONG, "zcp_inits"},
428a3c5bd6dSspeer 	{ZCP_STAT_RRFIFO_UNDERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_underrun"},
429a3c5bd6dSspeer 	{ZCP_STAT_RRFIFO_OVERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_overrun"},
43044961713Sgirish 	{ZCP_STAT_RSPFIFO_UNCORR_ERR, KSTAT_DATA_ULONG,
431a3c5bd6dSspeer 	"zcp_rspfifo_uncorr_err"},
432a3c5bd6dSspeer 	{ZCP_STAT_BUFFER_OVERFLOW, KSTAT_DATA_ULONG, "zcp_buffer_overflow"},
433a3c5bd6dSspeer 	{ZCP_STAT_STAT_TBL_PERR, KSTAT_DATA_ULONG, "zcp_stat_tbl_perr"},
434a3c5bd6dSspeer 	{ZCP_STAT_DYN_TBL_PERR, KSTAT_DATA_ULONG, "zcp_dyn_tbl_perr"},
435a3c5bd6dSspeer 	{ZCP_STAT_BUF_TBL_PERR, KSTAT_DATA_ULONG, "zcp_buf_tbl_perr"},
436a3c5bd6dSspeer 	{ZCP_STAT_TT_PROGRAM_ERR, KSTAT_DATA_ULONG, "zcp_tt_program_err"},
437a3c5bd6dSspeer 	{ZCP_STAT_RSP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_rsp_tt_index_err"},
438a3c5bd6dSspeer 	{ZCP_STAT_SLV_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_slv_tt_index_err"},
439a3c5bd6dSspeer 	{ZCP_STAT_ZCP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_zcp_tt_index_err"},
440a3c5bd6dSspeer 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_access_fail"},
441a3c5bd6dSspeer 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_cfifo_ecc"},
442a3c5bd6dSspeer 	{ZCP_STAT_END, NULL, NULL}
44344961713Sgirish };
44444961713Sgirish 
445a3c5bd6dSspeer typedef enum {
44644961713Sgirish 	FFLP_STAT_TCAM_PERR,
44744961713Sgirish 	FFLP_STAT_TCAM_ECC_ERR,
44844961713Sgirish 	FFLP_STAT_VLAN_PERR,
44944961713Sgirish 	FFLP_STAT_HASH_LOOKUP_ERR,
45044961713Sgirish 	FFLP_STAT_HASH_P0_PIO_ERR,
45144961713Sgirish 	FFLP_STAT_HASH_P1_PIO_ERR,
45244961713Sgirish 	FFLP_STAT_HASH_P2_PIO_ERR,
45344961713Sgirish 	FFLP_STAT_HASH_P3_PIO_ERR,
45444961713Sgirish 	FFLP_STAT_HASH_P4_PIO_ERR,
45544961713Sgirish 	FFLP_STAT_HASH_P5_PIO_ERR,
45644961713Sgirish 	FFLP_STAT_HASH_P6_PIO_ERR,
45744961713Sgirish 	FFLP_STAT_HASH_P7_PIO_ERR,
45844961713Sgirish 	FFLP_STAT_END
45944961713Sgirish } nxge_fflp_stat_index_t;
46044961713Sgirish 
46144961713Sgirish nxge_kstat_index_t nxge_fflp_stats[] = {
462a3c5bd6dSspeer 	{FFLP_STAT_TCAM_PERR, KSTAT_DATA_ULONG, "fflp_tcam_perr"},
463a3c5bd6dSspeer 	{FFLP_STAT_TCAM_ECC_ERR, KSTAT_DATA_ULONG, "fflp_tcam_ecc_err"},
464a3c5bd6dSspeer 	{FFLP_STAT_VLAN_PERR, KSTAT_DATA_ULONG, "fflp_vlan_perr"},
465a3c5bd6dSspeer 	{FFLP_STAT_HASH_LOOKUP_ERR, KSTAT_DATA_ULONG, "fflp_hash_lookup_err"},
466a3c5bd6dSspeer 	{FFLP_STAT_HASH_P0_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p0_pio_err"},
467a3c5bd6dSspeer 	{FFLP_STAT_HASH_P1_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p1_pio_err"},
468a3c5bd6dSspeer 	{FFLP_STAT_HASH_P2_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p2_pio_err"},
469a3c5bd6dSspeer 	{FFLP_STAT_HASH_P3_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p3_pio_err"},
470a3c5bd6dSspeer 	{FFLP_STAT_HASH_P4_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p4_pio_err"},
471a3c5bd6dSspeer 	{FFLP_STAT_HASH_P5_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p5_pio_err"},
472a3c5bd6dSspeer 	{FFLP_STAT_HASH_P6_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p6_pio_err"},
473a3c5bd6dSspeer 	{FFLP_STAT_HASH_P7_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p7_pio_err"},
474a3c5bd6dSspeer 	{FFLP_STAT_END, NULL, NULL}
47544961713Sgirish };
47644961713Sgirish 
47744961713Sgirish typedef enum {
47844961713Sgirish 	MMAC_MAX_ADDR,
47944961713Sgirish 	MMAC_AVAIL_ADDR,
48044961713Sgirish 	MMAC_ADDR_POOL1,
48144961713Sgirish 	MMAC_ADDR_POOL2,
48244961713Sgirish 	MMAC_ADDR_POOL3,
48344961713Sgirish 	MMAC_ADDR_POOL4,
48444961713Sgirish 	MMAC_ADDR_POOL5,
48544961713Sgirish 	MMAC_ADDR_POOL6,
48644961713Sgirish 	MMAC_ADDR_POOL7,
48744961713Sgirish 	MMAC_ADDR_POOL8,
48844961713Sgirish 	MMAC_ADDR_POOL9,
48944961713Sgirish 	MMAC_ADDR_POOL10,
49044961713Sgirish 	MMAC_ADDR_POOL11,
49144961713Sgirish 	MMAC_ADDR_POOL12,
49244961713Sgirish 	MMAC_ADDR_POOL13,
49344961713Sgirish 	MMAC_ADDR_POOL14,
49444961713Sgirish 	MMAC_ADDR_POOL15,
49544961713Sgirish 	MMAC_ADDR_POOL16,
49644961713Sgirish 	MMAC_STATS_END
49744961713Sgirish } nxge_mmac_stat_index_t;
49844961713Sgirish 
49944961713Sgirish nxge_kstat_index_t nxge_mmac_stats[] = {
50058324dfcSspeer 	{MMAC_MAX_ADDR, KSTAT_DATA_UINT64, "max_mmac_addr"},
50158324dfcSspeer 	{MMAC_AVAIL_ADDR, KSTAT_DATA_UINT64, "avail_mmac_addr"},
50244961713Sgirish 	{MMAC_ADDR_POOL1, KSTAT_DATA_UINT64, "mmac_addr_1"},
50344961713Sgirish 	{MMAC_ADDR_POOL2, KSTAT_DATA_UINT64, "mmac_addr_2"},
50444961713Sgirish 	{MMAC_ADDR_POOL3, KSTAT_DATA_UINT64, "mmac_addr_3"},
50544961713Sgirish 	{MMAC_ADDR_POOL4, KSTAT_DATA_UINT64, "mmac_addr_4"},
50644961713Sgirish 	{MMAC_ADDR_POOL5, KSTAT_DATA_UINT64, "mmac_addr_5"},
50744961713Sgirish 	{MMAC_ADDR_POOL6, KSTAT_DATA_UINT64, "mmac_addr_6"},
50844961713Sgirish 	{MMAC_ADDR_POOL7, KSTAT_DATA_UINT64, "mmac_addr_7"},
50944961713Sgirish 	{MMAC_ADDR_POOL8, KSTAT_DATA_UINT64, "mmac_addr_8"},
51044961713Sgirish 	{MMAC_ADDR_POOL9, KSTAT_DATA_UINT64, "mmac_addr_9"},
51144961713Sgirish 	{MMAC_ADDR_POOL10, KSTAT_DATA_UINT64, "mmac_addr_10"},
51244961713Sgirish 	{MMAC_ADDR_POOL11, KSTAT_DATA_UINT64, "mmac_addr_11"},
51344961713Sgirish 	{MMAC_ADDR_POOL12, KSTAT_DATA_UINT64, "mmac_addr_12"},
51444961713Sgirish 	{MMAC_ADDR_POOL13, KSTAT_DATA_UINT64, "mmac_addr_13"},
51544961713Sgirish 	{MMAC_ADDR_POOL14, KSTAT_DATA_UINT64, "mmac_addr_14"},
51644961713Sgirish 	{MMAC_ADDR_POOL15, KSTAT_DATA_UINT64, "mmac_addr_15"},
51744961713Sgirish 	{MMAC_ADDR_POOL16, KSTAT_DATA_UINT64, "mmac_addr_16"},
51844961713Sgirish 	{MMAC_STATS_END, NULL, NULL},
51944961713Sgirish };
52044961713Sgirish 
521a3c5bd6dSspeer /* ARGSUSED */
52244961713Sgirish int
52344961713Sgirish nxge_tdc_stat_update(kstat_t *ksp, int rw)
52444961713Sgirish {
525a3c5bd6dSspeer 	p_nxge_t nxgep;
526a3c5bd6dSspeer 	p_nxge_tdc_kstat_t tdc_kstatsp;
527a3c5bd6dSspeer 	p_nxge_tx_ring_stats_t statsp;
528a3c5bd6dSspeer 	int channel;
529a3c5bd6dSspeer 	char *ch_name, *end;
53044961713Sgirish 
53144961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
53244961713Sgirish 	if (nxgep == NULL)
53344961713Sgirish 		return (-1);
534a3c5bd6dSspeer 
53544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rxstat_update"));
53644961713Sgirish 
53744961713Sgirish 	ch_name = ksp->ks_name;
53844961713Sgirish 	ch_name += strlen(TDC_NAME_FORMAT1);
53944961713Sgirish 	channel = mi_strtol(ch_name, &end, 10);
54044961713Sgirish 
54144961713Sgirish 	tdc_kstatsp = (p_nxge_tdc_kstat_t)ksp->ks_data;
54244961713Sgirish 	statsp = (p_nxge_tx_ring_stats_t)&nxgep->statsp->tdc_stats[channel];
54344961713Sgirish 
54444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
545*71cd5202Smisaki 	    "nxge_tdc_stat_update data $%p statsp $%p channel %d",
546*71cd5202Smisaki 	    ksp->ks_data, statsp, channel));
54744961713Sgirish 
54844961713Sgirish 	if (rw == KSTAT_WRITE) {
54944961713Sgirish 		statsp->opackets = tdc_kstatsp->opackets.value.ull;
55044961713Sgirish 		statsp->obytes = tdc_kstatsp->obytes.value.ull;
55144961713Sgirish 		statsp->oerrors = tdc_kstatsp->oerrors.value.ull;
55244961713Sgirish 		statsp->mbox_err = tdc_kstatsp->mbox_err.value.ul;
55344961713Sgirish 		statsp->pkt_size_err = tdc_kstatsp->pkt_size_err.value.ul;
55444961713Sgirish 		statsp->tx_ring_oflow = tdc_kstatsp->tx_ring_oflow.value.ul;
55544961713Sgirish 		statsp->pre_buf_par_err =
556*71cd5202Smisaki 		    tdc_kstatsp->pref_buf_ecc_err.value.ul;
55744961713Sgirish 		statsp->nack_pref = tdc_kstatsp->nack_pref.value.ul;
55844961713Sgirish 		statsp->nack_pkt_rd = tdc_kstatsp->nack_pkt_rd.value.ul;
55944961713Sgirish 		statsp->conf_part_err = tdc_kstatsp->conf_part_err.value.ul;
56044961713Sgirish 		statsp->pkt_part_err = tdc_kstatsp->pkt_prt_err.value.ul;
56144961713Sgirish 	} else {
56244961713Sgirish 		tdc_kstatsp->opackets.value.ull = statsp->opackets;
56344961713Sgirish 		tdc_kstatsp->obytes.value.ull = statsp->obytes;
56444961713Sgirish 		tdc_kstatsp->oerrors.value.ull = statsp->oerrors;
56544961713Sgirish 		tdc_kstatsp->tx_hdr_pkts.value.ull = statsp->tx_hdr_pkts;
56644961713Sgirish 		tdc_kstatsp->tx_ddi_pkts.value.ull = statsp->tx_ddi_pkts;
56744961713Sgirish 		tdc_kstatsp->tx_dvma_pkts.value.ull = statsp->tx_dvma_pkts;
56844961713Sgirish 		tdc_kstatsp->tx_max_pend.value.ull = statsp->tx_max_pend;
56944961713Sgirish 		tdc_kstatsp->mbox_err.value.ul = statsp->mbox_err;
57044961713Sgirish 		tdc_kstatsp->pkt_size_err.value.ul = statsp->pkt_size_err;
57144961713Sgirish 		tdc_kstatsp->tx_ring_oflow.value.ul = statsp->tx_ring_oflow;
57244961713Sgirish 		tdc_kstatsp->pref_buf_ecc_err.value.ul =
573*71cd5202Smisaki 		    statsp->pre_buf_par_err;
57444961713Sgirish 		tdc_kstatsp->nack_pref.value.ul = statsp->nack_pref;
57544961713Sgirish 		tdc_kstatsp->nack_pkt_rd.value.ul = statsp->nack_pkt_rd;
57644961713Sgirish 		tdc_kstatsp->conf_part_err.value.ul = statsp->conf_part_err;
57744961713Sgirish 		tdc_kstatsp->pkt_prt_err.value.ul = statsp->pkt_part_err;
57844961713Sgirish 		tdc_kstatsp->tx_starts.value.ul = statsp->tx_starts;
57944961713Sgirish 		tdc_kstatsp->tx_nocanput.value.ul = statsp->tx_nocanput;
58044961713Sgirish 		tdc_kstatsp->tx_msgdup_fail.value.ul = statsp->tx_msgdup_fail;
58144961713Sgirish 		tdc_kstatsp->tx_allocb_fail.value.ul = statsp->tx_allocb_fail;
58244961713Sgirish 		tdc_kstatsp->tx_no_desc.value.ul = statsp->tx_no_desc;
58344961713Sgirish 		tdc_kstatsp->tx_dma_bind_fail.value.ul =
584*71cd5202Smisaki 		    statsp->tx_dma_bind_fail;
58544961713Sgirish 	}
58644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_tdc_stat_update"));
58744961713Sgirish 	return (0);
58844961713Sgirish }
58944961713Sgirish 
590a3c5bd6dSspeer /* ARGSUSED */
59144961713Sgirish int
59244961713Sgirish nxge_rdc_stat_update(kstat_t *ksp, int rw)
59344961713Sgirish {
594a3c5bd6dSspeer 	p_nxge_t nxgep;
595a3c5bd6dSspeer 	p_nxge_rdc_kstat_t rdc_kstatsp;
596a3c5bd6dSspeer 	p_nxge_rx_ring_stats_t statsp;
597a3c5bd6dSspeer 	int channel;
59844961713Sgirish 	char *ch_name, *end;
59944961713Sgirish 
60044961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
60144961713Sgirish 	if (nxgep == NULL)
60244961713Sgirish 		return (-1);
603a3c5bd6dSspeer 
60444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_stat_update"));
60544961713Sgirish 
60644961713Sgirish 	ch_name = ksp->ks_name;
60744961713Sgirish 	ch_name += strlen(RDC_NAME_FORMAT1);
60844961713Sgirish 	channel = mi_strtol(ch_name, &end, 10);
60944961713Sgirish 
61044961713Sgirish 	rdc_kstatsp = (p_nxge_rdc_kstat_t)ksp->ks_data;
61144961713Sgirish 	statsp = (p_nxge_rx_ring_stats_t)&nxgep->statsp->rdc_stats[channel];
61244961713Sgirish 
61344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
614*71cd5202Smisaki 	    "nxge_rdc_stat_update $%p statsp $%p channel %d",
615*71cd5202Smisaki 	    ksp->ks_data, statsp, channel));
61644961713Sgirish 
61744961713Sgirish 	if (rw == KSTAT_WRITE) {
61844961713Sgirish 		statsp->dcf_err = rdc_kstatsp->dcf_err.value.ul;
61944961713Sgirish 		statsp->rcr_ack_err = rdc_kstatsp->rcr_ack_err.value.ul;
62044961713Sgirish 		statsp->dc_fifo_err = rdc_kstatsp->dc_fifoflow_err.value.ul;
62144961713Sgirish 		statsp->rcr_sha_par = rdc_kstatsp->rcr_sha_par_err.value.ul;
62244961713Sgirish 		statsp->rbr_pre_par = rdc_kstatsp->rbr_pre_par_err.value.ul;
62344961713Sgirish 		statsp->wred_drop = rdc_kstatsp->wred_drop.value.ul;
62444961713Sgirish 		statsp->rbr_pre_empty = rdc_kstatsp->rbr_pre_emty.value.ul;
62544961713Sgirish 		statsp->rcr_shadow_full = rdc_kstatsp->rcr_shadow_full.value.ul;
62644961713Sgirish 		statsp->rx_rbr_tmout = rdc_kstatsp->rbr_tmout.value.ul;
62744961713Sgirish 		statsp->rsp_cnt_err = rdc_kstatsp->rsp_cnt_err.value.ul;
62844961713Sgirish 		statsp->byte_en_bus = rdc_kstatsp->byte_en_bus.value.ul;
62944961713Sgirish 		statsp->rsp_dat_err = rdc_kstatsp->rsp_dat_err.value.ul;
6304202ea4bSsbehera 		statsp->pkt_too_long_err =
6314202ea4bSsbehera 		    rdc_kstatsp->pkt_too_long_err.value.ul;
63244961713Sgirish 		statsp->l2_err = rdc_kstatsp->compl_l2_err.value.ul;
63344961713Sgirish 		statsp->l4_cksum_err = rdc_kstatsp->compl_l4_cksum_err.value.ul;
63444961713Sgirish 		statsp->fflp_soft_err =
635*71cd5202Smisaki 		    rdc_kstatsp->compl_fflp_soft_err.value.ul;
63644961713Sgirish 		statsp->zcp_soft_err = rdc_kstatsp->compl_zcp_soft_err.value.ul;
63744961713Sgirish 		statsp->config_err = rdc_kstatsp->config_err.value.ul;
63844961713Sgirish 		statsp->rcrincon = rdc_kstatsp->rcrincon.value.ul;
63944961713Sgirish 		statsp->rcrfull = rdc_kstatsp->rcrfull.value.ul;
64044961713Sgirish 		statsp->rbr_empty = rdc_kstatsp->rbr_empty.value.ul;
64144961713Sgirish 		statsp->rbrfull = rdc_kstatsp->rbrfull.value.ul;
64244961713Sgirish 		statsp->rbrlogpage = rdc_kstatsp->rbrlogpage.value.ul;
64344961713Sgirish 		statsp->cfiglogpage = rdc_kstatsp->cfiglogpage.value.ul;
64444961713Sgirish 	} else {
64544961713Sgirish 		rdc_kstatsp->ipackets.value.ull = statsp->ipackets;
64644961713Sgirish 		rdc_kstatsp->rbytes.value.ull = statsp->ibytes;
64744961713Sgirish 		rdc_kstatsp->errors.value.ul = statsp->ierrors;
64844961713Sgirish 		rdc_kstatsp->dcf_err.value.ul = statsp->dcf_err;
64944961713Sgirish 		rdc_kstatsp->rcr_ack_err.value.ul = statsp->rcr_ack_err;
65044961713Sgirish 		rdc_kstatsp->dc_fifoflow_err.value.ul = statsp->dc_fifo_err;
65144961713Sgirish 		rdc_kstatsp->rcr_sha_par_err.value.ul = statsp->rcr_sha_par;
65244961713Sgirish 		rdc_kstatsp->rbr_pre_par_err.value.ul = statsp->rbr_pre_par;
653a3c5bd6dSspeer 		rdc_kstatsp->wred_drop.value.ul = statsp->wred_drop;
654a3c5bd6dSspeer 		rdc_kstatsp->port_drop_pkt.value.ul = statsp->port_drop_pkt;
65544961713Sgirish 		rdc_kstatsp->rbr_pre_emty.value.ul = statsp->rbr_pre_empty;
65644961713Sgirish 		rdc_kstatsp->rcr_shadow_full.value.ul = statsp->rcr_shadow_full;
65744961713Sgirish 		rdc_kstatsp->rbr_tmout.value.ul = statsp->rx_rbr_tmout;
65844961713Sgirish 		rdc_kstatsp->rsp_cnt_err.value.ul = statsp->rsp_cnt_err;
65944961713Sgirish 		rdc_kstatsp->byte_en_bus.value.ul = statsp->byte_en_bus;
66044961713Sgirish 		rdc_kstatsp->rsp_dat_err.value.ul = statsp->rsp_dat_err;
6614202ea4bSsbehera 		rdc_kstatsp->pkt_too_long_err.value.ul =
6624202ea4bSsbehera 		    statsp->pkt_too_long_err;
66344961713Sgirish 		rdc_kstatsp->compl_l2_err.value.ul = statsp->l2_err;
66444961713Sgirish 		rdc_kstatsp->compl_l4_cksum_err.value.ul = statsp->l4_cksum_err;
66544961713Sgirish 		rdc_kstatsp->compl_fflp_soft_err.value.ul =
666*71cd5202Smisaki 		    statsp->fflp_soft_err;
66744961713Sgirish 		rdc_kstatsp->compl_zcp_soft_err.value.ul = statsp->zcp_soft_err;
66844961713Sgirish 		rdc_kstatsp->config_err.value.ul = statsp->config_err;
66944961713Sgirish 		rdc_kstatsp->rcrincon.value.ul = statsp->rcrincon;
67044961713Sgirish 		rdc_kstatsp->rcrfull.value.ul = statsp->rcrfull;
67144961713Sgirish 		rdc_kstatsp->rbr_empty.value.ul = statsp->rbr_empty;
67244961713Sgirish 		rdc_kstatsp->rbrfull.value.ul = statsp->rbrfull;
67344961713Sgirish 		rdc_kstatsp->rbrlogpage.value.ul = statsp->rbrlogpage;
67444961713Sgirish 		rdc_kstatsp->cfiglogpage.value.ul = statsp->cfiglogpage;
67544961713Sgirish 	}
676a3c5bd6dSspeer 
67744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_stat_update"));
67844961713Sgirish 	return (0);
67944961713Sgirish }
68044961713Sgirish 
681a3c5bd6dSspeer /* ARGSUSED */
68244961713Sgirish int
68344961713Sgirish nxge_rdc_sys_stat_update(kstat_t *ksp, int rw)
68444961713Sgirish {
685a3c5bd6dSspeer 	p_nxge_t nxgep;
686a3c5bd6dSspeer 	p_nxge_rdc_sys_kstat_t rdc_sys_kstatsp;
687a3c5bd6dSspeer 	p_nxge_rdc_sys_stats_t statsp;
68844961713Sgirish 
68944961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
69044961713Sgirish 	if (nxgep == NULL)
69144961713Sgirish 		return (-1);
692a3c5bd6dSspeer 
69344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_sys_stat_update"));
69444961713Sgirish 
69544961713Sgirish 	rdc_sys_kstatsp = (p_nxge_rdc_sys_kstat_t)ksp->ks_data;
69644961713Sgirish 	statsp = (p_nxge_rdc_sys_stats_t)&nxgep->statsp->rdc_sys_stats;
69744961713Sgirish 
69844961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "nxge_rdc_sys_stat_update %llx",
699*71cd5202Smisaki 	    ksp->ks_data));
70044961713Sgirish 
70144961713Sgirish 	if (rw == KSTAT_WRITE) {
70244961713Sgirish 		statsp->id_mismatch = rdc_sys_kstatsp->id_mismatch.value.ul;
70344961713Sgirish 		statsp->ipp_eop_err = rdc_sys_kstatsp->ipp_eop_err.value.ul;
70444961713Sgirish 		statsp->zcp_eop_err = rdc_sys_kstatsp->zcp_eop_err.value.ul;
70544961713Sgirish 	} else {
70644961713Sgirish 		rdc_sys_kstatsp->id_mismatch.value.ul = statsp->id_mismatch;
70744961713Sgirish 		rdc_sys_kstatsp->ipp_eop_err.value.ul = statsp->ipp_eop_err;
70844961713Sgirish 		rdc_sys_kstatsp->zcp_eop_err.value.ul = statsp->zcp_eop_err;
70944961713Sgirish 	}
71044961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_sys_stat_update"));
71144961713Sgirish 	return (0);
71244961713Sgirish }
71344961713Sgirish 
714a3c5bd6dSspeer /* ARGSUSED */
71544961713Sgirish static int
71644961713Sgirish nxge_txc_stat_update(kstat_t *ksp, int rw)
71744961713Sgirish {
718a3c5bd6dSspeer 	p_nxge_t nxgep;
719a3c5bd6dSspeer 	p_nxge_txc_kstat_t txc_kstatsp;
720a3c5bd6dSspeer 	p_nxge_txc_stats_t statsp;
72144961713Sgirish 
72244961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
72344961713Sgirish 
72444961713Sgirish 	if (nxgep == NULL)
72544961713Sgirish 		return (-1);
72644961713Sgirish 
72744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_txc_stat_update"));
72844961713Sgirish 
72944961713Sgirish 	txc_kstatsp = (p_nxge_txc_kstat_t)ksp->ks_data;
73044961713Sgirish 	statsp = (p_nxge_txc_stats_t)&nxgep->statsp->txc_stats;
73144961713Sgirish 
73244961713Sgirish 	if (rw == KSTAT_WRITE) {
73344961713Sgirish 		statsp->pkt_stuffed = txc_kstatsp->pkt_stuffed.value.ul;
73444961713Sgirish 		statsp->pkt_xmit = txc_kstatsp->pkt_xmit.value.ul;
73544961713Sgirish 		statsp->ro_correct_err = txc_kstatsp->ro_correct_err.value.ul;
73644961713Sgirish 		statsp->ro_uncorrect_err =
737*71cd5202Smisaki 		    txc_kstatsp->ro_uncorrect_err.value.ul;
73844961713Sgirish 		statsp->sf_correct_err = txc_kstatsp->sf_correct_err.value.ul;
73944961713Sgirish 		statsp->sf_uncorrect_err =
740*71cd5202Smisaki 		    txc_kstatsp->sf_uncorrect_err.value.ul;
74144961713Sgirish 		statsp->address_failed = txc_kstatsp->address_failed.value.ul;
74244961713Sgirish 		statsp->dma_failed = txc_kstatsp->dma_failed.value.ul;
74344961713Sgirish 		statsp->length_failed = txc_kstatsp->length_failed.value.ul;
74444961713Sgirish 		statsp->pkt_assy_dead = txc_kstatsp->pkt_assy_dead.value.ul;
74544961713Sgirish 		statsp->reorder_err = txc_kstatsp->reorder_err.value.ul;
74644961713Sgirish 	} else {
74744961713Sgirish 		txc_kstatsp->pkt_stuffed.value.ul = statsp->pkt_stuffed;
74844961713Sgirish 		txc_kstatsp->pkt_xmit.value.ul = statsp->pkt_xmit;
74944961713Sgirish 		txc_kstatsp->ro_correct_err.value.ul = statsp->ro_correct_err;
75044961713Sgirish 		txc_kstatsp->ro_uncorrect_err.value.ul =
751*71cd5202Smisaki 		    statsp->ro_uncorrect_err;
75244961713Sgirish 		txc_kstatsp->sf_correct_err.value.ul = statsp->sf_correct_err;
75344961713Sgirish 		txc_kstatsp->sf_uncorrect_err.value.ul =
754*71cd5202Smisaki 		    statsp->sf_uncorrect_err;
75544961713Sgirish 		txc_kstatsp->address_failed.value.ul = statsp->address_failed;
75644961713Sgirish 		txc_kstatsp->dma_failed.value.ul = statsp->dma_failed;
75744961713Sgirish 		txc_kstatsp->length_failed.value.ul = statsp->length_failed;
75844961713Sgirish 		txc_kstatsp->pkt_assy_dead.value.ul = statsp->pkt_assy_dead;
75944961713Sgirish 		txc_kstatsp->reorder_err.value.ul = statsp->reorder_err;
76044961713Sgirish 	}
76144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_txc_stat_update"));
76244961713Sgirish 	return (0);
76344961713Sgirish }
76444961713Sgirish 
765a3c5bd6dSspeer /* ARGSUSED */
76644961713Sgirish int
76744961713Sgirish nxge_ipp_stat_update(kstat_t *ksp, int rw)
76844961713Sgirish {
769a3c5bd6dSspeer 	p_nxge_t nxgep;
770a3c5bd6dSspeer 	p_nxge_ipp_kstat_t ipp_kstatsp;
771a3c5bd6dSspeer 	p_nxge_ipp_stats_t statsp;
77244961713Sgirish 
77344961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
77444961713Sgirish 	if (nxgep == NULL)
77544961713Sgirish 		return (-1);
77644961713Sgirish 
77744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_ipp_stat_update"));
77844961713Sgirish 
77944961713Sgirish 	ipp_kstatsp = (p_nxge_ipp_kstat_t)ksp->ks_data;
78044961713Sgirish 	statsp = (p_nxge_ipp_stats_t)&nxgep->statsp->ipp_stats;
78144961713Sgirish 
78244961713Sgirish 	if (rw == KSTAT_WRITE) {
78344961713Sgirish 		statsp->eop_miss = ipp_kstatsp->eop_miss.value.ul;
78444961713Sgirish 		statsp->sop_miss = ipp_kstatsp->sop_miss.value.ul;
78544961713Sgirish 		statsp->dfifo_ue = ipp_kstatsp->dfifo_ue.value.ul;
78644961713Sgirish 		statsp->ecc_err_cnt = ipp_kstatsp->ecc_err_cnt.value.ul;
787846a903dSml 		statsp->pfifo_perr = ipp_kstatsp->pfifo_perr.value.ul;
78844961713Sgirish 		statsp->pfifo_over = ipp_kstatsp->pfifo_over.value.ul;
78944961713Sgirish 		statsp->pfifo_und = ipp_kstatsp->pfifo_und.value.ul;
79044961713Sgirish 		statsp->bad_cs_cnt = ipp_kstatsp->bad_cs_cnt.value.ul;
79144961713Sgirish 		statsp->pkt_dis_cnt = ipp_kstatsp->pkt_dis_cnt.value.ul;
79244961713Sgirish 	} else {
79344961713Sgirish 		ipp_kstatsp->eop_miss.value.ul = statsp->eop_miss;
79444961713Sgirish 		ipp_kstatsp->sop_miss.value.ul = statsp->sop_miss;
79544961713Sgirish 		ipp_kstatsp->dfifo_ue.value.ul = statsp->dfifo_ue;
79644961713Sgirish 		ipp_kstatsp->ecc_err_cnt.value.ul = statsp->ecc_err_cnt;
797846a903dSml 		ipp_kstatsp->pfifo_perr.value.ul = statsp->pfifo_perr;
79844961713Sgirish 		ipp_kstatsp->pfifo_over.value.ul = statsp->pfifo_over;
79944961713Sgirish 		ipp_kstatsp->pfifo_und.value.ul = statsp->pfifo_und;
80044961713Sgirish 		ipp_kstatsp->bad_cs_cnt.value.ul = statsp->bad_cs_cnt;
80144961713Sgirish 		ipp_kstatsp->pkt_dis_cnt.value.ul = statsp->pkt_dis_cnt;
80244961713Sgirish 	}
80344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_ipp_stat_update"));
80444961713Sgirish 	return (0);
80544961713Sgirish }
80644961713Sgirish 
807a3c5bd6dSspeer /* ARGSUSED */
80844961713Sgirish int
80944961713Sgirish nxge_xmac_stat_update(kstat_t *ksp, int rw)
81044961713Sgirish {
811a3c5bd6dSspeer 	p_nxge_t nxgep;
812a3c5bd6dSspeer 	p_nxge_xmac_kstat_t xmac_kstatsp;
813a3c5bd6dSspeer 	p_nxge_xmac_stats_t statsp;
81444961713Sgirish 
81544961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
81644961713Sgirish 	if (nxgep == NULL)
81744961713Sgirish 		return (-1);
81844961713Sgirish 
81944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_xmac_stat_update"));
82044961713Sgirish 
82144961713Sgirish 	xmac_kstatsp = (p_nxge_xmac_kstat_t)ksp->ks_data;
82244961713Sgirish 	statsp = (p_nxge_xmac_stats_t)&nxgep->statsp->xmac_stats;
82344961713Sgirish 
82444961713Sgirish 	if (rw == KSTAT_WRITE) {
82544961713Sgirish 		statsp->tx_frame_cnt = xmac_kstatsp->tx_frame_cnt.value.ul;
82644961713Sgirish 		statsp->tx_underflow_err =
827*71cd5202Smisaki 		    xmac_kstatsp->tx_underflow_err.value.ul;
82844961713Sgirish 		statsp->tx_maxpktsize_err =
829*71cd5202Smisaki 		    xmac_kstatsp->tx_maxpktsize_err.value.ul;
83044961713Sgirish 		statsp->tx_overflow_err =
831*71cd5202Smisaki 		    xmac_kstatsp->tx_overflow_err.value.ul;
83244961713Sgirish 		statsp->tx_fifo_xfr_err =
833*71cd5202Smisaki 		    xmac_kstatsp->tx_fifo_xfr_err.value.ul;
83444961713Sgirish 		statsp->tx_byte_cnt = xmac_kstatsp->tx_byte_cnt.value.ul;
83544961713Sgirish 		statsp->rx_underflow_err =
836*71cd5202Smisaki 		    xmac_kstatsp->rx_underflow_err.value.ul;
83744961713Sgirish 		statsp->rx_overflow_err =
838*71cd5202Smisaki 		    xmac_kstatsp->rx_overflow_err.value.ul;
83944961713Sgirish 		statsp->rx_crc_err_cnt = xmac_kstatsp->rx_crc_err_cnt.value.ul;
84044961713Sgirish 		statsp->rx_len_err_cnt = xmac_kstatsp->rx_len_err_cnt.value.ul;
84144961713Sgirish 		statsp->rx_viol_err_cnt =
842*71cd5202Smisaki 		    xmac_kstatsp->rx_viol_err_cnt.value.ul;
84344961713Sgirish 		statsp->rx_byte_cnt = xmac_kstatsp->rx_byte_cnt.value.ul;
844321febdeSsbehera 		statsp->rx_frame_cnt = xmac_kstatsp->rx_frame_cnt.value.ul;
84544961713Sgirish 		statsp->rx_hist1_cnt = xmac_kstatsp->rx_hist1_cnt.value.ul;
84644961713Sgirish 		statsp->rx_hist2_cnt = xmac_kstatsp->rx_hist2_cnt.value.ul;
84744961713Sgirish 		statsp->rx_hist3_cnt = xmac_kstatsp->rx_hist3_cnt.value.ul;
84844961713Sgirish 		statsp->rx_hist4_cnt = xmac_kstatsp->rx_hist4_cnt.value.ul;
84944961713Sgirish 		statsp->rx_hist5_cnt = xmac_kstatsp->rx_hist5_cnt.value.ul;
85044961713Sgirish 		statsp->rx_hist6_cnt = xmac_kstatsp->rx_hist6_cnt.value.ul;
851321febdeSsbehera 		statsp->rx_hist7_cnt = xmac_kstatsp->rx_hist7_cnt.value.ul;
85244961713Sgirish 		statsp->rx_mult_cnt = xmac_kstatsp->rx_mult_cnt.value.ul;
85344961713Sgirish 		statsp->rx_frag_cnt = xmac_kstatsp->rx_frag_cnt.value.ul;
85444961713Sgirish 		statsp->rx_frame_align_err_cnt =
855*71cd5202Smisaki 		    xmac_kstatsp->rx_frame_align_err_cnt.value.ul;
85644961713Sgirish 		statsp->rx_linkfault_err_cnt =
857*71cd5202Smisaki 		    xmac_kstatsp->rx_linkfault_err_cnt.value.ul;
85844961713Sgirish 		statsp->rx_localfault_err =
859*71cd5202Smisaki 		    xmac_kstatsp->rx_local_fault_err_cnt.value.ul;
86044961713Sgirish 		statsp->rx_remotefault_err =
861*71cd5202Smisaki 		    xmac_kstatsp->rx_remote_fault_err_cnt.value.ul;
86244961713Sgirish 		statsp->xpcs_deskew_err_cnt =
863*71cd5202Smisaki 		    xmac_kstatsp->xpcs_deskew_err_cnt.value.ul;
86414ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
86544961713Sgirish 		statsp->xpcs_ln0_symbol_err_cnt =
866*71cd5202Smisaki 		    xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul;
86744961713Sgirish 		statsp->xpcs_ln1_symbol_err_cnt =
868*71cd5202Smisaki 		    xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul;
86944961713Sgirish 		statsp->xpcs_ln2_symbol_err_cnt =
870*71cd5202Smisaki 		    xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul;
87144961713Sgirish 		statsp->xpcs_ln3_symbol_err_cnt =
872*71cd5202Smisaki 		    xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul;
87314ea4bb7Ssd #endif
87444961713Sgirish 	} else {
87544961713Sgirish 		xmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
87644961713Sgirish 		xmac_kstatsp->tx_underflow_err.value.ul =
877*71cd5202Smisaki 		    statsp->tx_underflow_err;
87844961713Sgirish 		xmac_kstatsp->tx_maxpktsize_err.value.ul =
879*71cd5202Smisaki 		    statsp->tx_maxpktsize_err;
88044961713Sgirish 		xmac_kstatsp->tx_overflow_err.value.ul =
881*71cd5202Smisaki 		    statsp->tx_overflow_err;
88244961713Sgirish 		xmac_kstatsp->tx_fifo_xfr_err.value.ul =
883*71cd5202Smisaki 		    statsp->tx_fifo_xfr_err;
88444961713Sgirish 		xmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
88544961713Sgirish 		xmac_kstatsp->rx_underflow_err.value.ul =
886*71cd5202Smisaki 		    statsp->rx_underflow_err;
88744961713Sgirish 		xmac_kstatsp->rx_overflow_err.value.ul =
888*71cd5202Smisaki 		    statsp->rx_overflow_err;
88944961713Sgirish 		xmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
89044961713Sgirish 		xmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
89144961713Sgirish 		xmac_kstatsp->rx_viol_err_cnt.value.ul =
892*71cd5202Smisaki 		    statsp->rx_viol_err_cnt;
89344961713Sgirish 		xmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
894321febdeSsbehera 		xmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
89544961713Sgirish 		xmac_kstatsp->rx_hist1_cnt.value.ul = statsp->rx_hist1_cnt;
89644961713Sgirish 		xmac_kstatsp->rx_hist2_cnt.value.ul = statsp->rx_hist2_cnt;
89744961713Sgirish 		xmac_kstatsp->rx_hist3_cnt.value.ul = statsp->rx_hist3_cnt;
89844961713Sgirish 		xmac_kstatsp->rx_hist4_cnt.value.ul = statsp->rx_hist4_cnt;
89944961713Sgirish 		xmac_kstatsp->rx_hist5_cnt.value.ul = statsp->rx_hist5_cnt;
90044961713Sgirish 		xmac_kstatsp->rx_hist6_cnt.value.ul = statsp->rx_hist6_cnt;
901321febdeSsbehera 		xmac_kstatsp->rx_hist7_cnt.value.ul = statsp->rx_hist7_cnt;
90244961713Sgirish 		xmac_kstatsp->rx_mult_cnt.value.ul = statsp->rx_mult_cnt;
90344961713Sgirish 		xmac_kstatsp->rx_frag_cnt.value.ul = statsp->rx_frag_cnt;
90444961713Sgirish 		xmac_kstatsp->rx_frame_align_err_cnt.value.ul =
905*71cd5202Smisaki 		    statsp->rx_frame_align_err_cnt;
90644961713Sgirish 		xmac_kstatsp->rx_linkfault_err_cnt.value.ul =
907*71cd5202Smisaki 		    statsp->rx_linkfault_err_cnt;
90844961713Sgirish 		xmac_kstatsp->rx_local_fault_err_cnt.value.ul =
909*71cd5202Smisaki 		    statsp->rx_localfault_err;
91044961713Sgirish 		xmac_kstatsp->rx_remote_fault_err_cnt.value.ul =
911*71cd5202Smisaki 		    statsp->rx_remotefault_err;
91244961713Sgirish 		xmac_kstatsp->xpcs_deskew_err_cnt.value.ul =
913*71cd5202Smisaki 		    statsp->xpcs_deskew_err_cnt;
91414ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
91544961713Sgirish 		xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul =
916*71cd5202Smisaki 		    statsp->xpcs_ln0_symbol_err_cnt;
91744961713Sgirish 		xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul =
918*71cd5202Smisaki 		    statsp->xpcs_ln1_symbol_err_cnt;
91944961713Sgirish 		xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul =
920*71cd5202Smisaki 		    statsp->xpcs_ln2_symbol_err_cnt;
92144961713Sgirish 		xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul =
922*71cd5202Smisaki 		    statsp->xpcs_ln3_symbol_err_cnt;
92314ea4bb7Ssd #endif
92444961713Sgirish 	}
92544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_xmac_stat_update"));
92644961713Sgirish 	return (0);
92744961713Sgirish }
92844961713Sgirish 
929a3c5bd6dSspeer /* ARGSUSED */
93044961713Sgirish int
93144961713Sgirish nxge_bmac_stat_update(kstat_t *ksp, int rw)
93244961713Sgirish {
933a3c5bd6dSspeer 	p_nxge_t nxgep;
934a3c5bd6dSspeer 	p_nxge_bmac_kstat_t bmac_kstatsp;
935a3c5bd6dSspeer 	p_nxge_bmac_stats_t statsp;
93644961713Sgirish 
93744961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
93844961713Sgirish 	if (nxgep == NULL)
93944961713Sgirish 		return (-1);
94044961713Sgirish 
94144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_bmac_stat_update"));
94244961713Sgirish 
94344961713Sgirish 	bmac_kstatsp = (p_nxge_bmac_kstat_t)ksp->ks_data;
94444961713Sgirish 	statsp = (p_nxge_bmac_stats_t)&nxgep->statsp->bmac_stats;
94544961713Sgirish 
94644961713Sgirish 	if (rw == KSTAT_WRITE) {
94744961713Sgirish 		statsp->tx_frame_cnt = bmac_kstatsp->tx_frame_cnt.value.ul;
94844961713Sgirish 		statsp->tx_underrun_err =
949*71cd5202Smisaki 		    bmac_kstatsp->tx_underrun_err.value.ul;
95044961713Sgirish 		statsp->tx_max_pkt_err = bmac_kstatsp->tx_max_pkt_err.value.ul;
95144961713Sgirish 		statsp->tx_byte_cnt = bmac_kstatsp->tx_byte_cnt.value.ul;
95244961713Sgirish 		statsp->rx_frame_cnt = bmac_kstatsp->rx_frame_cnt.value.ul;
95344961713Sgirish 		statsp->rx_byte_cnt = bmac_kstatsp->rx_byte_cnt.value.ul;
95444961713Sgirish 		statsp->rx_overflow_err =
955*71cd5202Smisaki 		    bmac_kstatsp->rx_overflow_err.value.ul;
95644961713Sgirish 		statsp->rx_align_err_cnt =
957*71cd5202Smisaki 		    bmac_kstatsp->rx_align_err_cnt.value.ul;
95844961713Sgirish 		statsp->rx_crc_err_cnt = bmac_kstatsp->rx_crc_err_cnt.value.ul;
95944961713Sgirish 		statsp->rx_len_err_cnt = bmac_kstatsp->rx_len_err_cnt.value.ul;
96044961713Sgirish 		statsp->rx_viol_err_cnt =
961*71cd5202Smisaki 		    bmac_kstatsp->rx_viol_err_cnt.value.ul;
96244961713Sgirish 	} else {
96344961713Sgirish 		bmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
96444961713Sgirish 		bmac_kstatsp->tx_underrun_err.value.ul =
965*71cd5202Smisaki 		    statsp->tx_underrun_err;
96644961713Sgirish 		bmac_kstatsp->tx_max_pkt_err.value.ul = statsp->tx_max_pkt_err;
96744961713Sgirish 		bmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
96844961713Sgirish 		bmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
96944961713Sgirish 		bmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
97044961713Sgirish 		bmac_kstatsp->rx_overflow_err.value.ul =
971*71cd5202Smisaki 		    statsp->rx_overflow_err;
97244961713Sgirish 		bmac_kstatsp->rx_align_err_cnt.value.ul =
973*71cd5202Smisaki 		    statsp->rx_align_err_cnt;
97444961713Sgirish 		bmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
97544961713Sgirish 		bmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
97644961713Sgirish 		bmac_kstatsp->rx_viol_err_cnt.value.ul =
977*71cd5202Smisaki 		    statsp->rx_viol_err_cnt;
97844961713Sgirish 	}
97944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_bmac_stat_update"));
98044961713Sgirish 	return (0);
98144961713Sgirish }
98244961713Sgirish 
983a3c5bd6dSspeer /* ARGSUSED */
98444961713Sgirish int
98544961713Sgirish nxge_zcp_stat_update(kstat_t *ksp, int rw)
98644961713Sgirish {
987a3c5bd6dSspeer 	p_nxge_t nxgep;
988a3c5bd6dSspeer 	p_nxge_zcp_kstat_t zcp_kstatsp;
989a3c5bd6dSspeer 	p_nxge_zcp_stats_t statsp;
99044961713Sgirish 
99144961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
99244961713Sgirish 	if (nxgep == NULL)
99344961713Sgirish 		return (-1);
99444961713Sgirish 
99544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_zcp_stat_update"));
99644961713Sgirish 
99744961713Sgirish 	zcp_kstatsp = (p_nxge_zcp_kstat_t)ksp->ks_data;
99844961713Sgirish 	statsp = (p_nxge_zcp_stats_t)&nxgep->statsp->zcp_stats;
99944961713Sgirish 
100044961713Sgirish 	if (rw == KSTAT_WRITE) {
100144961713Sgirish 		statsp->rrfifo_underrun = zcp_kstatsp->rrfifo_underrun.value.ul;
100244961713Sgirish 		statsp->rrfifo_overrun = zcp_kstatsp->rrfifo_overrun.value.ul;
100344961713Sgirish 		statsp->rspfifo_uncorr_err =
1004*71cd5202Smisaki 		    zcp_kstatsp->rspfifo_uncorr_err.value.ul;
100544961713Sgirish 		statsp->buffer_overflow = zcp_kstatsp->buffer_overflow.value.ul;
100644961713Sgirish 		statsp->stat_tbl_perr = zcp_kstatsp->stat_tbl_perr.value.ul;
100744961713Sgirish 		statsp->dyn_tbl_perr = zcp_kstatsp->dyn_tbl_perr.value.ul;
100844961713Sgirish 		statsp->buf_tbl_perr = zcp_kstatsp->buf_tbl_perr.value.ul;
100944961713Sgirish 		statsp->tt_program_err = zcp_kstatsp->tt_program_err.value.ul;
101044961713Sgirish 		statsp->rsp_tt_index_err =
1011*71cd5202Smisaki 		    zcp_kstatsp->rsp_tt_index_err.value.ul;
101244961713Sgirish 		statsp->slv_tt_index_err =
1013*71cd5202Smisaki 		    zcp_kstatsp->slv_tt_index_err.value.ul;
101444961713Sgirish 		statsp->zcp_tt_index_err =
1015*71cd5202Smisaki 		    zcp_kstatsp->zcp_tt_index_err.value.ul;
101644961713Sgirish 		statsp->cfifo_ecc = zcp_kstatsp->cfifo_ecc.value.ul;
101744961713Sgirish 	} else {
101844961713Sgirish 		zcp_kstatsp->rrfifo_underrun.value.ul = statsp->rrfifo_underrun;
101944961713Sgirish 		zcp_kstatsp->rrfifo_overrun.value.ul = statsp->rrfifo_overrun;
102044961713Sgirish 		zcp_kstatsp->rspfifo_uncorr_err.value.ul =
1021*71cd5202Smisaki 		    statsp->rspfifo_uncorr_err;
102244961713Sgirish 		zcp_kstatsp->buffer_overflow.value.ul =
1023*71cd5202Smisaki 		    statsp->buffer_overflow;
102444961713Sgirish 		zcp_kstatsp->stat_tbl_perr.value.ul = statsp->stat_tbl_perr;
102544961713Sgirish 		zcp_kstatsp->dyn_tbl_perr.value.ul = statsp->dyn_tbl_perr;
1026a3c5bd6dSspeer 		zcp_kstatsp->buf_tbl_perr.value.ul = statsp->buf_tbl_perr;
102744961713Sgirish 		zcp_kstatsp->tt_program_err.value.ul = statsp->tt_program_err;
102844961713Sgirish 		zcp_kstatsp->rsp_tt_index_err.value.ul =
1029*71cd5202Smisaki 		    statsp->rsp_tt_index_err;
103044961713Sgirish 		zcp_kstatsp->slv_tt_index_err.value.ul =
1031*71cd5202Smisaki 		    statsp->slv_tt_index_err;
103244961713Sgirish 		zcp_kstatsp->zcp_tt_index_err.value.ul =
1033*71cd5202Smisaki 		    statsp->zcp_tt_index_err;
1034a3c5bd6dSspeer 		zcp_kstatsp->cfifo_ecc.value.ul = statsp->cfifo_ecc;
103544961713Sgirish 	}
103644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_zcp_stat_update"));
103744961713Sgirish 	return (0);
103844961713Sgirish }
103944961713Sgirish 
1040a3c5bd6dSspeer /* ARGSUSED */
104144961713Sgirish int
104244961713Sgirish nxge_fflp_stat_update(kstat_t *ksp, int rw)
104344961713Sgirish {
1044a3c5bd6dSspeer 	p_nxge_t nxgep;
1045a3c5bd6dSspeer 	p_nxge_fflp_kstat_t fflp_kstatsp;
1046a3c5bd6dSspeer 	p_nxge_fflp_stats_t statsp;
1047a3c5bd6dSspeer 	int ldc_grp;
104844961713Sgirish 
104944961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
105044961713Sgirish 	if (nxgep == NULL)
105144961713Sgirish 		return (-1);
105244961713Sgirish 
105344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_fflp_stat_update"));
105444961713Sgirish 
105544961713Sgirish 	fflp_kstatsp = (p_nxge_fflp_kstat_t)ksp->ks_data;
105644961713Sgirish 	statsp = (p_nxge_fflp_stats_t)&nxgep->statsp->fflp_stats;
105744961713Sgirish 
105844961713Sgirish 	if (rw == KSTAT_WRITE) {
105944961713Sgirish 		statsp->tcam_parity_err = fflp_kstatsp->fflp_tcam_perr.value.ul;
106044961713Sgirish 		statsp->tcam_ecc_err = fflp_kstatsp->fflp_tcam_ecc_err.value.ul;
106144961713Sgirish 		statsp->vlan_parity_err = fflp_kstatsp->fflp_vlan_perr.value.ul;
106244961713Sgirish 		statsp->hash_lookup_err =
1063*71cd5202Smisaki 		    fflp_kstatsp->fflp_hasht_lookup_err.value.ul;
106444961713Sgirish 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
106544961713Sgirish 			statsp->hash_pio_err[ldc_grp] =
1066*71cd5202Smisaki 			    fflp_kstatsp->fflp_hasht_data_err[ldc_grp].
1067*71cd5202Smisaki 			    value.ul;
106844961713Sgirish 		}
106944961713Sgirish 	} else {
107044961713Sgirish 		fflp_kstatsp->fflp_tcam_perr.value.ul =
1071*71cd5202Smisaki 		    fflp_kstatsp->fflp_tcam_perr.value.ul;
107244961713Sgirish 		fflp_kstatsp->fflp_tcam_ecc_err.value.ul = statsp->tcam_ecc_err;
107344961713Sgirish 		fflp_kstatsp->fflp_vlan_perr.value.ul = statsp->vlan_parity_err;
107444961713Sgirish 		fflp_kstatsp->fflp_hasht_lookup_err.value.ul =
1075*71cd5202Smisaki 		    statsp->hash_lookup_err;
107644961713Sgirish 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
107744961713Sgirish 			fflp_kstatsp->fflp_hasht_data_err[ldc_grp].value.ul =
1078*71cd5202Smisaki 			    statsp->hash_pio_err[ldc_grp];
107944961713Sgirish 		}
108044961713Sgirish 	}
108144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_fflp_stat_update"));
108244961713Sgirish 	return (0);
108344961713Sgirish }
108444961713Sgirish 
1085a3c5bd6dSspeer /* ARGSUSED */
108644961713Sgirish static uint64_t
108744961713Sgirish nxge_mac_octet_to_u64(struct ether_addr addr)
108844961713Sgirish {
108944961713Sgirish 	int i;
109044961713Sgirish 	uint64_t addr64 = 0;
1091a3c5bd6dSspeer 
109244961713Sgirish 	for (i = ETHERADDRL - 1; i >= 0; i--) {
109344961713Sgirish 		addr64 <<= 8;
109444961713Sgirish 		addr64 |= addr.ether_addr_octet[i];
109544961713Sgirish 	}
109644961713Sgirish 	return (addr64);
109744961713Sgirish }
109844961713Sgirish 
1099a3c5bd6dSspeer /* ARGSUSED */
110044961713Sgirish int
110144961713Sgirish nxge_mmac_stat_update(kstat_t *ksp, int rw)
110244961713Sgirish {
1103a3c5bd6dSspeer 	p_nxge_t nxgep;
1104a3c5bd6dSspeer 	p_nxge_mmac_kstat_t mmac_kstatsp;
1105a3c5bd6dSspeer 	p_nxge_mmac_stats_t statsp;
110644961713Sgirish 
110744961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
110844961713Sgirish 	if (nxgep == NULL)
110944961713Sgirish 		return (-1);
111044961713Sgirish 
111144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_mmac_stat_update"));
111244961713Sgirish 
111344961713Sgirish 	mmac_kstatsp = (p_nxge_mmac_kstat_t)ksp->ks_data;
111444961713Sgirish 	statsp = (p_nxge_mmac_stats_t)&nxgep->statsp->mmac_stats;
111544961713Sgirish 
111644961713Sgirish 	if (rw == KSTAT_WRITE) {
111744961713Sgirish 		cmn_err(CE_WARN, "Can not write mmac stats");
111844961713Sgirish 	} else {
111944961713Sgirish 		mmac_kstatsp->mmac_max_addr_cnt.value.ul =
1120*71cd5202Smisaki 		    statsp->mmac_max_cnt;
112144961713Sgirish 		mmac_kstatsp->mmac_avail_addr_cnt.value.ul =
1122*71cd5202Smisaki 		    statsp->mmac_avail_cnt;
112344961713Sgirish 		mmac_kstatsp->mmac_addr1.value.ul =
1124*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[0]);
112544961713Sgirish 		mmac_kstatsp->mmac_addr2.value.ul =
1126*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[1]);
112744961713Sgirish 		mmac_kstatsp->mmac_addr3.value.ul =
1128*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[2]);
112944961713Sgirish 		mmac_kstatsp->mmac_addr4.value.ul =
1130*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[3]);
113144961713Sgirish 		mmac_kstatsp->mmac_addr5.value.ul =
1132*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[4]);
113344961713Sgirish 		mmac_kstatsp->mmac_addr6.value.ul =
1134*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[5]);
113544961713Sgirish 		mmac_kstatsp->mmac_addr7.value.ul =
1136*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[6]);
113744961713Sgirish 		mmac_kstatsp->mmac_addr8.value.ul =
1138*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[7]);
113944961713Sgirish 		mmac_kstatsp->mmac_addr9.value.ul =
1140*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[8]);
114144961713Sgirish 		mmac_kstatsp->mmac_addr10.value.ul =
1142*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[9]);
114344961713Sgirish 		mmac_kstatsp->mmac_addr11.value.ul =
1144*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[10]);
114544961713Sgirish 		mmac_kstatsp->mmac_addr12.value.ul =
1146*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[11]);
114744961713Sgirish 		mmac_kstatsp->mmac_addr13.value.ul =
1148*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[12]);
114944961713Sgirish 		mmac_kstatsp->mmac_addr14.value.ul =
1150*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[13]);
115144961713Sgirish 		mmac_kstatsp->mmac_addr15.value.ul =
1152*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[14]);
115344961713Sgirish 		mmac_kstatsp->mmac_addr16.value.ul =
1154*71cd5202Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[15]);
115544961713Sgirish 	}
115644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_mmac_stat_update"));
115744961713Sgirish 	return (0);
115844961713Sgirish }
115944961713Sgirish 
1160a3c5bd6dSspeer /* ARGSUSED */
116144961713Sgirish static kstat_t *
116244961713Sgirish nxge_setup_local_kstat(p_nxge_t nxgep, int instance, char *name,
1163a3c5bd6dSspeer 	const nxge_kstat_index_t *ksip, size_t count,
1164a3c5bd6dSspeer 	int (*update) (kstat_t *, int))
116544961713Sgirish {
116644961713Sgirish 	kstat_t *ksp;
116744961713Sgirish 	kstat_named_t *knp;
116844961713Sgirish 	int i;
1169a3c5bd6dSspeer 
117044961713Sgirish 	ksp = kstat_create(NXGE_DRIVER_NAME, instance, name, "net",
1171*71cd5202Smisaki 	    KSTAT_TYPE_NAMED, count, 0);
117244961713Sgirish 	if (ksp == NULL)
117344961713Sgirish 		return (NULL);
117444961713Sgirish 
117544961713Sgirish 	ksp->ks_private = (void *)nxgep;
117644961713Sgirish 	ksp->ks_update = update;
117744961713Sgirish 	knp = ksp->ks_data;
117844961713Sgirish 
117944961713Sgirish 	for (i = 0; ksip[i].name != NULL; i++) {
118044961713Sgirish 		kstat_named_init(&knp[i], ksip[i].name, ksip[i].type);
118144961713Sgirish 	}
118244961713Sgirish 
118344961713Sgirish 	kstat_install(ksp);
118444961713Sgirish 	return (ksp);
118544961713Sgirish }
118644961713Sgirish 
1187a3c5bd6dSspeer /* ARGSUSED */
1188678453a8Sspeer void
1189678453a8Sspeer nxge_setup_rdc_kstats(p_nxge_t nxgep, int channel)
1190678453a8Sspeer {
1191678453a8Sspeer 	char stat_name[64];
1192678453a8Sspeer 
1193678453a8Sspeer 	/* Setup RDC statistics */
1194678453a8Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
1195678453a8Sspeer 	    RDC_NAME_FORMAT1, channel);
1196678453a8Sspeer 	nxgep->statsp->rdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
1197678453a8Sspeer 	    nxgep->instance,
1198678453a8Sspeer 	    stat_name,
1199678453a8Sspeer 	    nxge_rdc_stats,
1200678453a8Sspeer 	    RDC_STAT_END,
1201678453a8Sspeer 	    nxge_rdc_stat_update);
1202678453a8Sspeer #ifdef	NXGE_DEBUG_ERROR
1203678453a8Sspeer 	if (nxgep->statsp->rdc_ksp[channel] == NULL)
1204678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
1205*71cd5202Smisaki 		    "kstat_create failed for rdc channel %d", channel));
1206678453a8Sspeer #endif
1207678453a8Sspeer }
1208678453a8Sspeer 
1209678453a8Sspeer void
1210678453a8Sspeer nxge_setup_tdc_kstats(p_nxge_t nxgep, int channel)
1211678453a8Sspeer {
1212678453a8Sspeer 	char stat_name[64];
1213678453a8Sspeer 
1214678453a8Sspeer 	/* Setup TDC statistics */
1215678453a8Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
1216678453a8Sspeer 	    TDC_NAME_FORMAT1, channel);
1217678453a8Sspeer 	nxgep->statsp->tdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
1218678453a8Sspeer 	    nxgep->instance,
1219678453a8Sspeer 	    stat_name,
1220678453a8Sspeer 	    nxge_tdc_stats,
1221678453a8Sspeer 	    TDC_STAT_END,
1222678453a8Sspeer 	    nxge_tdc_stat_update);
1223678453a8Sspeer #ifdef	NXGE_DEBUG_ERROR
1224678453a8Sspeer 	if (nxgep->statsp->tdc_ksp[channel] == NULL) {
1225678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
1226*71cd5202Smisaki 		    "kstat_create failed for tdc channel %d", channel));
1227678453a8Sspeer 	}
1228678453a8Sspeer #endif
1229678453a8Sspeer }
1230678453a8Sspeer 
123144961713Sgirish void
123244961713Sgirish nxge_setup_kstats(p_nxge_t nxgep)
123344961713Sgirish {
123444961713Sgirish 	struct kstat *ksp;
123544961713Sgirish 	p_nxge_port_kstat_t nxgekp;
123644961713Sgirish 	size_t nxge_kstat_sz;
123744961713Sgirish 	char mmac_name[64];
1238a3c5bd6dSspeer 
123944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_setup_kstats"));
124044961713Sgirish 
124144961713Sgirish 	/* Setup RDC System statistics */
124244961713Sgirish 	nxgep->statsp->rdc_sys_ksp = nxge_setup_local_kstat(nxgep,
1243*71cd5202Smisaki 	    nxgep->instance,
1244*71cd5202Smisaki 	    "RDC System Stats",
1245*71cd5202Smisaki 	    &nxge_rdc_sys_stats[0],
1246*71cd5202Smisaki 	    RDC_SYS_STAT_END,
1247*71cd5202Smisaki 	    nxge_rdc_sys_stat_update);
124844961713Sgirish 
124944961713Sgirish 	/* Setup IPP statistics */
125044961713Sgirish 	nxgep->statsp->ipp_ksp = nxge_setup_local_kstat(nxgep,
1251*71cd5202Smisaki 	    nxgep->instance,
1252*71cd5202Smisaki 	    "IPP Stats",
1253*71cd5202Smisaki 	    &nxge_ipp_stats[0],
1254*71cd5202Smisaki 	    IPP_STAT_END,
1255*71cd5202Smisaki 	    nxge_ipp_stat_update);
125644961713Sgirish #ifdef	NXGE_DEBUG_ERROR
125744961713Sgirish 	if (nxgep->istatsp->pp_ksp == NULL)
125844961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for ipp"));
125944961713Sgirish #endif
126044961713Sgirish 
126144961713Sgirish 	/* Setup TXC statistics */
126244961713Sgirish 	nxgep->statsp->txc_ksp = nxge_setup_local_kstat(nxgep,
1263*71cd5202Smisaki 	    nxgep->instance, "TXC Stats", &nxge_txc_stats[0],
1264*71cd5202Smisaki 	    TXC_STAT_END, nxge_txc_stat_update);
126544961713Sgirish #ifdef	NXGE_DEBUG_ERROR
126644961713Sgirish 	if (nxgep->statsp->txc_ksp == NULL)
126744961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for txc"));
126844961713Sgirish #endif
126944961713Sgirish 
127044961713Sgirish 	/* Setup ZCP statistics */
127144961713Sgirish 	nxgep->statsp->zcp_ksp = nxge_setup_local_kstat(nxgep,
1272*71cd5202Smisaki 	    nxgep->instance, "ZCP Stats", &nxge_zcp_stats[0],
1273*71cd5202Smisaki 	    ZCP_STAT_END, nxge_zcp_stat_update);
127444961713Sgirish #ifdef	NXGE_DEBUG_ERROR
127544961713Sgirish 	if (nxgep->statsp->zcp_ksp == NULL)
127644961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for zcp"));
127744961713Sgirish #endif
127844961713Sgirish 
127944961713Sgirish 	/* Setup FFLP statistics */
128044961713Sgirish 	nxgep->statsp->fflp_ksp[0] = nxge_setup_local_kstat(nxgep,
1281*71cd5202Smisaki 	    nxgep->instance, "FFLP Stats", &nxge_fflp_stats[0],
1282*71cd5202Smisaki 	    FFLP_STAT_END, nxge_fflp_stat_update);
128344961713Sgirish 
128444961713Sgirish #ifdef	NXGE_DEBUG_ERROR
128544961713Sgirish 	if (nxgep->statsp->fflp_ksp == NULL)
128644961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
1287*71cd5202Smisaki 		    "kstat_create failed for fflp"));
128844961713Sgirish #endif
128944961713Sgirish 
129044961713Sgirish 	(void) sprintf(mmac_name, "MMAC Stats%d", nxgep->instance);
129144961713Sgirish 	nxgep->statsp->mmac_ksp = nxge_setup_local_kstat(nxgep,
1292*71cd5202Smisaki 	    nxgep->instance, "MMAC Stats", &nxge_mmac_stats[0],
1293*71cd5202Smisaki 	    MMAC_STATS_END, nxge_mmac_stat_update);
129444961713Sgirish 
129544961713Sgirish 	nxge_kstat_sz = sizeof (nxge_port_kstat_t) +
1296*71cd5202Smisaki 	    sizeof (nxge_mac_kstat_t) - sizeof (kstat_named_t);
129744961713Sgirish 
129844961713Sgirish 	if ((ksp = kstat_create(NXGE_DRIVER_NAME, nxgep->instance,
1299*71cd5202Smisaki 	    "Port Stats", "net", KSTAT_TYPE_NAMED,
1300*71cd5202Smisaki 	    nxge_kstat_sz / sizeof (kstat_named_t), 0)) == NULL) {
130144961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed"));
130244961713Sgirish 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
130344961713Sgirish 		return;
130444961713Sgirish 	}
130544961713Sgirish 
130644961713Sgirish 	/*
1307a3c5bd6dSspeer 	 * kstats
130844961713Sgirish 	 */
1309a3c5bd6dSspeer 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
131044961713Sgirish 
131144961713Sgirish 	/*
131244961713Sgirish 	 * transceiver state informations.
131344961713Sgirish 	 */
1314a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_inits, "xcvr_inits",
1315*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1316a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_inuse, "xcvr_inuse",
1317*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1318a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_addr, "xcvr_addr",
1319*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1320a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xcvr_id, "xcvr_id",
1321*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1322a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_autoneg, "cap_autoneg",
1323*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1324a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10gfdx, "cap_10gfdx",
1325*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1326a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10ghdx, "cap_10ghdx",
1327*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1328a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_1000fdx, "cap_1000fdx",
1329*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1330a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_1000hdx, "cap_1000hdx",
1331*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1332a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100T4, "cap_100T4",
1333*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1334a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100fdx, "cap_100fdx",
1335*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1336a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_100hdx, "cap_100hdx",
1337*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1338a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10fdx, "cap_10fdx",
1339*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1340a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_10hdx, "cap_10hdx",
1341*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1342a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_asmpause, "cap_asmpause",
1343*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1344a3c5bd6dSspeer 	kstat_named_init(&nxgekp->cap_pause, "cap_pause",
1345*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
134644961713Sgirish 
134744961713Sgirish 	/*
134844961713Sgirish 	 * Link partner capabilities.
134944961713Sgirish 	 */
1350a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_autoneg, "lp_cap_autoneg",
1351*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1352a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10gfdx, "lp_cap_10gfdx",
1353*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1354a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10ghdx, "lp_cap_10ghdx",
1355*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1356a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_1000fdx, "lp_cap_1000fdx",
1357*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1358a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_1000hdx, "lp_cap_1000hdx",
1359*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1360a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100T4, "lp_cap_100T4",
1361*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1362a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100fdx, "lp_cap_100fdx",
1363*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1364a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_100hdx, "lp_cap_100hdx",
1365*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1366a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10fdx, "lp_cap_10fdx",
1367*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1368a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_10hdx, "lp_cap_10hdx",
1369*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1370a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_asmpause, "lp_cap_asmpause",
1371*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1372a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lp_cap_pause, "lp_cap_pause",
1373*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
137444961713Sgirish 	/*
137544961713Sgirish 	 * Shared link setup.
137644961713Sgirish 	 */
1377a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_T4, "link_T4",
1378*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1379a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_speed, "link_speed",
1380*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1381a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_duplex, "link_duplex",
1382*71cd5202Smisaki 	    KSTAT_DATA_CHAR);
1383a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_asmpause, "link_asmpause",
1384*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1385a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_pause, "link_pause",
1386*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1387a3c5bd6dSspeer 	kstat_named_init(&nxgekp->link_up, "link_up",
1388*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
138944961713Sgirish 
139044961713Sgirish 	/*
1391a3c5bd6dSspeer 	 * Let the user know the MTU currently in use by the physical MAC
1392a3c5bd6dSspeer 	 * port.
139344961713Sgirish 	 */
1394a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mac_mtu, "mac_mtu",
1395*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
139644961713Sgirish 
139744961713Sgirish 	/*
139844961713Sgirish 	 * Loopback statistics.
139944961713Sgirish 	 */
1400a3c5bd6dSspeer 	kstat_named_init(&nxgekp->lb_mode, "lb_mode",
1401*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
140244961713Sgirish 
140344961713Sgirish 	/*
1404a3c5bd6dSspeer 	 * This tells the user whether the driver is in QOS mode or not.
140544961713Sgirish 	 */
1406a3c5bd6dSspeer 	kstat_named_init(&nxgekp->qos_mode, "qos_mode",
1407*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
140844961713Sgirish 
140944961713Sgirish 	/*
141044961713Sgirish 	 * This tells whether the instance is trunked or not
141144961713Sgirish 	 */
1412a3c5bd6dSspeer 	kstat_named_init(&nxgekp->trunk_mode, "trunk_mode",
1413*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
141444961713Sgirish 
141544961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1416a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_reqs, "mdt_reqs",
1417*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1418a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdr_bufs, "mdt_hdr_bufs",
1419*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1420a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pld_bufs, "mdt_pld_bufs",
1421*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1422a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pkts, "mdt_pkts",
1423*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1424a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdrs, "mdt_hdrs",
1425*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1426a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_plds, "mdt_plds",
1427*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1428a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_hdr_bind_fail, "mdt_hdr_bind_fail",
1429*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1430a3c5bd6dSspeer 	kstat_named_init(&nxgekp->mdt_pld_bind_fail, "mdt_pld_bind_fail",
1431*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
143244961713Sgirish #endif
1433321febdeSsbehera #ifdef ACCEPT_JUMBO
1434a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_jumbo_pkts, "tx_jumbo_pkts",
1435*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
143644961713Sgirish #endif
143744961713Sgirish 
143844961713Sgirish 	/*
143944961713Sgirish 	 * Rx Statistics.
144044961713Sgirish 	 */
1441321febdeSsbehera #ifdef ACCEPT_JUMBO
1442a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_jumbo_pkts, "rx_jumbo_pkts",
1443*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
144444961713Sgirish #endif
144544961713Sgirish 	/* General MAC statistics */
1446a3c5bd6dSspeer 	kstat_named_init(&nxgekp->ifspeed, "ifspeed",
1447*71cd5202Smisaki 	    KSTAT_DATA_UINT64);
1448a3c5bd6dSspeer 	kstat_named_init(&nxgekp->promisc, "promisc",
1449*71cd5202Smisaki 	    KSTAT_DATA_CHAR);
1450a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rev_id, "rev_id",
1451*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
145244961713Sgirish 
145344961713Sgirish 	ksp->ks_update = nxge_port_kstat_update;
145444961713Sgirish 	ksp->ks_private = (void *) nxgep;
145544961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC)
145644961713Sgirish 		nxge_xmac_init_kstats(ksp);
145744961713Sgirish 	else
145844961713Sgirish 		nxge_bmac_init_kstats(ksp);
145944961713Sgirish 	kstat_install(ksp);
146044961713Sgirish 	nxgep->statsp->port_ksp = ksp;
146144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
146244961713Sgirish }
146344961713Sgirish 
1464a3c5bd6dSspeer /* ARGSUSED */
146544961713Sgirish void
146644961713Sgirish nxge_xmac_init_kstats(struct kstat *ksp)
146744961713Sgirish {
1468a3c5bd6dSspeer 	p_nxge_xmac_kstat_t nxgekp;
146944961713Sgirish 
147044961713Sgirish 	nxgekp = (p_nxge_xmac_kstat_t)ksp->ks_data;
147144961713Sgirish 
147244961713Sgirish 	/*
147344961713Sgirish 	 * Transmit MAC statistics.
147444961713Sgirish 	 */
1475a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
1476*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1477a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
1478*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1479a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
1480*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1481a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
1482*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1483a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
1484*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1485a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
1486*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
148744961713Sgirish 
148844961713Sgirish 	/* Receive MAC statistics */
1489321febdeSsbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
1490321febdeSsbehera 	    KSTAT_DATA_ULONG);
1491a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
1492*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1493a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
1494*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1495a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
1496*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1497a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
1498*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1499a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
1500*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1501a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
1502*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
150344961713Sgirish 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
1504*71cd5202Smisaki 	    "rxmac_alignment_err",
1505*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1506a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
1507*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1508a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
1509*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1510a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
1511*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1512a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
1513*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1514a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
1515*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1516a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
1517*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1518321febdeSsbehera 	kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
1519321febdeSsbehera 	    KSTAT_DATA_ULONG);
1520a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_broadcast_cnt, "rxmac_broadcast_cnt",
1521*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1522a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
1523*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1524a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
1525*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1526a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_linkfault_err_cnt, "rxmac_linkfault_errs",
1527*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
152844961713Sgirish 	kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
1529*71cd5202Smisaki 	    "rxmac_remote_faults",
1530*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
153144961713Sgirish 	kstat_named_init(&nxgekp->rx_local_fault_err_cnt, "rxmac_local_faults",
1532*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
153344961713Sgirish 
153444961713Sgirish 	/* XPCS statistics */
153544961713Sgirish 
1536a3c5bd6dSspeer 	kstat_named_init(&nxgekp->xpcs_deskew_err_cnt, "xpcs_deskew_err_cnt",
1537*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
153814ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
153944961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln0_symbol_err_cnt,
1540*71cd5202Smisaki 	    "xpcs_ln0_symbol_err_cnt",
1541*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
154244961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln1_symbol_err_cnt,
1543*71cd5202Smisaki 	    "xpcs_ln1_symbol_err_cnt",
1544*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
154544961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln2_symbol_err_cnt,
1546*71cd5202Smisaki 	    "xpcs_ln2_symbol_err_cnt",
1547*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
154844961713Sgirish 	kstat_named_init(&nxgekp->xpcs_ln3_symbol_err_cnt,
1549*71cd5202Smisaki 	    "xpcs_ln3_symbol_err_cnt",
1550*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
155114ea4bb7Ssd #endif
155244961713Sgirish }
155344961713Sgirish 
1554a3c5bd6dSspeer /* ARGSUSED */
155544961713Sgirish void
155644961713Sgirish nxge_bmac_init_kstats(struct kstat *ksp)
155744961713Sgirish {
1558a3c5bd6dSspeer 	p_nxge_bmac_kstat_t nxgekp;
155944961713Sgirish 
156044961713Sgirish 	nxgekp = (p_nxge_bmac_kstat_t)ksp->ks_data;
156144961713Sgirish 
156244961713Sgirish 	/*
156344961713Sgirish 	 * Transmit MAC statistics.
156444961713Sgirish 	 */
1565a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
1566*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1567a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underrun_err, "txmac_underflow_err",
1568*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1569a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_max_pkt_err, "txmac_maxpktsize_err",
1570*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1571a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
1572*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
157344961713Sgirish 
157444961713Sgirish 	/* Receive MAC statistics */
1575a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
1576*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1577a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
1578*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1579a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
1580*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1581a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
1582*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1583a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
1584*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1585a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_align_err_cnt, "rxmac_alignment_err",
1586*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1587a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
1588*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
158944961713Sgirish }
159044961713Sgirish 
1591a3c5bd6dSspeer /* ARGSUSED */
159244961713Sgirish void
159344961713Sgirish nxge_mac_init_kstats(p_nxge_t nxgep, struct kstat *ksp)
159444961713Sgirish {
1595a3c5bd6dSspeer 	p_nxge_mac_kstat_t nxgekp;
159644961713Sgirish 
159744961713Sgirish 	nxgekp = (p_nxge_mac_kstat_t)ksp->ks_data;
159844961713Sgirish 
159944961713Sgirish 	/*
160044961713Sgirish 	 * Transmit MAC statistics.
160144961713Sgirish 	 */
1602a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
1603*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1604a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
1605*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1606a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
1607*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1608a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
1609*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1610a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
1611*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1612a3c5bd6dSspeer 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
1613*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
161444961713Sgirish 
1615a3c5bd6dSspeer 	/*
1616a3c5bd6dSspeer 	 * Receive MAC statistics
1617a3c5bd6dSspeer 	 */
1618a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
1619*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1620a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
1621*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1622a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
1623*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1624a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
1625*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1626a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
1627*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1628a3c5bd6dSspeer 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
1629*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
163044961713Sgirish 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
1631*71cd5202Smisaki 	    "rxmac_alignment_err",
1632*71cd5202Smisaki 	    KSTAT_DATA_ULONG);
1633321febdeSsbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
1634321febdeSsbehera 	    KSTAT_DATA_ULONG);
163544961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
163644961713Sgirish 		kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
1637*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
163844961713Sgirish 		kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
1639*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
164044961713Sgirish 		kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
1641*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
164244961713Sgirish 		kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
1643*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
164444961713Sgirish 		kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
1645*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
1646a3c5bd6dSspeer 		kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
1647*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
1648321febdeSsbehera 		kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
1649321febdeSsbehera 		    KSTAT_DATA_ULONG);
165044961713Sgirish 		kstat_named_init(&nxgekp->rx_broadcast_cnt,
1651*71cd5202Smisaki 		    "rxmac_broadcast_cnt",
1652*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
165344961713Sgirish 		kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
1654*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
165544961713Sgirish 		kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
1656*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
165744961713Sgirish 		kstat_named_init(&nxgekp->rx_linkfault_err_cnt,
1658*71cd5202Smisaki 		    "rxmac_linkfault_errs",
1659*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
166044961713Sgirish 		kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
1661*71cd5202Smisaki 		    "rxmac_remote_faults",
1662*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
166344961713Sgirish 		kstat_named_init(&nxgekp->rx_local_fault_err_cnt,
1664*71cd5202Smisaki 		    "rxmac_local_faults",
1665*71cd5202Smisaki 		    KSTAT_DATA_ULONG);
166644961713Sgirish 	}
166744961713Sgirish }
166844961713Sgirish 
1669a3c5bd6dSspeer /* ARGSUSED */
167044961713Sgirish void
167144961713Sgirish nxge_destroy_kstats(p_nxge_t nxgep)
167244961713Sgirish {
167344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_destroy_kstats"));
1674a3c5bd6dSspeer 
1675a3c5bd6dSspeer 	if (nxgep->statsp == NULL)
167644961713Sgirish 		return;
1677a3c5bd6dSspeer 	if (nxgep->statsp->ksp)
167844961713Sgirish 		kstat_delete(nxgep->statsp->ksp);
167944961713Sgirish 
168044961713Sgirish 	if (nxgep->statsp->rdc_sys_ksp)
168144961713Sgirish 		kstat_delete(nxgep->statsp->rdc_sys_ksp);
1682a3c5bd6dSspeer 	if (nxgep->statsp->fflp_ksp[0])
168344961713Sgirish 		kstat_delete(nxgep->statsp->fflp_ksp[0]);
168444961713Sgirish 	if (nxgep->statsp->ipp_ksp)
168544961713Sgirish 		kstat_delete(nxgep->statsp->ipp_ksp);
168644961713Sgirish 	if (nxgep->statsp->txc_ksp)
168744961713Sgirish 		kstat_delete(nxgep->statsp->txc_ksp);
168844961713Sgirish 	if (nxgep->statsp->mac_ksp)
168944961713Sgirish 		kstat_delete(nxgep->statsp->mac_ksp);
169044961713Sgirish 	if (nxgep->statsp->zcp_ksp)
169144961713Sgirish 		kstat_delete(nxgep->statsp->zcp_ksp);
169244961713Sgirish 	if (nxgep->statsp->port_ksp)
169344961713Sgirish 		kstat_delete(nxgep->statsp->port_ksp);
169444961713Sgirish 	if (nxgep->statsp->mmac_ksp)
169544961713Sgirish 		kstat_delete(nxgep->statsp->mmac_ksp);
1696a3c5bd6dSspeer 	if (nxgep->statsp)
169744961713Sgirish 		KMEM_FREE(nxgep->statsp, nxgep->statsp->stats_size);
1698a3c5bd6dSspeer 
169944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_destroy_kstats"));
170044961713Sgirish }
170144961713Sgirish 
1702a3c5bd6dSspeer /* ARGSUSED */
170344961713Sgirish int
170444961713Sgirish nxge_port_kstat_update(kstat_t *ksp, int rw)
170544961713Sgirish {
170644961713Sgirish 	p_nxge_t nxgep;
170744961713Sgirish 	p_nxge_stats_t statsp;
170844961713Sgirish 	p_nxge_port_kstat_t nxgekp;
1709a3c5bd6dSspeer 
171044961713Sgirish 	nxgep = (p_nxge_t)ksp->ks_private;
171144961713Sgirish 	if (nxgep == NULL)
171244961713Sgirish 		return (-1);
171344961713Sgirish 
171444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_port_kstat_update"));
171544961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
171644961713Sgirish 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
171744961713Sgirish 	nxge_save_cntrs(nxgep);
171844961713Sgirish 
171944961713Sgirish 	if (rw == KSTAT_WRITE) {
172044961713Sgirish 		/*
172144961713Sgirish 		 * transceiver state informations.
172244961713Sgirish 		 */
1723a3c5bd6dSspeer 		statsp->mac_stats.xcvr_inits = nxgekp->xcvr_inits.value.ul;
172444961713Sgirish 
172544961713Sgirish 		/*
172644961713Sgirish 		 * Tx Statistics.
172744961713Sgirish 		 */
172844961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1729a3c5bd6dSspeer 		statsp->port_stats.mdt_reqs = nxgekp->mdt_reqs.value.ul;
1730a3c5bd6dSspeer 		statsp->port_stats.mdt_hdr_bufs = nxgekp->mdt_hdr_bufs.value.ul;
1731a3c5bd6dSspeer 		statsp->port_stats.mdt_pld_bufs = nxgekp->mdt_pld_bufs.value.ul;
1732a3c5bd6dSspeer 		statsp->port_stats.mdt_pkts = nxgekp->mdt_pkts.value.ul;
1733a3c5bd6dSspeer 		statsp->port_stats.mdt_hdrs = nxgekp->mdt_hdrs.value.ul;
1734a3c5bd6dSspeer 		statsp->port_stats.mdt_plds = nxgekp->mdt_plds.value.ul;
173544961713Sgirish 		statsp->port_stats.mdt_hdr_bind_fail =
1736*71cd5202Smisaki 		    nxgekp->mdt_hdr_bind_fail.value.ul;
173744961713Sgirish 		statsp->port_stats.mdt_pld_bind_fail =
1738*71cd5202Smisaki 		    nxgekp->mdt_pld_bind_fail.value.ul;
173944961713Sgirish #endif
174044961713Sgirish #ifdef ACCEPT_JUMBO
174144961713Sgirish 		statsp->port_stats.tx_jumbo_pkts =
1742*71cd5202Smisaki 		    nxgekp->tx_jumbo_pkts.value.ul;
174344961713Sgirish #endif
174444961713Sgirish 		/*
174544961713Sgirish 		 * Rx Statistics.
174644961713Sgirish 		 */
1747321febdeSsbehera #ifdef ACCEPT_JUMBO
174844961713Sgirish 		statsp->port_stats.rx_jumbo_pkts =
1749*71cd5202Smisaki 		    nxgekp->rx_jumbo_pkts.value.ul;
175044961713Sgirish #endif
1751321febdeSsbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
1752321febdeSsbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_WRITE);
1753321febdeSsbehera 		} else {
1754321febdeSsbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_WRITE);
1755321febdeSsbehera 		}
175644961713Sgirish 		return (0);
175744961713Sgirish 	} else {
175844961713Sgirish 		if (nxgep->filter.all_phys_cnt)
175944961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "phys");
176044961713Sgirish 		else if (nxgep->filter.all_multicast_cnt)
176144961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "multi");
176244961713Sgirish 		else
176344961713Sgirish 			(void) strcpy(nxgekp->promisc.value.c, "off");
1764a3c5bd6dSspeer 		nxgekp->ifspeed.value.ul =
1765*71cd5202Smisaki 		    statsp->mac_stats.link_speed * 1000000ULL;
1766a3c5bd6dSspeer 		nxgekp->rev_id.value.ul = statsp->mac_stats.rev_id;
176744961713Sgirish 
176844961713Sgirish 		/*
176944961713Sgirish 		 * transceiver state informations.
177044961713Sgirish 		 */
1771a3c5bd6dSspeer 		nxgekp->xcvr_inits.value.ul = statsp->mac_stats.xcvr_inits;
1772a3c5bd6dSspeer 		nxgekp->xcvr_inuse.value.ul = statsp->mac_stats.xcvr_inuse;
1773a3c5bd6dSspeer 		nxgekp->xcvr_addr.value.ul = statsp->mac_stats.xcvr_portn;
1774a3c5bd6dSspeer 		nxgekp->xcvr_id.value.ul = statsp->mac_stats.xcvr_id;
1775a3c5bd6dSspeer 		nxgekp->cap_autoneg.value.ul = statsp->mac_stats.cap_autoneg;
1776a3c5bd6dSspeer 		nxgekp->cap_10gfdx.value.ul = statsp->mac_stats.cap_10gfdx;
1777a3c5bd6dSspeer 		nxgekp->cap_10ghdx.value.ul = statsp->mac_stats.cap_10ghdx;
1778a3c5bd6dSspeer 		nxgekp->cap_1000fdx.value.ul = statsp->mac_stats.cap_1000fdx;
1779a3c5bd6dSspeer 		nxgekp->cap_1000hdx.value.ul = statsp->mac_stats.cap_1000hdx;
1780a3c5bd6dSspeer 		nxgekp->cap_100T4.value.ul = statsp->mac_stats.cap_100T4;
1781a3c5bd6dSspeer 		nxgekp->cap_100fdx.value.ul = statsp->mac_stats.cap_100fdx;
1782a3c5bd6dSspeer 		nxgekp->cap_100hdx.value.ul = statsp->mac_stats.cap_100hdx;
1783a3c5bd6dSspeer 		nxgekp->cap_10fdx.value.ul = statsp->mac_stats.cap_10fdx;
1784a3c5bd6dSspeer 		nxgekp->cap_10hdx.value.ul = statsp->mac_stats.cap_10hdx;
1785a3c5bd6dSspeer 		nxgekp->cap_asmpause.value.ul =
1786*71cd5202Smisaki 		    statsp->mac_stats.cap_asmpause;
1787a3c5bd6dSspeer 		nxgekp->cap_pause.value.ul = statsp->mac_stats.cap_pause;
178844961713Sgirish 
178944961713Sgirish 		/*
179044961713Sgirish 		 * Link partner capabilities.
179144961713Sgirish 		 */
1792a3c5bd6dSspeer 		nxgekp->lp_cap_autoneg.value.ul =
1793*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_autoneg;
179444961713Sgirish 		nxgekp->lp_cap_10gfdx.value.ul =
1795*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_10gfdx;
179644961713Sgirish 		nxgekp->lp_cap_10ghdx.value.ul =
1797*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_10ghdx;
1798a3c5bd6dSspeer 		nxgekp->lp_cap_1000fdx.value.ul =
1799*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_1000fdx;
1800a3c5bd6dSspeer 		nxgekp->lp_cap_1000hdx.value.ul =
1801*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_1000hdx;
1802a3c5bd6dSspeer 		nxgekp->lp_cap_100T4.value.ul =
1803*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_100T4;
1804a3c5bd6dSspeer 		nxgekp->lp_cap_100fdx.value.ul =
1805*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_100fdx;
1806a3c5bd6dSspeer 		nxgekp->lp_cap_100hdx.value.ul =
1807*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_100hdx;
1808a3c5bd6dSspeer 		nxgekp->lp_cap_10fdx.value.ul =
1809*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_10fdx;
1810a3c5bd6dSspeer 		nxgekp->lp_cap_10hdx.value.ul =
1811*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_10hdx;
181244961713Sgirish 		nxgekp->lp_cap_asmpause.value.ul =
1813*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_asmpause;
1814a3c5bd6dSspeer 		nxgekp->lp_cap_pause.value.ul =
1815*71cd5202Smisaki 		    statsp->mac_stats.lp_cap_pause;
181644961713Sgirish 
181744961713Sgirish 		/*
181844961713Sgirish 		 * Physical link statistics.
181944961713Sgirish 		 */
1820a3c5bd6dSspeer 		nxgekp->link_T4.value.ul = statsp->mac_stats.link_T4;
1821a3c5bd6dSspeer 		nxgekp->link_speed.value.ul = statsp->mac_stats.link_speed;
182244961713Sgirish 		if (statsp->mac_stats.link_duplex == 2)
182344961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "full");
182444961713Sgirish 		else if (statsp->mac_stats.link_duplex == 1)
182544961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "half");
182644961713Sgirish 		else
182744961713Sgirish 			(void) strcpy(nxgekp->link_duplex.value.c, "unknown");
1828a3c5bd6dSspeer 		nxgekp->link_asmpause.value.ul =
1829*71cd5202Smisaki 		    statsp->mac_stats.link_asmpause;
1830a3c5bd6dSspeer 		nxgekp->link_pause.value.ul = statsp->mac_stats.link_pause;
1831a3c5bd6dSspeer 		nxgekp->link_up.value.ul = statsp->mac_stats.link_up;
183244961713Sgirish 
183344961713Sgirish 		/*
1834a3c5bd6dSspeer 		 * Lets the user know the MTU currently in use by the physical
1835a3c5bd6dSspeer 		 * MAC port.
183644961713Sgirish 		 */
1837a3c5bd6dSspeer 		nxgekp->mac_mtu.value.ul = statsp->mac_stats.mac_mtu;
183844961713Sgirish 
183944961713Sgirish 		/*
184044961713Sgirish 		 * Loopback statistics.
184144961713Sgirish 		 */
1842a3c5bd6dSspeer 		nxgekp->lb_mode.value.ul = statsp->port_stats.lb_mode;
184344961713Sgirish 
184444961713Sgirish 		/*
1845a3c5bd6dSspeer 		 * This tells the user whether the driver is in QOS mode or
1846a3c5bd6dSspeer 		 * not.
184744961713Sgirish 		 */
1848a3c5bd6dSspeer 		nxgekp->qos_mode.value.ul = statsp->port_stats.qos_mode;
184944961713Sgirish 
185044961713Sgirish 		/*
185144961713Sgirish 		 * This tells whether the instance is trunked or not
185244961713Sgirish 		 */
1853a3c5bd6dSspeer 		nxgekp->trunk_mode.value.ul = statsp->port_stats.trunk_mode;
185444961713Sgirish 
185544961713Sgirish #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
1856a3c5bd6dSspeer 		nxgekp->mdt_reqs.value.ul = statsp->port_stats.mdt_reqs;
1857a3c5bd6dSspeer 		nxgekp->mdt_hdr_bufs.value.ul =
1858*71cd5202Smisaki 		    statsp->port_stats.mdt_hdr_bufs;
1859a3c5bd6dSspeer 		nxgekp->mdt_pld_bufs.value.ul =
1860*71cd5202Smisaki 		    statsp->port_stats.mdt_pld_bufs;
1861a3c5bd6dSspeer 		nxgekp->mdt_pkts.value.ul = statsp->port_stats.mdt_pkts;
1862a3c5bd6dSspeer 		nxgekp->mdt_hdrs.value.ul = statsp->port_stats.mdt_hdrs;
1863a3c5bd6dSspeer 		nxgekp->mdt_plds.value.ul = statsp->port_stats.mdt_plds;
186444961713Sgirish 		nxgekp->mdt_hdr_bind_fail.value.ul =
1865*71cd5202Smisaki 		    statsp->port_stats.mdt_hdr_bind_fail;
186644961713Sgirish 		nxgekp->mdt_pld_bind_fail.value.ul =
1867*71cd5202Smisaki 		    statsp->port_stats.mdt_pld_bind_fail;
186844961713Sgirish #endif
186944961713Sgirish #ifdef ACCEPT_JUMBO
1870a3c5bd6dSspeer 		nxgekp->tx_jumbo_pkts.value.ul =
1871*71cd5202Smisaki 		    statsp->port_stats.tx_jumbo_pkts;
187244961713Sgirish #endif
187344961713Sgirish #ifdef TX_MBLK_DEST
1874a3c5bd6dSspeer 		nxgekp->tx_1_desc.value.ul = statsp->port_stats.tx_1_desc;
1875a3c5bd6dSspeer 		nxgekp->tx_2_desc.value.ul = statsp->port_stats.tx_2_desc;
1876a3c5bd6dSspeer 		nxgekp->tx_3_desc.value.ul = statsp->port_stats.tx_3_desc;
1877a3c5bd6dSspeer 		nxgekp->tx_4_desc.value.ul = statsp->port_stats.tx_4_desc;
1878a3c5bd6dSspeer 		nxgekp->tx_5_desc.value.ul = statsp->port_stats.tx_5_desc;
1879a3c5bd6dSspeer 		nxgekp->tx_6_desc.value.ul = statsp->port_stats.tx_6_desc;
1880a3c5bd6dSspeer 		nxgekp->tx_7_desc.value.ul = statsp->port_stats.tx_7_desc;
1881a3c5bd6dSspeer 		nxgekp->tx_8_desc.value.ul = statsp->port_stats.tx_8_desc;
1882a3c5bd6dSspeer 		nxgekp->tx_max_desc.value.ul =
1883*71cd5202Smisaki 		    statsp->port_stats.tx_max_desc;
188444961713Sgirish #endif
188544961713Sgirish 		/*
188644961713Sgirish 		 * Rx Statistics.
188744961713Sgirish 		 */
188844961713Sgirish #ifdef ACCEPT_JUMBO
1889a3c5bd6dSspeer 		nxgekp->rx_jumbo_pkts.value.ul =
1890*71cd5202Smisaki 		    statsp->port_stats.rx_jumbo_pkts;
189144961713Sgirish #endif
1892321febdeSsbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
1893321febdeSsbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_READ);
1894321febdeSsbehera 		} else {
1895321febdeSsbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_READ);
1896321febdeSsbehera 		}
189744961713Sgirish 	}
1898a3c5bd6dSspeer 
189944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_port_kstat_update"));
190044961713Sgirish 	return (0);
190144961713Sgirish }
190244961713Sgirish 
190344961713Sgirish /*
190444961713Sgirish  * if this is the first init do not bother to save the
190544961713Sgirish  * counters.
190644961713Sgirish  */
1907a3c5bd6dSspeer /* ARGSUSED */
190844961713Sgirish void
190944961713Sgirish nxge_save_cntrs(p_nxge_t nxgep)
191044961713Sgirish {
1911a3c5bd6dSspeer 	p_nxge_stats_t statsp;
1912a3c5bd6dSspeer 	uint64_t val;
1913a3c5bd6dSspeer 	npi_handle_t handle;
1914a3c5bd6dSspeer 	uint8_t portn;
1915a3c5bd6dSspeer 	uint8_t cnt8;
1916a3c5bd6dSspeer 	uint16_t cnt16;
1917a3c5bd6dSspeer 	uint32_t cnt32;
191844961713Sgirish 
191944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_save_cntrs"));
192044961713Sgirish 
192144961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
192244961713Sgirish 	handle = nxgep->npi_handle;
192344961713Sgirish 	portn = nxgep->mac.portnum;
192444961713Sgirish 
192544961713Sgirish 	MUTEX_ENTER(&nxgep->ouraddr_lock);
192644961713Sgirish 
192744961713Sgirish 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
192844961713Sgirish 		/*
192944961713Sgirish 		 * Transmit MAC statistics.
193044961713Sgirish 		 */
193144961713Sgirish 		XMAC_REG_RD(handle, portn, XTXMAC_FRM_CNT_REG, &val);
193244961713Sgirish 		statsp->xmac_stats.tx_frame_cnt += (val & XTXMAC_FRM_CNT_MASK);
193344961713Sgirish 		XMAC_REG_RD(handle, portn, XTXMAC_BYTE_CNT_REG, &val);
193444961713Sgirish 		statsp->xmac_stats.tx_byte_cnt += (val & XTXMAC_BYTE_CNT_MASK);
193544961713Sgirish 		/*
193644961713Sgirish 		 * Receive XMAC statistics.
193744961713Sgirish 		 */
193844961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_CRC_ER_CNT_REG, &val);
193944961713Sgirish 		statsp->xmac_stats.rx_crc_err_cnt +=
1940*71cd5202Smisaki 		    (val & XRXMAC_CRC_ER_CNT_MASK);
1941321febdeSsbehera 
194244961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_MPSZER_CNT_REG, &val);
194344961713Sgirish 		statsp->xmac_stats.rx_len_err_cnt +=
1944*71cd5202Smisaki 		    (val & XRXMAC_MPSZER_CNT_MASK);
1945321febdeSsbehera 
194644961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_CD_VIO_CNT_REG, &val);
194744961713Sgirish 		statsp->xmac_stats.rx_viol_err_cnt +=
1948*71cd5202Smisaki 		    (val & XRXMAC_CD_VIO_CNT_MASK);
1949321febdeSsbehera 
195044961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_BT_CNT_REG, &val);
195144961713Sgirish 		statsp->xmac_stats.rx_byte_cnt += (val & XRXMAC_BT_CNT_MASK);
1952321febdeSsbehera 
195344961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT1_REG, &val);
195444961713Sgirish 		statsp->xmac_stats.rx_hist1_cnt +=
1955*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT1_MASK);
1956321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1957321febdeSsbehera 		    (val & XRXMAC_HIST_CNT1_MASK);
1958321febdeSsbehera 
195944961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT2_REG, &val);
196044961713Sgirish 		statsp->xmac_stats.rx_hist2_cnt +=
1961*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT2_MASK);
1962321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1963321febdeSsbehera 		    (val & XRXMAC_HIST_CNT2_MASK);
1964321febdeSsbehera 
196544961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT3_REG, &val);
196644961713Sgirish 		statsp->xmac_stats.rx_hist3_cnt +=
1967*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT3_MASK);
1968321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1969321febdeSsbehera 		    (val & XRXMAC_HIST_CNT3_MASK);
1970321febdeSsbehera 
197144961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT4_REG, &val);
197244961713Sgirish 		statsp->xmac_stats.rx_hist4_cnt +=
1973*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT4_MASK);
1974321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1975321febdeSsbehera 		    (val & XRXMAC_HIST_CNT4_MASK);
1976321febdeSsbehera 
197744961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT5_REG, &val);
197844961713Sgirish 		statsp->xmac_stats.rx_hist5_cnt +=
1979*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT5_MASK);
1980321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1981321febdeSsbehera 		    (val & XRXMAC_HIST_CNT5_MASK);
1982321febdeSsbehera 
198344961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT6_REG, &val);
198444961713Sgirish 		statsp->xmac_stats.rx_hist6_cnt +=
1985*71cd5202Smisaki 		    (val & XRXMAC_HIST_CNT6_MASK);
1986321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1987321febdeSsbehera 		    (val & XRXMAC_HIST_CNT6_MASK);
1988321febdeSsbehera 
1989321febdeSsbehera 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT7_REG, &val);
1990321febdeSsbehera 		statsp->xmac_stats.rx_hist7_cnt +=
1991321febdeSsbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
1992321febdeSsbehera 		statsp->xmac_stats.rx_frame_cnt +=
1993321febdeSsbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
1994321febdeSsbehera 
199544961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_BC_FRM_CNT_REG, &val);
199644961713Sgirish 		statsp->xmac_stats.rx_broadcast_cnt +=
1997*71cd5202Smisaki 		    (val & XRXMAC_BC_FRM_CNT_MASK);
1998321febdeSsbehera 
199944961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_MC_FRM_CNT_REG, &val);
200044961713Sgirish 		statsp->xmac_stats.rx_mult_cnt +=
2001*71cd5202Smisaki 		    (val & XRXMAC_MC_FRM_CNT_MASK);
2002321febdeSsbehera 
200344961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_FRAG_CNT_REG, &val);
200444961713Sgirish 		statsp->xmac_stats.rx_frag_cnt += (val & XRXMAC_FRAG_CNT_MASK);
2005321febdeSsbehera 
200644961713Sgirish 		XMAC_REG_RD(handle, portn, XRXMAC_AL_ER_CNT_REG, &val);
200744961713Sgirish 		statsp->xmac_stats.rx_frame_align_err_cnt +=
2008*71cd5202Smisaki 		    (val & XRXMAC_AL_ER_CNT_MASK);
2009321febdeSsbehera 
201044961713Sgirish 		XMAC_REG_RD(handle, portn, XMAC_LINK_FLT_CNT_REG, &val);
201144961713Sgirish 		statsp->xmac_stats.rx_linkfault_err_cnt +=
2012*71cd5202Smisaki 		    (val & XMAC_LINK_FLT_CNT_MASK);
2013321febdeSsbehera 
201444961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
2015*71cd5202Smisaki 		    XPCS_REG_DESCWERR_COUNTER, &cnt32);
201644961713Sgirish 		statsp->xmac_stats.xpcs_deskew_err_cnt +=
2017*71cd5202Smisaki 		    (val & XMAC_XPCS_DESKEW_ERR_CNT_MASK);
2018321febdeSsbehera 
201914ea4bb7Ssd #ifdef	NXGE_DEBUG_SYMBOL_ERR
202044961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
2021*71cd5202Smisaki 		    XPCS_REG_SYMBOL_ERR_L0_1_COUNTER, &cnt32);
202244961713Sgirish 		statsp->xmac_stats.xpcs_ln0_symbol_err_cnt +=
2023*71cd5202Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L0_MASK);
202444961713Sgirish 		statsp->xmac_stats.xpcs_ln1_symbol_err_cnt +=
2025*71cd5202Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L1_MASK) >>
2026*71cd5202Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L1_SHIFT);
202744961713Sgirish 		(void) npi_xmac_xpcs_read(handle, portn,
2028*71cd5202Smisaki 		    XPCS_REG_SYMBOL_ERR_L2_3_COUNTER, &cnt32);
202944961713Sgirish 		statsp->xmac_stats.xpcs_ln2_symbol_err_cnt +=
2030*71cd5202Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L2_MASK);
203144961713Sgirish 		statsp->xmac_stats.xpcs_ln3_symbol_err_cnt +=
2032*71cd5202Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L3_MASK) >>
2033*71cd5202Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L3_SHIFT);
203414ea4bb7Ssd #endif
203544961713Sgirish 	} else if (nxgep->mac.porttype == PORT_TYPE_BMAC) {
203644961713Sgirish 		/*
203744961713Sgirish 		 * Transmit MAC statistics.
203844961713Sgirish 		 */
203944961713Sgirish 		BMAC_REG_RD(handle, portn, BTXMAC_FRM_CNT_REG, &val);
204044961713Sgirish 		statsp->bmac_stats.tx_frame_cnt += (val & BTXMAC_FRM_CNT_MASK);
2041321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2042321febdeSsbehera 		BMAC_REG_WR(handle, portn, BTXMAC_FRM_CNT_REG, 0);
2043321febdeSsbehera 
2044321febdeSsbehera 		BMAC_REG_RD(handle, portn, BTXMAC_BYTE_CNT_REG, &val);
204544961713Sgirish 		statsp->bmac_stats.tx_byte_cnt += (val & BTXMAC_BYTE_CNT_MASK);
2046321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2047321febdeSsbehera 		BMAC_REG_WR(handle, portn, BTXMAC_BYTE_CNT_REG, 0);
204844961713Sgirish 
204944961713Sgirish 		/*
205044961713Sgirish 		 * Receive MAC statistics.
205144961713Sgirish 		 */
2052321febdeSsbehera 		BMAC_REG_RD(handle, portn, RXMAC_FRM_CNT_REG, &val);
205344961713Sgirish 		statsp->bmac_stats.rx_frame_cnt += (val & RXMAC_FRM_CNT_MASK);
2054321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2055321febdeSsbehera 		BMAC_REG_WR(handle, portn, RXMAC_FRM_CNT_REG, 0);
2056321febdeSsbehera 
2057321febdeSsbehera 		BMAC_REG_RD(handle, portn, BRXMAC_BYTE_CNT_REG, &val);
205844961713Sgirish 		statsp->bmac_stats.rx_byte_cnt += (val & BRXMAC_BYTE_CNT_MASK);
2059321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2060321febdeSsbehera 		BMAC_REG_WR(handle, portn, BRXMAC_BYTE_CNT_REG, 0);
2061321febdeSsbehera 
2062321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_AL_ER_CNT_REG, &val);
206344961713Sgirish 		statsp->bmac_stats.rx_align_err_cnt +=
2064*71cd5202Smisaki 		    (val & BMAC_AL_ER_CNT_MASK);
2065321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2066321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_AL_ER_CNT_REG, 0);
2067321febdeSsbehera 
2068321febdeSsbehera 		BMAC_REG_RD(handle, portn, MAC_LEN_ER_CNT_REG, &val);
206944961713Sgirish 		statsp->bmac_stats.rx_len_err_cnt +=
2070*71cd5202Smisaki 		    (val & MAC_LEN_ER_CNT_MASK);
2071321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2072321febdeSsbehera 		BMAC_REG_WR(handle, portn, MAC_LEN_ER_CNT_REG, 0);
2073321febdeSsbehera 
2074321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_CRC_ER_CNT_REG, &val);
207544961713Sgirish 		statsp->bmac_stats.rx_crc_err_cnt +=
2076*71cd5202Smisaki 		    (val & BMAC_CRC_ER_CNT_MASK);
2077321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2078321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_CRC_ER_CNT_REG, 0);
2079321febdeSsbehera 
2080321febdeSsbehera 		BMAC_REG_RD(handle, portn, BMAC_CD_VIO_CNT_REG, &val);
208144961713Sgirish 		statsp->bmac_stats.rx_viol_err_cnt +=
2082*71cd5202Smisaki 		    (val & BMAC_CD_VIO_CNT_MASK);
2083321febdeSsbehera 		/* Clear register as it is not auto clear on read */
2084321febdeSsbehera 		BMAC_REG_WR(handle, portn, BMAC_CD_VIO_CNT_REG, 0);
208544961713Sgirish 	}
2086678453a8Sspeer 	if (isLDOMguest(nxgep)) {
2087678453a8Sspeer 		MUTEX_EXIT(&nxgep->ouraddr_lock);
2088678453a8Sspeer 		goto nxge_save_cntrs_exit;
2089678453a8Sspeer 	}
209044961713Sgirish 	/* Update IPP counters */
209144961713Sgirish 	(void) npi_ipp_get_ecc_err_count(handle, portn, &cnt8);
209244961713Sgirish 	statsp->ipp_stats.ecc_err_cnt += cnt8;
209344961713Sgirish 	(void) npi_ipp_get_pkt_dis_count(handle, portn, &cnt16);
209444961713Sgirish 	statsp->ipp_stats.pkt_dis_cnt += cnt16;
209544961713Sgirish 	(void) npi_ipp_get_cs_err_count(handle, portn, &cnt16);
209644961713Sgirish 	statsp->ipp_stats.bad_cs_cnt += cnt16;
209744961713Sgirish 
209844961713Sgirish 	MUTEX_EXIT(&nxgep->ouraddr_lock);
209944961713Sgirish 
210044961713Sgirish nxge_save_cntrs_exit:
210144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_save_cntrs"));
210244961713Sgirish }
210344961713Sgirish 
2104678453a8Sspeer uint64_t
2105678453a8Sspeer nxge_m_rx_stat(
2106678453a8Sspeer 	nxge_t *nxgep,
2107678453a8Sspeer 	uint_t stat)
2108678453a8Sspeer {
2109678453a8Sspeer 	p_nxge_stats_t statsp;
2110678453a8Sspeer 	nxge_grp_set_t *rx_set;
2111678453a8Sspeer 	int8_t set[NXGE_MAX_RDCS];
2112678453a8Sspeer 	int i, cursor;
2113678453a8Sspeer 
2114678453a8Sspeer 	uint64_t val = 0;
2115678453a8Sspeer 
2116678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_rx_stat"));
2117678453a8Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
2118678453a8Sspeer 
2119678453a8Sspeer 	rx_set = &nxgep->rx_set;
2120678453a8Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
2121678453a8Sspeer 		if ((1 << i) & rx_set->owned.map) {
2122678453a8Sspeer 			set[cursor++] = (uint8_t)i;
2123678453a8Sspeer 		}
2124678453a8Sspeer 	}
2125678453a8Sspeer 
2126678453a8Sspeer 	for (i = 0; i < cursor; i++) {
2127678453a8Sspeer 		int rdc = set[i];
2128678453a8Sspeer 		switch (stat) {
2129678453a8Sspeer 		case MAC_STAT_IERRORS:
2130678453a8Sspeer 		case ETHER_STAT_MACRCV_ERRORS:
2131678453a8Sspeer 			val += statsp->rdc_stats[rdc].ierrors;
2132678453a8Sspeer 			break;
2133678453a8Sspeer 
2134678453a8Sspeer 		case MAC_STAT_RBYTES:
2135678453a8Sspeer 			val += statsp->rdc_stats[rdc].ibytes;
2136678453a8Sspeer 			break;
2137678453a8Sspeer 
2138678453a8Sspeer 		case MAC_STAT_IPACKETS:
2139678453a8Sspeer 			val += statsp->rdc_stats[rdc].ipackets;
2140678453a8Sspeer 			break;
2141678453a8Sspeer 
2142678453a8Sspeer 		default:
2143678453a8Sspeer 			break;
2144678453a8Sspeer 		}
2145678453a8Sspeer 	}
2146678453a8Sspeer 
2147678453a8Sspeer 	return (val);
2148678453a8Sspeer }
2149678453a8Sspeer 
2150678453a8Sspeer uint64_t
2151678453a8Sspeer nxge_m_tx_stat(
2152678453a8Sspeer 	nxge_t *nxgep,
2153678453a8Sspeer 	uint_t stat)
2154678453a8Sspeer {
2155678453a8Sspeer 	p_nxge_stats_t statsp;
2156678453a8Sspeer 	nxge_grp_set_t *tx_set;
2157678453a8Sspeer 	int8_t set[NXGE_MAX_TDCS];
2158678453a8Sspeer 	int i, cursor;
2159678453a8Sspeer 
2160678453a8Sspeer 	uint64_t val = 0;
2161678453a8Sspeer 
2162678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_tx_stat"));
2163678453a8Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
2164678453a8Sspeer 
2165678453a8Sspeer 	tx_set = &nxgep->tx_set;
2166678453a8Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
2167678453a8Sspeer 		if ((1 << i) & tx_set->owned.map) {
2168678453a8Sspeer 			set[cursor++] = (uint8_t)i;
2169678453a8Sspeer 		}
2170678453a8Sspeer 	}
2171678453a8Sspeer 
2172678453a8Sspeer 	for (i = 0; i < cursor; i++) {
2173678453a8Sspeer 		int tdc = set[i];
2174678453a8Sspeer 		switch (stat) {
2175678453a8Sspeer 		case MAC_STAT_OERRORS:
2176678453a8Sspeer 			val += statsp->tdc_stats[tdc].oerrors;
2177678453a8Sspeer 			break;
2178678453a8Sspeer 
2179678453a8Sspeer 		case MAC_STAT_OBYTES:
2180678453a8Sspeer 			val += statsp->tdc_stats[tdc].obytes;
2181678453a8Sspeer 			break;
2182678453a8Sspeer 
2183678453a8Sspeer 		case MAC_STAT_OPACKETS:
2184678453a8Sspeer 			val += statsp->tdc_stats[tdc].opackets;
2185678453a8Sspeer 			break;
2186678453a8Sspeer 
2187678453a8Sspeer 		default:
2188678453a8Sspeer 			break;
2189678453a8Sspeer 		}
2190678453a8Sspeer 	}
2191678453a8Sspeer 
2192678453a8Sspeer 	return (val);
2193678453a8Sspeer }
2194678453a8Sspeer 
2195a3c5bd6dSspeer /* ARGSUSED */
219644961713Sgirish int
219744961713Sgirish nxge_m_stat(void *arg, uint_t stat, uint64_t *value)
219844961713Sgirish {
2199a3c5bd6dSspeer 	p_nxge_t nxgep = (p_nxge_t)arg;
2200a3c5bd6dSspeer 	p_nxge_stats_t statsp;
2201a3c5bd6dSspeer 	uint64_t val = 0;
220244961713Sgirish 
220344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_stat"));
220444961713Sgirish 	statsp = (p_nxge_stats_t)nxgep->statsp;
220544961713Sgirish 
220644961713Sgirish 	switch (stat) {
220744961713Sgirish 	case MAC_STAT_IFSPEED:
220844961713Sgirish 		val = statsp->mac_stats.link_speed * 1000000ull;
220944961713Sgirish 		break;
221044961713Sgirish 
221144961713Sgirish 	case MAC_STAT_MULTIRCV:
221244961713Sgirish 		val = statsp->port_stats.multircv;
221344961713Sgirish 		break;
221444961713Sgirish 
221544961713Sgirish 	case MAC_STAT_BRDCSTRCV:
221644961713Sgirish 		val = statsp->port_stats.brdcstrcv;
221744961713Sgirish 		break;
221844961713Sgirish 
221944961713Sgirish 	case MAC_STAT_MULTIXMT:
222044961713Sgirish 		val = statsp->port_stats.multixmt;
222144961713Sgirish 		break;
222244961713Sgirish 
222344961713Sgirish 	case MAC_STAT_BRDCSTXMT:
222444961713Sgirish 		val = statsp->port_stats.brdcstxmt;
222544961713Sgirish 		break;
222644961713Sgirish 
222744961713Sgirish 	case MAC_STAT_NORCVBUF:
222844961713Sgirish 		val = statsp->port_stats.norcvbuf;
222944961713Sgirish 		break;
223044961713Sgirish 
223144961713Sgirish 	case MAC_STAT_IERRORS:
223244961713Sgirish 	case ETHER_STAT_MACRCV_ERRORS:
2233678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
223444961713Sgirish 		break;
223544961713Sgirish 
223644961713Sgirish 	case MAC_STAT_OERRORS:
2237678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
2238678453a8Sspeer 		break;
223944961713Sgirish 
2240678453a8Sspeer 	case MAC_STAT_NOXMTBUF:
2241678453a8Sspeer 		val = statsp->port_stats.noxmtbuf;
224244961713Sgirish 		break;
224344961713Sgirish 
224444961713Sgirish 	case MAC_STAT_COLLISIONS:
224544961713Sgirish 		val = 0;
224644961713Sgirish 		break;
224744961713Sgirish 
224844961713Sgirish 	case MAC_STAT_RBYTES:
2249678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
225044961713Sgirish 		break;
225144961713Sgirish 
225244961713Sgirish 	case MAC_STAT_IPACKETS:
2253678453a8Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
225444961713Sgirish 		break;
225544961713Sgirish 
225644961713Sgirish 	case MAC_STAT_OBYTES:
2257678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
225844961713Sgirish 		break;
225944961713Sgirish 
226044961713Sgirish 	case MAC_STAT_OPACKETS:
2261678453a8Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
226244961713Sgirish 		break;
226344961713Sgirish 	case MAC_STAT_LINK_STATE:
226444961713Sgirish 		val = statsp->mac_stats.link_duplex;
226544961713Sgirish 		break;
226644961713Sgirish 	case MAC_STAT_LINK_UP:
226744961713Sgirish 		val = statsp->mac_stats.link_up;
226844961713Sgirish 		break;
226944961713Sgirish 	case MAC_STAT_PROMISC:
227044961713Sgirish 		val = statsp->mac_stats.promisc;
227144961713Sgirish 		break;
227244961713Sgirish 	case ETHER_STAT_SQE_ERRORS:
227344961713Sgirish 		val = 0;
227444961713Sgirish 		break;
227544961713Sgirish 
227644961713Sgirish 	case ETHER_STAT_ALIGN_ERRORS:
227744961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
227844961713Sgirish 			val = statsp->xmac_stats.rx_frame_align_err_cnt;
227944961713Sgirish 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
228044961713Sgirish 			val = statsp->bmac_stats.rx_align_err_cnt;
228144961713Sgirish 		else
228244961713Sgirish 			val = 0;
228344961713Sgirish 		break;
228444961713Sgirish 
228544961713Sgirish 	case ETHER_STAT_FCS_ERRORS:
228644961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
228744961713Sgirish 			val = statsp->xmac_stats.rx_crc_err_cnt;
228844961713Sgirish 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
228944961713Sgirish 			val = statsp->bmac_stats.rx_crc_err_cnt;
229044961713Sgirish 		else
229144961713Sgirish 			val = 0;
229244961713Sgirish 		break;
229344961713Sgirish 
229444961713Sgirish 	case ETHER_STAT_FIRST_COLLISIONS:
229544961713Sgirish 		val = 0;
229644961713Sgirish 		break;
229744961713Sgirish 
229844961713Sgirish 	case ETHER_STAT_MULTI_COLLISIONS:
229944961713Sgirish 		val = 0;
230044961713Sgirish 		break;
230144961713Sgirish 
230244961713Sgirish 	case ETHER_STAT_TX_LATE_COLLISIONS:
230344961713Sgirish 		val = 0;
230444961713Sgirish 		break;
230544961713Sgirish 
230644961713Sgirish 	case ETHER_STAT_EX_COLLISIONS:
230744961713Sgirish 		val = 0;
230844961713Sgirish 		break;
230944961713Sgirish 
231044961713Sgirish 	case ETHER_STAT_DEFER_XMTS:
231144961713Sgirish 		val = 0;
231244961713Sgirish 		break;
231344961713Sgirish 
231444961713Sgirish 	case ETHER_STAT_MACXMT_ERRORS:
231544961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
231644961713Sgirish 			val = statsp->xmac_stats.tx_underflow_err +
2317*71cd5202Smisaki 			    statsp->xmac_stats.tx_maxpktsize_err +
2318*71cd5202Smisaki 			    statsp->xmac_stats.tx_overflow_err +
2319*71cd5202Smisaki 			    statsp->xmac_stats.tx_fifo_xfr_err;
232044961713Sgirish 		} else {
232144961713Sgirish 			val = statsp->bmac_stats.tx_underrun_err +
2322*71cd5202Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
232344961713Sgirish 		}
232444961713Sgirish 		break;
232544961713Sgirish 
232644961713Sgirish 	case ETHER_STAT_CARRIER_ERRORS:
232744961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
232844961713Sgirish 			val = statsp->xmac_stats.rx_linkfault_err_cnt;
232944961713Sgirish 		} else {
233044961713Sgirish 			val = statsp->mac_stats.xcvr_inits +
2331*71cd5202Smisaki 			    statsp->mac_stats.serdes_inits;
233244961713Sgirish 		}
233344961713Sgirish 		break;
233444961713Sgirish 
233544961713Sgirish 	case ETHER_STAT_TOOLONG_ERRORS:
233644961713Sgirish 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
233744961713Sgirish 			val = statsp->xmac_stats.tx_maxpktsize_err +
2338*71cd5202Smisaki 			    statsp->xmac_stats.rx_len_err_cnt;
233944961713Sgirish 
234044961713Sgirish 		} else {
234144961713Sgirish 			val = statsp->bmac_stats.rx_len_err_cnt +
2342*71cd5202Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
234344961713Sgirish 		}
234444961713Sgirish 		break;
234544961713Sgirish 
234644961713Sgirish 
234744961713Sgirish 	case ETHER_STAT_XCVR_ADDR:
234844961713Sgirish 		val = statsp->mac_stats.xcvr_portn;
234944961713Sgirish 		break;
235044961713Sgirish 	case ETHER_STAT_XCVR_ID:
235144961713Sgirish 		val = statsp->mac_stats.xcvr_id;
235244961713Sgirish 		break;
235344961713Sgirish 
235444961713Sgirish 	case ETHER_STAT_XCVR_INUSE:
235544961713Sgirish 		val = statsp->mac_stats.xcvr_inuse;
235644961713Sgirish 		break;
235744961713Sgirish 
235844961713Sgirish 	case ETHER_STAT_CAP_1000FDX:
235944961713Sgirish 		val = statsp->mac_stats.cap_1000fdx;
236044961713Sgirish 		break;
236144961713Sgirish 
236244961713Sgirish 	case ETHER_STAT_CAP_1000HDX:
236344961713Sgirish 		val = statsp->mac_stats.cap_1000hdx;
236444961713Sgirish 		break;
236544961713Sgirish 
236644961713Sgirish 	case ETHER_STAT_CAP_100FDX:
236744961713Sgirish 		val = statsp->mac_stats.cap_100fdx;
236844961713Sgirish 		break;
236944961713Sgirish 
237044961713Sgirish 	case ETHER_STAT_CAP_100HDX:
237144961713Sgirish 		val = statsp->mac_stats.cap_100hdx;
237244961713Sgirish 		break;
237344961713Sgirish 
237444961713Sgirish 	case ETHER_STAT_CAP_10FDX:
237544961713Sgirish 		val = statsp->mac_stats.cap_10fdx;
237644961713Sgirish 		break;
237744961713Sgirish 
237844961713Sgirish 	case ETHER_STAT_CAP_10HDX:
237944961713Sgirish 		val = statsp->mac_stats.cap_10hdx;
238044961713Sgirish 		break;
238144961713Sgirish 
238244961713Sgirish 	case ETHER_STAT_CAP_ASMPAUSE:
238344961713Sgirish 		val = statsp->mac_stats.cap_asmpause;
238444961713Sgirish 		val = 1;
238544961713Sgirish 		break;
238644961713Sgirish 
238744961713Sgirish 	case ETHER_STAT_CAP_PAUSE:
238844961713Sgirish 		val = statsp->mac_stats.cap_pause;
238944961713Sgirish 		break;
239044961713Sgirish 
239144961713Sgirish 	case ETHER_STAT_CAP_AUTONEG:
239244961713Sgirish 		val = statsp->mac_stats.cap_autoneg;
239344961713Sgirish 		break;
239444961713Sgirish 
239544961713Sgirish 	case ETHER_STAT_ADV_CAP_1000FDX:
239644961713Sgirish 		val = statsp->mac_stats.adv_cap_1000fdx;
239744961713Sgirish 		break;
239844961713Sgirish 
239944961713Sgirish 	case ETHER_STAT_ADV_CAP_1000HDX:
240044961713Sgirish 		val = statsp->mac_stats.adv_cap_1000hdx;
240144961713Sgirish 		break;
240244961713Sgirish 
240344961713Sgirish 	case ETHER_STAT_ADV_CAP_100FDX:
240444961713Sgirish 		val = statsp->mac_stats.adv_cap_100fdx;
240544961713Sgirish 		break;
240644961713Sgirish 
240744961713Sgirish 	case ETHER_STAT_ADV_CAP_100HDX:
240844961713Sgirish 		val = statsp->mac_stats.adv_cap_100hdx;
240944961713Sgirish 		break;
241044961713Sgirish 
241144961713Sgirish 	case ETHER_STAT_ADV_CAP_10FDX:
241244961713Sgirish 		val = statsp->mac_stats.adv_cap_10fdx;
241344961713Sgirish 		break;
241444961713Sgirish 
241544961713Sgirish 	case ETHER_STAT_ADV_CAP_10HDX:
241644961713Sgirish 		val = statsp->mac_stats.adv_cap_10hdx;
241744961713Sgirish 		break;
241844961713Sgirish 
241944961713Sgirish 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
242044961713Sgirish 		val = statsp->mac_stats.adv_cap_asmpause;
242144961713Sgirish 		break;
242244961713Sgirish 
242344961713Sgirish 	case ETHER_STAT_ADV_CAP_PAUSE:
242444961713Sgirish 		val = statsp->mac_stats.adv_cap_pause;
242544961713Sgirish 		break;
242644961713Sgirish 
242744961713Sgirish 	case ETHER_STAT_ADV_CAP_AUTONEG:
242844961713Sgirish 		val = statsp->mac_stats.adv_cap_autoneg;
242944961713Sgirish 		break;
243044961713Sgirish 
243144961713Sgirish 	case ETHER_STAT_LP_CAP_1000FDX:
243244961713Sgirish 		val = statsp->mac_stats.lp_cap_1000fdx;
243344961713Sgirish 		break;
243444961713Sgirish 
243544961713Sgirish 	case ETHER_STAT_LP_CAP_1000HDX:
243644961713Sgirish 		val = statsp->mac_stats.lp_cap_1000hdx;
243744961713Sgirish 		break;
243844961713Sgirish 
243944961713Sgirish 	case ETHER_STAT_LP_CAP_100FDX:
244044961713Sgirish 		val = statsp->mac_stats.lp_cap_100fdx;
244144961713Sgirish 		break;
244244961713Sgirish 
244344961713Sgirish 	case ETHER_STAT_LP_CAP_100HDX:
244444961713Sgirish 		val = statsp->mac_stats.lp_cap_100hdx;
244544961713Sgirish 		break;
244644961713Sgirish 
244744961713Sgirish 	case ETHER_STAT_LP_CAP_10FDX:
244844961713Sgirish 		val = statsp->mac_stats.lp_cap_10fdx;
244944961713Sgirish 		break;
245044961713Sgirish 
245144961713Sgirish 	case ETHER_STAT_LP_CAP_10HDX:
245244961713Sgirish 		val = statsp->mac_stats.lp_cap_10hdx;
245344961713Sgirish 		break;
245444961713Sgirish 
245544961713Sgirish 	case ETHER_STAT_LP_CAP_ASMPAUSE:
245644961713Sgirish 		val = statsp->mac_stats.lp_cap_asmpause;
245744961713Sgirish 		break;
245844961713Sgirish 
245944961713Sgirish 	case ETHER_STAT_LP_CAP_PAUSE:
246044961713Sgirish 		val = statsp->mac_stats.lp_cap_pause;
246144961713Sgirish 		break;
246244961713Sgirish 
246344961713Sgirish 	case ETHER_STAT_LP_CAP_AUTONEG:
246444961713Sgirish 		val = statsp->mac_stats.lp_cap_autoneg;
246544961713Sgirish 		break;
246644961713Sgirish 
246744961713Sgirish 	case ETHER_STAT_LINK_ASMPAUSE:
246844961713Sgirish 		val = statsp->mac_stats.link_asmpause;
246944961713Sgirish 		break;
247044961713Sgirish 
247144961713Sgirish 	case ETHER_STAT_LINK_PAUSE:
247244961713Sgirish 		val = statsp->mac_stats.link_pause;
247344961713Sgirish 		break;
247444961713Sgirish 
247544961713Sgirish 	case ETHER_STAT_LINK_AUTONEG:
247644961713Sgirish 		val = statsp->mac_stats.cap_autoneg;
247744961713Sgirish 		break;
247844961713Sgirish 
247944961713Sgirish 	case ETHER_STAT_LINK_DUPLEX:
248044961713Sgirish 		val = statsp->mac_stats.link_duplex;
248144961713Sgirish 		break;
248244961713Sgirish 
248344961713Sgirish 	default:
248444961713Sgirish 		/*
248544961713Sgirish 		 * Shouldn't reach here...
248644961713Sgirish 		 */
248744961713Sgirish #ifdef NXGE_DEBUG
248844961713Sgirish 		NXGE_ERROR_MSG((nxgep, KST_CTL,
2489*71cd5202Smisaki 		    "nxge_m_stat: unrecognized parameter value = 0x%x",
2490*71cd5202Smisaki 		    stat));
249144961713Sgirish #endif
249244961713Sgirish 
249344961713Sgirish 		return (ENOTSUP);
249444961713Sgirish 	}
249544961713Sgirish 	*value = val;
249644961713Sgirish 	return (0);
249744961713Sgirish }
2498