xref: /onnv-gate/usr/src/uts/common/io/nxge/nxge_kstats.c (revision 11878:ac93462db6d7)
13859Sml29623 /*
23859Sml29623  * CDDL HEADER START
33859Sml29623  *
43859Sml29623  * The contents of this file are subject to the terms of the
53859Sml29623  * Common Development and Distribution License (the "License").
63859Sml29623  * You may not use this file except in compliance with the License.
73859Sml29623  *
83859Sml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93859Sml29623  * or http://www.opensolaris.org/os/licensing.
103859Sml29623  * See the License for the specific language governing permissions
113859Sml29623  * and limitations under the License.
123859Sml29623  *
133859Sml29623  * When distributing Covered Code, include this CDDL HEADER in each
143859Sml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153859Sml29623  * If applicable, add the following below this CDDL HEADER, with the
163859Sml29623  * fields enclosed by brackets "[]" replaced with your own identifying
173859Sml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
183859Sml29623  *
193859Sml29623  * CDDL HEADER END
203859Sml29623  */
213859Sml29623 /*
22*11878SVenu.Iyer@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
233859Sml29623  * Use is subject to license terms.
243859Sml29623  */
253859Sml29623 
263859Sml29623 #include <sys/nxge/nxge_impl.h>
276495Sspeer #include <sys/nxge/nxge_hio.h>
286495Sspeer 
293859Sml29623 #include <inet/mi.h>
303859Sml29623 
313859Sml29623 #define	RDC_NAME_FORMAT1	"RDC Channel"
323859Sml29623 #define	TDC_NAME_FORMAT1	"TDC Channel"
333859Sml29623 #define	CH_NAME_FORMAT		" %d Stats"
343859Sml29623 #define	TDC_NAME_FORMAT		"TDC Channel %d Stats"
353859Sml29623 #define	RDC_NAME_FORMAT		"RDC Channel %d Stats"
363859Sml29623 
373859Sml29623 void nxge_mac_init_kstats(p_nxge_t, struct kstat *);
383859Sml29623 void nxge_xmac_init_kstats(struct kstat *);
393859Sml29623 void nxge_bmac_init_kstats(struct kstat *);
403859Sml29623 
413859Sml29623 /* ARGSUSED */
423859Sml29623 void
nxge_init_statsp(p_nxge_t nxgep)433859Sml29623 nxge_init_statsp(p_nxge_t nxgep)
443859Sml29623 {
453859Sml29623 	size_t stats_size;
463859Sml29623 
473859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_init_statsp"));
483859Sml29623 
493859Sml29623 	stats_size = sizeof (nxge_stats_t);
503859Sml29623 	nxgep->statsp = KMEM_ZALLOC(stats_size, KM_SLEEP);
513859Sml29623 	nxgep->statsp->stats_size = stats_size;
523859Sml29623 
533859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_init_statsp"));
543859Sml29623 }
553859Sml29623 
563859Sml29623 typedef struct {
573859Sml29623 	uint8_t index;
583859Sml29623 	uint8_t type;
593859Sml29623 	char *name;
603859Sml29623 } nxge_kstat_index_t;
613859Sml29623 
623859Sml29623 typedef enum {
633859Sml29623 	RDC_STAT_PACKETS = 0,
643859Sml29623 	RDC_STAT_BYTES,
653859Sml29623 	RDC_STAT_ERRORS,
663859Sml29623 	RDC_STAT_DCF_ERR,
673859Sml29623 	RDC_STAT_RCR_ACK_ERR,
683859Sml29623 	RDC_STAT_RCR_DC_FIFOFLOW_ERR,
693859Sml29623 	RDC_STAT_RCR_SHA_PAR_ERR,
703859Sml29623 	RDC_STAT_RBR_PRE_PAR_ERR,
713859Sml29623 	RDC_STAT_WRED_DROP,
723859Sml29623 	RDC_STAT_RBR_PRE_EMTY,
733859Sml29623 	RDC_STAT_RCR_SHADOW_FULL,
743859Sml29623 	RDC_STAT_RBR_TMOUT,
753859Sml29623 	RDC_STAT_RSP_CNT_ERR,
763859Sml29623 	RDC_STAT_BYTE_EN_BUS,
773859Sml29623 	RDC_STAT_RSP_DAT_ERR,
786028Ssbehera 	RDC_STAT_PKT_TOO_LONG_ERR,
793859Sml29623 	RDC_STAT_COMPL_L2_ERR,
803859Sml29623 	RDC_STAT_COMPL_L4_CKSUM_ERR,
813859Sml29623 	RDC_STAT_COMPL_ZCP_SOFT_ERR,
823859Sml29623 	RDC_STAT_COMPL_FFLP_SOFT_ERR,
833859Sml29623 	RDC_STAT_CONFIG_ERR,
843859Sml29623 	RDC_STAT_RCRINCON,
853859Sml29623 	RDC_STAT_RCRFULL,
863859Sml29623 	RDC_STAT_RBR_EMPTY,
873859Sml29623 	RDC_STAT_RBR_FULL,
883859Sml29623 	RDC_STAT_RBRLOGPAGE,
893859Sml29623 	RDC_STAT_CFIGLOGPAGE,
903859Sml29623 	RDC_STAT_PORT_DROP_PKT,
913859Sml29623 	RDC_STAT_RCRTO,
923859Sml29623 	RDC_STAT_RCRTHRES,
933859Sml29623 	RDC_STAT_MEX,
943859Sml29623 	RDC_STAT_ID_MIS,
953859Sml29623 	RDC_STAT_ZCP_EOP,
963859Sml29623 	RDC_STAT_IPP_EOP,
973859Sml29623 	RDC_STAT_END
983859Sml29623 } nxge_rdc_stat_index_t;
993859Sml29623 
1003859Sml29623 nxge_kstat_index_t nxge_rdc_stats[] = {
1013859Sml29623 	{RDC_STAT_PACKETS, KSTAT_DATA_UINT64, "rdc_packets"},
1023859Sml29623 	{RDC_STAT_BYTES, KSTAT_DATA_UINT64, "rdc_bytes"},
1033859Sml29623 	{RDC_STAT_ERRORS, KSTAT_DATA_ULONG, "rdc_errors"},
1043859Sml29623 	{RDC_STAT_DCF_ERR, KSTAT_DATA_ULONG, "rdc_dcf_err"},
1053859Sml29623 	{RDC_STAT_RCR_ACK_ERR, KSTAT_DATA_ULONG, "rdc_rcr_ack_err"},
1063859Sml29623 	{RDC_STAT_RCR_DC_FIFOFLOW_ERR, KSTAT_DATA_ULONG, "rdc_dc_fifoflow_err"},
1073859Sml29623 	{RDC_STAT_RCR_SHA_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rcr_sha_par_err"},
1083859Sml29623 	{RDC_STAT_RBR_PRE_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rbr_pre_par_err"},
1093859Sml29623 	{RDC_STAT_WRED_DROP, KSTAT_DATA_ULONG, "rdc_wred_drop"},
1103859Sml29623 	{RDC_STAT_RBR_PRE_EMTY, KSTAT_DATA_ULONG, "rdc_rbr_pre_empty"},
1113859Sml29623 	{RDC_STAT_RCR_SHADOW_FULL, KSTAT_DATA_ULONG, "rdc_rcr_shadow_full"},
1123859Sml29623 	{RDC_STAT_RBR_TMOUT, KSTAT_DATA_ULONG, "rdc_rbr_tmout"},
1133859Sml29623 	{RDC_STAT_RSP_CNT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_cnt_err"},
1143859Sml29623 	{RDC_STAT_BYTE_EN_BUS, KSTAT_DATA_ULONG, "rdc_byte_en_bus"},
1153859Sml29623 	{RDC_STAT_RSP_DAT_ERR, KSTAT_DATA_ULONG, "rdc_rsp_dat_err"},
1166028Ssbehera 	{RDC_STAT_PKT_TOO_LONG_ERR, KSTAT_DATA_ULONG, "rdc_pkt_too_long_err"},
1173859Sml29623 	{RDC_STAT_COMPL_L2_ERR, KSTAT_DATA_ULONG, "rdc_compl_l2_err"},
1183859Sml29623 	{RDC_STAT_COMPL_L4_CKSUM_ERR, KSTAT_DATA_ULONG, "rdc_compl_l4_cksum"},
1193859Sml29623 	{RDC_STAT_COMPL_ZCP_SOFT_ERR, KSTAT_DATA_ULONG,
1203859Sml29623 		"rdc_compl_zcp_soft_err"},
1213859Sml29623 	{RDC_STAT_COMPL_FFLP_SOFT_ERR, KSTAT_DATA_ULONG,
1223859Sml29623 		"rdc_compl_fflp_soft_err"},
1233859Sml29623 	{RDC_STAT_CONFIG_ERR, KSTAT_DATA_ULONG, "rdc_config_err"},
1243859Sml29623 	{RDC_STAT_RCRINCON, KSTAT_DATA_ULONG, "rdc_rcrincon"},
1253859Sml29623 	{RDC_STAT_RCRFULL, KSTAT_DATA_ULONG, "rdc_rcrfull"},
1263859Sml29623 	{RDC_STAT_RBR_EMPTY, KSTAT_DATA_ULONG, "rdc_rbr_empty"},
1273859Sml29623 	{RDC_STAT_RBR_FULL, KSTAT_DATA_ULONG, "rdc_rbrfull"},
1283859Sml29623 	{RDC_STAT_RBRLOGPAGE, KSTAT_DATA_ULONG, "rdc_rbrlogpage"},
1293859Sml29623 	{RDC_STAT_CFIGLOGPAGE, KSTAT_DATA_ULONG, "rdc_cfiglogpage"},
1303859Sml29623 	{RDC_STAT_PORT_DROP_PKT, KSTAT_DATA_ULONG, "rdc_port_drop_pkt"},
1313859Sml29623 	{RDC_STAT_RCRTO, KSTAT_DATA_ULONG, "rdc_rcrto"},
1323859Sml29623 	{RDC_STAT_RCRTHRES, KSTAT_DATA_ULONG, "rdc_rcrthres"},
1333859Sml29623 	{RDC_STAT_MEX, KSTAT_DATA_ULONG, "rdc_mex"},
1343859Sml29623 	{RDC_STAT_ID_MIS, KSTAT_DATA_ULONG, "rdc_id_mismatch"},
1353859Sml29623 	{RDC_STAT_ZCP_EOP, KSTAT_DATA_ULONG, "rdc_zcp_eop"},
1363859Sml29623 	{RDC_STAT_IPP_EOP, KSTAT_DATA_ULONG, "rdc_ipp_eop"},
1373859Sml29623 	{RDC_STAT_END, NULL, NULL}
1383859Sml29623 };
1393859Sml29623 
1403859Sml29623 typedef enum {
1413859Sml29623 	RDC_SYS_STAT_PRE_PAR_ERR = 0,
1423859Sml29623 	RDC_SYS_STAT_SHA_PAR_ERR,
1433859Sml29623 	RDC_SYS_STAT_ID_MISMATCH,
1443859Sml29623 	RDC_SYS_STAT_IPP_EOP_ERR,
1453859Sml29623 	RDC_SYS_STAT_ZCP_EOP_ERR,
1463859Sml29623 	RDC_SYS_STAT_END
1473859Sml29623 } nxge_rdc_sys_stat_idx_t;
1483859Sml29623 
1493859Sml29623 nxge_kstat_index_t nxge_rdc_sys_stats[] = {
1503859Sml29623 	{RDC_SYS_STAT_PRE_PAR_ERR, KSTAT_DATA_UINT64, "rdc_pre_par_err"},
1513859Sml29623 	{RDC_SYS_STAT_SHA_PAR_ERR, KSTAT_DATA_UINT64, "rdc_sha_par_err"},
1523859Sml29623 	{RDC_SYS_STAT_ID_MISMATCH, KSTAT_DATA_UINT64, "rdc_stat_id_mismatch"},
1533859Sml29623 	{RDC_SYS_STAT_IPP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_ipp_eop_err"},
1543859Sml29623 	{RDC_SYS_STAT_ZCP_EOP_ERR, KSTAT_DATA_UINT64, "rdc_zcp_eop_err"},
1553859Sml29623 	{RDC_SYS_STAT_END, NULL, NULL}
1563859Sml29623 };
1573859Sml29623 
1583859Sml29623 typedef enum {
1593859Sml29623 	TDC_STAT_PACKETS = 0,
1603859Sml29623 	TDC_STAT_BYTES,
1613859Sml29623 	TDC_STAT_ERRORS,
1623859Sml29623 	TDC_STAT_TX_INITS,
1633859Sml29623 	TDC_STAT_TX_NO_BUF,
1643859Sml29623 	TDC_STAT_MBOX_ERR,
1653859Sml29623 	TDC_STAT_PKT_SIZE_ERR,
1663859Sml29623 	TDC_STAT_TX_RING_OFLOW,
1673859Sml29623 	TDC_STAT_PREF_BUF_ECC_ERR,
1683859Sml29623 	TDC_STAT_NACK_PREF,
1693859Sml29623 	TDC_STAT_NACK_PKT_RD,
1703859Sml29623 	TDC_STAT_CONF_PART_ERR,
1713859Sml29623 	TDC_STAT_PKT_PRT_ERR,
1723859Sml29623 	TDC_STAT_RESET_FAIL,
1733859Sml29623 	TDC_STAT_TX_STARTS,
1743859Sml29623 	TDC_STAT_TX_NOCANPUT,
1753859Sml29623 	TDC_STAT_TX_MSGDUP_FAIL,
1763859Sml29623 	TDC_STAT_TX_ALLOCB_FAIL,
1773859Sml29623 	TDC_STAT_TX_NO_DESC,
1783859Sml29623 	TDC_STAT_TX_DMA_BIND_FAIL,
1793859Sml29623 	TDC_STAT_TX_UFLOW,
1803859Sml29623 	TDC_STAT_TX_HDR_PKTS,
1813859Sml29623 	TDC_STAT_TX_DDI_PKTS,
1823859Sml29623 	TDC_STAT_TX_DVMA_PKTS,
1833859Sml29623 	TDC_STAT_TX_MAX_PEND,
1843859Sml29623 	TDC_STAT_END
1853859Sml29623 } nxge_tdc_stats_index_t;
1863859Sml29623 
1873859Sml29623 nxge_kstat_index_t nxge_tdc_stats[] = {
1883859Sml29623 	{TDC_STAT_PACKETS, KSTAT_DATA_UINT64, "tdc_packets"},
1893859Sml29623 	{TDC_STAT_BYTES, KSTAT_DATA_UINT64, "tdc_bytes"},
1903859Sml29623 	{TDC_STAT_ERRORS, KSTAT_DATA_UINT64, "tdc_errors"},
1913859Sml29623 	{TDC_STAT_TX_INITS, KSTAT_DATA_ULONG, "tdc_tx_inits"},
1923859Sml29623 	{TDC_STAT_TX_NO_BUF, KSTAT_DATA_ULONG, "tdc_tx_no_buf"},
1933859Sml29623 	{TDC_STAT_MBOX_ERR, KSTAT_DATA_ULONG, "tdc_mbox_err"},
1943859Sml29623 	{TDC_STAT_PKT_SIZE_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_err"},
1953859Sml29623 	{TDC_STAT_TX_RING_OFLOW,
1963859Sml29623 		KSTAT_DATA_ULONG, "tdc_tx_ring_oflow"},
1973859Sml29623 	{TDC_STAT_PREF_BUF_ECC_ERR,
1983859Sml29623 		KSTAT_DATA_ULONG, "tdc_pref_buf_err_err"},
1993859Sml29623 	{TDC_STAT_NACK_PREF, KSTAT_DATA_ULONG, "tdc_nack_pref"},
2003859Sml29623 	{TDC_STAT_NACK_PKT_RD, KSTAT_DATA_ULONG, "tdc_nack_pkt_rd"},
2013859Sml29623 	{TDC_STAT_CONF_PART_ERR,
2023859Sml29623 		KSTAT_DATA_ULONG, "tdc_conf_part_err"},
2033859Sml29623 	{TDC_STAT_PKT_PRT_ERR, KSTAT_DATA_ULONG, "tdc_pkt_prt_err"},
2043859Sml29623 	{TDC_STAT_RESET_FAIL, KSTAT_DATA_ULONG, "tdc_reset_fail"},
2053859Sml29623 	{TDC_STAT_TX_STARTS, KSTAT_DATA_ULONG, "tdc_tx_starts"},
2063859Sml29623 	{TDC_STAT_TX_NOCANPUT, KSTAT_DATA_ULONG, "tdc_tx_nocanput"},
2073859Sml29623 	{TDC_STAT_TX_MSGDUP_FAIL, KSTAT_DATA_ULONG, "tdc_tx_msgdup_fail"},
2083859Sml29623 	{TDC_STAT_TX_ALLOCB_FAIL, KSTAT_DATA_ULONG, "tdc_tx_allocb_fail"},
2093859Sml29623 	{TDC_STAT_TX_NO_DESC, KSTAT_DATA_ULONG, "tdc_tx_no_desc"},
2103859Sml29623 	{TDC_STAT_TX_DMA_BIND_FAIL, KSTAT_DATA_ULONG, "tdc_tx_dma_bind_fail"},
2113859Sml29623 	{TDC_STAT_TX_UFLOW, KSTAT_DATA_ULONG, "tdc_tx_uflow"},
2123859Sml29623 	{TDC_STAT_TX_HDR_PKTS, KSTAT_DATA_ULONG, "tdc_tx_hdr_pkts"},
2133859Sml29623 	{TDC_STAT_TX_DDI_PKTS, KSTAT_DATA_ULONG, "tdc_tx_ddi_pkts"},
2143859Sml29623 	{TDC_STAT_TX_DVMA_PKTS, KSTAT_DATA_ULONG, "tdc_tx_dvma_pkts"},
2153859Sml29623 	{TDC_STAT_TX_MAX_PEND, KSTAT_DATA_ULONG, "tdc_tx_max_pend"},
2163859Sml29623 	{TDC_STAT_END, NULL, NULL}
2173859Sml29623 };
2183859Sml29623 
2193859Sml29623 /* IPP Statistics definitions */
2203859Sml29623 typedef enum {
2213859Sml29623 	IPP_STAT_EOP_MISS = 0,
2223859Sml29623 	IPP_STAT_SOP_MISS,
2233859Sml29623 	IPP_STAT_DFIFO_UE,
2243859Sml29623 	IPP_STAT_ECC_ERR,
2254439Sml29623 	IPP_STAT_PFIFO_PERR,
2263859Sml29623 	IPP_STAT_PFIFO_OVER,
2273859Sml29623 	IPP_STAT_PFIFO_UND,
2283859Sml29623 	IPP_STAT_BAD_CS,
2293859Sml29623 	IPP_STAT_BAD_DIS,
2303859Sml29623 	IPP_STAT_END
2313859Sml29623 } nxge_ipp_stat_index_t;
2323859Sml29623 
2333859Sml29623 nxge_kstat_index_t nxge_ipp_stats[] = {
2343859Sml29623 	{IPP_STAT_EOP_MISS, KSTAT_DATA_ULONG, "rxipp_eop_miss"},
2353859Sml29623 	{IPP_STAT_SOP_MISS, KSTAT_DATA_ULONG, "rxipp_sop_miss"},
2363859Sml29623 	{IPP_STAT_DFIFO_UE, KSTAT_DATA_ULONG, "rxipp_dfifo_ue"},
2373859Sml29623 	{IPP_STAT_ECC_ERR, KSTAT_DATA_ULONG, "rxipp_ecc_err"},
2384439Sml29623 	{IPP_STAT_PFIFO_PERR, KSTAT_DATA_ULONG, "rxipp_pfifo_perr"},
2393859Sml29623 	{IPP_STAT_PFIFO_OVER, KSTAT_DATA_ULONG, "rxipp_pfifo_over"},
2403859Sml29623 	{IPP_STAT_PFIFO_UND, KSTAT_DATA_ULONG, "rxipp_pfifo_und"},
2413859Sml29623 	{IPP_STAT_BAD_CS, KSTAT_DATA_ULONG, "rxipp_bad_cs"},
2423859Sml29623 	{IPP_STAT_BAD_DIS, KSTAT_DATA_ULONG, "rxipp_bad_dis"},
2433859Sml29623 	{IPP_STAT_END, NULL, NULL}
2443859Sml29623 };
2453859Sml29623 
2463859Sml29623 /* TXC Statistics definitions */
2473859Sml29623 typedef enum {
2483859Sml29623 	TXC_STAT_PKT_STUFFED = 0,
2493859Sml29623 	TXC_STAT_PKT_XMIT,
2503859Sml29623 	TXC_STAT_RO_CORRECT_ERR,
2513859Sml29623 	TXC_STAT_RO_UNCORRECT_ERR,
2523859Sml29623 	TXC_STAT_SF_CORRECT_ERR,
2533859Sml29623 	TXC_STAT_SF_UNCORRECT_ERR,
2543859Sml29623 	TXC_STAT_ADDRESS_FAILED,
2553859Sml29623 	TXC_STAT_DMA_FAILED,
2563859Sml29623 	TXC_STAT_LENGTH_FAILED,
2573859Sml29623 	TXC_STAT_PKT_ASSY_DEAD,
2583859Sml29623 	TXC_STAT_REORDER_ERR,
2593859Sml29623 	TXC_STAT_END
2603859Sml29623 } nxge_txc_stat_index_t;
2613859Sml29623 
2623859Sml29623 nxge_kstat_index_t nxge_txc_stats[] = {
2633859Sml29623 	{TXC_STAT_PKT_STUFFED, KSTAT_DATA_ULONG, "txc_pkt_stuffed"},
2643859Sml29623 	{TXC_STAT_PKT_XMIT, KSTAT_DATA_ULONG, "txc_pkt_xmit"},
2653859Sml29623 	{TXC_STAT_RO_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_correct_err"},
2663859Sml29623 	{TXC_STAT_RO_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_ro_uncorrect_err"},
2673859Sml29623 	{TXC_STAT_SF_CORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_correct_err"},
2683859Sml29623 	{TXC_STAT_SF_UNCORRECT_ERR, KSTAT_DATA_ULONG, "txc_sf_uncorrect_err"},
2693859Sml29623 	{TXC_STAT_ADDRESS_FAILED, KSTAT_DATA_ULONG, "txc_address_failed"},
2703859Sml29623 	{TXC_STAT_DMA_FAILED, KSTAT_DATA_ULONG, "txc_dma_failed"},
2713859Sml29623 	{TXC_STAT_LENGTH_FAILED, KSTAT_DATA_ULONG, "txc_length_failed"},
2723859Sml29623 	{TXC_STAT_PKT_ASSY_DEAD, KSTAT_DATA_ULONG, "txc_pkt_assy_dead"},
2733859Sml29623 	{TXC_STAT_REORDER_ERR, KSTAT_DATA_ULONG, "txc_reorder_err"},
2743859Sml29623 	{TXC_STAT_END, NULL, NULL}
2753859Sml29623 };
2763859Sml29623 
2773859Sml29623 typedef enum {
2783859Sml29623 	XMAC_STAT_TX_FRAME_CNT = 0,
2793859Sml29623 	XMAC_STAT_TX_UNDERFLOW_ERR,
2803859Sml29623 	XMAC_STAT_TX_MAXPKTSIZE_ERR,
2813859Sml29623 	XMAC_STAT_TX_OVERFLOW_ERR,
2823859Sml29623 	XMAC_STAT_TX_FIFO_XFR_ERR,
2833859Sml29623 	XMAC_STAT_TX_BYTE_CNT,
2843859Sml29623 	XMAC_STAT_RX_FRAME_CNT,
2853859Sml29623 	XMAC_STAT_RX_UNDERFLOW_ERR,
2863859Sml29623 	XMAC_STAT_RX_OVERFLOW_ERR,
2873859Sml29623 	XMAC_STAT_RX_CRC_ERR_CNT,
2883859Sml29623 	XMAC_STAT_RX_LEN_ERR_CNT,
2893859Sml29623 	XMAC_STAT_RX_VIOL_ERR_CNT,
2903859Sml29623 	XMAC_STAT_RX_BYTE_CNT,
2913859Sml29623 	XMAC_STAT_RX_HIST1_CNT,
2923859Sml29623 	XMAC_STAT_RX_HIST2_CNT,
2933859Sml29623 	XMAC_STAT_RX_HIST3_CNT,
2943859Sml29623 	XMAC_STAT_RX_HIST4_CNT,
2953859Sml29623 	XMAC_STAT_RX_HIST5_CNT,
2963859Sml29623 	XMAC_STAT_RX_HIST6_CNT,
2973859Sml29623 	XMAC_STAT_RX_HIST7_CNT,
2983859Sml29623 	XMAC_STAT_RX_BROADCAST_CNT,
2993859Sml29623 	XMAC_STAT_RX_MULT_CNT,
3003859Sml29623 	XMAC_STAT_RX_FRAG_CNT,
3013859Sml29623 	XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
3023859Sml29623 	XMAC_STAT_RX_LINKFAULT_ERR_CNT,
3033859Sml29623 	XMAC_STAT_RX_REMOTEFAULT_ERR,
3043859Sml29623 	XMAC_STAT_RX_LOCALFAULT_ERR,
3053859Sml29623 	XMAC_STAT_RX_PAUSE_CNT,
3063859Sml29623 	XMAC_STAT_TX_PAUSE_STATE,
3073859Sml29623 	XMAC_STAT_TX_NOPAUSE_STATE,
3083859Sml29623 	XMAC_STAT_XPCS_DESKEW_ERR_CNT,
3093859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
3103859Sml29623 	XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
3113859Sml29623 	XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
3123859Sml29623 	XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
3133859Sml29623 	XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
3143859Sml29623 #endif
3153859Sml29623 	XMAC_STAT_END
3163859Sml29623 } nxge_xmac_stat_index_t;
3173859Sml29623 
3183859Sml29623 nxge_kstat_index_t nxge_xmac_stats[] = {
3193859Sml29623 	{XMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
3203859Sml29623 	{XMAC_STAT_TX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "tmac_underflow_err"},
3213859Sml29623 	{XMAC_STAT_TX_MAXPKTSIZE_ERR, KSTAT_DATA_ULONG, "txmac_maxpktsize_err"},
3223859Sml29623 	{XMAC_STAT_TX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "txmac_overflow_err"},
3233859Sml29623 	{XMAC_STAT_TX_FIFO_XFR_ERR, KSTAT_DATA_ULONG, "txmac_fifo_xfr_err"},
3243859Sml29623 	{XMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
3253859Sml29623 	{XMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
3263859Sml29623 	{XMAC_STAT_RX_UNDERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_underflow_err"},
3273859Sml29623 	{XMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
3283859Sml29623 	{XMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err"},
3293859Sml29623 	{XMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_length_err"},
3303859Sml29623 	{XMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_code_violations"},
3313859Sml29623 	{XMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
3323859Sml29623 	{XMAC_STAT_RX_HIST1_CNT, KSTAT_DATA_ULONG, "rxmac_64_cnt"},
3333859Sml29623 	{XMAC_STAT_RX_HIST2_CNT, KSTAT_DATA_ULONG, "rxmac_65_127_cnt"},
3343859Sml29623 	{XMAC_STAT_RX_HIST3_CNT, KSTAT_DATA_ULONG, "rxmac_128_255_cnt"},
3353859Sml29623 	{XMAC_STAT_RX_HIST4_CNT, KSTAT_DATA_ULONG, "rxmac_256_511_cnt"},
3363859Sml29623 	{XMAC_STAT_RX_HIST5_CNT, KSTAT_DATA_ULONG, "rxmac_512_1023_cnt"},
3373859Sml29623 	{XMAC_STAT_RX_HIST6_CNT, KSTAT_DATA_ULONG, "rxmac_1024_1522_cnt"},
3383859Sml29623 	{XMAC_STAT_RX_HIST7_CNT, KSTAT_DATA_ULONG, "rxmac_jumbo_cnt"},
3393859Sml29623 	{XMAC_STAT_RX_BROADCAST_CNT, KSTAT_DATA_ULONG, "rxmac_broadcast_cnt"},
3403859Sml29623 	{XMAC_STAT_RX_MULT_CNT, KSTAT_DATA_ULONG, "rxmac_multicast_cnt"},
3413859Sml29623 	{XMAC_STAT_RX_FRAG_CNT, KSTAT_DATA_ULONG, "rxmac_fragment_cnt"},
3423859Sml29623 	{XMAC_STAT_RX_FRAME_ALIGN_ERR_CNT,
3433859Sml29623 		KSTAT_DATA_ULONG, "rxmac_alignment_err"},
3443859Sml29623 	{XMAC_STAT_RX_LINKFAULT_ERR_CNT,
3453859Sml29623 		KSTAT_DATA_ULONG, "rxmac_linkfault_errs"},
3463859Sml29623 	{XMAC_STAT_RX_REMOTEFAULT_ERR,
3473859Sml29623 		KSTAT_DATA_ULONG, "rxmac_remote_faults"},
3483859Sml29623 	{XMAC_STAT_RX_LOCALFAULT_ERR,
3493859Sml29623 		KSTAT_DATA_ULONG, "rxmac_local_faults"},
3503859Sml29623 	{XMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
3513859Sml29623 	{XMAC_STAT_TX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
3523859Sml29623 	{XMAC_STAT_TX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "txmac_nopause_state"},
3533859Sml29623 	{XMAC_STAT_XPCS_DESKEW_ERR_CNT,
3543859Sml29623 		KSTAT_DATA_ULONG, "xpcs_deskew_err_cnt"},
3553859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
3563859Sml29623 	{XMAC_STAT_XPCS_SYMBOL_L0_ERR_CNT,
3573859Sml29623 		KSTAT_DATA_ULONG, "xpcs_ln0_symbol_err_cnt"},
3583859Sml29623 	{XMAC_STAT_XPCS_SYMBOL_L1_ERR_CNT,
3593859Sml29623 		KSTAT_DATA_ULONG, "xpcs_ln1_symbol_err_cnt"},
3603859Sml29623 	{XMAC_STAT_XPCS_SYMBOL_L2_ERR_CNT,
3613859Sml29623 		KSTAT_DATA_ULONG, "xpcs_ln2_symbol_err_cnt"},
3623859Sml29623 	{XMAC_STAT_XPCS_SYMBOL_L3_ERR_CNT,
3633859Sml29623 		KSTAT_DATA_ULONG, "xpcs_ln3_symbol_err_cnt"},
3643859Sml29623 #endif
3653859Sml29623 	{XMAC_STAT_END, NULL, NULL}
3663859Sml29623 };
3673859Sml29623 
3683859Sml29623 typedef enum {
3693859Sml29623 	BMAC_STAT_TX_FRAME_CNT = 0,
3703859Sml29623 	BMAC_STAT_TX_UNDERRUN_ERR,
3713859Sml29623 	BMAC_STAT_TX_MAX_PKT_ERR,
3723859Sml29623 	BMAC_STAT_TX_BYTE_CNT,
3733859Sml29623 	BMAC_STAT_RX_FRAME_CNT,
3743859Sml29623 	BMAC_STAT_RX_BYTE_CNT,
3753859Sml29623 	BMAC_STAT_RX_OVERFLOW_ERR,
3763859Sml29623 	BMAC_STAT_RX_ALIGN_ERR_CNT,
3773859Sml29623 	BMAC_STAT_RX_CRC_ERR_CNT,
3783859Sml29623 	BMAC_STAT_RX_LEN_ERR_CNT,
3793859Sml29623 	BMAC_STAT_RX_VIOL_ERR_CNT,
3803859Sml29623 	BMAC_STAT_RX_PAUSE_CNT,
3813859Sml29623 	BMAC_STAT_RX_PAUSE_STATE,
3823859Sml29623 	BMAC_STAT_RX_NOPAUSE_STATE,
3833859Sml29623 	BMAC_STAT_END
3843859Sml29623 } nxge_bmac_stat_index_t;
3853859Sml29623 
3863859Sml29623 nxge_kstat_index_t nxge_bmac_stats[] = {
3873859Sml29623 	{BMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_ULONG, "txmac_frame_cnt"},
3883859Sml29623 	{BMAC_STAT_TX_UNDERRUN_ERR, KSTAT_DATA_ULONG, "txmac_underrun_err"},
3893859Sml29623 	{BMAC_STAT_TX_MAX_PKT_ERR, KSTAT_DATA_ULONG, "txmac_max_pkt_err"},
3903859Sml29623 	{BMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_ULONG, "txmac_byte_cnt"},
3913859Sml29623 	{BMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_ULONG, "rxmac_frame_cnt"},
3923859Sml29623 	{BMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_ULONG, "rxmac_byte_cnt"},
3933859Sml29623 	{BMAC_STAT_RX_OVERFLOW_ERR, KSTAT_DATA_ULONG, "rxmac_overflow_err"},
3943859Sml29623 	{BMAC_STAT_RX_ALIGN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_align_err_cnt"},
3953859Sml29623 	{BMAC_STAT_RX_CRC_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_crc_err_cnt"},
3963859Sml29623 	{BMAC_STAT_RX_LEN_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_len_err_cnt"},
3973859Sml29623 	{BMAC_STAT_RX_VIOL_ERR_CNT, KSTAT_DATA_ULONG, "rxmac_viol_err_cnt"},
3983859Sml29623 	{BMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_ULONG, "rxmac_pause_cnt"},
3993859Sml29623 	{BMAC_STAT_RX_PAUSE_STATE, KSTAT_DATA_ULONG, "txmac_pause_state"},
4003859Sml29623 	{BMAC_STAT_RX_NOPAUSE_STATE, KSTAT_DATA_ULONG, "tx_nopause_state"},
4013859Sml29623 	{BMAC_STAT_END, NULL, NULL}
4023859Sml29623 };
4033859Sml29623 
4043859Sml29623 typedef enum {
4053859Sml29623 	ZCP_STAT_ERRORS,
4063859Sml29623 	ZCP_STAT_INITS,
4073859Sml29623 	ZCP_STAT_RRFIFO_UNDERRUN,
4083859Sml29623 	ZCP_STAT_RRFIFO_OVERRUN,
4093859Sml29623 	ZCP_STAT_RSPFIFO_UNCORR_ERR,
4103859Sml29623 	ZCP_STAT_BUFFER_OVERFLOW,
4113859Sml29623 	ZCP_STAT_STAT_TBL_PERR,
4123859Sml29623 	ZCP_STAT_DYN_TBL_PERR,
4133859Sml29623 	ZCP_STAT_BUF_TBL_PERR,
4143859Sml29623 	ZCP_STAT_TT_PROGRAM_ERR,
4153859Sml29623 	ZCP_STAT_RSP_TT_INDEX_ERR,
4163859Sml29623 	ZCP_STAT_SLV_TT_INDEX_ERR,
4173859Sml29623 	ZCP_STAT_ZCP_TT_INDEX_ERR,
4183859Sml29623 	ZCP_STAT_ZCP_ACCESS_FAIL,
4193859Sml29623 	ZCP_CFIFO_ECC,
4203859Sml29623 	ZCP_STAT_END
4213859Sml29623 } nxge_zcp_stat_index_t;
4223859Sml29623 
4233859Sml29623 nxge_kstat_index_t nxge_zcp_stats[] = {
4243859Sml29623 	{ZCP_STAT_ERRORS, KSTAT_DATA_ULONG, "zcp_erros"},
4253859Sml29623 	{ZCP_STAT_INITS, KSTAT_DATA_ULONG, "zcp_inits"},
4263859Sml29623 	{ZCP_STAT_RRFIFO_UNDERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_underrun"},
4273859Sml29623 	{ZCP_STAT_RRFIFO_OVERRUN, KSTAT_DATA_ULONG, "zcp_rrfifo_overrun"},
4283859Sml29623 	{ZCP_STAT_RSPFIFO_UNCORR_ERR, KSTAT_DATA_ULONG,
4293859Sml29623 	"zcp_rspfifo_uncorr_err"},
4303859Sml29623 	{ZCP_STAT_BUFFER_OVERFLOW, KSTAT_DATA_ULONG, "zcp_buffer_overflow"},
4313859Sml29623 	{ZCP_STAT_STAT_TBL_PERR, KSTAT_DATA_ULONG, "zcp_stat_tbl_perr"},
4323859Sml29623 	{ZCP_STAT_DYN_TBL_PERR, KSTAT_DATA_ULONG, "zcp_dyn_tbl_perr"},
4333859Sml29623 	{ZCP_STAT_BUF_TBL_PERR, KSTAT_DATA_ULONG, "zcp_buf_tbl_perr"},
4343859Sml29623 	{ZCP_STAT_TT_PROGRAM_ERR, KSTAT_DATA_ULONG, "zcp_tt_program_err"},
4353859Sml29623 	{ZCP_STAT_RSP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_rsp_tt_index_err"},
4363859Sml29623 	{ZCP_STAT_SLV_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_slv_tt_index_err"},
4373859Sml29623 	{ZCP_STAT_ZCP_TT_INDEX_ERR, KSTAT_DATA_ULONG, "zcp_zcp_tt_index_err"},
4383859Sml29623 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_access_fail"},
4393859Sml29623 	{ZCP_STAT_ZCP_ACCESS_FAIL, KSTAT_DATA_ULONG, "zcp_cfifo_ecc"},
4403859Sml29623 	{ZCP_STAT_END, NULL, NULL}
4413859Sml29623 };
4423859Sml29623 
4433859Sml29623 typedef enum {
4443859Sml29623 	FFLP_STAT_TCAM_PERR,
4453859Sml29623 	FFLP_STAT_TCAM_ECC_ERR,
4463859Sml29623 	FFLP_STAT_VLAN_PERR,
4473859Sml29623 	FFLP_STAT_HASH_LOOKUP_ERR,
4483859Sml29623 	FFLP_STAT_HASH_P0_PIO_ERR,
4493859Sml29623 	FFLP_STAT_HASH_P1_PIO_ERR,
4503859Sml29623 	FFLP_STAT_HASH_P2_PIO_ERR,
4513859Sml29623 	FFLP_STAT_HASH_P3_PIO_ERR,
4523859Sml29623 	FFLP_STAT_HASH_P4_PIO_ERR,
4533859Sml29623 	FFLP_STAT_HASH_P5_PIO_ERR,
4543859Sml29623 	FFLP_STAT_HASH_P6_PIO_ERR,
4553859Sml29623 	FFLP_STAT_HASH_P7_PIO_ERR,
4563859Sml29623 	FFLP_STAT_END
4573859Sml29623 } nxge_fflp_stat_index_t;
4583859Sml29623 
4593859Sml29623 nxge_kstat_index_t nxge_fflp_stats[] = {
4603859Sml29623 	{FFLP_STAT_TCAM_PERR, KSTAT_DATA_ULONG, "fflp_tcam_perr"},
4613859Sml29623 	{FFLP_STAT_TCAM_ECC_ERR, KSTAT_DATA_ULONG, "fflp_tcam_ecc_err"},
4623859Sml29623 	{FFLP_STAT_VLAN_PERR, KSTAT_DATA_ULONG, "fflp_vlan_perr"},
4633859Sml29623 	{FFLP_STAT_HASH_LOOKUP_ERR, KSTAT_DATA_ULONG, "fflp_hash_lookup_err"},
4643859Sml29623 	{FFLP_STAT_HASH_P0_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p0_pio_err"},
4653859Sml29623 	{FFLP_STAT_HASH_P1_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p1_pio_err"},
4663859Sml29623 	{FFLP_STAT_HASH_P2_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p2_pio_err"},
4673859Sml29623 	{FFLP_STAT_HASH_P3_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p3_pio_err"},
4683859Sml29623 	{FFLP_STAT_HASH_P4_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p4_pio_err"},
4693859Sml29623 	{FFLP_STAT_HASH_P5_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p5_pio_err"},
4703859Sml29623 	{FFLP_STAT_HASH_P6_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p6_pio_err"},
4713859Sml29623 	{FFLP_STAT_HASH_P7_PIO_ERR, KSTAT_DATA_ULONG, "fflp_hash_p7_pio_err"},
4723859Sml29623 	{FFLP_STAT_END, NULL, NULL}
4733859Sml29623 };
4743859Sml29623 
4753859Sml29623 typedef enum {
4763859Sml29623 	MMAC_MAX_ADDR,
4773859Sml29623 	MMAC_AVAIL_ADDR,
4783859Sml29623 	MMAC_ADDR_POOL1,
4793859Sml29623 	MMAC_ADDR_POOL2,
4803859Sml29623 	MMAC_ADDR_POOL3,
4813859Sml29623 	MMAC_ADDR_POOL4,
4823859Sml29623 	MMAC_ADDR_POOL5,
4833859Sml29623 	MMAC_ADDR_POOL6,
4843859Sml29623 	MMAC_ADDR_POOL7,
4853859Sml29623 	MMAC_ADDR_POOL8,
4863859Sml29623 	MMAC_ADDR_POOL9,
4873859Sml29623 	MMAC_ADDR_POOL10,
4883859Sml29623 	MMAC_ADDR_POOL11,
4893859Sml29623 	MMAC_ADDR_POOL12,
4903859Sml29623 	MMAC_ADDR_POOL13,
4913859Sml29623 	MMAC_ADDR_POOL14,
4923859Sml29623 	MMAC_ADDR_POOL15,
4933859Sml29623 	MMAC_ADDR_POOL16,
4943859Sml29623 	MMAC_STATS_END
4953859Sml29623 } nxge_mmac_stat_index_t;
4963859Sml29623 
4973859Sml29623 nxge_kstat_index_t nxge_mmac_stats[] = {
4983859Sml29623 	{MMAC_MAX_ADDR, KSTAT_DATA_UINT64, "max_mmac_addr"},
4993859Sml29623 	{MMAC_AVAIL_ADDR, KSTAT_DATA_UINT64, "avail_mmac_addr"},
5003859Sml29623 	{MMAC_ADDR_POOL1, KSTAT_DATA_UINT64, "mmac_addr_1"},
5013859Sml29623 	{MMAC_ADDR_POOL2, KSTAT_DATA_UINT64, "mmac_addr_2"},
5023859Sml29623 	{MMAC_ADDR_POOL3, KSTAT_DATA_UINT64, "mmac_addr_3"},
5033859Sml29623 	{MMAC_ADDR_POOL4, KSTAT_DATA_UINT64, "mmac_addr_4"},
5043859Sml29623 	{MMAC_ADDR_POOL5, KSTAT_DATA_UINT64, "mmac_addr_5"},
5053859Sml29623 	{MMAC_ADDR_POOL6, KSTAT_DATA_UINT64, "mmac_addr_6"},
5063859Sml29623 	{MMAC_ADDR_POOL7, KSTAT_DATA_UINT64, "mmac_addr_7"},
5073859Sml29623 	{MMAC_ADDR_POOL8, KSTAT_DATA_UINT64, "mmac_addr_8"},
5083859Sml29623 	{MMAC_ADDR_POOL9, KSTAT_DATA_UINT64, "mmac_addr_9"},
5093859Sml29623 	{MMAC_ADDR_POOL10, KSTAT_DATA_UINT64, "mmac_addr_10"},
5103859Sml29623 	{MMAC_ADDR_POOL11, KSTAT_DATA_UINT64, "mmac_addr_11"},
5113859Sml29623 	{MMAC_ADDR_POOL12, KSTAT_DATA_UINT64, "mmac_addr_12"},
5123859Sml29623 	{MMAC_ADDR_POOL13, KSTAT_DATA_UINT64, "mmac_addr_13"},
5133859Sml29623 	{MMAC_ADDR_POOL14, KSTAT_DATA_UINT64, "mmac_addr_14"},
5143859Sml29623 	{MMAC_ADDR_POOL15, KSTAT_DATA_UINT64, "mmac_addr_15"},
5153859Sml29623 	{MMAC_ADDR_POOL16, KSTAT_DATA_UINT64, "mmac_addr_16"},
5163859Sml29623 	{MMAC_STATS_END, NULL, NULL},
5173859Sml29623 };
5183859Sml29623 
5193859Sml29623 /* ARGSUSED */
5203859Sml29623 int
nxge_tdc_stat_update(kstat_t * ksp,int rw)5213859Sml29623 nxge_tdc_stat_update(kstat_t *ksp, int rw)
5223859Sml29623 {
5233859Sml29623 	p_nxge_t nxgep;
5243859Sml29623 	p_nxge_tdc_kstat_t tdc_kstatsp;
5253859Sml29623 	p_nxge_tx_ring_stats_t statsp;
5263859Sml29623 	int channel;
5273859Sml29623 	char *ch_name, *end;
5283859Sml29623 
5293859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
5303859Sml29623 	if (nxgep == NULL)
5313859Sml29623 		return (-1);
5323859Sml29623 
5333859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rxstat_update"));
5343859Sml29623 
5353859Sml29623 	ch_name = ksp->ks_name;
5363859Sml29623 	ch_name += strlen(TDC_NAME_FORMAT1);
5373859Sml29623 	channel = mi_strtol(ch_name, &end, 10);
5383859Sml29623 
5393859Sml29623 	tdc_kstatsp = (p_nxge_tdc_kstat_t)ksp->ks_data;
5403859Sml29623 	statsp = (p_nxge_tx_ring_stats_t)&nxgep->statsp->tdc_stats[channel];
5413859Sml29623 
5423859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
5436946Smisaki 	    "nxge_tdc_stat_update data $%p statsp $%p channel %d",
5446946Smisaki 	    ksp->ks_data, statsp, channel));
5453859Sml29623 
5463859Sml29623 	if (rw == KSTAT_WRITE) {
5473859Sml29623 		statsp->opackets = tdc_kstatsp->opackets.value.ull;
5483859Sml29623 		statsp->obytes = tdc_kstatsp->obytes.value.ull;
5493859Sml29623 		statsp->oerrors = tdc_kstatsp->oerrors.value.ull;
5503859Sml29623 		statsp->mbox_err = tdc_kstatsp->mbox_err.value.ul;
5513859Sml29623 		statsp->pkt_size_err = tdc_kstatsp->pkt_size_err.value.ul;
5523859Sml29623 		statsp->tx_ring_oflow = tdc_kstatsp->tx_ring_oflow.value.ul;
5533859Sml29623 		statsp->pre_buf_par_err =
5546946Smisaki 		    tdc_kstatsp->pref_buf_ecc_err.value.ul;
5553859Sml29623 		statsp->nack_pref = tdc_kstatsp->nack_pref.value.ul;
5563859Sml29623 		statsp->nack_pkt_rd = tdc_kstatsp->nack_pkt_rd.value.ul;
5573859Sml29623 		statsp->conf_part_err = tdc_kstatsp->conf_part_err.value.ul;
5583859Sml29623 		statsp->pkt_part_err = tdc_kstatsp->pkt_prt_err.value.ul;
5593859Sml29623 	} else {
5603859Sml29623 		tdc_kstatsp->opackets.value.ull = statsp->opackets;
5613859Sml29623 		tdc_kstatsp->obytes.value.ull = statsp->obytes;
5623859Sml29623 		tdc_kstatsp->oerrors.value.ull = statsp->oerrors;
5633859Sml29623 		tdc_kstatsp->tx_hdr_pkts.value.ull = statsp->tx_hdr_pkts;
5643859Sml29623 		tdc_kstatsp->tx_ddi_pkts.value.ull = statsp->tx_ddi_pkts;
5653859Sml29623 		tdc_kstatsp->tx_dvma_pkts.value.ull = statsp->tx_dvma_pkts;
5663859Sml29623 		tdc_kstatsp->tx_max_pend.value.ull = statsp->tx_max_pend;
5673859Sml29623 		tdc_kstatsp->mbox_err.value.ul = statsp->mbox_err;
5683859Sml29623 		tdc_kstatsp->pkt_size_err.value.ul = statsp->pkt_size_err;
5693859Sml29623 		tdc_kstatsp->tx_ring_oflow.value.ul = statsp->tx_ring_oflow;
5703859Sml29623 		tdc_kstatsp->pref_buf_ecc_err.value.ul =
5716946Smisaki 		    statsp->pre_buf_par_err;
5723859Sml29623 		tdc_kstatsp->nack_pref.value.ul = statsp->nack_pref;
5733859Sml29623 		tdc_kstatsp->nack_pkt_rd.value.ul = statsp->nack_pkt_rd;
5743859Sml29623 		tdc_kstatsp->conf_part_err.value.ul = statsp->conf_part_err;
5753859Sml29623 		tdc_kstatsp->pkt_prt_err.value.ul = statsp->pkt_part_err;
5763859Sml29623 		tdc_kstatsp->tx_starts.value.ul = statsp->tx_starts;
5773859Sml29623 		tdc_kstatsp->tx_nocanput.value.ul = statsp->tx_nocanput;
5783859Sml29623 		tdc_kstatsp->tx_msgdup_fail.value.ul = statsp->tx_msgdup_fail;
5793859Sml29623 		tdc_kstatsp->tx_allocb_fail.value.ul = statsp->tx_allocb_fail;
5803859Sml29623 		tdc_kstatsp->tx_no_desc.value.ul = statsp->tx_no_desc;
5813859Sml29623 		tdc_kstatsp->tx_dma_bind_fail.value.ul =
5826946Smisaki 		    statsp->tx_dma_bind_fail;
5833859Sml29623 	}
5843859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_tdc_stat_update"));
5853859Sml29623 	return (0);
5863859Sml29623 }
5873859Sml29623 
5883859Sml29623 /* ARGSUSED */
5893859Sml29623 int
nxge_rdc_stat_update(kstat_t * ksp,int rw)5903859Sml29623 nxge_rdc_stat_update(kstat_t *ksp, int rw)
5913859Sml29623 {
5923859Sml29623 	p_nxge_t nxgep;
5933859Sml29623 	p_nxge_rdc_kstat_t rdc_kstatsp;
5943859Sml29623 	p_nxge_rx_ring_stats_t statsp;
5953859Sml29623 	int channel;
5963859Sml29623 	char *ch_name, *end;
5973859Sml29623 
5983859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
5993859Sml29623 	if (nxgep == NULL)
6003859Sml29623 		return (-1);
6013859Sml29623 
6023859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_stat_update"));
6033859Sml29623 
6043859Sml29623 	ch_name = ksp->ks_name;
6053859Sml29623 	ch_name += strlen(RDC_NAME_FORMAT1);
6063859Sml29623 	channel = mi_strtol(ch_name, &end, 10);
6073859Sml29623 
6083859Sml29623 	rdc_kstatsp = (p_nxge_rdc_kstat_t)ksp->ks_data;
6093859Sml29623 	statsp = (p_nxge_rx_ring_stats_t)&nxgep->statsp->rdc_stats[channel];
6103859Sml29623 
6113859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL,
6126946Smisaki 	    "nxge_rdc_stat_update $%p statsp $%p channel %d",
6136946Smisaki 	    ksp->ks_data, statsp, channel));
6143859Sml29623 
6153859Sml29623 	if (rw == KSTAT_WRITE) {
6163859Sml29623 		statsp->dcf_err = rdc_kstatsp->dcf_err.value.ul;
6173859Sml29623 		statsp->rcr_ack_err = rdc_kstatsp->rcr_ack_err.value.ul;
6183859Sml29623 		statsp->dc_fifo_err = rdc_kstatsp->dc_fifoflow_err.value.ul;
6193859Sml29623 		statsp->rcr_sha_par = rdc_kstatsp->rcr_sha_par_err.value.ul;
6203859Sml29623 		statsp->rbr_pre_par = rdc_kstatsp->rbr_pre_par_err.value.ul;
6213859Sml29623 		statsp->wred_drop = rdc_kstatsp->wred_drop.value.ul;
6223859Sml29623 		statsp->rbr_pre_empty = rdc_kstatsp->rbr_pre_emty.value.ul;
6233859Sml29623 		statsp->rcr_shadow_full = rdc_kstatsp->rcr_shadow_full.value.ul;
6243859Sml29623 		statsp->rx_rbr_tmout = rdc_kstatsp->rbr_tmout.value.ul;
6253859Sml29623 		statsp->rsp_cnt_err = rdc_kstatsp->rsp_cnt_err.value.ul;
6263859Sml29623 		statsp->byte_en_bus = rdc_kstatsp->byte_en_bus.value.ul;
6273859Sml29623 		statsp->rsp_dat_err = rdc_kstatsp->rsp_dat_err.value.ul;
6286028Ssbehera 		statsp->pkt_too_long_err =
6296028Ssbehera 		    rdc_kstatsp->pkt_too_long_err.value.ul;
6303859Sml29623 		statsp->l2_err = rdc_kstatsp->compl_l2_err.value.ul;
6313859Sml29623 		statsp->l4_cksum_err = rdc_kstatsp->compl_l4_cksum_err.value.ul;
6323859Sml29623 		statsp->fflp_soft_err =
6336946Smisaki 		    rdc_kstatsp->compl_fflp_soft_err.value.ul;
6343859Sml29623 		statsp->zcp_soft_err = rdc_kstatsp->compl_zcp_soft_err.value.ul;
6353859Sml29623 		statsp->config_err = rdc_kstatsp->config_err.value.ul;
6363859Sml29623 		statsp->rcrincon = rdc_kstatsp->rcrincon.value.ul;
6373859Sml29623 		statsp->rcrfull = rdc_kstatsp->rcrfull.value.ul;
6383859Sml29623 		statsp->rbr_empty = rdc_kstatsp->rbr_empty.value.ul;
6393859Sml29623 		statsp->rbrfull = rdc_kstatsp->rbrfull.value.ul;
6403859Sml29623 		statsp->rbrlogpage = rdc_kstatsp->rbrlogpage.value.ul;
6413859Sml29623 		statsp->cfiglogpage = rdc_kstatsp->cfiglogpage.value.ul;
6423859Sml29623 	} else {
6433859Sml29623 		rdc_kstatsp->ipackets.value.ull = statsp->ipackets;
6443859Sml29623 		rdc_kstatsp->rbytes.value.ull = statsp->ibytes;
6453859Sml29623 		rdc_kstatsp->errors.value.ul = statsp->ierrors;
6463859Sml29623 		rdc_kstatsp->dcf_err.value.ul = statsp->dcf_err;
6473859Sml29623 		rdc_kstatsp->rcr_ack_err.value.ul = statsp->rcr_ack_err;
6483859Sml29623 		rdc_kstatsp->dc_fifoflow_err.value.ul = statsp->dc_fifo_err;
6493859Sml29623 		rdc_kstatsp->rcr_sha_par_err.value.ul = statsp->rcr_sha_par;
6503859Sml29623 		rdc_kstatsp->rbr_pre_par_err.value.ul = statsp->rbr_pre_par;
6513859Sml29623 		rdc_kstatsp->wred_drop.value.ul = statsp->wred_drop;
6523859Sml29623 		rdc_kstatsp->port_drop_pkt.value.ul = statsp->port_drop_pkt;
6533859Sml29623 		rdc_kstatsp->rbr_pre_emty.value.ul = statsp->rbr_pre_empty;
6543859Sml29623 		rdc_kstatsp->rcr_shadow_full.value.ul = statsp->rcr_shadow_full;
6553859Sml29623 		rdc_kstatsp->rbr_tmout.value.ul = statsp->rx_rbr_tmout;
6563859Sml29623 		rdc_kstatsp->rsp_cnt_err.value.ul = statsp->rsp_cnt_err;
6573859Sml29623 		rdc_kstatsp->byte_en_bus.value.ul = statsp->byte_en_bus;
6583859Sml29623 		rdc_kstatsp->rsp_dat_err.value.ul = statsp->rsp_dat_err;
6596028Ssbehera 		rdc_kstatsp->pkt_too_long_err.value.ul =
6606028Ssbehera 		    statsp->pkt_too_long_err;
6613859Sml29623 		rdc_kstatsp->compl_l2_err.value.ul = statsp->l2_err;
6623859Sml29623 		rdc_kstatsp->compl_l4_cksum_err.value.ul = statsp->l4_cksum_err;
6633859Sml29623 		rdc_kstatsp->compl_fflp_soft_err.value.ul =
6646946Smisaki 		    statsp->fflp_soft_err;
6653859Sml29623 		rdc_kstatsp->compl_zcp_soft_err.value.ul = statsp->zcp_soft_err;
6663859Sml29623 		rdc_kstatsp->config_err.value.ul = statsp->config_err;
6673859Sml29623 		rdc_kstatsp->rcrincon.value.ul = statsp->rcrincon;
6683859Sml29623 		rdc_kstatsp->rcrfull.value.ul = statsp->rcrfull;
6693859Sml29623 		rdc_kstatsp->rbr_empty.value.ul = statsp->rbr_empty;
6703859Sml29623 		rdc_kstatsp->rbrfull.value.ul = statsp->rbrfull;
6713859Sml29623 		rdc_kstatsp->rbrlogpage.value.ul = statsp->rbrlogpage;
6723859Sml29623 		rdc_kstatsp->cfiglogpage.value.ul = statsp->cfiglogpage;
6733859Sml29623 	}
6743859Sml29623 
6753859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_stat_update"));
6763859Sml29623 	return (0);
6773859Sml29623 }
6783859Sml29623 
6793859Sml29623 /* ARGSUSED */
6803859Sml29623 int
nxge_rdc_sys_stat_update(kstat_t * ksp,int rw)6813859Sml29623 nxge_rdc_sys_stat_update(kstat_t *ksp, int rw)
6823859Sml29623 {
6833859Sml29623 	p_nxge_t nxgep;
6843859Sml29623 	p_nxge_rdc_sys_kstat_t rdc_sys_kstatsp;
6853859Sml29623 	p_nxge_rdc_sys_stats_t statsp;
6863859Sml29623 
6873859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
6883859Sml29623 	if (nxgep == NULL)
6893859Sml29623 		return (-1);
6903859Sml29623 
6913859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_rdc_sys_stat_update"));
6923859Sml29623 
6933859Sml29623 	rdc_sys_kstatsp = (p_nxge_rdc_sys_kstat_t)ksp->ks_data;
6943859Sml29623 	statsp = (p_nxge_rdc_sys_stats_t)&nxgep->statsp->rdc_sys_stats;
6953859Sml29623 
6963859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "nxge_rdc_sys_stat_update %llx",
6976946Smisaki 	    ksp->ks_data));
6983859Sml29623 
6993859Sml29623 	if (rw == KSTAT_WRITE) {
7003859Sml29623 		statsp->id_mismatch = rdc_sys_kstatsp->id_mismatch.value.ul;
7013859Sml29623 		statsp->ipp_eop_err = rdc_sys_kstatsp->ipp_eop_err.value.ul;
7023859Sml29623 		statsp->zcp_eop_err = rdc_sys_kstatsp->zcp_eop_err.value.ul;
7033859Sml29623 	} else {
7043859Sml29623 		rdc_sys_kstatsp->id_mismatch.value.ul = statsp->id_mismatch;
7053859Sml29623 		rdc_sys_kstatsp->ipp_eop_err.value.ul = statsp->ipp_eop_err;
7063859Sml29623 		rdc_sys_kstatsp->zcp_eop_err.value.ul = statsp->zcp_eop_err;
7073859Sml29623 	}
7083859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, " <== nxge_rdc_sys_stat_update"));
7093859Sml29623 	return (0);
7103859Sml29623 }
7113859Sml29623 
7123859Sml29623 /* ARGSUSED */
7133859Sml29623 static int
nxge_txc_stat_update(kstat_t * ksp,int rw)7143859Sml29623 nxge_txc_stat_update(kstat_t *ksp, int rw)
7153859Sml29623 {
7163859Sml29623 	p_nxge_t nxgep;
7173859Sml29623 	p_nxge_txc_kstat_t txc_kstatsp;
7183859Sml29623 	p_nxge_txc_stats_t statsp;
7193859Sml29623 
7203859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
7213859Sml29623 
7223859Sml29623 	if (nxgep == NULL)
7233859Sml29623 		return (-1);
7243859Sml29623 
7253859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_txc_stat_update"));
7263859Sml29623 
7273859Sml29623 	txc_kstatsp = (p_nxge_txc_kstat_t)ksp->ks_data;
7283859Sml29623 	statsp = (p_nxge_txc_stats_t)&nxgep->statsp->txc_stats;
7293859Sml29623 
7303859Sml29623 	if (rw == KSTAT_WRITE) {
7313859Sml29623 		statsp->pkt_stuffed = txc_kstatsp->pkt_stuffed.value.ul;
7323859Sml29623 		statsp->pkt_xmit = txc_kstatsp->pkt_xmit.value.ul;
7333859Sml29623 		statsp->ro_correct_err = txc_kstatsp->ro_correct_err.value.ul;
7343859Sml29623 		statsp->ro_uncorrect_err =
7356946Smisaki 		    txc_kstatsp->ro_uncorrect_err.value.ul;
7363859Sml29623 		statsp->sf_correct_err = txc_kstatsp->sf_correct_err.value.ul;
7373859Sml29623 		statsp->sf_uncorrect_err =
7386946Smisaki 		    txc_kstatsp->sf_uncorrect_err.value.ul;
7393859Sml29623 		statsp->address_failed = txc_kstatsp->address_failed.value.ul;
7403859Sml29623 		statsp->dma_failed = txc_kstatsp->dma_failed.value.ul;
7413859Sml29623 		statsp->length_failed = txc_kstatsp->length_failed.value.ul;
7423859Sml29623 		statsp->pkt_assy_dead = txc_kstatsp->pkt_assy_dead.value.ul;
7433859Sml29623 		statsp->reorder_err = txc_kstatsp->reorder_err.value.ul;
7443859Sml29623 	} else {
7453859Sml29623 		txc_kstatsp->pkt_stuffed.value.ul = statsp->pkt_stuffed;
7463859Sml29623 		txc_kstatsp->pkt_xmit.value.ul = statsp->pkt_xmit;
7473859Sml29623 		txc_kstatsp->ro_correct_err.value.ul = statsp->ro_correct_err;
7483859Sml29623 		txc_kstatsp->ro_uncorrect_err.value.ul =
7496946Smisaki 		    statsp->ro_uncorrect_err;
7503859Sml29623 		txc_kstatsp->sf_correct_err.value.ul = statsp->sf_correct_err;
7513859Sml29623 		txc_kstatsp->sf_uncorrect_err.value.ul =
7526946Smisaki 		    statsp->sf_uncorrect_err;
7533859Sml29623 		txc_kstatsp->address_failed.value.ul = statsp->address_failed;
7543859Sml29623 		txc_kstatsp->dma_failed.value.ul = statsp->dma_failed;
7553859Sml29623 		txc_kstatsp->length_failed.value.ul = statsp->length_failed;
7563859Sml29623 		txc_kstatsp->pkt_assy_dead.value.ul = statsp->pkt_assy_dead;
7573859Sml29623 		txc_kstatsp->reorder_err.value.ul = statsp->reorder_err;
7583859Sml29623 	}
7593859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_txc_stat_update"));
7603859Sml29623 	return (0);
7613859Sml29623 }
7623859Sml29623 
7633859Sml29623 /* ARGSUSED */
7643859Sml29623 int
nxge_ipp_stat_update(kstat_t * ksp,int rw)7653859Sml29623 nxge_ipp_stat_update(kstat_t *ksp, int rw)
7663859Sml29623 {
7673859Sml29623 	p_nxge_t nxgep;
7683859Sml29623 	p_nxge_ipp_kstat_t ipp_kstatsp;
7693859Sml29623 	p_nxge_ipp_stats_t statsp;
7703859Sml29623 
7713859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
7723859Sml29623 	if (nxgep == NULL)
7733859Sml29623 		return (-1);
7743859Sml29623 
7753859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_ipp_stat_update"));
7763859Sml29623 
7773859Sml29623 	ipp_kstatsp = (p_nxge_ipp_kstat_t)ksp->ks_data;
7783859Sml29623 	statsp = (p_nxge_ipp_stats_t)&nxgep->statsp->ipp_stats;
7793859Sml29623 
7803859Sml29623 	if (rw == KSTAT_WRITE) {
7813859Sml29623 		statsp->eop_miss = ipp_kstatsp->eop_miss.value.ul;
7823859Sml29623 		statsp->sop_miss = ipp_kstatsp->sop_miss.value.ul;
7833859Sml29623 		statsp->dfifo_ue = ipp_kstatsp->dfifo_ue.value.ul;
7843859Sml29623 		statsp->ecc_err_cnt = ipp_kstatsp->ecc_err_cnt.value.ul;
7854439Sml29623 		statsp->pfifo_perr = ipp_kstatsp->pfifo_perr.value.ul;
7863859Sml29623 		statsp->pfifo_over = ipp_kstatsp->pfifo_over.value.ul;
7873859Sml29623 		statsp->pfifo_und = ipp_kstatsp->pfifo_und.value.ul;
7883859Sml29623 		statsp->bad_cs_cnt = ipp_kstatsp->bad_cs_cnt.value.ul;
7893859Sml29623 		statsp->pkt_dis_cnt = ipp_kstatsp->pkt_dis_cnt.value.ul;
7903859Sml29623 	} else {
7913859Sml29623 		ipp_kstatsp->eop_miss.value.ul = statsp->eop_miss;
7923859Sml29623 		ipp_kstatsp->sop_miss.value.ul = statsp->sop_miss;
7933859Sml29623 		ipp_kstatsp->dfifo_ue.value.ul = statsp->dfifo_ue;
7943859Sml29623 		ipp_kstatsp->ecc_err_cnt.value.ul = statsp->ecc_err_cnt;
7954439Sml29623 		ipp_kstatsp->pfifo_perr.value.ul = statsp->pfifo_perr;
7963859Sml29623 		ipp_kstatsp->pfifo_over.value.ul = statsp->pfifo_over;
7973859Sml29623 		ipp_kstatsp->pfifo_und.value.ul = statsp->pfifo_und;
7983859Sml29623 		ipp_kstatsp->bad_cs_cnt.value.ul = statsp->bad_cs_cnt;
7993859Sml29623 		ipp_kstatsp->pkt_dis_cnt.value.ul = statsp->pkt_dis_cnt;
8003859Sml29623 	}
8013859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_ipp_stat_update"));
8023859Sml29623 	return (0);
8033859Sml29623 }
8043859Sml29623 
8053859Sml29623 /* ARGSUSED */
8063859Sml29623 int
nxge_xmac_stat_update(kstat_t * ksp,int rw)8073859Sml29623 nxge_xmac_stat_update(kstat_t *ksp, int rw)
8083859Sml29623 {
8093859Sml29623 	p_nxge_t nxgep;
8103859Sml29623 	p_nxge_xmac_kstat_t xmac_kstatsp;
8113859Sml29623 	p_nxge_xmac_stats_t statsp;
8123859Sml29623 
8133859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
8143859Sml29623 	if (nxgep == NULL)
8153859Sml29623 		return (-1);
8163859Sml29623 
8173859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_xmac_stat_update"));
8183859Sml29623 
8193859Sml29623 	xmac_kstatsp = (p_nxge_xmac_kstat_t)ksp->ks_data;
8203859Sml29623 	statsp = (p_nxge_xmac_stats_t)&nxgep->statsp->xmac_stats;
8213859Sml29623 
8223859Sml29623 	if (rw == KSTAT_WRITE) {
8233859Sml29623 		statsp->tx_frame_cnt = xmac_kstatsp->tx_frame_cnt.value.ul;
8243859Sml29623 		statsp->tx_underflow_err =
8256946Smisaki 		    xmac_kstatsp->tx_underflow_err.value.ul;
8263859Sml29623 		statsp->tx_maxpktsize_err =
8276946Smisaki 		    xmac_kstatsp->tx_maxpktsize_err.value.ul;
8283859Sml29623 		statsp->tx_overflow_err =
8296946Smisaki 		    xmac_kstatsp->tx_overflow_err.value.ul;
8303859Sml29623 		statsp->tx_fifo_xfr_err =
8316946Smisaki 		    xmac_kstatsp->tx_fifo_xfr_err.value.ul;
8323859Sml29623 		statsp->tx_byte_cnt = xmac_kstatsp->tx_byte_cnt.value.ul;
8333859Sml29623 		statsp->rx_underflow_err =
8346946Smisaki 		    xmac_kstatsp->rx_underflow_err.value.ul;
8353859Sml29623 		statsp->rx_overflow_err =
8366946Smisaki 		    xmac_kstatsp->rx_overflow_err.value.ul;
8373859Sml29623 		statsp->rx_crc_err_cnt = xmac_kstatsp->rx_crc_err_cnt.value.ul;
8383859Sml29623 		statsp->rx_len_err_cnt = xmac_kstatsp->rx_len_err_cnt.value.ul;
8393859Sml29623 		statsp->rx_viol_err_cnt =
8406946Smisaki 		    xmac_kstatsp->rx_viol_err_cnt.value.ul;
8413859Sml29623 		statsp->rx_byte_cnt = xmac_kstatsp->rx_byte_cnt.value.ul;
8426075Ssbehera 		statsp->rx_frame_cnt = xmac_kstatsp->rx_frame_cnt.value.ul;
8433859Sml29623 		statsp->rx_hist1_cnt = xmac_kstatsp->rx_hist1_cnt.value.ul;
8443859Sml29623 		statsp->rx_hist2_cnt = xmac_kstatsp->rx_hist2_cnt.value.ul;
8453859Sml29623 		statsp->rx_hist3_cnt = xmac_kstatsp->rx_hist3_cnt.value.ul;
8463859Sml29623 		statsp->rx_hist4_cnt = xmac_kstatsp->rx_hist4_cnt.value.ul;
8473859Sml29623 		statsp->rx_hist5_cnt = xmac_kstatsp->rx_hist5_cnt.value.ul;
8483859Sml29623 		statsp->rx_hist6_cnt = xmac_kstatsp->rx_hist6_cnt.value.ul;
8496075Ssbehera 		statsp->rx_hist7_cnt = xmac_kstatsp->rx_hist7_cnt.value.ul;
8503859Sml29623 		statsp->rx_mult_cnt = xmac_kstatsp->rx_mult_cnt.value.ul;
8513859Sml29623 		statsp->rx_frag_cnt = xmac_kstatsp->rx_frag_cnt.value.ul;
8523859Sml29623 		statsp->rx_frame_align_err_cnt =
8536946Smisaki 		    xmac_kstatsp->rx_frame_align_err_cnt.value.ul;
8543859Sml29623 		statsp->rx_linkfault_err_cnt =
8556946Smisaki 		    xmac_kstatsp->rx_linkfault_err_cnt.value.ul;
8563859Sml29623 		statsp->rx_localfault_err =
8576946Smisaki 		    xmac_kstatsp->rx_local_fault_err_cnt.value.ul;
8583859Sml29623 		statsp->rx_remotefault_err =
8596946Smisaki 		    xmac_kstatsp->rx_remote_fault_err_cnt.value.ul;
8603859Sml29623 		statsp->xpcs_deskew_err_cnt =
8616946Smisaki 		    xmac_kstatsp->xpcs_deskew_err_cnt.value.ul;
8623859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
8633859Sml29623 		statsp->xpcs_ln0_symbol_err_cnt =
8646946Smisaki 		    xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul;
8653859Sml29623 		statsp->xpcs_ln1_symbol_err_cnt =
8666946Smisaki 		    xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul;
8673859Sml29623 		statsp->xpcs_ln2_symbol_err_cnt =
8686946Smisaki 		    xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul;
8693859Sml29623 		statsp->xpcs_ln3_symbol_err_cnt =
8706946Smisaki 		    xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul;
8713859Sml29623 #endif
8723859Sml29623 	} else {
8733859Sml29623 		xmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
8743859Sml29623 		xmac_kstatsp->tx_underflow_err.value.ul =
8756946Smisaki 		    statsp->tx_underflow_err;
8763859Sml29623 		xmac_kstatsp->tx_maxpktsize_err.value.ul =
8776946Smisaki 		    statsp->tx_maxpktsize_err;
8783859Sml29623 		xmac_kstatsp->tx_overflow_err.value.ul =
8796946Smisaki 		    statsp->tx_overflow_err;
8803859Sml29623 		xmac_kstatsp->tx_fifo_xfr_err.value.ul =
8816946Smisaki 		    statsp->tx_fifo_xfr_err;
8823859Sml29623 		xmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
8833859Sml29623 		xmac_kstatsp->rx_underflow_err.value.ul =
8846946Smisaki 		    statsp->rx_underflow_err;
8853859Sml29623 		xmac_kstatsp->rx_overflow_err.value.ul =
8866946Smisaki 		    statsp->rx_overflow_err;
8873859Sml29623 		xmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
8883859Sml29623 		xmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
8893859Sml29623 		xmac_kstatsp->rx_viol_err_cnt.value.ul =
8906946Smisaki 		    statsp->rx_viol_err_cnt;
8913859Sml29623 		xmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
8926075Ssbehera 		xmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
8933859Sml29623 		xmac_kstatsp->rx_hist1_cnt.value.ul = statsp->rx_hist1_cnt;
8943859Sml29623 		xmac_kstatsp->rx_hist2_cnt.value.ul = statsp->rx_hist2_cnt;
8953859Sml29623 		xmac_kstatsp->rx_hist3_cnt.value.ul = statsp->rx_hist3_cnt;
8963859Sml29623 		xmac_kstatsp->rx_hist4_cnt.value.ul = statsp->rx_hist4_cnt;
8973859Sml29623 		xmac_kstatsp->rx_hist5_cnt.value.ul = statsp->rx_hist5_cnt;
8983859Sml29623 		xmac_kstatsp->rx_hist6_cnt.value.ul = statsp->rx_hist6_cnt;
8996075Ssbehera 		xmac_kstatsp->rx_hist7_cnt.value.ul = statsp->rx_hist7_cnt;
9003859Sml29623 		xmac_kstatsp->rx_mult_cnt.value.ul = statsp->rx_mult_cnt;
9013859Sml29623 		xmac_kstatsp->rx_frag_cnt.value.ul = statsp->rx_frag_cnt;
9023859Sml29623 		xmac_kstatsp->rx_frame_align_err_cnt.value.ul =
9036946Smisaki 		    statsp->rx_frame_align_err_cnt;
9043859Sml29623 		xmac_kstatsp->rx_linkfault_err_cnt.value.ul =
9056946Smisaki 		    statsp->rx_linkfault_err_cnt;
9063859Sml29623 		xmac_kstatsp->rx_local_fault_err_cnt.value.ul =
9076946Smisaki 		    statsp->rx_localfault_err;
9083859Sml29623 		xmac_kstatsp->rx_remote_fault_err_cnt.value.ul =
9096946Smisaki 		    statsp->rx_remotefault_err;
9103859Sml29623 		xmac_kstatsp->xpcs_deskew_err_cnt.value.ul =
9116946Smisaki 		    statsp->xpcs_deskew_err_cnt;
9123859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
9133859Sml29623 		xmac_kstatsp->xpcs_ln0_symbol_err_cnt.value.ul =
9146946Smisaki 		    statsp->xpcs_ln0_symbol_err_cnt;
9153859Sml29623 		xmac_kstatsp->xpcs_ln1_symbol_err_cnt.value.ul =
9166946Smisaki 		    statsp->xpcs_ln1_symbol_err_cnt;
9173859Sml29623 		xmac_kstatsp->xpcs_ln2_symbol_err_cnt.value.ul =
9186946Smisaki 		    statsp->xpcs_ln2_symbol_err_cnt;
9193859Sml29623 		xmac_kstatsp->xpcs_ln3_symbol_err_cnt.value.ul =
9206946Smisaki 		    statsp->xpcs_ln3_symbol_err_cnt;
9213859Sml29623 #endif
9223859Sml29623 	}
9233859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_xmac_stat_update"));
9243859Sml29623 	return (0);
9253859Sml29623 }
9263859Sml29623 
9273859Sml29623 /* ARGSUSED */
9283859Sml29623 int
nxge_bmac_stat_update(kstat_t * ksp,int rw)9293859Sml29623 nxge_bmac_stat_update(kstat_t *ksp, int rw)
9303859Sml29623 {
9313859Sml29623 	p_nxge_t nxgep;
9323859Sml29623 	p_nxge_bmac_kstat_t bmac_kstatsp;
9333859Sml29623 	p_nxge_bmac_stats_t statsp;
9343859Sml29623 
9353859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
9363859Sml29623 	if (nxgep == NULL)
9373859Sml29623 		return (-1);
9383859Sml29623 
9393859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_bmac_stat_update"));
9403859Sml29623 
9413859Sml29623 	bmac_kstatsp = (p_nxge_bmac_kstat_t)ksp->ks_data;
9423859Sml29623 	statsp = (p_nxge_bmac_stats_t)&nxgep->statsp->bmac_stats;
9433859Sml29623 
9443859Sml29623 	if (rw == KSTAT_WRITE) {
9453859Sml29623 		statsp->tx_frame_cnt = bmac_kstatsp->tx_frame_cnt.value.ul;
9463859Sml29623 		statsp->tx_underrun_err =
9476946Smisaki 		    bmac_kstatsp->tx_underrun_err.value.ul;
9483859Sml29623 		statsp->tx_max_pkt_err = bmac_kstatsp->tx_max_pkt_err.value.ul;
9493859Sml29623 		statsp->tx_byte_cnt = bmac_kstatsp->tx_byte_cnt.value.ul;
9503859Sml29623 		statsp->rx_frame_cnt = bmac_kstatsp->rx_frame_cnt.value.ul;
9513859Sml29623 		statsp->rx_byte_cnt = bmac_kstatsp->rx_byte_cnt.value.ul;
9523859Sml29623 		statsp->rx_overflow_err =
9536946Smisaki 		    bmac_kstatsp->rx_overflow_err.value.ul;
9543859Sml29623 		statsp->rx_align_err_cnt =
9556946Smisaki 		    bmac_kstatsp->rx_align_err_cnt.value.ul;
9563859Sml29623 		statsp->rx_crc_err_cnt = bmac_kstatsp->rx_crc_err_cnt.value.ul;
9573859Sml29623 		statsp->rx_len_err_cnt = bmac_kstatsp->rx_len_err_cnt.value.ul;
9583859Sml29623 		statsp->rx_viol_err_cnt =
9596946Smisaki 		    bmac_kstatsp->rx_viol_err_cnt.value.ul;
9603859Sml29623 	} else {
9613859Sml29623 		bmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
9623859Sml29623 		bmac_kstatsp->tx_underrun_err.value.ul =
9636946Smisaki 		    statsp->tx_underrun_err;
9643859Sml29623 		bmac_kstatsp->tx_max_pkt_err.value.ul = statsp->tx_max_pkt_err;
9653859Sml29623 		bmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
9663859Sml29623 		bmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
9673859Sml29623 		bmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
9683859Sml29623 		bmac_kstatsp->rx_overflow_err.value.ul =
9696946Smisaki 		    statsp->rx_overflow_err;
9703859Sml29623 		bmac_kstatsp->rx_align_err_cnt.value.ul =
9716946Smisaki 		    statsp->rx_align_err_cnt;
9723859Sml29623 		bmac_kstatsp->rx_crc_err_cnt.value.ul = statsp->rx_crc_err_cnt;
9733859Sml29623 		bmac_kstatsp->rx_len_err_cnt.value.ul = statsp->rx_len_err_cnt;
9743859Sml29623 		bmac_kstatsp->rx_viol_err_cnt.value.ul =
9756946Smisaki 		    statsp->rx_viol_err_cnt;
9763859Sml29623 	}
9773859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_bmac_stat_update"));
9783859Sml29623 	return (0);
9793859Sml29623 }
9803859Sml29623 
9813859Sml29623 /* ARGSUSED */
9823859Sml29623 int
nxge_zcp_stat_update(kstat_t * ksp,int rw)9833859Sml29623 nxge_zcp_stat_update(kstat_t *ksp, int rw)
9843859Sml29623 {
9853859Sml29623 	p_nxge_t nxgep;
9863859Sml29623 	p_nxge_zcp_kstat_t zcp_kstatsp;
9873859Sml29623 	p_nxge_zcp_stats_t statsp;
9883859Sml29623 
9893859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
9903859Sml29623 	if (nxgep == NULL)
9913859Sml29623 		return (-1);
9923859Sml29623 
9933859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_zcp_stat_update"));
9943859Sml29623 
9953859Sml29623 	zcp_kstatsp = (p_nxge_zcp_kstat_t)ksp->ks_data;
9963859Sml29623 	statsp = (p_nxge_zcp_stats_t)&nxgep->statsp->zcp_stats;
9973859Sml29623 
9983859Sml29623 	if (rw == KSTAT_WRITE) {
9993859Sml29623 		statsp->rrfifo_underrun = zcp_kstatsp->rrfifo_underrun.value.ul;
10003859Sml29623 		statsp->rrfifo_overrun = zcp_kstatsp->rrfifo_overrun.value.ul;
10013859Sml29623 		statsp->rspfifo_uncorr_err =
10026946Smisaki 		    zcp_kstatsp->rspfifo_uncorr_err.value.ul;
10033859Sml29623 		statsp->buffer_overflow = zcp_kstatsp->buffer_overflow.value.ul;
10043859Sml29623 		statsp->stat_tbl_perr = zcp_kstatsp->stat_tbl_perr.value.ul;
10053859Sml29623 		statsp->dyn_tbl_perr = zcp_kstatsp->dyn_tbl_perr.value.ul;
10063859Sml29623 		statsp->buf_tbl_perr = zcp_kstatsp->buf_tbl_perr.value.ul;
10073859Sml29623 		statsp->tt_program_err = zcp_kstatsp->tt_program_err.value.ul;
10083859Sml29623 		statsp->rsp_tt_index_err =
10096946Smisaki 		    zcp_kstatsp->rsp_tt_index_err.value.ul;
10103859Sml29623 		statsp->slv_tt_index_err =
10116946Smisaki 		    zcp_kstatsp->slv_tt_index_err.value.ul;
10123859Sml29623 		statsp->zcp_tt_index_err =
10136946Smisaki 		    zcp_kstatsp->zcp_tt_index_err.value.ul;
10143859Sml29623 		statsp->cfifo_ecc = zcp_kstatsp->cfifo_ecc.value.ul;
10153859Sml29623 	} else {
10163859Sml29623 		zcp_kstatsp->rrfifo_underrun.value.ul = statsp->rrfifo_underrun;
10173859Sml29623 		zcp_kstatsp->rrfifo_overrun.value.ul = statsp->rrfifo_overrun;
10183859Sml29623 		zcp_kstatsp->rspfifo_uncorr_err.value.ul =
10196946Smisaki 		    statsp->rspfifo_uncorr_err;
10203859Sml29623 		zcp_kstatsp->buffer_overflow.value.ul =
10216946Smisaki 		    statsp->buffer_overflow;
10223859Sml29623 		zcp_kstatsp->stat_tbl_perr.value.ul = statsp->stat_tbl_perr;
10233859Sml29623 		zcp_kstatsp->dyn_tbl_perr.value.ul = statsp->dyn_tbl_perr;
10243859Sml29623 		zcp_kstatsp->buf_tbl_perr.value.ul = statsp->buf_tbl_perr;
10253859Sml29623 		zcp_kstatsp->tt_program_err.value.ul = statsp->tt_program_err;
10263859Sml29623 		zcp_kstatsp->rsp_tt_index_err.value.ul =
10276946Smisaki 		    statsp->rsp_tt_index_err;
10283859Sml29623 		zcp_kstatsp->slv_tt_index_err.value.ul =
10296946Smisaki 		    statsp->slv_tt_index_err;
10303859Sml29623 		zcp_kstatsp->zcp_tt_index_err.value.ul =
10316946Smisaki 		    statsp->zcp_tt_index_err;
10323859Sml29623 		zcp_kstatsp->cfifo_ecc.value.ul = statsp->cfifo_ecc;
10333859Sml29623 	}
10343859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_zcp_stat_update"));
10353859Sml29623 	return (0);
10363859Sml29623 }
10373859Sml29623 
10383859Sml29623 /* ARGSUSED */
10393859Sml29623 int
nxge_fflp_stat_update(kstat_t * ksp,int rw)10403859Sml29623 nxge_fflp_stat_update(kstat_t *ksp, int rw)
10413859Sml29623 {
10423859Sml29623 	p_nxge_t nxgep;
10433859Sml29623 	p_nxge_fflp_kstat_t fflp_kstatsp;
10443859Sml29623 	p_nxge_fflp_stats_t statsp;
10453859Sml29623 	int ldc_grp;
10463859Sml29623 
10473859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
10483859Sml29623 	if (nxgep == NULL)
10493859Sml29623 		return (-1);
10503859Sml29623 
10513859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_fflp_stat_update"));
10523859Sml29623 
10533859Sml29623 	fflp_kstatsp = (p_nxge_fflp_kstat_t)ksp->ks_data;
10543859Sml29623 	statsp = (p_nxge_fflp_stats_t)&nxgep->statsp->fflp_stats;
10553859Sml29623 
10563859Sml29623 	if (rw == KSTAT_WRITE) {
10573859Sml29623 		statsp->tcam_parity_err = fflp_kstatsp->fflp_tcam_perr.value.ul;
10583859Sml29623 		statsp->tcam_ecc_err = fflp_kstatsp->fflp_tcam_ecc_err.value.ul;
10593859Sml29623 		statsp->vlan_parity_err = fflp_kstatsp->fflp_vlan_perr.value.ul;
10603859Sml29623 		statsp->hash_lookup_err =
10616946Smisaki 		    fflp_kstatsp->fflp_hasht_lookup_err.value.ul;
10623859Sml29623 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
10633859Sml29623 			statsp->hash_pio_err[ldc_grp] =
10646946Smisaki 			    fflp_kstatsp->fflp_hasht_data_err[ldc_grp].
10656946Smisaki 			    value.ul;
10663859Sml29623 		}
10673859Sml29623 	} else {
10683859Sml29623 		fflp_kstatsp->fflp_tcam_perr.value.ul =
10696946Smisaki 		    fflp_kstatsp->fflp_tcam_perr.value.ul;
10703859Sml29623 		fflp_kstatsp->fflp_tcam_ecc_err.value.ul = statsp->tcam_ecc_err;
10713859Sml29623 		fflp_kstatsp->fflp_vlan_perr.value.ul = statsp->vlan_parity_err;
10723859Sml29623 		fflp_kstatsp->fflp_hasht_lookup_err.value.ul =
10736946Smisaki 		    statsp->hash_lookup_err;
10743859Sml29623 		for (ldc_grp = 0; ldc_grp < MAX_PARTITION; ldc_grp++) {
10753859Sml29623 			fflp_kstatsp->fflp_hasht_data_err[ldc_grp].value.ul =
10766946Smisaki 			    statsp->hash_pio_err[ldc_grp];
10773859Sml29623 		}
10783859Sml29623 	}
10793859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_fflp_stat_update"));
10803859Sml29623 	return (0);
10813859Sml29623 }
10823859Sml29623 
10833859Sml29623 /* ARGSUSED */
10843859Sml29623 static uint64_t
nxge_mac_octet_to_u64(struct ether_addr addr)10853859Sml29623 nxge_mac_octet_to_u64(struct ether_addr addr)
10863859Sml29623 {
10873859Sml29623 	int i;
10883859Sml29623 	uint64_t addr64 = 0;
10893859Sml29623 
10903859Sml29623 	for (i = ETHERADDRL - 1; i >= 0; i--) {
10913859Sml29623 		addr64 <<= 8;
10923859Sml29623 		addr64 |= addr.ether_addr_octet[i];
10933859Sml29623 	}
10943859Sml29623 	return (addr64);
10953859Sml29623 }
10963859Sml29623 
10973859Sml29623 /* ARGSUSED */
10983859Sml29623 int
nxge_mmac_stat_update(kstat_t * ksp,int rw)10993859Sml29623 nxge_mmac_stat_update(kstat_t *ksp, int rw)
11003859Sml29623 {
11013859Sml29623 	p_nxge_t nxgep;
11023859Sml29623 	p_nxge_mmac_kstat_t mmac_kstatsp;
11033859Sml29623 	p_nxge_mmac_stats_t statsp;
11043859Sml29623 
11053859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
11063859Sml29623 	if (nxgep == NULL)
11073859Sml29623 		return (-1);
11083859Sml29623 
11093859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_mmac_stat_update"));
11103859Sml29623 
11113859Sml29623 	mmac_kstatsp = (p_nxge_mmac_kstat_t)ksp->ks_data;
11123859Sml29623 	statsp = (p_nxge_mmac_stats_t)&nxgep->statsp->mmac_stats;
11133859Sml29623 
11143859Sml29623 	if (rw == KSTAT_WRITE) {
11153859Sml29623 		cmn_err(CE_WARN, "Can not write mmac stats");
11163859Sml29623 	} else {
11173859Sml29623 		mmac_kstatsp->mmac_max_addr_cnt.value.ul =
11186946Smisaki 		    statsp->mmac_max_cnt;
11193859Sml29623 		mmac_kstatsp->mmac_avail_addr_cnt.value.ul =
11206946Smisaki 		    statsp->mmac_avail_cnt;
11213859Sml29623 		mmac_kstatsp->mmac_addr1.value.ul =
11226946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[0]);
11233859Sml29623 		mmac_kstatsp->mmac_addr2.value.ul =
11246946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[1]);
11253859Sml29623 		mmac_kstatsp->mmac_addr3.value.ul =
11266946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[2]);
11273859Sml29623 		mmac_kstatsp->mmac_addr4.value.ul =
11286946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[3]);
11293859Sml29623 		mmac_kstatsp->mmac_addr5.value.ul =
11306946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[4]);
11313859Sml29623 		mmac_kstatsp->mmac_addr6.value.ul =
11326946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[5]);
11333859Sml29623 		mmac_kstatsp->mmac_addr7.value.ul =
11346946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[6]);
11353859Sml29623 		mmac_kstatsp->mmac_addr8.value.ul =
11366946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[7]);
11373859Sml29623 		mmac_kstatsp->mmac_addr9.value.ul =
11386946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[8]);
11393859Sml29623 		mmac_kstatsp->mmac_addr10.value.ul =
11406946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[9]);
11413859Sml29623 		mmac_kstatsp->mmac_addr11.value.ul =
11426946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[10]);
11433859Sml29623 		mmac_kstatsp->mmac_addr12.value.ul =
11446946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[11]);
11453859Sml29623 		mmac_kstatsp->mmac_addr13.value.ul =
11466946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[12]);
11473859Sml29623 		mmac_kstatsp->mmac_addr14.value.ul =
11486946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[13]);
11493859Sml29623 		mmac_kstatsp->mmac_addr15.value.ul =
11506946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[14]);
11513859Sml29623 		mmac_kstatsp->mmac_addr16.value.ul =
11526946Smisaki 		    nxge_mac_octet_to_u64(statsp->mmac_avail_pool[15]);
11533859Sml29623 	}
11543859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_mmac_stat_update"));
11553859Sml29623 	return (0);
11563859Sml29623 }
11573859Sml29623 
11583859Sml29623 /* ARGSUSED */
11593859Sml29623 static kstat_t *
nxge_setup_local_kstat(p_nxge_t nxgep,int instance,char * name,const nxge_kstat_index_t * ksip,size_t count,int (* update)(kstat_t *,int))11603859Sml29623 nxge_setup_local_kstat(p_nxge_t nxgep, int instance, char *name,
11613859Sml29623 	const nxge_kstat_index_t *ksip, size_t count,
11623859Sml29623 	int (*update) (kstat_t *, int))
11633859Sml29623 {
11643859Sml29623 	kstat_t *ksp;
11653859Sml29623 	kstat_named_t *knp;
11663859Sml29623 	int i;
11673859Sml29623 
11683859Sml29623 	ksp = kstat_create(NXGE_DRIVER_NAME, instance, name, "net",
11696946Smisaki 	    KSTAT_TYPE_NAMED, count, 0);
11703859Sml29623 	if (ksp == NULL)
11713859Sml29623 		return (NULL);
11723859Sml29623 
11733859Sml29623 	ksp->ks_private = (void *)nxgep;
11743859Sml29623 	ksp->ks_update = update;
11753859Sml29623 	knp = ksp->ks_data;
11763859Sml29623 
11773859Sml29623 	for (i = 0; ksip[i].name != NULL; i++) {
11783859Sml29623 		kstat_named_init(&knp[i], ksip[i].name, ksip[i].type);
11793859Sml29623 	}
11803859Sml29623 
11813859Sml29623 	kstat_install(ksp);
11823859Sml29623 	return (ksp);
11833859Sml29623 }
11843859Sml29623 
11853859Sml29623 /* ARGSUSED */
11863859Sml29623 void
nxge_setup_rdc_kstats(p_nxge_t nxgep,int channel)11876495Sspeer nxge_setup_rdc_kstats(p_nxge_t nxgep, int channel)
11886495Sspeer {
11896495Sspeer 	char stat_name[64];
11906495Sspeer 
11916495Sspeer 	/* Setup RDC statistics */
11926495Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
11936495Sspeer 	    RDC_NAME_FORMAT1, channel);
11946495Sspeer 	nxgep->statsp->rdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
11956495Sspeer 	    nxgep->instance,
11966495Sspeer 	    stat_name,
11976495Sspeer 	    nxge_rdc_stats,
11986495Sspeer 	    RDC_STAT_END,
11996495Sspeer 	    nxge_rdc_stat_update);
12006495Sspeer #ifdef	NXGE_DEBUG_ERROR
12016495Sspeer 	if (nxgep->statsp->rdc_ksp[channel] == NULL)
12026495Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
12036946Smisaki 		    "kstat_create failed for rdc channel %d", channel));
12046495Sspeer #endif
12056495Sspeer }
12066495Sspeer 
12076495Sspeer void
nxge_setup_tdc_kstats(p_nxge_t nxgep,int channel)12086495Sspeer nxge_setup_tdc_kstats(p_nxge_t nxgep, int channel)
12096495Sspeer {
12106495Sspeer 	char stat_name[64];
12116495Sspeer 
12126495Sspeer 	/* Setup TDC statistics */
12136495Sspeer 	(void) sprintf(stat_name, "%s" CH_NAME_FORMAT,
12146495Sspeer 	    TDC_NAME_FORMAT1, channel);
12156495Sspeer 	nxgep->statsp->tdc_ksp[channel] = nxge_setup_local_kstat(nxgep,
12166495Sspeer 	    nxgep->instance,
12176495Sspeer 	    stat_name,
12186495Sspeer 	    nxge_tdc_stats,
12196495Sspeer 	    TDC_STAT_END,
12206495Sspeer 	    nxge_tdc_stat_update);
12216495Sspeer #ifdef	NXGE_DEBUG_ERROR
12226495Sspeer 	if (nxgep->statsp->tdc_ksp[channel] == NULL) {
12236495Sspeer 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
12246946Smisaki 		    "kstat_create failed for tdc channel %d", channel));
12256495Sspeer 	}
12266495Sspeer #endif
12276495Sspeer }
12286495Sspeer 
12296495Sspeer void
nxge_setup_kstats(p_nxge_t nxgep)12303859Sml29623 nxge_setup_kstats(p_nxge_t nxgep)
12313859Sml29623 {
12323859Sml29623 	struct kstat *ksp;
12333859Sml29623 	p_nxge_port_kstat_t nxgekp;
12343859Sml29623 	size_t nxge_kstat_sz;
12353859Sml29623 	char mmac_name[64];
12363859Sml29623 
12373859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_setup_kstats"));
12383859Sml29623 
12393859Sml29623 	/* Setup RDC System statistics */
12403859Sml29623 	nxgep->statsp->rdc_sys_ksp = nxge_setup_local_kstat(nxgep,
12416946Smisaki 	    nxgep->instance,
12426946Smisaki 	    "RDC System Stats",
12436946Smisaki 	    &nxge_rdc_sys_stats[0],
12446946Smisaki 	    RDC_SYS_STAT_END,
12456946Smisaki 	    nxge_rdc_sys_stat_update);
12463859Sml29623 
12473859Sml29623 	/* Setup IPP statistics */
12483859Sml29623 	nxgep->statsp->ipp_ksp = nxge_setup_local_kstat(nxgep,
12496946Smisaki 	    nxgep->instance,
12506946Smisaki 	    "IPP Stats",
12516946Smisaki 	    &nxge_ipp_stats[0],
12526946Smisaki 	    IPP_STAT_END,
12536946Smisaki 	    nxge_ipp_stat_update);
12543859Sml29623 #ifdef	NXGE_DEBUG_ERROR
12553859Sml29623 	if (nxgep->istatsp->pp_ksp == NULL)
12563859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for ipp"));
12573859Sml29623 #endif
12583859Sml29623 
12593859Sml29623 	/* Setup TXC statistics */
12603859Sml29623 	nxgep->statsp->txc_ksp = nxge_setup_local_kstat(nxgep,
12616946Smisaki 	    nxgep->instance, "TXC Stats", &nxge_txc_stats[0],
12626946Smisaki 	    TXC_STAT_END, nxge_txc_stat_update);
12633859Sml29623 #ifdef	NXGE_DEBUG_ERROR
12643859Sml29623 	if (nxgep->statsp->txc_ksp == NULL)
12653859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for txc"));
12663859Sml29623 #endif
12673859Sml29623 
12683859Sml29623 	/* Setup ZCP statistics */
12693859Sml29623 	nxgep->statsp->zcp_ksp = nxge_setup_local_kstat(nxgep,
12706946Smisaki 	    nxgep->instance, "ZCP Stats", &nxge_zcp_stats[0],
12716946Smisaki 	    ZCP_STAT_END, nxge_zcp_stat_update);
12723859Sml29623 #ifdef	NXGE_DEBUG_ERROR
12733859Sml29623 	if (nxgep->statsp->zcp_ksp == NULL)
12743859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed for zcp"));
12753859Sml29623 #endif
12763859Sml29623 
12773859Sml29623 	/* Setup FFLP statistics */
12783859Sml29623 	nxgep->statsp->fflp_ksp[0] = nxge_setup_local_kstat(nxgep,
12796946Smisaki 	    nxgep->instance, "FFLP Stats", &nxge_fflp_stats[0],
12806946Smisaki 	    FFLP_STAT_END, nxge_fflp_stat_update);
12813859Sml29623 
12823859Sml29623 #ifdef	NXGE_DEBUG_ERROR
12833859Sml29623 	if (nxgep->statsp->fflp_ksp == NULL)
12843859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL,
12856946Smisaki 		    "kstat_create failed for fflp"));
12863859Sml29623 #endif
12873859Sml29623 
12883859Sml29623 	(void) sprintf(mmac_name, "MMAC Stats%d", nxgep->instance);
12893859Sml29623 	nxgep->statsp->mmac_ksp = nxge_setup_local_kstat(nxgep,
12906946Smisaki 	    nxgep->instance, "MMAC Stats", &nxge_mmac_stats[0],
12916946Smisaki 	    MMAC_STATS_END, nxge_mmac_stat_update);
12923859Sml29623 
12933859Sml29623 	nxge_kstat_sz = sizeof (nxge_port_kstat_t) +
12946946Smisaki 	    sizeof (nxge_mac_kstat_t) - sizeof (kstat_named_t);
12953859Sml29623 
12963859Sml29623 	if ((ksp = kstat_create(NXGE_DRIVER_NAME, nxgep->instance,
12976946Smisaki 	    "Port Stats", "net", KSTAT_TYPE_NAMED,
12986946Smisaki 	    nxge_kstat_sz / sizeof (kstat_named_t), 0)) == NULL) {
12993859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "kstat_create failed"));
13003859Sml29623 		NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
13013859Sml29623 		return;
13023859Sml29623 	}
13033859Sml29623 
13043859Sml29623 	/*
13053859Sml29623 	 * kstats
13063859Sml29623 	 */
13073859Sml29623 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
13083859Sml29623 
13093859Sml29623 	/*
13103859Sml29623 	 * transceiver state informations.
13113859Sml29623 	 */
13123859Sml29623 	kstat_named_init(&nxgekp->xcvr_inits, "xcvr_inits",
13136946Smisaki 	    KSTAT_DATA_ULONG);
13143859Sml29623 	kstat_named_init(&nxgekp->xcvr_inuse, "xcvr_inuse",
13156946Smisaki 	    KSTAT_DATA_ULONG);
13163859Sml29623 	kstat_named_init(&nxgekp->xcvr_addr, "xcvr_addr",
13176946Smisaki 	    KSTAT_DATA_ULONG);
13183859Sml29623 	kstat_named_init(&nxgekp->xcvr_id, "xcvr_id",
13196946Smisaki 	    KSTAT_DATA_ULONG);
13203859Sml29623 	kstat_named_init(&nxgekp->cap_autoneg, "cap_autoneg",
13216946Smisaki 	    KSTAT_DATA_ULONG);
13223859Sml29623 	kstat_named_init(&nxgekp->cap_10gfdx, "cap_10gfdx",
13236946Smisaki 	    KSTAT_DATA_ULONG);
13243859Sml29623 	kstat_named_init(&nxgekp->cap_10ghdx, "cap_10ghdx",
13256946Smisaki 	    KSTAT_DATA_ULONG);
13263859Sml29623 	kstat_named_init(&nxgekp->cap_1000fdx, "cap_1000fdx",
13276946Smisaki 	    KSTAT_DATA_ULONG);
13283859Sml29623 	kstat_named_init(&nxgekp->cap_1000hdx, "cap_1000hdx",
13296946Smisaki 	    KSTAT_DATA_ULONG);
13303859Sml29623 	kstat_named_init(&nxgekp->cap_100T4, "cap_100T4",
13316946Smisaki 	    KSTAT_DATA_ULONG);
13323859Sml29623 	kstat_named_init(&nxgekp->cap_100fdx, "cap_100fdx",
13336946Smisaki 	    KSTAT_DATA_ULONG);
13343859Sml29623 	kstat_named_init(&nxgekp->cap_100hdx, "cap_100hdx",
13356946Smisaki 	    KSTAT_DATA_ULONG);
13363859Sml29623 	kstat_named_init(&nxgekp->cap_10fdx, "cap_10fdx",
13376946Smisaki 	    KSTAT_DATA_ULONG);
13383859Sml29623 	kstat_named_init(&nxgekp->cap_10hdx, "cap_10hdx",
13396946Smisaki 	    KSTAT_DATA_ULONG);
13403859Sml29623 	kstat_named_init(&nxgekp->cap_asmpause, "cap_asmpause",
13416946Smisaki 	    KSTAT_DATA_ULONG);
13423859Sml29623 	kstat_named_init(&nxgekp->cap_pause, "cap_pause",
13436946Smisaki 	    KSTAT_DATA_ULONG);
13443859Sml29623 
13453859Sml29623 	/*
13463859Sml29623 	 * Link partner capabilities.
13473859Sml29623 	 */
13483859Sml29623 	kstat_named_init(&nxgekp->lp_cap_autoneg, "lp_cap_autoneg",
13496946Smisaki 	    KSTAT_DATA_ULONG);
13503859Sml29623 	kstat_named_init(&nxgekp->lp_cap_10gfdx, "lp_cap_10gfdx",
13516946Smisaki 	    KSTAT_DATA_ULONG);
13523859Sml29623 	kstat_named_init(&nxgekp->lp_cap_10ghdx, "lp_cap_10ghdx",
13536946Smisaki 	    KSTAT_DATA_ULONG);
13543859Sml29623 	kstat_named_init(&nxgekp->lp_cap_1000fdx, "lp_cap_1000fdx",
13556946Smisaki 	    KSTAT_DATA_ULONG);
13563859Sml29623 	kstat_named_init(&nxgekp->lp_cap_1000hdx, "lp_cap_1000hdx",
13576946Smisaki 	    KSTAT_DATA_ULONG);
13583859Sml29623 	kstat_named_init(&nxgekp->lp_cap_100T4, "lp_cap_100T4",
13596946Smisaki 	    KSTAT_DATA_ULONG);
13603859Sml29623 	kstat_named_init(&nxgekp->lp_cap_100fdx, "lp_cap_100fdx",
13616946Smisaki 	    KSTAT_DATA_ULONG);
13623859Sml29623 	kstat_named_init(&nxgekp->lp_cap_100hdx, "lp_cap_100hdx",
13636946Smisaki 	    KSTAT_DATA_ULONG);
13643859Sml29623 	kstat_named_init(&nxgekp->lp_cap_10fdx, "lp_cap_10fdx",
13656946Smisaki 	    KSTAT_DATA_ULONG);
13663859Sml29623 	kstat_named_init(&nxgekp->lp_cap_10hdx, "lp_cap_10hdx",
13676946Smisaki 	    KSTAT_DATA_ULONG);
13683859Sml29623 	kstat_named_init(&nxgekp->lp_cap_asmpause, "lp_cap_asmpause",
13696946Smisaki 	    KSTAT_DATA_ULONG);
13703859Sml29623 	kstat_named_init(&nxgekp->lp_cap_pause, "lp_cap_pause",
13716946Smisaki 	    KSTAT_DATA_ULONG);
13723859Sml29623 	/*
13733859Sml29623 	 * Shared link setup.
13743859Sml29623 	 */
13753859Sml29623 	kstat_named_init(&nxgekp->link_T4, "link_T4",
13766946Smisaki 	    KSTAT_DATA_ULONG);
13773859Sml29623 	kstat_named_init(&nxgekp->link_speed, "link_speed",
13786946Smisaki 	    KSTAT_DATA_ULONG);
13793859Sml29623 	kstat_named_init(&nxgekp->link_duplex, "link_duplex",
13806946Smisaki 	    KSTAT_DATA_CHAR);
13813859Sml29623 	kstat_named_init(&nxgekp->link_asmpause, "link_asmpause",
13826946Smisaki 	    KSTAT_DATA_ULONG);
13833859Sml29623 	kstat_named_init(&nxgekp->link_pause, "link_pause",
13846946Smisaki 	    KSTAT_DATA_ULONG);
13853859Sml29623 	kstat_named_init(&nxgekp->link_up, "link_up",
13866946Smisaki 	    KSTAT_DATA_ULONG);
13873859Sml29623 
13883859Sml29623 	/*
13893859Sml29623 	 * Let the user know the MTU currently in use by the physical MAC
13903859Sml29623 	 * port.
13913859Sml29623 	 */
13923859Sml29623 	kstat_named_init(&nxgekp->mac_mtu, "mac_mtu",
13936946Smisaki 	    KSTAT_DATA_ULONG);
13943859Sml29623 
13953859Sml29623 	/*
13963859Sml29623 	 * Loopback statistics.
13973859Sml29623 	 */
13983859Sml29623 	kstat_named_init(&nxgekp->lb_mode, "lb_mode",
13996946Smisaki 	    KSTAT_DATA_ULONG);
14003859Sml29623 
14013859Sml29623 	/*
14023859Sml29623 	 * This tells the user whether the driver is in QOS mode or not.
14033859Sml29623 	 */
14043859Sml29623 	kstat_named_init(&nxgekp->qos_mode, "qos_mode",
14056946Smisaki 	    KSTAT_DATA_ULONG);
14063859Sml29623 
14073859Sml29623 	/*
14083859Sml29623 	 * This tells whether the instance is trunked or not
14093859Sml29623 	 */
14103859Sml29623 	kstat_named_init(&nxgekp->trunk_mode, "trunk_mode",
14116946Smisaki 	    KSTAT_DATA_ULONG);
14123859Sml29623 
14133859Sml29623 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
14143859Sml29623 	kstat_named_init(&nxgekp->mdt_reqs, "mdt_reqs",
14156946Smisaki 	    KSTAT_DATA_ULONG);
14163859Sml29623 	kstat_named_init(&nxgekp->mdt_hdr_bufs, "mdt_hdr_bufs",
14176946Smisaki 	    KSTAT_DATA_ULONG);
14183859Sml29623 	kstat_named_init(&nxgekp->mdt_pld_bufs, "mdt_pld_bufs",
14196946Smisaki 	    KSTAT_DATA_ULONG);
14203859Sml29623 	kstat_named_init(&nxgekp->mdt_pkts, "mdt_pkts",
14216946Smisaki 	    KSTAT_DATA_ULONG);
14223859Sml29623 	kstat_named_init(&nxgekp->mdt_hdrs, "mdt_hdrs",
14236946Smisaki 	    KSTAT_DATA_ULONG);
14243859Sml29623 	kstat_named_init(&nxgekp->mdt_plds, "mdt_plds",
14256946Smisaki 	    KSTAT_DATA_ULONG);
14263859Sml29623 	kstat_named_init(&nxgekp->mdt_hdr_bind_fail, "mdt_hdr_bind_fail",
14276946Smisaki 	    KSTAT_DATA_ULONG);
14283859Sml29623 	kstat_named_init(&nxgekp->mdt_pld_bind_fail, "mdt_pld_bind_fail",
14296946Smisaki 	    KSTAT_DATA_ULONG);
14303859Sml29623 #endif
14316075Ssbehera #ifdef ACCEPT_JUMBO
14323859Sml29623 	kstat_named_init(&nxgekp->tx_jumbo_pkts, "tx_jumbo_pkts",
14336946Smisaki 	    KSTAT_DATA_ULONG);
14343859Sml29623 #endif
14353859Sml29623 
14363859Sml29623 	/*
14373859Sml29623 	 * Rx Statistics.
14383859Sml29623 	 */
14396075Ssbehera #ifdef ACCEPT_JUMBO
14403859Sml29623 	kstat_named_init(&nxgekp->rx_jumbo_pkts, "rx_jumbo_pkts",
14416946Smisaki 	    KSTAT_DATA_ULONG);
14423859Sml29623 #endif
14433859Sml29623 	/* General MAC statistics */
14443859Sml29623 	kstat_named_init(&nxgekp->ifspeed, "ifspeed",
14456946Smisaki 	    KSTAT_DATA_UINT64);
14463859Sml29623 	kstat_named_init(&nxgekp->promisc, "promisc",
14476946Smisaki 	    KSTAT_DATA_CHAR);
14483859Sml29623 	kstat_named_init(&nxgekp->rev_id, "rev_id",
14496946Smisaki 	    KSTAT_DATA_ULONG);
14503859Sml29623 
14513859Sml29623 	ksp->ks_update = nxge_port_kstat_update;
14523859Sml29623 	ksp->ks_private = (void *) nxgep;
14533859Sml29623 	if (nxgep->mac.porttype == PORT_TYPE_XMAC)
14543859Sml29623 		nxge_xmac_init_kstats(ksp);
14553859Sml29623 	else
14563859Sml29623 		nxge_bmac_init_kstats(ksp);
14573859Sml29623 	kstat_install(ksp);
14583859Sml29623 	nxgep->statsp->port_ksp = ksp;
14593859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_setup_kstats"));
14603859Sml29623 }
14613859Sml29623 
14623859Sml29623 /* ARGSUSED */
14633859Sml29623 void
nxge_xmac_init_kstats(struct kstat * ksp)14643859Sml29623 nxge_xmac_init_kstats(struct kstat *ksp)
14653859Sml29623 {
14663859Sml29623 	p_nxge_xmac_kstat_t nxgekp;
14673859Sml29623 
14683859Sml29623 	nxgekp = (p_nxge_xmac_kstat_t)ksp->ks_data;
14693859Sml29623 
14703859Sml29623 	/*
14713859Sml29623 	 * Transmit MAC statistics.
14723859Sml29623 	 */
14733859Sml29623 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
14746946Smisaki 	    KSTAT_DATA_ULONG);
14753859Sml29623 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
14766946Smisaki 	    KSTAT_DATA_ULONG);
14773859Sml29623 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
14786946Smisaki 	    KSTAT_DATA_ULONG);
14793859Sml29623 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
14806946Smisaki 	    KSTAT_DATA_ULONG);
14813859Sml29623 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
14826946Smisaki 	    KSTAT_DATA_ULONG);
14833859Sml29623 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
14846946Smisaki 	    KSTAT_DATA_ULONG);
14853859Sml29623 
14863859Sml29623 	/* Receive MAC statistics */
14876075Ssbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
14886075Ssbehera 	    KSTAT_DATA_ULONG);
14893859Sml29623 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
14906946Smisaki 	    KSTAT_DATA_ULONG);
14913859Sml29623 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
14926946Smisaki 	    KSTAT_DATA_ULONG);
14933859Sml29623 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
14946946Smisaki 	    KSTAT_DATA_ULONG);
14953859Sml29623 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
14966946Smisaki 	    KSTAT_DATA_ULONG);
14973859Sml29623 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
14986946Smisaki 	    KSTAT_DATA_ULONG);
14993859Sml29623 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
15006946Smisaki 	    KSTAT_DATA_ULONG);
15013859Sml29623 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
15026946Smisaki 	    "rxmac_alignment_err",
15036946Smisaki 	    KSTAT_DATA_ULONG);
15043859Sml29623 	kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
15056946Smisaki 	    KSTAT_DATA_ULONG);
15063859Sml29623 	kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
15076946Smisaki 	    KSTAT_DATA_ULONG);
15083859Sml29623 	kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
15096946Smisaki 	    KSTAT_DATA_ULONG);
15103859Sml29623 	kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
15116946Smisaki 	    KSTAT_DATA_ULONG);
15123859Sml29623 	kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
15136946Smisaki 	    KSTAT_DATA_ULONG);
15143859Sml29623 	kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
15156946Smisaki 	    KSTAT_DATA_ULONG);
15166075Ssbehera 	kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
15176075Ssbehera 	    KSTAT_DATA_ULONG);
15183859Sml29623 	kstat_named_init(&nxgekp->rx_broadcast_cnt, "rxmac_broadcast_cnt",
15196946Smisaki 	    KSTAT_DATA_ULONG);
15203859Sml29623 	kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
15216946Smisaki 	    KSTAT_DATA_ULONG);
15223859Sml29623 	kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
15236946Smisaki 	    KSTAT_DATA_ULONG);
15243859Sml29623 	kstat_named_init(&nxgekp->rx_linkfault_err_cnt, "rxmac_linkfault_errs",
15256946Smisaki 	    KSTAT_DATA_ULONG);
15263859Sml29623 	kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
15276946Smisaki 	    "rxmac_remote_faults",
15286946Smisaki 	    KSTAT_DATA_ULONG);
15293859Sml29623 	kstat_named_init(&nxgekp->rx_local_fault_err_cnt, "rxmac_local_faults",
15306946Smisaki 	    KSTAT_DATA_ULONG);
15313859Sml29623 
15323859Sml29623 	/* XPCS statistics */
15333859Sml29623 
15343859Sml29623 	kstat_named_init(&nxgekp->xpcs_deskew_err_cnt, "xpcs_deskew_err_cnt",
15356946Smisaki 	    KSTAT_DATA_ULONG);
15363859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
15373859Sml29623 	kstat_named_init(&nxgekp->xpcs_ln0_symbol_err_cnt,
15386946Smisaki 	    "xpcs_ln0_symbol_err_cnt",
15396946Smisaki 	    KSTAT_DATA_ULONG);
15403859Sml29623 	kstat_named_init(&nxgekp->xpcs_ln1_symbol_err_cnt,
15416946Smisaki 	    "xpcs_ln1_symbol_err_cnt",
15426946Smisaki 	    KSTAT_DATA_ULONG);
15433859Sml29623 	kstat_named_init(&nxgekp->xpcs_ln2_symbol_err_cnt,
15446946Smisaki 	    "xpcs_ln2_symbol_err_cnt",
15456946Smisaki 	    KSTAT_DATA_ULONG);
15463859Sml29623 	kstat_named_init(&nxgekp->xpcs_ln3_symbol_err_cnt,
15476946Smisaki 	    "xpcs_ln3_symbol_err_cnt",
15486946Smisaki 	    KSTAT_DATA_ULONG);
15493859Sml29623 #endif
15503859Sml29623 }
15513859Sml29623 
15523859Sml29623 /* ARGSUSED */
15533859Sml29623 void
nxge_bmac_init_kstats(struct kstat * ksp)15543859Sml29623 nxge_bmac_init_kstats(struct kstat *ksp)
15553859Sml29623 {
15563859Sml29623 	p_nxge_bmac_kstat_t nxgekp;
15573859Sml29623 
15583859Sml29623 	nxgekp = (p_nxge_bmac_kstat_t)ksp->ks_data;
15593859Sml29623 
15603859Sml29623 	/*
15613859Sml29623 	 * Transmit MAC statistics.
15623859Sml29623 	 */
15633859Sml29623 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
15646946Smisaki 	    KSTAT_DATA_ULONG);
15653859Sml29623 	kstat_named_init(&nxgekp->tx_underrun_err, "txmac_underflow_err",
15666946Smisaki 	    KSTAT_DATA_ULONG);
15673859Sml29623 	kstat_named_init(&nxgekp->tx_max_pkt_err, "txmac_maxpktsize_err",
15686946Smisaki 	    KSTAT_DATA_ULONG);
15693859Sml29623 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
15706946Smisaki 	    KSTAT_DATA_ULONG);
15713859Sml29623 
15723859Sml29623 	/* Receive MAC statistics */
15733859Sml29623 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
15746946Smisaki 	    KSTAT_DATA_ULONG);
15753859Sml29623 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
15766946Smisaki 	    KSTAT_DATA_ULONG);
15773859Sml29623 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
15786946Smisaki 	    KSTAT_DATA_ULONG);
15793859Sml29623 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
15806946Smisaki 	    KSTAT_DATA_ULONG);
15813859Sml29623 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
15826946Smisaki 	    KSTAT_DATA_ULONG);
15833859Sml29623 	kstat_named_init(&nxgekp->rx_align_err_cnt, "rxmac_alignment_err",
15846946Smisaki 	    KSTAT_DATA_ULONG);
15853859Sml29623 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
15866946Smisaki 	    KSTAT_DATA_ULONG);
15873859Sml29623 }
15883859Sml29623 
15893859Sml29623 /* ARGSUSED */
15903859Sml29623 void
nxge_mac_init_kstats(p_nxge_t nxgep,struct kstat * ksp)15913859Sml29623 nxge_mac_init_kstats(p_nxge_t nxgep, struct kstat *ksp)
15923859Sml29623 {
15933859Sml29623 	p_nxge_mac_kstat_t nxgekp;
15943859Sml29623 
15953859Sml29623 	nxgekp = (p_nxge_mac_kstat_t)ksp->ks_data;
15963859Sml29623 
15973859Sml29623 	/*
15983859Sml29623 	 * Transmit MAC statistics.
15993859Sml29623 	 */
16003859Sml29623 	kstat_named_init(&nxgekp->tx_frame_cnt, "txmac_frame_cnt",
16016946Smisaki 	    KSTAT_DATA_ULONG);
16023859Sml29623 	kstat_named_init(&nxgekp->tx_underflow_err, "txmac_underflow_err",
16036946Smisaki 	    KSTAT_DATA_ULONG);
16043859Sml29623 	kstat_named_init(&nxgekp->tx_overflow_err, "txmac_overflow_err",
16056946Smisaki 	    KSTAT_DATA_ULONG);
16063859Sml29623 	kstat_named_init(&nxgekp->tx_maxpktsize_err, "txmac_maxpktsize_err",
16076946Smisaki 	    KSTAT_DATA_ULONG);
16083859Sml29623 	kstat_named_init(&nxgekp->tx_fifo_xfr_err, "txmac_fifo_xfr_err",
16096946Smisaki 	    KSTAT_DATA_ULONG);
16103859Sml29623 	kstat_named_init(&nxgekp->tx_byte_cnt, "txmac_byte_cnt",
16116946Smisaki 	    KSTAT_DATA_ULONG);
16123859Sml29623 
16133859Sml29623 	/*
16143859Sml29623 	 * Receive MAC statistics
16153859Sml29623 	 */
16163859Sml29623 	kstat_named_init(&nxgekp->rx_overflow_err, "rxmac_overflow_err",
16176946Smisaki 	    KSTAT_DATA_ULONG);
16183859Sml29623 	kstat_named_init(&nxgekp->rx_underflow_err, "rxmac_underflow_err",
16196946Smisaki 	    KSTAT_DATA_ULONG);
16203859Sml29623 	kstat_named_init(&nxgekp->rx_crc_err_cnt, "rxmac_crc_err",
16216946Smisaki 	    KSTAT_DATA_ULONG);
16223859Sml29623 	kstat_named_init(&nxgekp->rx_len_err_cnt, "rxmac_length_err",
16236946Smisaki 	    KSTAT_DATA_ULONG);
16243859Sml29623 	kstat_named_init(&nxgekp->rx_viol_err_cnt, "rxmac_code_violations",
16256946Smisaki 	    KSTAT_DATA_ULONG);
16263859Sml29623 	kstat_named_init(&nxgekp->rx_byte_cnt, "rxmac_byte_cnt",
16276946Smisaki 	    KSTAT_DATA_ULONG);
16283859Sml29623 	kstat_named_init(&nxgekp->rx_frame_align_err_cnt,
16296946Smisaki 	    "rxmac_alignment_err",
16306946Smisaki 	    KSTAT_DATA_ULONG);
16316075Ssbehera 	kstat_named_init(&nxgekp->rx_frame_cnt, "rxmac_frame_cnt",
16326075Ssbehera 	    KSTAT_DATA_ULONG);
16333859Sml29623 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
16343859Sml29623 		kstat_named_init(&nxgekp->rx_hist1_cnt, "rxmac_64_cnt",
16356946Smisaki 		    KSTAT_DATA_ULONG);
16363859Sml29623 		kstat_named_init(&nxgekp->rx_hist2_cnt, "rxmac_65_127_cnt",
16376946Smisaki 		    KSTAT_DATA_ULONG);
16383859Sml29623 		kstat_named_init(&nxgekp->rx_hist3_cnt, "rxmac_128_255_cnt",
16396946Smisaki 		    KSTAT_DATA_ULONG);
16403859Sml29623 		kstat_named_init(&nxgekp->rx_hist4_cnt, "rxmac_256_511_cnt",
16416946Smisaki 		    KSTAT_DATA_ULONG);
16423859Sml29623 		kstat_named_init(&nxgekp->rx_hist5_cnt, "rxmac_512_1023_cnt",
16436946Smisaki 		    KSTAT_DATA_ULONG);
16443859Sml29623 		kstat_named_init(&nxgekp->rx_hist6_cnt, "rxmac_1024_1522_cnt",
16456946Smisaki 		    KSTAT_DATA_ULONG);
16466075Ssbehera 		kstat_named_init(&nxgekp->rx_hist7_cnt, "rxmac_jumbo_cnt",
16476075Ssbehera 		    KSTAT_DATA_ULONG);
16483859Sml29623 		kstat_named_init(&nxgekp->rx_broadcast_cnt,
16496946Smisaki 		    "rxmac_broadcast_cnt",
16506946Smisaki 		    KSTAT_DATA_ULONG);
16513859Sml29623 		kstat_named_init(&nxgekp->rx_mult_cnt, "rxmac_multicast_cnt",
16526946Smisaki 		    KSTAT_DATA_ULONG);
16533859Sml29623 		kstat_named_init(&nxgekp->rx_frag_cnt, "rxmac_fragment_cnt",
16546946Smisaki 		    KSTAT_DATA_ULONG);
16553859Sml29623 		kstat_named_init(&nxgekp->rx_linkfault_err_cnt,
16566946Smisaki 		    "rxmac_linkfault_errs",
16576946Smisaki 		    KSTAT_DATA_ULONG);
16583859Sml29623 		kstat_named_init(&nxgekp->rx_remote_fault_err_cnt,
16596946Smisaki 		    "rxmac_remote_faults",
16606946Smisaki 		    KSTAT_DATA_ULONG);
16613859Sml29623 		kstat_named_init(&nxgekp->rx_local_fault_err_cnt,
16626946Smisaki 		    "rxmac_local_faults",
16636946Smisaki 		    KSTAT_DATA_ULONG);
16643859Sml29623 	}
16653859Sml29623 }
16663859Sml29623 
16673859Sml29623 /* ARGSUSED */
16683859Sml29623 void
nxge_destroy_kstats(p_nxge_t nxgep)16693859Sml29623 nxge_destroy_kstats(p_nxge_t nxgep)
16703859Sml29623 {
16713859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_destroy_kstats"));
16723859Sml29623 
16733859Sml29623 	if (nxgep->statsp == NULL)
16743859Sml29623 		return;
16753859Sml29623 	if (nxgep->statsp->ksp)
16763859Sml29623 		kstat_delete(nxgep->statsp->ksp);
16773859Sml29623 
16783859Sml29623 	if (nxgep->statsp->rdc_sys_ksp)
16793859Sml29623 		kstat_delete(nxgep->statsp->rdc_sys_ksp);
16803859Sml29623 	if (nxgep->statsp->fflp_ksp[0])
16813859Sml29623 		kstat_delete(nxgep->statsp->fflp_ksp[0]);
16823859Sml29623 	if (nxgep->statsp->ipp_ksp)
16833859Sml29623 		kstat_delete(nxgep->statsp->ipp_ksp);
16843859Sml29623 	if (nxgep->statsp->txc_ksp)
16853859Sml29623 		kstat_delete(nxgep->statsp->txc_ksp);
16863859Sml29623 	if (nxgep->statsp->mac_ksp)
16873859Sml29623 		kstat_delete(nxgep->statsp->mac_ksp);
16883859Sml29623 	if (nxgep->statsp->zcp_ksp)
16893859Sml29623 		kstat_delete(nxgep->statsp->zcp_ksp);
16903859Sml29623 	if (nxgep->statsp->port_ksp)
16913859Sml29623 		kstat_delete(nxgep->statsp->port_ksp);
16923859Sml29623 	if (nxgep->statsp->mmac_ksp)
16933859Sml29623 		kstat_delete(nxgep->statsp->mmac_ksp);
16943859Sml29623 	if (nxgep->statsp)
16953859Sml29623 		KMEM_FREE(nxgep->statsp, nxgep->statsp->stats_size);
16963859Sml29623 
16973859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_destroy_kstats"));
16983859Sml29623 }
16993859Sml29623 
17003859Sml29623 /* ARGSUSED */
17013859Sml29623 int
nxge_port_kstat_update(kstat_t * ksp,int rw)17023859Sml29623 nxge_port_kstat_update(kstat_t *ksp, int rw)
17033859Sml29623 {
17043859Sml29623 	p_nxge_t nxgep;
17053859Sml29623 	p_nxge_stats_t statsp;
17063859Sml29623 	p_nxge_port_kstat_t nxgekp;
17073859Sml29623 
17083859Sml29623 	nxgep = (p_nxge_t)ksp->ks_private;
17093859Sml29623 	if (nxgep == NULL)
17103859Sml29623 		return (-1);
17113859Sml29623 
17123859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_port_kstat_update"));
17133859Sml29623 	statsp = (p_nxge_stats_t)nxgep->statsp;
17143859Sml29623 	nxgekp = (p_nxge_port_kstat_t)ksp->ks_data;
17153859Sml29623 	nxge_save_cntrs(nxgep);
17163859Sml29623 
17173859Sml29623 	if (rw == KSTAT_WRITE) {
17183859Sml29623 		/*
17193859Sml29623 		 * transceiver state informations.
17203859Sml29623 		 */
17213859Sml29623 		statsp->mac_stats.xcvr_inits = nxgekp->xcvr_inits.value.ul;
17223859Sml29623 
17233859Sml29623 		/*
17243859Sml29623 		 * Tx Statistics.
17253859Sml29623 		 */
17263859Sml29623 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
17273859Sml29623 		statsp->port_stats.mdt_reqs = nxgekp->mdt_reqs.value.ul;
17283859Sml29623 		statsp->port_stats.mdt_hdr_bufs = nxgekp->mdt_hdr_bufs.value.ul;
17293859Sml29623 		statsp->port_stats.mdt_pld_bufs = nxgekp->mdt_pld_bufs.value.ul;
17303859Sml29623 		statsp->port_stats.mdt_pkts = nxgekp->mdt_pkts.value.ul;
17313859Sml29623 		statsp->port_stats.mdt_hdrs = nxgekp->mdt_hdrs.value.ul;
17323859Sml29623 		statsp->port_stats.mdt_plds = nxgekp->mdt_plds.value.ul;
17333859Sml29623 		statsp->port_stats.mdt_hdr_bind_fail =
17346946Smisaki 		    nxgekp->mdt_hdr_bind_fail.value.ul;
17353859Sml29623 		statsp->port_stats.mdt_pld_bind_fail =
17366946Smisaki 		    nxgekp->mdt_pld_bind_fail.value.ul;
17373859Sml29623 #endif
17383859Sml29623 #ifdef ACCEPT_JUMBO
17393859Sml29623 		statsp->port_stats.tx_jumbo_pkts =
17406946Smisaki 		    nxgekp->tx_jumbo_pkts.value.ul;
17413859Sml29623 #endif
17423859Sml29623 		/*
17433859Sml29623 		 * Rx Statistics.
17443859Sml29623 		 */
17456075Ssbehera #ifdef ACCEPT_JUMBO
17463859Sml29623 		statsp->port_stats.rx_jumbo_pkts =
17476946Smisaki 		    nxgekp->rx_jumbo_pkts.value.ul;
17483859Sml29623 #endif
17496075Ssbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
17506075Ssbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_WRITE);
17516075Ssbehera 		} else {
17526075Ssbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_WRITE);
17536075Ssbehera 		}
17543859Sml29623 		return (0);
17553859Sml29623 	} else {
17563859Sml29623 		if (nxgep->filter.all_phys_cnt)
17573859Sml29623 			(void) strcpy(nxgekp->promisc.value.c, "phys");
17583859Sml29623 		else if (nxgep->filter.all_multicast_cnt)
17593859Sml29623 			(void) strcpy(nxgekp->promisc.value.c, "multi");
17603859Sml29623 		else
17613859Sml29623 			(void) strcpy(nxgekp->promisc.value.c, "off");
17623859Sml29623 		nxgekp->ifspeed.value.ul =
17636946Smisaki 		    statsp->mac_stats.link_speed * 1000000ULL;
17643859Sml29623 		nxgekp->rev_id.value.ul = statsp->mac_stats.rev_id;
17653859Sml29623 
17663859Sml29623 		/*
17673859Sml29623 		 * transceiver state informations.
17683859Sml29623 		 */
17693859Sml29623 		nxgekp->xcvr_inits.value.ul = statsp->mac_stats.xcvr_inits;
17703859Sml29623 		nxgekp->xcvr_inuse.value.ul = statsp->mac_stats.xcvr_inuse;
17713859Sml29623 		nxgekp->xcvr_addr.value.ul = statsp->mac_stats.xcvr_portn;
17723859Sml29623 		nxgekp->xcvr_id.value.ul = statsp->mac_stats.xcvr_id;
17733859Sml29623 		nxgekp->cap_autoneg.value.ul = statsp->mac_stats.cap_autoneg;
17743859Sml29623 		nxgekp->cap_10gfdx.value.ul = statsp->mac_stats.cap_10gfdx;
17753859Sml29623 		nxgekp->cap_10ghdx.value.ul = statsp->mac_stats.cap_10ghdx;
17763859Sml29623 		nxgekp->cap_1000fdx.value.ul = statsp->mac_stats.cap_1000fdx;
17773859Sml29623 		nxgekp->cap_1000hdx.value.ul = statsp->mac_stats.cap_1000hdx;
17783859Sml29623 		nxgekp->cap_100T4.value.ul = statsp->mac_stats.cap_100T4;
17793859Sml29623 		nxgekp->cap_100fdx.value.ul = statsp->mac_stats.cap_100fdx;
17803859Sml29623 		nxgekp->cap_100hdx.value.ul = statsp->mac_stats.cap_100hdx;
17813859Sml29623 		nxgekp->cap_10fdx.value.ul = statsp->mac_stats.cap_10fdx;
17823859Sml29623 		nxgekp->cap_10hdx.value.ul = statsp->mac_stats.cap_10hdx;
17833859Sml29623 		nxgekp->cap_asmpause.value.ul =
17846946Smisaki 		    statsp->mac_stats.cap_asmpause;
17853859Sml29623 		nxgekp->cap_pause.value.ul = statsp->mac_stats.cap_pause;
17863859Sml29623 
17873859Sml29623 		/*
17883859Sml29623 		 * Link partner capabilities.
17893859Sml29623 		 */
17903859Sml29623 		nxgekp->lp_cap_autoneg.value.ul =
17916946Smisaki 		    statsp->mac_stats.lp_cap_autoneg;
17923859Sml29623 		nxgekp->lp_cap_10gfdx.value.ul =
17936946Smisaki 		    statsp->mac_stats.lp_cap_10gfdx;
17943859Sml29623 		nxgekp->lp_cap_10ghdx.value.ul =
17956946Smisaki 		    statsp->mac_stats.lp_cap_10ghdx;
17963859Sml29623 		nxgekp->lp_cap_1000fdx.value.ul =
17976946Smisaki 		    statsp->mac_stats.lp_cap_1000fdx;
17983859Sml29623 		nxgekp->lp_cap_1000hdx.value.ul =
17996946Smisaki 		    statsp->mac_stats.lp_cap_1000hdx;
18003859Sml29623 		nxgekp->lp_cap_100T4.value.ul =
18016946Smisaki 		    statsp->mac_stats.lp_cap_100T4;
18023859Sml29623 		nxgekp->lp_cap_100fdx.value.ul =
18036946Smisaki 		    statsp->mac_stats.lp_cap_100fdx;
18043859Sml29623 		nxgekp->lp_cap_100hdx.value.ul =
18056946Smisaki 		    statsp->mac_stats.lp_cap_100hdx;
18063859Sml29623 		nxgekp->lp_cap_10fdx.value.ul =
18076946Smisaki 		    statsp->mac_stats.lp_cap_10fdx;
18083859Sml29623 		nxgekp->lp_cap_10hdx.value.ul =
18096946Smisaki 		    statsp->mac_stats.lp_cap_10hdx;
18103859Sml29623 		nxgekp->lp_cap_asmpause.value.ul =
18116946Smisaki 		    statsp->mac_stats.lp_cap_asmpause;
18123859Sml29623 		nxgekp->lp_cap_pause.value.ul =
18136946Smisaki 		    statsp->mac_stats.lp_cap_pause;
18143859Sml29623 
18153859Sml29623 		/*
18163859Sml29623 		 * Physical link statistics.
18173859Sml29623 		 */
18183859Sml29623 		nxgekp->link_T4.value.ul = statsp->mac_stats.link_T4;
18193859Sml29623 		nxgekp->link_speed.value.ul = statsp->mac_stats.link_speed;
18203859Sml29623 		if (statsp->mac_stats.link_duplex == 2)
18213859Sml29623 			(void) strcpy(nxgekp->link_duplex.value.c, "full");
18223859Sml29623 		else if (statsp->mac_stats.link_duplex == 1)
18233859Sml29623 			(void) strcpy(nxgekp->link_duplex.value.c, "half");
18243859Sml29623 		else
18253859Sml29623 			(void) strcpy(nxgekp->link_duplex.value.c, "unknown");
18263859Sml29623 		nxgekp->link_asmpause.value.ul =
18276946Smisaki 		    statsp->mac_stats.link_asmpause;
18283859Sml29623 		nxgekp->link_pause.value.ul = statsp->mac_stats.link_pause;
18293859Sml29623 		nxgekp->link_up.value.ul = statsp->mac_stats.link_up;
18303859Sml29623 
18313859Sml29623 		/*
18323859Sml29623 		 * Lets the user know the MTU currently in use by the physical
18333859Sml29623 		 * MAC port.
18343859Sml29623 		 */
18353859Sml29623 		nxgekp->mac_mtu.value.ul = statsp->mac_stats.mac_mtu;
18363859Sml29623 
18373859Sml29623 		/*
18383859Sml29623 		 * Loopback statistics.
18393859Sml29623 		 */
18403859Sml29623 		nxgekp->lb_mode.value.ul = statsp->port_stats.lb_mode;
18413859Sml29623 
18423859Sml29623 		/*
18433859Sml29623 		 * This tells the user whether the driver is in QOS mode or
18443859Sml29623 		 * not.
18453859Sml29623 		 */
18463859Sml29623 		nxgekp->qos_mode.value.ul = statsp->port_stats.qos_mode;
18473859Sml29623 
18483859Sml29623 		/*
18493859Sml29623 		 * This tells whether the instance is trunked or not
18503859Sml29623 		 */
18513859Sml29623 		nxgekp->trunk_mode.value.ul = statsp->port_stats.trunk_mode;
18523859Sml29623 
18533859Sml29623 #if defined MULTI_DATA_TX || defined MULTI_DATA_TXV2
18543859Sml29623 		nxgekp->mdt_reqs.value.ul = statsp->port_stats.mdt_reqs;
18553859Sml29623 		nxgekp->mdt_hdr_bufs.value.ul =
18566946Smisaki 		    statsp->port_stats.mdt_hdr_bufs;
18573859Sml29623 		nxgekp->mdt_pld_bufs.value.ul =
18586946Smisaki 		    statsp->port_stats.mdt_pld_bufs;
18593859Sml29623 		nxgekp->mdt_pkts.value.ul = statsp->port_stats.mdt_pkts;
18603859Sml29623 		nxgekp->mdt_hdrs.value.ul = statsp->port_stats.mdt_hdrs;
18613859Sml29623 		nxgekp->mdt_plds.value.ul = statsp->port_stats.mdt_plds;
18623859Sml29623 		nxgekp->mdt_hdr_bind_fail.value.ul =
18636946Smisaki 		    statsp->port_stats.mdt_hdr_bind_fail;
18643859Sml29623 		nxgekp->mdt_pld_bind_fail.value.ul =
18656946Smisaki 		    statsp->port_stats.mdt_pld_bind_fail;
18663859Sml29623 #endif
18673859Sml29623 #ifdef ACCEPT_JUMBO
18683859Sml29623 		nxgekp->tx_jumbo_pkts.value.ul =
18696946Smisaki 		    statsp->port_stats.tx_jumbo_pkts;
18703859Sml29623 #endif
18713859Sml29623 #ifdef TX_MBLK_DEST
18723859Sml29623 		nxgekp->tx_1_desc.value.ul = statsp->port_stats.tx_1_desc;
18733859Sml29623 		nxgekp->tx_2_desc.value.ul = statsp->port_stats.tx_2_desc;
18743859Sml29623 		nxgekp->tx_3_desc.value.ul = statsp->port_stats.tx_3_desc;
18753859Sml29623 		nxgekp->tx_4_desc.value.ul = statsp->port_stats.tx_4_desc;
18763859Sml29623 		nxgekp->tx_5_desc.value.ul = statsp->port_stats.tx_5_desc;
18773859Sml29623 		nxgekp->tx_6_desc.value.ul = statsp->port_stats.tx_6_desc;
18783859Sml29623 		nxgekp->tx_7_desc.value.ul = statsp->port_stats.tx_7_desc;
18793859Sml29623 		nxgekp->tx_8_desc.value.ul = statsp->port_stats.tx_8_desc;
18803859Sml29623 		nxgekp->tx_max_desc.value.ul =
18816946Smisaki 		    statsp->port_stats.tx_max_desc;
18823859Sml29623 #endif
18833859Sml29623 		/*
18843859Sml29623 		 * Rx Statistics.
18853859Sml29623 		 */
18863859Sml29623 #ifdef ACCEPT_JUMBO
18873859Sml29623 		nxgekp->rx_jumbo_pkts.value.ul =
18886946Smisaki 		    statsp->port_stats.rx_jumbo_pkts;
18893859Sml29623 #endif
18906075Ssbehera 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
18916075Ssbehera 			(void) nxge_xmac_stat_update(ksp, KSTAT_READ);
18926075Ssbehera 		} else {
18936075Ssbehera 			(void) nxge_bmac_stat_update(ksp, KSTAT_READ);
18946075Ssbehera 		}
18953859Sml29623 	}
18963859Sml29623 
18973859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "<== nxge_port_kstat_update"));
18983859Sml29623 	return (0);
18993859Sml29623 }
19003859Sml29623 
19013859Sml29623 /*
19023859Sml29623  * if this is the first init do not bother to save the
19033859Sml29623  * counters.
19043859Sml29623  */
19053859Sml29623 /* ARGSUSED */
19063859Sml29623 void
nxge_save_cntrs(p_nxge_t nxgep)19073859Sml29623 nxge_save_cntrs(p_nxge_t nxgep)
19083859Sml29623 {
19093859Sml29623 	p_nxge_stats_t statsp;
19103859Sml29623 	uint64_t val;
19113859Sml29623 	npi_handle_t handle;
19123859Sml29623 	uint8_t portn;
19133859Sml29623 	uint8_t cnt8;
19143859Sml29623 	uint16_t cnt16;
19153859Sml29623 	uint32_t cnt32;
19163859Sml29623 
19173859Sml29623 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_save_cntrs"));
19183859Sml29623 
19193859Sml29623 	statsp = (p_nxge_stats_t)nxgep->statsp;
19203859Sml29623 	handle = nxgep->npi_handle;
19213859Sml29623 	portn = nxgep->mac.portnum;
19223859Sml29623 
19233859Sml29623 	MUTEX_ENTER(&nxgep->ouraddr_lock);
19243859Sml29623 
19253859Sml29623 	if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
19263859Sml29623 		/*
19273859Sml29623 		 * Transmit MAC statistics.
19283859Sml29623 		 */
19293859Sml29623 		XMAC_REG_RD(handle, portn, XTXMAC_FRM_CNT_REG, &val);
19303859Sml29623 		statsp->xmac_stats.tx_frame_cnt += (val & XTXMAC_FRM_CNT_MASK);
19313859Sml29623 		XMAC_REG_RD(handle, portn, XTXMAC_BYTE_CNT_REG, &val);
19323859Sml29623 		statsp->xmac_stats.tx_byte_cnt += (val & XTXMAC_BYTE_CNT_MASK);
19333859Sml29623 		/*
19343859Sml29623 		 * Receive XMAC statistics.
19353859Sml29623 		 */
19363859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_CRC_ER_CNT_REG, &val);
19373859Sml29623 		statsp->xmac_stats.rx_crc_err_cnt +=
19386946Smisaki 		    (val & XRXMAC_CRC_ER_CNT_MASK);
19396075Ssbehera 
19403859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_MPSZER_CNT_REG, &val);
19413859Sml29623 		statsp->xmac_stats.rx_len_err_cnt +=
19426946Smisaki 		    (val & XRXMAC_MPSZER_CNT_MASK);
19436075Ssbehera 
19443859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_CD_VIO_CNT_REG, &val);
19453859Sml29623 		statsp->xmac_stats.rx_viol_err_cnt +=
19466946Smisaki 		    (val & XRXMAC_CD_VIO_CNT_MASK);
19476075Ssbehera 
19483859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_BT_CNT_REG, &val);
19493859Sml29623 		statsp->xmac_stats.rx_byte_cnt += (val & XRXMAC_BT_CNT_MASK);
19506075Ssbehera 
19513859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT1_REG, &val);
19523859Sml29623 		statsp->xmac_stats.rx_hist1_cnt +=
19536946Smisaki 		    (val & XRXMAC_HIST_CNT1_MASK);
19546075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19556075Ssbehera 		    (val & XRXMAC_HIST_CNT1_MASK);
19566075Ssbehera 
19573859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT2_REG, &val);
19583859Sml29623 		statsp->xmac_stats.rx_hist2_cnt +=
19596946Smisaki 		    (val & XRXMAC_HIST_CNT2_MASK);
19606075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19616075Ssbehera 		    (val & XRXMAC_HIST_CNT2_MASK);
19626075Ssbehera 
19633859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT3_REG, &val);
19643859Sml29623 		statsp->xmac_stats.rx_hist3_cnt +=
19656946Smisaki 		    (val & XRXMAC_HIST_CNT3_MASK);
19666075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19676075Ssbehera 		    (val & XRXMAC_HIST_CNT3_MASK);
19686075Ssbehera 
19693859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT4_REG, &val);
19703859Sml29623 		statsp->xmac_stats.rx_hist4_cnt +=
19716946Smisaki 		    (val & XRXMAC_HIST_CNT4_MASK);
19726075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19736075Ssbehera 		    (val & XRXMAC_HIST_CNT4_MASK);
19746075Ssbehera 
19753859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT5_REG, &val);
19763859Sml29623 		statsp->xmac_stats.rx_hist5_cnt +=
19776946Smisaki 		    (val & XRXMAC_HIST_CNT5_MASK);
19786075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19796075Ssbehera 		    (val & XRXMAC_HIST_CNT5_MASK);
19806075Ssbehera 
19813859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT6_REG, &val);
19823859Sml29623 		statsp->xmac_stats.rx_hist6_cnt +=
19836946Smisaki 		    (val & XRXMAC_HIST_CNT6_MASK);
19846075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19856075Ssbehera 		    (val & XRXMAC_HIST_CNT6_MASK);
19866075Ssbehera 
19876075Ssbehera 		XMAC_REG_RD(handle, portn, XRXMAC_HIST_CNT7_REG, &val);
19886075Ssbehera 		statsp->xmac_stats.rx_hist7_cnt +=
19896075Ssbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
19906075Ssbehera 		statsp->xmac_stats.rx_frame_cnt +=
19916075Ssbehera 		    (val & XRXMAC_HIST_CNT7_MASK);
19926075Ssbehera 
19933859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_BC_FRM_CNT_REG, &val);
19943859Sml29623 		statsp->xmac_stats.rx_broadcast_cnt +=
19956946Smisaki 		    (val & XRXMAC_BC_FRM_CNT_MASK);
19966075Ssbehera 
19973859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_MC_FRM_CNT_REG, &val);
19983859Sml29623 		statsp->xmac_stats.rx_mult_cnt +=
19996946Smisaki 		    (val & XRXMAC_MC_FRM_CNT_MASK);
20006075Ssbehera 
20013859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_FRAG_CNT_REG, &val);
20023859Sml29623 		statsp->xmac_stats.rx_frag_cnt += (val & XRXMAC_FRAG_CNT_MASK);
20036075Ssbehera 
20043859Sml29623 		XMAC_REG_RD(handle, portn, XRXMAC_AL_ER_CNT_REG, &val);
20053859Sml29623 		statsp->xmac_stats.rx_frame_align_err_cnt +=
20066946Smisaki 		    (val & XRXMAC_AL_ER_CNT_MASK);
20076075Ssbehera 
20083859Sml29623 		XMAC_REG_RD(handle, portn, XMAC_LINK_FLT_CNT_REG, &val);
20093859Sml29623 		statsp->xmac_stats.rx_linkfault_err_cnt +=
20106946Smisaki 		    (val & XMAC_LINK_FLT_CNT_MASK);
20116075Ssbehera 
20123859Sml29623 		(void) npi_xmac_xpcs_read(handle, portn,
20136946Smisaki 		    XPCS_REG_DESCWERR_COUNTER, &cnt32);
20143859Sml29623 		statsp->xmac_stats.xpcs_deskew_err_cnt +=
20156946Smisaki 		    (val & XMAC_XPCS_DESKEW_ERR_CNT_MASK);
20166075Ssbehera 
20173859Sml29623 #ifdef	NXGE_DEBUG_SYMBOL_ERR
20183859Sml29623 		(void) npi_xmac_xpcs_read(handle, portn,
20196946Smisaki 		    XPCS_REG_SYMBOL_ERR_L0_1_COUNTER, &cnt32);
20203859Sml29623 		statsp->xmac_stats.xpcs_ln0_symbol_err_cnt +=
20216946Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L0_MASK);
20223859Sml29623 		statsp->xmac_stats.xpcs_ln1_symbol_err_cnt +=
20236946Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L1_MASK) >>
20246946Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L1_SHIFT);
20253859Sml29623 		(void) npi_xmac_xpcs_read(handle, portn,
20266946Smisaki 		    XPCS_REG_SYMBOL_ERR_L2_3_COUNTER, &cnt32);
20273859Sml29623 		statsp->xmac_stats.xpcs_ln2_symbol_err_cnt +=
20286946Smisaki 		    (cnt32 & XMAC_XPCS_SYM_ERR_CNT_L2_MASK);
20293859Sml29623 		statsp->xmac_stats.xpcs_ln3_symbol_err_cnt +=
20306946Smisaki 		    ((cnt32 & XMAC_XPCS_SYM_ERR_CNT_L3_MASK) >>
20316946Smisaki 		    XMAC_XPCS_SYM_ERR_CNT_L3_SHIFT);
20323859Sml29623 #endif
20333859Sml29623 	} else if (nxgep->mac.porttype == PORT_TYPE_BMAC) {
20343859Sml29623 		/*
20353859Sml29623 		 * Transmit MAC statistics.
20363859Sml29623 		 */
20373859Sml29623 		BMAC_REG_RD(handle, portn, BTXMAC_FRM_CNT_REG, &val);
20383859Sml29623 		statsp->bmac_stats.tx_frame_cnt += (val & BTXMAC_FRM_CNT_MASK);
20396075Ssbehera 		/* Clear register as it is not auto clear on read */
20406075Ssbehera 		BMAC_REG_WR(handle, portn, BTXMAC_FRM_CNT_REG, 0);
20416075Ssbehera 
20426075Ssbehera 		BMAC_REG_RD(handle, portn, BTXMAC_BYTE_CNT_REG, &val);
20433859Sml29623 		statsp->bmac_stats.tx_byte_cnt += (val & BTXMAC_BYTE_CNT_MASK);
20446075Ssbehera 		/* Clear register as it is not auto clear on read */
20456075Ssbehera 		BMAC_REG_WR(handle, portn, BTXMAC_BYTE_CNT_REG, 0);
20463859Sml29623 
20473859Sml29623 		/*
20483859Sml29623 		 * Receive MAC statistics.
20493859Sml29623 		 */
20506075Ssbehera 		BMAC_REG_RD(handle, portn, RXMAC_FRM_CNT_REG, &val);
20513859Sml29623 		statsp->bmac_stats.rx_frame_cnt += (val & RXMAC_FRM_CNT_MASK);
20526075Ssbehera 		/* Clear register as it is not auto clear on read */
20536075Ssbehera 		BMAC_REG_WR(handle, portn, RXMAC_FRM_CNT_REG, 0);
20546075Ssbehera 
20556075Ssbehera 		BMAC_REG_RD(handle, portn, BRXMAC_BYTE_CNT_REG, &val);
20563859Sml29623 		statsp->bmac_stats.rx_byte_cnt += (val & BRXMAC_BYTE_CNT_MASK);
20576075Ssbehera 		/* Clear register as it is not auto clear on read */
20586075Ssbehera 		BMAC_REG_WR(handle, portn, BRXMAC_BYTE_CNT_REG, 0);
20596075Ssbehera 
20606075Ssbehera 		BMAC_REG_RD(handle, portn, BMAC_AL_ER_CNT_REG, &val);
20613859Sml29623 		statsp->bmac_stats.rx_align_err_cnt +=
20626946Smisaki 		    (val & BMAC_AL_ER_CNT_MASK);
20636075Ssbehera 		/* Clear register as it is not auto clear on read */
20646075Ssbehera 		BMAC_REG_WR(handle, portn, BMAC_AL_ER_CNT_REG, 0);
20656075Ssbehera 
20666075Ssbehera 		BMAC_REG_RD(handle, portn, MAC_LEN_ER_CNT_REG, &val);
20673859Sml29623 		statsp->bmac_stats.rx_len_err_cnt +=
20686946Smisaki 		    (val & MAC_LEN_ER_CNT_MASK);
20696075Ssbehera 		/* Clear register as it is not auto clear on read */
20706075Ssbehera 		BMAC_REG_WR(handle, portn, MAC_LEN_ER_CNT_REG, 0);
20716075Ssbehera 
20726075Ssbehera 		BMAC_REG_RD(handle, portn, BMAC_CRC_ER_CNT_REG, &val);
20733859Sml29623 		statsp->bmac_stats.rx_crc_err_cnt +=
20746946Smisaki 		    (val & BMAC_CRC_ER_CNT_MASK);
20756075Ssbehera 		/* Clear register as it is not auto clear on read */
20766075Ssbehera 		BMAC_REG_WR(handle, portn, BMAC_CRC_ER_CNT_REG, 0);
20776075Ssbehera 
20786075Ssbehera 		BMAC_REG_RD(handle, portn, BMAC_CD_VIO_CNT_REG, &val);
20793859Sml29623 		statsp->bmac_stats.rx_viol_err_cnt +=
20806946Smisaki 		    (val & BMAC_CD_VIO_CNT_MASK);
20816075Ssbehera 		/* Clear register as it is not auto clear on read */
20826075Ssbehera 		BMAC_REG_WR(handle, portn, BMAC_CD_VIO_CNT_REG, 0);
20833859Sml29623 	}
20846495Sspeer 	if (isLDOMguest(nxgep)) {
20856495Sspeer 		MUTEX_EXIT(&nxgep->ouraddr_lock);
20866495Sspeer 		goto nxge_save_cntrs_exit;
20876495Sspeer 	}
20883859Sml29623 	/* Update IPP counters */
20893859Sml29623 	(void) npi_ipp_get_ecc_err_count(handle, portn, &cnt8);
20903859Sml29623 	statsp->ipp_stats.ecc_err_cnt += cnt8;
20913859Sml29623 	(void) npi_ipp_get_pkt_dis_count(handle, portn, &cnt16);
20923859Sml29623 	statsp->ipp_stats.pkt_dis_cnt += cnt16;
20933859Sml29623 	(void) npi_ipp_get_cs_err_count(handle, portn, &cnt16);
20943859Sml29623 	statsp->ipp_stats.bad_cs_cnt += cnt16;
20953859Sml29623 
20963859Sml29623 	MUTEX_EXIT(&nxgep->ouraddr_lock);
20973859Sml29623 
20983859Sml29623 nxge_save_cntrs_exit:
20993859Sml29623 	NXGE_DEBUG_MSG((nxgep, DDI_CTL, "<== nxge_save_cntrs"));
21003859Sml29623 }
21013859Sml29623 
21026495Sspeer uint64_t
nxge_m_rx_stat(nxge_t * nxgep,uint_t stat)21036495Sspeer nxge_m_rx_stat(
21046495Sspeer 	nxge_t *nxgep,
21056495Sspeer 	uint_t stat)
21066495Sspeer {
21076495Sspeer 	p_nxge_stats_t statsp;
21086495Sspeer 	nxge_grp_set_t *rx_set;
21096495Sspeer 	int8_t set[NXGE_MAX_RDCS];
21106495Sspeer 	int i, cursor;
21116495Sspeer 
21126495Sspeer 	uint64_t val = 0;
21136495Sspeer 
21146495Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_rx_stat"));
21156495Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
21166495Sspeer 
21176495Sspeer 	rx_set = &nxgep->rx_set;
21186495Sspeer 	for (i = 0, cursor = 0; i < NXGE_MAX_RDCS; i++) {
21196495Sspeer 		if ((1 << i) & rx_set->owned.map) {
21206495Sspeer 			set[cursor++] = (uint8_t)i;
21216495Sspeer 		}
21226495Sspeer 	}
21236495Sspeer 
21246495Sspeer 	for (i = 0; i < cursor; i++) {
21256495Sspeer 		int rdc = set[i];
21266495Sspeer 		switch (stat) {
21276495Sspeer 		case MAC_STAT_IERRORS:
21286495Sspeer 		case ETHER_STAT_MACRCV_ERRORS:
21296495Sspeer 			val += statsp->rdc_stats[rdc].ierrors;
21306495Sspeer 			break;
21316495Sspeer 
21326495Sspeer 		case MAC_STAT_RBYTES:
21336495Sspeer 			val += statsp->rdc_stats[rdc].ibytes;
21346495Sspeer 			break;
21356495Sspeer 
21366495Sspeer 		case MAC_STAT_IPACKETS:
21376495Sspeer 			val += statsp->rdc_stats[rdc].ipackets;
21386495Sspeer 			break;
21396495Sspeer 
21406495Sspeer 		default:
21416495Sspeer 			break;
21426495Sspeer 		}
21436495Sspeer 	}
21446495Sspeer 
21456495Sspeer 	return (val);
21466495Sspeer }
21476495Sspeer 
21486495Sspeer uint64_t
nxge_m_tx_stat(nxge_t * nxgep,uint_t stat)21496495Sspeer nxge_m_tx_stat(
21506495Sspeer 	nxge_t *nxgep,
21516495Sspeer 	uint_t stat)
21526495Sspeer {
21536495Sspeer 	p_nxge_stats_t statsp;
21546495Sspeer 	nxge_grp_set_t *tx_set;
21556495Sspeer 	int8_t set[NXGE_MAX_TDCS];
21566495Sspeer 	int i, cursor;
21576495Sspeer 
21586495Sspeer 	uint64_t val = 0;
21596495Sspeer 
21606495Sspeer 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_tx_stat"));
21616495Sspeer 	statsp = (p_nxge_stats_t)nxgep->statsp;
21626495Sspeer 
21636495Sspeer 	tx_set = &nxgep->tx_set;
21647126Sml29623 	for (i = 0, cursor = 0; i < NXGE_MAX_TDCS; i++) {
21656495Sspeer 		if ((1 << i) & tx_set->owned.map) {
21666495Sspeer 			set[cursor++] = (uint8_t)i;
21676495Sspeer 		}
21686495Sspeer 	}
21696495Sspeer 
21706495Sspeer 	for (i = 0; i < cursor; i++) {
21716495Sspeer 		int tdc = set[i];
21726495Sspeer 		switch (stat) {
21736495Sspeer 		case MAC_STAT_OERRORS:
21746495Sspeer 			val += statsp->tdc_stats[tdc].oerrors;
21756495Sspeer 			break;
21766495Sspeer 
21776495Sspeer 		case MAC_STAT_OBYTES:
21786495Sspeer 			val += statsp->tdc_stats[tdc].obytes;
21796495Sspeer 			break;
21806495Sspeer 
21816495Sspeer 		case MAC_STAT_OPACKETS:
21826495Sspeer 			val += statsp->tdc_stats[tdc].opackets;
21836495Sspeer 			break;
21846495Sspeer 
21856495Sspeer 		default:
21866495Sspeer 			break;
21876495Sspeer 		}
21886495Sspeer 	}
21896495Sspeer 
21906495Sspeer 	return (val);
21916495Sspeer }
21926495Sspeer 
2193*11878SVenu.Iyer@Sun.COM /*
2194*11878SVenu.Iyer@Sun.COM  * Retrieve a value for one of the statistics for a particular rx ring
2195*11878SVenu.Iyer@Sun.COM  */
2196*11878SVenu.Iyer@Sun.COM int
nxge_rx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)2197*11878SVenu.Iyer@Sun.COM nxge_rx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
2198*11878SVenu.Iyer@Sun.COM {
2199*11878SVenu.Iyer@Sun.COM 	p_nxge_ring_handle_t    rhp = (p_nxge_ring_handle_t)rdriver;
2200*11878SVenu.Iyer@Sun.COM 	p_nxge_t		nxgep = rhp->nxgep;
2201*11878SVenu.Iyer@Sun.COM 	int			r_index;
2202*11878SVenu.Iyer@Sun.COM 	p_nxge_stats_t 		statsp;
2203*11878SVenu.Iyer@Sun.COM 
2204*11878SVenu.Iyer@Sun.COM 	ASSERT(nxgep != NULL);
2205*11878SVenu.Iyer@Sun.COM 	statsp = (p_nxge_stats_t)nxgep->statsp;
2206*11878SVenu.Iyer@Sun.COM 	ASSERT(statsp != NULL);
2207*11878SVenu.Iyer@Sun.COM 	r_index = rhp->index + nxgep->pt_config.hw_config.start_rdc;
2208*11878SVenu.Iyer@Sun.COM 
2209*11878SVenu.Iyer@Sun.COM 	if (statsp->rdc_ksp[r_index] == NULL)
2210*11878SVenu.Iyer@Sun.COM 		return (0);
2211*11878SVenu.Iyer@Sun.COM 
2212*11878SVenu.Iyer@Sun.COM 	switch (stat) {
2213*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_IERRORS:
2214*11878SVenu.Iyer@Sun.COM 		*val = statsp->rdc_stats[r_index].ierrors;
2215*11878SVenu.Iyer@Sun.COM 		break;
2216*11878SVenu.Iyer@Sun.COM 
2217*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_RBYTES:
2218*11878SVenu.Iyer@Sun.COM 		*val = statsp->rdc_stats[r_index].ibytes;
2219*11878SVenu.Iyer@Sun.COM 		break;
2220*11878SVenu.Iyer@Sun.COM 
2221*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_IPACKETS:
2222*11878SVenu.Iyer@Sun.COM 		*val = statsp->rdc_stats[r_index].ipackets;
2223*11878SVenu.Iyer@Sun.COM 		break;
2224*11878SVenu.Iyer@Sun.COM 
2225*11878SVenu.Iyer@Sun.COM 	default:
2226*11878SVenu.Iyer@Sun.COM 		*val = 0;
2227*11878SVenu.Iyer@Sun.COM 		return (ENOTSUP);
2228*11878SVenu.Iyer@Sun.COM 	}
2229*11878SVenu.Iyer@Sun.COM 
2230*11878SVenu.Iyer@Sun.COM 	return (0);
2231*11878SVenu.Iyer@Sun.COM }
2232*11878SVenu.Iyer@Sun.COM 
2233*11878SVenu.Iyer@Sun.COM /*
2234*11878SVenu.Iyer@Sun.COM  * Retrieve a value for one of the statistics for a particular tx ring
2235*11878SVenu.Iyer@Sun.COM  */
2236*11878SVenu.Iyer@Sun.COM int
nxge_tx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)2237*11878SVenu.Iyer@Sun.COM nxge_tx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
2238*11878SVenu.Iyer@Sun.COM {
2239*11878SVenu.Iyer@Sun.COM 	p_nxge_ring_handle_t    rhp = (p_nxge_ring_handle_t)rdriver;
2240*11878SVenu.Iyer@Sun.COM 	p_nxge_t		nxgep = rhp->nxgep;
2241*11878SVenu.Iyer@Sun.COM 	int			r_index;
2242*11878SVenu.Iyer@Sun.COM 	p_nxge_stats_t 		statsp;
2243*11878SVenu.Iyer@Sun.COM 
2244*11878SVenu.Iyer@Sun.COM 	ASSERT(nxgep != NULL);
2245*11878SVenu.Iyer@Sun.COM 	statsp = (p_nxge_stats_t)nxgep->statsp;
2246*11878SVenu.Iyer@Sun.COM 	ASSERT(statsp != NULL);
2247*11878SVenu.Iyer@Sun.COM 	r_index = nxgep->pt_config.hw_config.tdc.start + rhp->index;
2248*11878SVenu.Iyer@Sun.COM 
2249*11878SVenu.Iyer@Sun.COM 	if (statsp->tdc_ksp[r_index] == NULL)
2250*11878SVenu.Iyer@Sun.COM 		return (0);
2251*11878SVenu.Iyer@Sun.COM 
2252*11878SVenu.Iyer@Sun.COM 	switch (stat) {
2253*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OERRORS:
2254*11878SVenu.Iyer@Sun.COM 		*val = statsp->tdc_stats[r_index].oerrors;
2255*11878SVenu.Iyer@Sun.COM 		break;
2256*11878SVenu.Iyer@Sun.COM 
2257*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OBYTES:
2258*11878SVenu.Iyer@Sun.COM 		*val = statsp->tdc_stats[r_index].obytes;
2259*11878SVenu.Iyer@Sun.COM 		break;
2260*11878SVenu.Iyer@Sun.COM 
2261*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OPACKETS:
2262*11878SVenu.Iyer@Sun.COM 		*val = statsp->tdc_stats[r_index].opackets;
2263*11878SVenu.Iyer@Sun.COM 		break;
2264*11878SVenu.Iyer@Sun.COM 
2265*11878SVenu.Iyer@Sun.COM 	default:
2266*11878SVenu.Iyer@Sun.COM 		*val = 0;
2267*11878SVenu.Iyer@Sun.COM 		return (ENOTSUP);
2268*11878SVenu.Iyer@Sun.COM 	}
2269*11878SVenu.Iyer@Sun.COM 
2270*11878SVenu.Iyer@Sun.COM 	return (0);
2271*11878SVenu.Iyer@Sun.COM }
2272*11878SVenu.Iyer@Sun.COM 
22733859Sml29623 /* ARGSUSED */
22743859Sml29623 int
nxge_m_stat(void * arg,uint_t stat,uint64_t * value)22753859Sml29623 nxge_m_stat(void *arg, uint_t stat, uint64_t *value)
22763859Sml29623 {
22773859Sml29623 	p_nxge_t nxgep = (p_nxge_t)arg;
22783859Sml29623 	p_nxge_stats_t statsp;
22793859Sml29623 	uint64_t val = 0;
22803859Sml29623 
22813859Sml29623 	NXGE_DEBUG_MSG((nxgep, KST_CTL, "==> nxge_m_stat"));
22823859Sml29623 	statsp = (p_nxge_stats_t)nxgep->statsp;
22833859Sml29623 
22843859Sml29623 	switch (stat) {
22853859Sml29623 	case MAC_STAT_IFSPEED:
22863859Sml29623 		val = statsp->mac_stats.link_speed * 1000000ull;
22873859Sml29623 		break;
22883859Sml29623 
22893859Sml29623 	case MAC_STAT_MULTIRCV:
22903859Sml29623 		val = statsp->port_stats.multircv;
22913859Sml29623 		break;
22923859Sml29623 
22933859Sml29623 	case MAC_STAT_BRDCSTRCV:
22943859Sml29623 		val = statsp->port_stats.brdcstrcv;
22953859Sml29623 		break;
22963859Sml29623 
22973859Sml29623 	case MAC_STAT_MULTIXMT:
22983859Sml29623 		val = statsp->port_stats.multixmt;
22993859Sml29623 		break;
23003859Sml29623 
23013859Sml29623 	case MAC_STAT_BRDCSTXMT:
23023859Sml29623 		val = statsp->port_stats.brdcstxmt;
23033859Sml29623 		break;
23043859Sml29623 
23053859Sml29623 	case MAC_STAT_NORCVBUF:
23063859Sml29623 		val = statsp->port_stats.norcvbuf;
23073859Sml29623 		break;
23083859Sml29623 
23093859Sml29623 	case MAC_STAT_IERRORS:
23103859Sml29623 	case ETHER_STAT_MACRCV_ERRORS:
23116495Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
23126495Sspeer 		break;
23136495Sspeer 
23146495Sspeer 	case MAC_STAT_OERRORS:
23156495Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
23163859Sml29623 		break;
23173859Sml29623 
23183859Sml29623 	case MAC_STAT_NOXMTBUF:
23193859Sml29623 		val = statsp->port_stats.noxmtbuf;
23203859Sml29623 		break;
23213859Sml29623 
23223859Sml29623 	case MAC_STAT_COLLISIONS:
23233859Sml29623 		val = 0;
23243859Sml29623 		break;
23253859Sml29623 
23263859Sml29623 	case MAC_STAT_RBYTES:
23276495Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
23283859Sml29623 		break;
23293859Sml29623 
23303859Sml29623 	case MAC_STAT_IPACKETS:
23316495Sspeer 		val = nxge_m_rx_stat(nxgep, stat);
23323859Sml29623 		break;
23333859Sml29623 
23343859Sml29623 	case MAC_STAT_OBYTES:
23356495Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
23363859Sml29623 		break;
23373859Sml29623 
23383859Sml29623 	case MAC_STAT_OPACKETS:
23396495Sspeer 		val = nxge_m_tx_stat(nxgep, stat);
23403859Sml29623 		break;
23413859Sml29623 	case MAC_STAT_LINK_STATE:
23423859Sml29623 		val = statsp->mac_stats.link_duplex;
23433859Sml29623 		break;
23443859Sml29623 	case MAC_STAT_LINK_UP:
23453859Sml29623 		val = statsp->mac_stats.link_up;
23463859Sml29623 		break;
23473859Sml29623 	case MAC_STAT_PROMISC:
23483859Sml29623 		val = statsp->mac_stats.promisc;
23493859Sml29623 		break;
23503859Sml29623 	case ETHER_STAT_SQE_ERRORS:
23513859Sml29623 		val = 0;
23523859Sml29623 		break;
23533859Sml29623 
23543859Sml29623 	case ETHER_STAT_ALIGN_ERRORS:
23553859Sml29623 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
23563859Sml29623 			val = statsp->xmac_stats.rx_frame_align_err_cnt;
23573859Sml29623 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
23583859Sml29623 			val = statsp->bmac_stats.rx_align_err_cnt;
23593859Sml29623 		else
23603859Sml29623 			val = 0;
23613859Sml29623 		break;
23623859Sml29623 
23633859Sml29623 	case ETHER_STAT_FCS_ERRORS:
23643859Sml29623 		if (nxgep->mac.porttype == PORT_TYPE_XMAC)
23653859Sml29623 			val = statsp->xmac_stats.rx_crc_err_cnt;
23663859Sml29623 		else if (nxgep->mac.porttype == PORT_TYPE_BMAC)
23673859Sml29623 			val = statsp->bmac_stats.rx_crc_err_cnt;
23683859Sml29623 		else
23693859Sml29623 			val = 0;
23703859Sml29623 		break;
23713859Sml29623 
23723859Sml29623 	case ETHER_STAT_FIRST_COLLISIONS:
23733859Sml29623 		val = 0;
23743859Sml29623 		break;
23753859Sml29623 
23763859Sml29623 	case ETHER_STAT_MULTI_COLLISIONS:
23773859Sml29623 		val = 0;
23783859Sml29623 		break;
23793859Sml29623 
23803859Sml29623 	case ETHER_STAT_TX_LATE_COLLISIONS:
23813859Sml29623 		val = 0;
23823859Sml29623 		break;
23833859Sml29623 
23843859Sml29623 	case ETHER_STAT_EX_COLLISIONS:
23853859Sml29623 		val = 0;
23863859Sml29623 		break;
23873859Sml29623 
23883859Sml29623 	case ETHER_STAT_DEFER_XMTS:
23893859Sml29623 		val = 0;
23903859Sml29623 		break;
23913859Sml29623 
23923859Sml29623 	case ETHER_STAT_MACXMT_ERRORS:
23933859Sml29623 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
23943859Sml29623 			val = statsp->xmac_stats.tx_underflow_err +
23956946Smisaki 			    statsp->xmac_stats.tx_maxpktsize_err +
23966946Smisaki 			    statsp->xmac_stats.tx_overflow_err +
23976946Smisaki 			    statsp->xmac_stats.tx_fifo_xfr_err;
23983859Sml29623 		} else {
23993859Sml29623 			val = statsp->bmac_stats.tx_underrun_err +
24006946Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
24013859Sml29623 		}
24023859Sml29623 		break;
24033859Sml29623 
24043859Sml29623 	case ETHER_STAT_CARRIER_ERRORS:
24053859Sml29623 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
24063859Sml29623 			val = statsp->xmac_stats.rx_linkfault_err_cnt;
24073859Sml29623 		} else {
24083859Sml29623 			val = statsp->mac_stats.xcvr_inits +
24096946Smisaki 			    statsp->mac_stats.serdes_inits;
24103859Sml29623 		}
24113859Sml29623 		break;
24123859Sml29623 
24133859Sml29623 	case ETHER_STAT_TOOLONG_ERRORS:
24143859Sml29623 		if (nxgep->mac.porttype == PORT_TYPE_XMAC) {
24153859Sml29623 			val = statsp->xmac_stats.tx_maxpktsize_err +
24166946Smisaki 			    statsp->xmac_stats.rx_len_err_cnt;
24173859Sml29623 
24183859Sml29623 		} else {
24193859Sml29623 			val = statsp->bmac_stats.rx_len_err_cnt +
24206946Smisaki 			    statsp->bmac_stats.tx_max_pkt_err;
24213859Sml29623 		}
24223859Sml29623 		break;
24233859Sml29623 
24243859Sml29623 
24253859Sml29623 	case ETHER_STAT_XCVR_ADDR:
24263859Sml29623 		val = statsp->mac_stats.xcvr_portn;
24273859Sml29623 		break;
24283859Sml29623 	case ETHER_STAT_XCVR_ID:
24293859Sml29623 		val = statsp->mac_stats.xcvr_id;
24303859Sml29623 		break;
24313859Sml29623 
24323859Sml29623 	case ETHER_STAT_XCVR_INUSE:
24333859Sml29623 		val = statsp->mac_stats.xcvr_inuse;
24343859Sml29623 		break;
24353859Sml29623 
24363859Sml29623 	case ETHER_STAT_CAP_1000FDX:
24373859Sml29623 		val = statsp->mac_stats.cap_1000fdx;
24383859Sml29623 		break;
24393859Sml29623 
24403859Sml29623 	case ETHER_STAT_CAP_1000HDX:
24413859Sml29623 		val = statsp->mac_stats.cap_1000hdx;
24423859Sml29623 		break;
24433859Sml29623 
24443859Sml29623 	case ETHER_STAT_CAP_100FDX:
24453859Sml29623 		val = statsp->mac_stats.cap_100fdx;
24463859Sml29623 		break;
24473859Sml29623 
24483859Sml29623 	case ETHER_STAT_CAP_100HDX:
24493859Sml29623 		val = statsp->mac_stats.cap_100hdx;
24503859Sml29623 		break;
24513859Sml29623 
24523859Sml29623 	case ETHER_STAT_CAP_10FDX:
24533859Sml29623 		val = statsp->mac_stats.cap_10fdx;
24543859Sml29623 		break;
24553859Sml29623 
24563859Sml29623 	case ETHER_STAT_CAP_10HDX:
24573859Sml29623 		val = statsp->mac_stats.cap_10hdx;
24583859Sml29623 		break;
24593859Sml29623 
24603859Sml29623 	case ETHER_STAT_CAP_ASMPAUSE:
24613859Sml29623 		val = statsp->mac_stats.cap_asmpause;
24623859Sml29623 		val = 1;
24633859Sml29623 		break;
24643859Sml29623 
24653859Sml29623 	case ETHER_STAT_CAP_PAUSE:
24663859Sml29623 		val = statsp->mac_stats.cap_pause;
24673859Sml29623 		break;
24683859Sml29623 
24693859Sml29623 	case ETHER_STAT_CAP_AUTONEG:
24703859Sml29623 		val = statsp->mac_stats.cap_autoneg;
24713859Sml29623 		break;
24723859Sml29623 
24733859Sml29623 	case ETHER_STAT_ADV_CAP_1000FDX:
24743859Sml29623 		val = statsp->mac_stats.adv_cap_1000fdx;
24753859Sml29623 		break;
24763859Sml29623 
24773859Sml29623 	case ETHER_STAT_ADV_CAP_1000HDX:
24783859Sml29623 		val = statsp->mac_stats.adv_cap_1000hdx;
24793859Sml29623 		break;
24803859Sml29623 
24813859Sml29623 	case ETHER_STAT_ADV_CAP_100FDX:
24823859Sml29623 		val = statsp->mac_stats.adv_cap_100fdx;
24833859Sml29623 		break;
24843859Sml29623 
24853859Sml29623 	case ETHER_STAT_ADV_CAP_100HDX:
24863859Sml29623 		val = statsp->mac_stats.adv_cap_100hdx;
24873859Sml29623 		break;
24883859Sml29623 
24893859Sml29623 	case ETHER_STAT_ADV_CAP_10FDX:
24903859Sml29623 		val = statsp->mac_stats.adv_cap_10fdx;
24913859Sml29623 		break;
24923859Sml29623 
24933859Sml29623 	case ETHER_STAT_ADV_CAP_10HDX:
24943859Sml29623 		val = statsp->mac_stats.adv_cap_10hdx;
24953859Sml29623 		break;
24963859Sml29623 
24973859Sml29623 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
24983859Sml29623 		val = statsp->mac_stats.adv_cap_asmpause;
24993859Sml29623 		break;
25003859Sml29623 
25013859Sml29623 	case ETHER_STAT_ADV_CAP_PAUSE:
25023859Sml29623 		val = statsp->mac_stats.adv_cap_pause;
25033859Sml29623 		break;
25043859Sml29623 
25053859Sml29623 	case ETHER_STAT_ADV_CAP_AUTONEG:
25063859Sml29623 		val = statsp->mac_stats.adv_cap_autoneg;
25073859Sml29623 		break;
25083859Sml29623 
25093859Sml29623 	case ETHER_STAT_LP_CAP_1000FDX:
25103859Sml29623 		val = statsp->mac_stats.lp_cap_1000fdx;
25113859Sml29623 		break;
25123859Sml29623 
25133859Sml29623 	case ETHER_STAT_LP_CAP_1000HDX:
25143859Sml29623 		val = statsp->mac_stats.lp_cap_1000hdx;
25153859Sml29623 		break;
25163859Sml29623 
25173859Sml29623 	case ETHER_STAT_LP_CAP_100FDX:
25183859Sml29623 		val = statsp->mac_stats.lp_cap_100fdx;
25193859Sml29623 		break;
25203859Sml29623 
25213859Sml29623 	case ETHER_STAT_LP_CAP_100HDX:
25223859Sml29623 		val = statsp->mac_stats.lp_cap_100hdx;
25233859Sml29623 		break;
25243859Sml29623 
25253859Sml29623 	case ETHER_STAT_LP_CAP_10FDX:
25263859Sml29623 		val = statsp->mac_stats.lp_cap_10fdx;
25273859Sml29623 		break;
25283859Sml29623 
25293859Sml29623 	case ETHER_STAT_LP_CAP_10HDX:
25303859Sml29623 		val = statsp->mac_stats.lp_cap_10hdx;
25313859Sml29623 		break;
25323859Sml29623 
25333859Sml29623 	case ETHER_STAT_LP_CAP_ASMPAUSE:
25343859Sml29623 		val = statsp->mac_stats.lp_cap_asmpause;
25353859Sml29623 		break;
25363859Sml29623 
25373859Sml29623 	case ETHER_STAT_LP_CAP_PAUSE:
25383859Sml29623 		val = statsp->mac_stats.lp_cap_pause;
25393859Sml29623 		break;
25403859Sml29623 
25413859Sml29623 	case ETHER_STAT_LP_CAP_AUTONEG:
25423859Sml29623 		val = statsp->mac_stats.lp_cap_autoneg;
25433859Sml29623 		break;
25443859Sml29623 
25453859Sml29623 	case ETHER_STAT_LINK_ASMPAUSE:
25463859Sml29623 		val = statsp->mac_stats.link_asmpause;
25473859Sml29623 		break;
25483859Sml29623 
25493859Sml29623 	case ETHER_STAT_LINK_PAUSE:
25503859Sml29623 		val = statsp->mac_stats.link_pause;
25513859Sml29623 		break;
25523859Sml29623 
25533859Sml29623 	case ETHER_STAT_LINK_AUTONEG:
25543859Sml29623 		val = statsp->mac_stats.cap_autoneg;
25553859Sml29623 		break;
25563859Sml29623 
25573859Sml29623 	case ETHER_STAT_LINK_DUPLEX:
25583859Sml29623 		val = statsp->mac_stats.link_duplex;
25593859Sml29623 		break;
25603859Sml29623 
25613859Sml29623 	default:
25623859Sml29623 		/*
25633859Sml29623 		 * Shouldn't reach here...
25643859Sml29623 		 */
25653859Sml29623 #ifdef NXGE_DEBUG
25663859Sml29623 		NXGE_ERROR_MSG((nxgep, KST_CTL,
25676946Smisaki 		    "nxge_m_stat: unrecognized parameter value = 0x%x",
25686946Smisaki 		    stat));
25693859Sml29623 #endif
25703859Sml29623 
25713859Sml29623 		return (ENOTSUP);
25723859Sml29623 	}
25733859Sml29623 	*value = val;
25743859Sml29623 	return (0);
25753859Sml29623 }
2576