xref: /onnv-gate/usr/src/uts/common/io/hxge/hxge_kstats.c (revision 11878:ac93462db6d7)
16349Sqs148142 /*
26349Sqs148142  * CDDL HEADER START
36349Sqs148142  *
46349Sqs148142  * The contents of this file are subject to the terms of the
56349Sqs148142  * Common Development and Distribution License (the "License").
66349Sqs148142  * You may not use this file except in compliance with the License.
76349Sqs148142  *
86349Sqs148142  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96349Sqs148142  * or http://www.opensolaris.org/os/licensing.
106349Sqs148142  * See the License for the specific language governing permissions
116349Sqs148142  * and limitations under the License.
126349Sqs148142  *
136349Sqs148142  * When distributing Covered Code, include this CDDL HEADER in each
146349Sqs148142  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156349Sqs148142  * If applicable, add the following below this CDDL HEADER, with the
166349Sqs148142  * fields enclosed by brackets "[]" replaced with your own identifying
176349Sqs148142  * information: Portions Copyright [yyyy] [name of copyright owner]
186349Sqs148142  *
196349Sqs148142  * CDDL HEADER END
206349Sqs148142  */
216349Sqs148142 /*
22*11878SVenu.Iyer@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
236349Sqs148142  * Use is subject to license terms.
246349Sqs148142  */
256349Sqs148142 
266349Sqs148142 #include <hxge_impl.h>
276349Sqs148142 #include <inet/mi.h>
286349Sqs148142 #include <sys/cmn_err.h>
296349Sqs148142 
306349Sqs148142 #define	RDC_NAME_FORMAT1 "RDC_"
316349Sqs148142 #define	TDC_NAME_FORMAT1 "TDC_"
326349Sqs148142 #define	CH_NAME_FORMAT "%d"
336349Sqs148142 
348718SMichael.Speer@Sun.COM static int hxge_mmac_stat_update(kstat_t *ksp, int rw);
358718SMichael.Speer@Sun.COM 
366349Sqs148142 void
hxge_init_statsp(p_hxge_t hxgep)376349Sqs148142 hxge_init_statsp(p_hxge_t hxgep)
386349Sqs148142 {
396349Sqs148142 	size_t stats_size;
406349Sqs148142 
416349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_init_statsp"));
426349Sqs148142 
436349Sqs148142 	stats_size = sizeof (hxge_stats_t);
446349Sqs148142 	hxgep->statsp = KMEM_ZALLOC(stats_size, KM_SLEEP);
456349Sqs148142 	hxgep->statsp->stats_size = stats_size;
466349Sqs148142 
476349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, " <== hxge_init_statsp"));
486349Sqs148142 }
496349Sqs148142 
506349Sqs148142 typedef struct {
516349Sqs148142 	uint8_t index;
526349Sqs148142 	uint8_t type;
536349Sqs148142 	char *name;
546349Sqs148142 } hxge_kstat_index_t;
556349Sqs148142 
566349Sqs148142 typedef enum {
576349Sqs148142 	RDC_STAT_PACKETS = 0,
586349Sqs148142 	RDC_STAT_BYTES,
596349Sqs148142 	RDC_STAT_ERRORS,
606349Sqs148142 	RDC_STAT_JUMBO_PKTS,
616349Sqs148142 	RDC_STAT_RCR_UNKNOWN_ERR,
626349Sqs148142 	RDC_STAT_RCR_SHA_PAR_ERR,
636349Sqs148142 	RDC_STAT_RBR_PRE_PAR_ERR,
646349Sqs148142 	RDC_STAT_RBR_PRE_EMTY,
656349Sqs148142 	RDC_STAT_RCR_SHADOW_FULL,
666349Sqs148142 	RDC_STAT_RBR_TMOUT,
676349Sqs148142 	RDC_STAT_PEU_RESP_ERR,
686349Sqs148142 	RDC_STAT_CTRL_FIFO_ECC_ERR,
696349Sqs148142 	RDC_STAT_DATA_FIFO_ECC_ERR,
706349Sqs148142 	RDC_STAT_RCRFULL,
716349Sqs148142 	RDC_STAT_RBR_EMPTY,
728141SMichael.Speer@Sun.COM 	RDC_STAT_RBR_EMPTY_FAIL,
738236SQiyan.Sun@Sun.COM 	RDC_STAT_RBR_EMPTY_RESTORE,
746349Sqs148142 	RDC_STAT_RBR_FULL,
757618SMichael.Speer@Sun.COM 	RDC_STAT_RCR_INVALIDS,
766349Sqs148142 	RDC_STAT_RCRTO,
776349Sqs148142 	RDC_STAT_RCRTHRES,
788103SQiyan.Sun@Sun.COM 	RDC_STAT_PKT_DROP,
796349Sqs148142 	RDC_STAT_END
806349Sqs148142 } hxge_rdc_stat_index_t;
816349Sqs148142 
826349Sqs148142 hxge_kstat_index_t hxge_rdc_stats[] = {
836349Sqs148142 	{RDC_STAT_PACKETS, KSTAT_DATA_UINT64, "rdc_packets"},
846349Sqs148142 	{RDC_STAT_BYTES, KSTAT_DATA_UINT64, "rdc_bytes"},
857584SQiyan.Sun@Sun.COM 	{RDC_STAT_ERRORS, KSTAT_DATA_ULONG, "rdc_errors"},
866349Sqs148142 	{RDC_STAT_JUMBO_PKTS, KSTAT_DATA_ULONG, "rdc_jumbo_pkts"},
876349Sqs148142 	{RDC_STAT_RCR_UNKNOWN_ERR, KSTAT_DATA_ULONG, "rdc_rcr_unknown_err"},
886349Sqs148142 	{RDC_STAT_RCR_SHA_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rcr_sha_par_err"},
896349Sqs148142 	{RDC_STAT_RBR_PRE_PAR_ERR, KSTAT_DATA_ULONG, "rdc_rbr_pre_par_err"},
906349Sqs148142 	{RDC_STAT_RBR_PRE_EMTY, KSTAT_DATA_ULONG, "rdc_rbr_pre_empty"},
916349Sqs148142 	{RDC_STAT_RCR_SHADOW_FULL, KSTAT_DATA_ULONG, "rdc_rcr_shadow_full"},
926349Sqs148142 	{RDC_STAT_RBR_TMOUT, KSTAT_DATA_ULONG, "rdc_rbr_tmout"},
936349Sqs148142 	{RDC_STAT_PEU_RESP_ERR, KSTAT_DATA_ULONG, "peu_resp_err"},
946349Sqs148142 	{RDC_STAT_CTRL_FIFO_ECC_ERR, KSTAT_DATA_ULONG, "ctrl_fifo_ecc_err"},
956349Sqs148142 	{RDC_STAT_DATA_FIFO_ECC_ERR, KSTAT_DATA_ULONG, "data_fifo_ecc_err"},
966349Sqs148142 	{RDC_STAT_RCRFULL, KSTAT_DATA_ULONG, "rdc_rcrfull"},
976349Sqs148142 	{RDC_STAT_RBR_EMPTY, KSTAT_DATA_ULONG, "rdc_rbr_empty"},
988141SMichael.Speer@Sun.COM 	{RDC_STAT_RBR_EMPTY_FAIL, KSTAT_DATA_ULONG, "rdc_rbr_empty_fail"},
998236SQiyan.Sun@Sun.COM 	{RDC_STAT_RBR_EMPTY_FAIL, KSTAT_DATA_ULONG, "rdc_rbr_empty_restore"},
1006349Sqs148142 	{RDC_STAT_RBR_FULL, KSTAT_DATA_ULONG, "rdc_rbrfull"},
1017618SMichael.Speer@Sun.COM 	{RDC_STAT_RCR_INVALIDS, KSTAT_DATA_ULONG, "rdc_rcr_invalids"},
1026349Sqs148142 	{RDC_STAT_RCRTO, KSTAT_DATA_ULONG, "rdc_rcrto"},
1036349Sqs148142 	{RDC_STAT_RCRTHRES, KSTAT_DATA_ULONG, "rdc_rcrthres"},
1048103SQiyan.Sun@Sun.COM 	{RDC_STAT_PKT_DROP, KSTAT_DATA_ULONG, "rdc_pkt_drop"},
1056349Sqs148142 	{RDC_STAT_END, NULL, NULL}
1066349Sqs148142 };
1076349Sqs148142 
1086349Sqs148142 typedef enum {
1096349Sqs148142 	RDC_SYS_STAT_CTRL_FIFO_SEC = 0,
1106349Sqs148142 	RDC_SYS_STAT_CTRL_FIFO_DED,
1116349Sqs148142 	RDC_SYS_STAT_DATA_FIFO_SEC,
1126349Sqs148142 	RDC_SYS_STAT_DATA_FIFO_DED,
1136349Sqs148142 	RDC_SYS_STAT_END
1146349Sqs148142 } hxge_rdc_sys_stat_idx_t;
1156349Sqs148142 
1166349Sqs148142 hxge_kstat_index_t hxge_rdc_sys_stats[] = {
1176349Sqs148142 	{RDC_SYS_STAT_CTRL_FIFO_SEC, KSTAT_DATA_UINT64, "rdc_ctrl_fifo_sec"},
1186349Sqs148142 	{RDC_SYS_STAT_CTRL_FIFO_DED, KSTAT_DATA_UINT64, "rdc_ctrl_fifo_ded"},
1196349Sqs148142 	{RDC_SYS_STAT_DATA_FIFO_SEC, KSTAT_DATA_UINT64, "rdc_data_fifo_sec"},
1206349Sqs148142 	{RDC_SYS_STAT_DATA_FIFO_DED, KSTAT_DATA_UINT64, "tdc_data_fifo_ded"},
1216349Sqs148142 	{RDC_SYS_STAT_END, NULL, NULL}
1226349Sqs148142 };
1236349Sqs148142 
1246349Sqs148142 typedef enum {
1256349Sqs148142 	TDC_STAT_PACKETS = 0,
1266349Sqs148142 	TDC_STAT_BYTES,
1276349Sqs148142 	TDC_STAT_BYTES_WITH_PAD,
1286349Sqs148142 	TDC_STAT_ERRORS,
1296349Sqs148142 	TDC_STAT_TX_INITS,
1306349Sqs148142 	TDC_STAT_TX_NO_BUF,
1316349Sqs148142 	TDC_STAT_PEU_RESP_ERR,
1326349Sqs148142 	TDC_STAT_PKT_SIZE_ERR,
1336349Sqs148142 	TDC_STAT_TX_RNG_OFLOW,
1346349Sqs148142 	TDC_STAT_PKT_SIZE_HDR_ERR,
1356349Sqs148142 	TDC_STAT_RUNT_PKT_DROP_ERR,
1366349Sqs148142 	TDC_STAT_PREF_PAR_ERR,
1376349Sqs148142 	TDC_STAT_TDR_PREF_CPL_TO,
1386349Sqs148142 	TDC_STAT_PKT_CPL_TO,
1396349Sqs148142 	TDC_STAT_INVALID_SOP,
1406349Sqs148142 	TDC_STAT_UNEXPECTED_SOP,
1416349Sqs148142 	TDC_STAT_COUNT_HDR_SIZE_ERR,
1426349Sqs148142 	TDC_STAT_COUNT_RUNT,
1436349Sqs148142 	TDC_STAT_COUNT_ABORT,
1446349Sqs148142 	TDC_STAT_TX_STARTS,
1456349Sqs148142 	TDC_STAT_TX_NO_DESC,
1466349Sqs148142 	TDC_STAT_TX_DMA_BIND_FAIL,
1476349Sqs148142 	TDC_STAT_TX_HDR_PKTS,
1486349Sqs148142 	TDC_STAT_TX_DDI_PKTS,
1496349Sqs148142 	TDC_STAT_TX_JUMBO_PKTS,
1506349Sqs148142 	TDC_STAT_TX_MAX_PEND,
1516349Sqs148142 	TDC_STAT_TX_MARKS,
1526349Sqs148142 	TDC_STAT_END
1536349Sqs148142 } hxge_tdc_stats_index_t;
1546349Sqs148142 
1556349Sqs148142 hxge_kstat_index_t hxge_tdc_stats[] = {
1566349Sqs148142 	{TDC_STAT_PACKETS, KSTAT_DATA_UINT64, "tdc_packets"},
1576349Sqs148142 	{TDC_STAT_BYTES, KSTAT_DATA_UINT64, "tdc_bytes"},
1586349Sqs148142 	{TDC_STAT_BYTES_WITH_PAD, KSTAT_DATA_UINT64, "tdc_bytes_with_pad"},
1596349Sqs148142 	{TDC_STAT_ERRORS, KSTAT_DATA_UINT64, "tdc_errors"},
1606349Sqs148142 	{TDC_STAT_TX_INITS, KSTAT_DATA_ULONG, "tdc_tx_inits"},
1616349Sqs148142 	{TDC_STAT_TX_NO_BUF, KSTAT_DATA_ULONG, "tdc_tx_no_buf"},
1626349Sqs148142 
1636349Sqs148142 	{TDC_STAT_PEU_RESP_ERR, KSTAT_DATA_ULONG, "tdc_peu_resp_err"},
1646349Sqs148142 	{TDC_STAT_PKT_SIZE_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_err"},
1656349Sqs148142 	{TDC_STAT_TX_RNG_OFLOW, KSTAT_DATA_ULONG, "tdc_tx_rng_oflow"},
1666349Sqs148142 	{TDC_STAT_PKT_SIZE_HDR_ERR, KSTAT_DATA_ULONG, "tdc_pkt_size_hdr_err"},
1676349Sqs148142 	{TDC_STAT_RUNT_PKT_DROP_ERR, KSTAT_DATA_ULONG, "tdc_runt_pkt_drop_err"},
1686349Sqs148142 	{TDC_STAT_PREF_PAR_ERR, KSTAT_DATA_ULONG, "tdc_pref_par_err"},
1696349Sqs148142 	{TDC_STAT_TDR_PREF_CPL_TO, KSTAT_DATA_ULONG, "tdc_tdr_pref_cpl_to"},
1706349Sqs148142 	{TDC_STAT_PKT_CPL_TO, KSTAT_DATA_ULONG, "tdc_pkt_cpl_to"},
1716349Sqs148142 	{TDC_STAT_INVALID_SOP, KSTAT_DATA_ULONG, "tdc_invalid_sop"},
1726349Sqs148142 	{TDC_STAT_UNEXPECTED_SOP, KSTAT_DATA_ULONG, "tdc_unexpected_sop"},
1736349Sqs148142 
1746349Sqs148142 	{TDC_STAT_COUNT_HDR_SIZE_ERR, KSTAT_DATA_ULONG,
1756349Sqs148142 	    "tdc_count_hdr_size_err"},
1766349Sqs148142 	{TDC_STAT_COUNT_RUNT, KSTAT_DATA_ULONG, "tdc_count_runt"},
1776349Sqs148142 	{TDC_STAT_COUNT_ABORT, KSTAT_DATA_ULONG, "tdc_count_abort"},
1786349Sqs148142 
1796349Sqs148142 	{TDC_STAT_TX_STARTS, KSTAT_DATA_ULONG, "tdc_tx_starts"},
1806349Sqs148142 	{TDC_STAT_TX_NO_DESC, KSTAT_DATA_ULONG, "tdc_tx_no_desc"},
1816349Sqs148142 	{TDC_STAT_TX_DMA_BIND_FAIL, KSTAT_DATA_ULONG, "tdc_tx_dma_bind_fail"},
1826349Sqs148142 	{TDC_STAT_TX_HDR_PKTS, KSTAT_DATA_ULONG, "tdc_tx_hdr_pkts"},
1836349Sqs148142 	{TDC_STAT_TX_DDI_PKTS, KSTAT_DATA_ULONG, "tdc_tx_ddi_pkts"},
1846349Sqs148142 	{TDC_STAT_TX_JUMBO_PKTS, KSTAT_DATA_ULONG, "tdc_tx_jumbo_pkts"},
1856349Sqs148142 	{TDC_STAT_TX_MAX_PEND, KSTAT_DATA_ULONG, "tdc_tx_max_pend"},
1866349Sqs148142 	{TDC_STAT_TX_MARKS, KSTAT_DATA_ULONG, "tdc_tx_marks"},
1876349Sqs148142 	{TDC_STAT_END, NULL, NULL}
1886349Sqs148142 };
1896349Sqs148142 
1906349Sqs148142 typedef enum {
1916349Sqs148142 	REORD_TBL_PAR_ERR = 0,
1926349Sqs148142 	REORD_BUF_DED_ERR,
1936349Sqs148142 	REORD_BUF_SEC_ERR,
1946349Sqs148142 	TDC_SYS_STAT_END
1956349Sqs148142 } hxge_tdc_sys_stat_idx_t;
1966349Sqs148142 
1976349Sqs148142 hxge_kstat_index_t hxge_tdc_sys_stats[] = {
1986349Sqs148142 	{REORD_TBL_PAR_ERR, KSTAT_DATA_UINT64, "reord_tbl_par_err"},
1996349Sqs148142 	{REORD_BUF_DED_ERR, KSTAT_DATA_UINT64, "reord_buf_ded_err"},
2006349Sqs148142 	{REORD_BUF_SEC_ERR, KSTAT_DATA_UINT64, "reord_buf_sec_err"},
2016349Sqs148142 	{TDC_SYS_STAT_END, NULL, NULL}
2026349Sqs148142 };
2036349Sqs148142 
2046349Sqs148142 typedef enum {
2056349Sqs148142 	VMAC_STAT_TX_FRAME_CNT,		/* vmac_tx_frame_cnt_t */
2066349Sqs148142 	VMAC_STAT_TX_BYTE_CNT,		/* vmac_tx_byte_cnt_t */
2076349Sqs148142 
2086349Sqs148142 	VMAC_STAT_RX_FRAME_CNT,		/* vmac_rx_frame_cnt_t */
2096349Sqs148142 	VMAC_STAT_RX_BYTE_CNT,		/* vmac_rx_byte_cnt_t */
2106349Sqs148142 	VMAC_STAT_RX_DROP_FRAME_CNT,	/* vmac_rx_drop_fr_cnt_t */
2116349Sqs148142 	VMAC_STAT_RX_DROP_BYTE_CNT,	/* vmac_rx_drop_byte_cnt_t */
2126349Sqs148142 	VMAC_STAT_RX_CRC_CNT,		/* vmac_rx_crc_cnt_t */
2136349Sqs148142 	VMAC_STAT_RX_PAUSE_CNT,		/* vmac_rx_pause_cnt_t */
2146349Sqs148142 	VMAC_STAT_RX_BCAST_FR_CNT,	/* vmac_rx_bcast_fr_cnt_t */
2156349Sqs148142 	VMAC_STAT_RX_MCAST_FR_CNT,	/* vmac_rx_mcast_fr_cnt_t */
2166349Sqs148142 	VMAC_STAT_END
2176349Sqs148142 } hxge_vmac_stat_index_t;
2186349Sqs148142 
2196349Sqs148142 hxge_kstat_index_t hxge_vmac_stats[] = {
2206864Sqs148142 	{VMAC_STAT_TX_FRAME_CNT, KSTAT_DATA_UINT64, "vmac_tx_frame_cnt"},
2216864Sqs148142 	{VMAC_STAT_TX_BYTE_CNT, KSTAT_DATA_UINT64, "vmac_tx_byte_cnt"},
2226349Sqs148142 
2236864Sqs148142 	{VMAC_STAT_RX_FRAME_CNT, KSTAT_DATA_UINT64, "vmac_rx_frame_cnt"},
2246864Sqs148142 	{VMAC_STAT_RX_BYTE_CNT, KSTAT_DATA_UINT64, "vmac_rx_byte_cnt"},
2256864Sqs148142 	{VMAC_STAT_RX_DROP_FRAME_CNT, KSTAT_DATA_UINT64,
2266349Sqs148142 		"vmac_rx_drop_frame_cnt"},
2276864Sqs148142 	{VMAC_STAT_RX_DROP_BYTE_CNT, KSTAT_DATA_UINT64,
2286864Sqs148142 		"vmac_rx_drop_byte_cnt"},
2296864Sqs148142 	{VMAC_STAT_RX_CRC_CNT, KSTAT_DATA_UINT64, "vmac_rx_crc_cnt"},
2306864Sqs148142 	{VMAC_STAT_RX_PAUSE_CNT, KSTAT_DATA_UINT64, "vmac_rx_pause_cnt"},
2316864Sqs148142 	{VMAC_STAT_RX_BCAST_FR_CNT, KSTAT_DATA_UINT64, "vmac_rx_bcast_fr_cnt"},
2326864Sqs148142 	{VMAC_STAT_RX_MCAST_FR_CNT, KSTAT_DATA_UINT64, "vmac_rx_mcast_fr_cnt"},
2336349Sqs148142 	{VMAC_STAT_END, NULL, NULL}
2346349Sqs148142 };
2356349Sqs148142 
2366349Sqs148142 typedef enum {
2376349Sqs148142 	PFC_STAT_PKT_DROP,
2386349Sqs148142 	PFC_STAT_TCAM_PARITY_ERR,
2396349Sqs148142 	PFC_STAT_VLAN_PARITY_ERR,
2406349Sqs148142 	PFC_STAT_BAD_CS_COUNT,
2416349Sqs148142 	PFC_STAT_DROP_COUNT,
2426349Sqs148142 	PFC_STAT_TCP_CTRL_DROP,
2436349Sqs148142 	PFC_STAT_L2_ADDR_DROP,
2446349Sqs148142 	PFC_STAT_CLASS_CODE_DROP,
2456349Sqs148142 	PFC_STAT_TCAM_DROP,
2466349Sqs148142 	PFC_STAT_VLAN_DROP,
2476349Sqs148142 	PFC_STAT_END
2486349Sqs148142 } hxge_pfc_stat_index_t;
2496349Sqs148142 
2506349Sqs148142 hxge_kstat_index_t hxge_pfc_stats[] = {
2516349Sqs148142 	{PFC_STAT_PKT_DROP, KSTAT_DATA_ULONG, "pfc_pkt_drop"},
2526349Sqs148142 	{PFC_STAT_TCAM_PARITY_ERR, KSTAT_DATA_ULONG, "pfc_tcam_parity_err"},
2536349Sqs148142 	{PFC_STAT_VLAN_PARITY_ERR, KSTAT_DATA_ULONG, "pfc_vlan_parity_err"},
2546349Sqs148142 	{PFC_STAT_BAD_CS_COUNT, KSTAT_DATA_ULONG, "pfc_bad_cs_count"},
2556349Sqs148142 	{PFC_STAT_DROP_COUNT, KSTAT_DATA_ULONG, "pfc_drop_count"},
2566349Sqs148142 	{PFC_STAT_TCP_CTRL_DROP, KSTAT_DATA_ULONG, "  pfc_pkt_drop_tcp_ctrl"},
2576349Sqs148142 	{PFC_STAT_L2_ADDR_DROP, KSTAT_DATA_ULONG, "  pfc_pkt_drop_l2_addr"},
2586349Sqs148142 	{PFC_STAT_CLASS_CODE_DROP, KSTAT_DATA_ULONG,
2596349Sqs148142 	    "  pfc_pkt_drop_class_code"},
2606349Sqs148142 	{PFC_STAT_TCAM_DROP, KSTAT_DATA_ULONG, "  pfc_pkt_drop_tcam"},
2616349Sqs148142 	{PFC_STAT_VLAN_DROP, KSTAT_DATA_ULONG, "  pfc_pkt_drop_vlan"},
2626349Sqs148142 	{PFC_STAT_END, NULL, NULL}
2636349Sqs148142 };
2646349Sqs148142 
2656349Sqs148142 typedef enum {
2666349Sqs148142 	SPC_ACC_ERR = 0,
2676349Sqs148142 	TDC_PIOACC_ERR,
2686349Sqs148142 	RDC_PIOACC_ERR,
2696349Sqs148142 	PFC_PIOACC_ERR,
2706349Sqs148142 	VMAC_PIOACC_ERR,
2716349Sqs148142 	CPL_HDRQ_PARERR,
2726349Sqs148142 	CPL_DATAQ_PARERR,
2736349Sqs148142 	RETRYRAM_XDLH_PARERR,
2746349Sqs148142 	RETRYSOTRAM_XDLH_PARERR,
2756349Sqs148142 	P_HDRQ_PARERR,
2766349Sqs148142 	P_DATAQ_PARERR,
2776349Sqs148142 	NP_HDRQ_PARERR,
2786349Sqs148142 	NP_DATAQ_PARERR,
2796349Sqs148142 	EIC_MSIX_PARERR,
2806349Sqs148142 	HCR_PARERR,
2816349Sqs148142 	PEU_SYS_STAT_END
2826349Sqs148142 } hxge_peu_sys_stat_idx_t;
2836349Sqs148142 
2846349Sqs148142 hxge_kstat_index_t hxge_peu_sys_stats[] = {
2856349Sqs148142 	{SPC_ACC_ERR, KSTAT_DATA_UINT64, "spc_acc_err"},
2866349Sqs148142 	{TDC_PIOACC_ERR, KSTAT_DATA_UINT64, "tdc_pioacc_err"},
2876349Sqs148142 	{RDC_PIOACC_ERR, KSTAT_DATA_UINT64, "rdc_pioacc_err"},
2886349Sqs148142 	{PFC_PIOACC_ERR, KSTAT_DATA_UINT64, "pfc_pioacc_err"},
2896349Sqs148142 	{VMAC_PIOACC_ERR, KSTAT_DATA_UINT64, "vmac_pioacc_err"},
2906349Sqs148142 	{CPL_HDRQ_PARERR, KSTAT_DATA_UINT64, "cpl_hdrq_parerr"},
2916349Sqs148142 	{CPL_DATAQ_PARERR, KSTAT_DATA_UINT64, "cpl_dataq_parerr"},
2926349Sqs148142 	{RETRYRAM_XDLH_PARERR, KSTAT_DATA_UINT64, "retryram_xdlh_parerr"},
2936349Sqs148142 	{RETRYSOTRAM_XDLH_PARERR, KSTAT_DATA_UINT64, "retrysotram_xdlh_parerr"},
2946349Sqs148142 	{P_HDRQ_PARERR, KSTAT_DATA_UINT64, "p_hdrq_parerr"},
2956349Sqs148142 	{P_DATAQ_PARERR, KSTAT_DATA_UINT64, "p_dataq_parerr"},
2966349Sqs148142 	{NP_HDRQ_PARERR, KSTAT_DATA_UINT64, "np_hdrq_parerr"},
2976349Sqs148142 	{NP_DATAQ_PARERR, KSTAT_DATA_UINT64, "np_dataq_parerr"},
2986349Sqs148142 	{EIC_MSIX_PARERR, KSTAT_DATA_UINT64, "eic_msix_parerr"},
2996349Sqs148142 	{HCR_PARERR, KSTAT_DATA_UINT64, "hcr_parerr"},
3006349Sqs148142 	{TDC_SYS_STAT_END, NULL, NULL}
3016349Sqs148142 };
3026349Sqs148142 
3038718SMichael.Speer@Sun.COM typedef enum {
3048718SMichael.Speer@Sun.COM 	MMAC_MAX_ADDR,
3058718SMichael.Speer@Sun.COM 	MMAC_AVAIL_ADDR,
3068718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL1,
3078718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL2,
3088718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL3,
3098718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL4,
3108718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL5,
3118718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL6,
3128718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL7,
3138718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL8,
3148718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL9,
3158718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL10,
3168718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL11,
3178718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL12,
3188718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL13,
3198718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL14,
3208718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL15,
3218718SMichael.Speer@Sun.COM 	MMAC_ADDR_POOL16,
3228718SMichael.Speer@Sun.COM 	MMAC_STATS_END
3238718SMichael.Speer@Sun.COM } hxge_mmac_stat_index_t;
3248718SMichael.Speer@Sun.COM 
3258718SMichael.Speer@Sun.COM hxge_kstat_index_t hxge_mmac_stats[] = {
3268718SMichael.Speer@Sun.COM 	{MMAC_MAX_ADDR, KSTAT_DATA_UINT64, "max_mmac_addr"},
3278718SMichael.Speer@Sun.COM 	{MMAC_AVAIL_ADDR, KSTAT_DATA_UINT64, "avail_mmac_addr"},
3288718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL1, KSTAT_DATA_UINT64, "mmac_addr_1"},
3298718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL2, KSTAT_DATA_UINT64, "mmac_addr_2"},
3308718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL3, KSTAT_DATA_UINT64, "mmac_addr_3"},
3318718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL4, KSTAT_DATA_UINT64, "mmac_addr_4"},
3328718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL5, KSTAT_DATA_UINT64, "mmac_addr_5"},
3338718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL6, KSTAT_DATA_UINT64, "mmac_addr_6"},
3348718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL7, KSTAT_DATA_UINT64, "mmac_addr_7"},
3358718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL8, KSTAT_DATA_UINT64, "mmac_addr_8"},
3368718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL9, KSTAT_DATA_UINT64, "mmac_addr_9"},
3378718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL10, KSTAT_DATA_UINT64, "mmac_addr_10"},
3388718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL11, KSTAT_DATA_UINT64, "mmac_addr_11"},
3398718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL12, KSTAT_DATA_UINT64, "mmac_addr_12"},
3408718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL13, KSTAT_DATA_UINT64, "mmac_addr_13"},
3418718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL14, KSTAT_DATA_UINT64, "mmac_addr_14"},
3428718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL15, KSTAT_DATA_UINT64, "mmac_addr_15"},
3438718SMichael.Speer@Sun.COM 	{MMAC_ADDR_POOL16, KSTAT_DATA_UINT64, "mmac_addr_16"},
3448718SMichael.Speer@Sun.COM 	{MMAC_STATS_END, NULL, NULL},
3458718SMichael.Speer@Sun.COM };
3468718SMichael.Speer@Sun.COM 
3478718SMichael.Speer@Sun.COM 
3486349Sqs148142 /* ARGSUSED */
3496349Sqs148142 int
hxge_tdc_stat_update(kstat_t * ksp,int rw)3506349Sqs148142 hxge_tdc_stat_update(kstat_t *ksp, int rw)
3516349Sqs148142 {
3526349Sqs148142 	p_hxge_t		hxgep;
3536349Sqs148142 	p_hxge_tdc_kstat_t	tdc_kstatsp;
3546349Sqs148142 	p_hxge_tx_ring_stats_t	statsp;
3556349Sqs148142 	int			channel;
3566349Sqs148142 	char			*ch_name, *end;
3576349Sqs148142 
3586349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
3596349Sqs148142 	if (hxgep == NULL)
3606349Sqs148142 		return (-1);
3616349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_rxstat_update"));
3626349Sqs148142 
3636349Sqs148142 	ch_name = ksp->ks_name;
3646349Sqs148142 	ch_name += strlen(TDC_NAME_FORMAT1);
3656349Sqs148142 	channel = mi_strtol(ch_name, &end, 10);
3666349Sqs148142 
3676349Sqs148142 	tdc_kstatsp = (p_hxge_tdc_kstat_t)ksp->ks_data;
3686349Sqs148142 	statsp = (p_hxge_tx_ring_stats_t)&hxgep->statsp->tdc_stats[channel];
3696349Sqs148142 
3706349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL,
3716349Sqs148142 	    "hxge_tdc_stat_update data $%p statsp $%p channel %d",
3726349Sqs148142 	    ksp->ks_data, statsp, channel));
3736349Sqs148142 
3746349Sqs148142 	tdc_kstatsp->opackets.value.ull = statsp->opackets;
3756349Sqs148142 	tdc_kstatsp->obytes.value.ull = statsp->obytes;
3766349Sqs148142 	tdc_kstatsp->obytes_with_pad.value.ull = statsp->obytes_with_pad;
3776349Sqs148142 	tdc_kstatsp->oerrors.value.ull = statsp->oerrors;
3786349Sqs148142 	tdc_kstatsp->tx_hdr_pkts.value.ull = statsp->tx_hdr_pkts;
3796349Sqs148142 	tdc_kstatsp->tx_ddi_pkts.value.ull = statsp->tx_ddi_pkts;
3806349Sqs148142 	tdc_kstatsp->tx_jumbo_pkts.value.ull = statsp->tx_jumbo_pkts;
3816349Sqs148142 	tdc_kstatsp->tx_max_pend.value.ull = statsp->tx_max_pend;
3826349Sqs148142 	tdc_kstatsp->peu_resp_err.value.ul = statsp->peu_resp_err;
3836349Sqs148142 	tdc_kstatsp->pkt_size_err.value.ul = statsp->pkt_size_err;
3846349Sqs148142 	tdc_kstatsp->tx_rng_oflow.value.ul = statsp->tx_rng_oflow;
3856349Sqs148142 	tdc_kstatsp->pkt_size_hdr_err.value.ul = statsp->pkt_size_hdr_err;
3866349Sqs148142 	tdc_kstatsp->runt_pkt_drop_err.value.ul = statsp->runt_pkt_drop_err;
3876349Sqs148142 	tdc_kstatsp->pref_par_err.value.ul = statsp->pref_par_err;
3886349Sqs148142 	tdc_kstatsp->tdr_pref_cpl_to.value.ul = statsp->tdr_pref_cpl_to;
3896349Sqs148142 	tdc_kstatsp->pkt_cpl_to.value.ul = statsp->pkt_cpl_to;
3906349Sqs148142 	tdc_kstatsp->invalid_sop.value.ul = statsp->invalid_sop;
3916349Sqs148142 	tdc_kstatsp->unexpected_sop.value.ul = statsp->unexpected_sop;
3926349Sqs148142 	tdc_kstatsp->tx_starts.value.ul = statsp->tx_starts;
3936349Sqs148142 	tdc_kstatsp->tx_no_desc.value.ul = statsp->tx_no_desc;
3946349Sqs148142 	tdc_kstatsp->tx_dma_bind_fail.value.ul = statsp->tx_dma_bind_fail;
3956349Sqs148142 
3966349Sqs148142 	tdc_kstatsp->count_hdr_size_err.value.ul =
3976349Sqs148142 	    statsp->count_hdr_size_err;
3986349Sqs148142 	tdc_kstatsp->count_runt.value.ul = statsp->count_runt;
3996349Sqs148142 	tdc_kstatsp->count_abort.value.ul = statsp->count_abort;
4006349Sqs148142 	tdc_kstatsp->tx_marks.value.ul = statsp->tx_marks;
4016349Sqs148142 
4026349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, " <== hxge_tdc_stat_update"));
4036349Sqs148142 	return (0);
4046349Sqs148142 }
4056349Sqs148142 
4066349Sqs148142 /* ARGSUSED */
4076349Sqs148142 int
hxge_tdc_sys_stat_update(kstat_t * ksp,int rw)4086349Sqs148142 hxge_tdc_sys_stat_update(kstat_t *ksp, int rw)
4096349Sqs148142 {
4106349Sqs148142 	p_hxge_t		hxgep;
4116349Sqs148142 	p_hxge_tdc_sys_kstat_t	tdc_sys_kstatsp;
4126349Sqs148142 	p_hxge_tdc_sys_stats_t	statsp;
4136349Sqs148142 
4146349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
4156349Sqs148142 	if (hxgep == NULL)
4166349Sqs148142 		return (-1);
4176349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_tdc_sys_stat_update"));
4186349Sqs148142 
4196349Sqs148142 	tdc_sys_kstatsp = (p_hxge_tdc_sys_kstat_t)ksp->ks_data;
4206349Sqs148142 	statsp = (p_hxge_tdc_sys_stats_t)&hxgep->statsp->tdc_sys_stats;
4216349Sqs148142 
4226349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "hxge_tdc_sys_stat_update %llx",
4236349Sqs148142 	    ksp->ks_data));
4246349Sqs148142 
4256349Sqs148142 	tdc_sys_kstatsp->reord_tbl_par_err.value.ul =
4266349Sqs148142 	    statsp->reord_tbl_par_err;
4276349Sqs148142 	tdc_sys_kstatsp->reord_buf_ded_err.value.ul =
4286349Sqs148142 	    statsp->reord_buf_ded_err;
4296349Sqs148142 	tdc_sys_kstatsp->reord_buf_sec_err.value.ul =
4306349Sqs148142 	    statsp->reord_buf_sec_err;
4316349Sqs148142 
4326349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, " <== hxge_tdc_sys_stat_update"));
4336349Sqs148142 	return (0);
4346349Sqs148142 }
4356349Sqs148142 
4366349Sqs148142 /* ARGSUSED */
4376349Sqs148142 int
hxge_rdc_stat_update(kstat_t * ksp,int rw)4386349Sqs148142 hxge_rdc_stat_update(kstat_t *ksp, int rw)
4396349Sqs148142 {
4406349Sqs148142 	p_hxge_t		hxgep;
4416349Sqs148142 	p_hxge_rdc_kstat_t	rdc_kstatsp;
4426349Sqs148142 	p_hxge_rx_ring_stats_t	statsp;
4436349Sqs148142 	int			channel;
4446349Sqs148142 	char			*ch_name, *end;
4456349Sqs148142 
4466349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
4476349Sqs148142 	if (hxgep == NULL)
4486349Sqs148142 		return (-1);
4496349Sqs148142 
4506349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_rdc_stat_update"));
4516349Sqs148142 
4526349Sqs148142 	ch_name = ksp->ks_name;
4536349Sqs148142 	ch_name += strlen(RDC_NAME_FORMAT1);
4546349Sqs148142 	channel = mi_strtol(ch_name, &end, 10);
4556349Sqs148142 
4566349Sqs148142 	rdc_kstatsp = (p_hxge_rdc_kstat_t)ksp->ks_data;
4576349Sqs148142 	statsp = (p_hxge_rx_ring_stats_t)&hxgep->statsp->rdc_stats[channel];
4586349Sqs148142 
4596349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL,
4606349Sqs148142 	    "hxge_rdc_stat_update $%p statsp $%p channel %d",
4616349Sqs148142 	    ksp->ks_data, statsp, channel));
4626349Sqs148142 
4636349Sqs148142 	rdc_kstatsp->ipackets.value.ull = statsp->ipackets;
4646349Sqs148142 	rdc_kstatsp->rbytes.value.ull = statsp->ibytes;
4656349Sqs148142 	rdc_kstatsp->jumbo_pkts.value.ul = statsp->jumbo_pkts;
4666349Sqs148142 	rdc_kstatsp->rcr_unknown_err.value.ul = statsp->rcr_unknown_err;
4676349Sqs148142 	rdc_kstatsp->errors.value.ul = statsp->ierrors;
4686349Sqs148142 	rdc_kstatsp->rcr_sha_par_err.value.ul = statsp->rcr_sha_par;
4696349Sqs148142 	rdc_kstatsp->rbr_pre_par_err.value.ul = statsp->rbr_pre_par;
4706349Sqs148142 	rdc_kstatsp->rbr_pre_emty.value.ul = statsp->rbr_pre_empty;
4716349Sqs148142 	rdc_kstatsp->rcr_shadow_full.value.ul = statsp->rcr_shadow_full;
4726349Sqs148142 	rdc_kstatsp->rbr_tmout.value.ul = statsp->rbr_tmout;
4736349Sqs148142 	rdc_kstatsp->peu_resp_err.value.ul = statsp->peu_resp_err;
4746349Sqs148142 	rdc_kstatsp->ctrl_fifo_ecc_err.value.ul = statsp->ctrl_fifo_ecc_err;
4756349Sqs148142 	rdc_kstatsp->data_fifo_ecc_err.value.ul = statsp->data_fifo_ecc_err;
4766349Sqs148142 	rdc_kstatsp->rcrfull.value.ul = statsp->rcrfull;
4776349Sqs148142 	rdc_kstatsp->rbr_empty.value.ul = statsp->rbr_empty;
4788141SMichael.Speer@Sun.COM 	rdc_kstatsp->rbr_empty_fail.value.ul = statsp->rbr_empty_fail;
4798236SQiyan.Sun@Sun.COM 	rdc_kstatsp->rbr_empty_restore.value.ul = statsp->rbr_empty_restore;
4806349Sqs148142 	rdc_kstatsp->rbrfull.value.ul = statsp->rbrfull;
4817618SMichael.Speer@Sun.COM 	rdc_kstatsp->rcr_invalids.value.ul = statsp->rcr_invalids;
4826349Sqs148142 	rdc_kstatsp->rcr_to.value.ul = statsp->rcr_to;
4836349Sqs148142 	rdc_kstatsp->rcr_thresh.value.ul = statsp->rcr_thres;
4848103SQiyan.Sun@Sun.COM 	rdc_kstatsp->pkt_drop.value.ul = statsp->pkt_drop;
4856349Sqs148142 
4866349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, " <== hxge_rdc_stat_update"));
4876349Sqs148142 	return (0);
4886349Sqs148142 }
4896349Sqs148142 
4906349Sqs148142 /* ARGSUSED */
4916349Sqs148142 int
hxge_rdc_sys_stat_update(kstat_t * ksp,int rw)4926349Sqs148142 hxge_rdc_sys_stat_update(kstat_t *ksp, int rw)
4936349Sqs148142 {
4946349Sqs148142 	p_hxge_t		hxgep;
4956349Sqs148142 	p_hxge_rdc_sys_kstat_t	rdc_sys_kstatsp;
4966349Sqs148142 	p_hxge_rdc_sys_stats_t	statsp;
4976349Sqs148142 
4986349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
4996349Sqs148142 	if (hxgep == NULL)
5006349Sqs148142 		return (-1);
5016349Sqs148142 
5026349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_rdc_sys_stat_update"));
5036349Sqs148142 
5046349Sqs148142 	rdc_sys_kstatsp = (p_hxge_rdc_sys_kstat_t)ksp->ks_data;
5056349Sqs148142 	statsp = (p_hxge_rdc_sys_stats_t)&hxgep->statsp->rdc_sys_stats;
5066349Sqs148142 
5076349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "hxge_rdc_sys_stat_update %llx",
5086349Sqs148142 	    ksp->ks_data));
5096349Sqs148142 
5106349Sqs148142 	rdc_sys_kstatsp->ctrl_fifo_sec.value.ul = statsp->ctrl_fifo_sec;
5116349Sqs148142 	rdc_sys_kstatsp->ctrl_fifo_ded.value.ul = statsp->ctrl_fifo_ded;
5126349Sqs148142 	rdc_sys_kstatsp->data_fifo_sec.value.ul = statsp->data_fifo_sec;
5136349Sqs148142 	rdc_sys_kstatsp->data_fifo_ded.value.ul = statsp->data_fifo_ded;
5146349Sqs148142 
5156349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, " <== hxge_rdc_sys_stat_update"));
5166349Sqs148142 	return (0);
5176349Sqs148142 }
5186349Sqs148142 
5196349Sqs148142 /* ARGSUSED */
5206349Sqs148142 int
hxge_vmac_stat_update(kstat_t * ksp,int rw)5216349Sqs148142 hxge_vmac_stat_update(kstat_t *ksp, int rw)
5226349Sqs148142 {
5236349Sqs148142 	p_hxge_t		hxgep;
5246349Sqs148142 	p_hxge_vmac_kstat_t	vmac_kstatsp;
5256349Sqs148142 	p_hxge_vmac_stats_t	statsp;
5266349Sqs148142 
5276349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
5286349Sqs148142 	if (hxgep == NULL)
5296349Sqs148142 		return (-1);
5306349Sqs148142 
5316349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_vmac_stat_update"));
5326349Sqs148142 
5336349Sqs148142 	hxge_save_cntrs(hxgep);
5346349Sqs148142 
5356349Sqs148142 	vmac_kstatsp = (p_hxge_vmac_kstat_t)ksp->ks_data;
5366349Sqs148142 	statsp = (p_hxge_vmac_stats_t)&hxgep->statsp->vmac_stats;
5376349Sqs148142 
5386349Sqs148142 	vmac_kstatsp->tx_frame_cnt.value.ul = statsp->tx_frame_cnt;
5396349Sqs148142 	vmac_kstatsp->tx_byte_cnt.value.ul = statsp->tx_byte_cnt;
5406349Sqs148142 
5416349Sqs148142 	vmac_kstatsp->rx_frame_cnt.value.ul = statsp->rx_frame_cnt;
5426349Sqs148142 	vmac_kstatsp->rx_byte_cnt.value.ul = statsp->rx_byte_cnt;
5436349Sqs148142 	vmac_kstatsp->rx_drop_frame_cnt.value.ul = statsp->rx_drop_frame_cnt;
5446349Sqs148142 	vmac_kstatsp->rx_drop_byte_cnt.value.ul = statsp->rx_drop_byte_cnt;
5456349Sqs148142 	vmac_kstatsp->rx_crc_cnt.value.ul = statsp->rx_crc_cnt;
5466349Sqs148142 	vmac_kstatsp->rx_pause_cnt.value.ul = statsp->rx_pause_cnt;
5476349Sqs148142 	vmac_kstatsp->rx_bcast_fr_cnt.value.ul = statsp->rx_bcast_fr_cnt;
5486349Sqs148142 	vmac_kstatsp->rx_mcast_fr_cnt.value.ul = statsp->rx_mcast_fr_cnt;
5496349Sqs148142 
5506349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_vmac_stat_update"));
5516349Sqs148142 	return (0);
5526349Sqs148142 }
5536349Sqs148142 
5546349Sqs148142 /* ARGSUSED */
5556349Sqs148142 int
hxge_pfc_stat_update(kstat_t * ksp,int rw)5566349Sqs148142 hxge_pfc_stat_update(kstat_t *ksp, int rw)
5576349Sqs148142 {
5586349Sqs148142 	p_hxge_t		hxgep;
5596349Sqs148142 	p_hxge_pfc_kstat_t	kstatsp;
5606349Sqs148142 	p_hxge_pfc_stats_t	statsp;
5616349Sqs148142 
5626349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
5636349Sqs148142 	if (hxgep == NULL)
5646349Sqs148142 		return (-1);
5656349Sqs148142 
5666349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_pfc_stat_update"));
5676349Sqs148142 
5686349Sqs148142 	kstatsp = (p_hxge_pfc_kstat_t)ksp->ks_data;
5696349Sqs148142 	statsp = (p_hxge_pfc_stats_t)&hxgep->statsp->pfc_stats;
5706349Sqs148142 
5716349Sqs148142 	kstatsp->pfc_pkt_drop.value.ul = statsp->pkt_drop;
5726349Sqs148142 	kstatsp->pfc_tcam_parity_err.value.ul = statsp->tcam_parity_err;
5736349Sqs148142 	kstatsp->pfc_vlan_parity_err.value.ul = statsp->vlan_parity_err;
5746349Sqs148142 	kstatsp->pfc_bad_cs_count.value.ul = statsp->bad_cs_count;
5756349Sqs148142 	kstatsp->pfc_drop_count.value.ul = statsp->drop_count;
5766349Sqs148142 	kstatsp->pfc_tcp_ctrl_drop.value.ul = statsp->errlog.tcp_ctrl_drop;
5776349Sqs148142 	kstatsp->pfc_l2_addr_drop.value.ul = statsp->errlog.l2_addr_drop;
5786349Sqs148142 	kstatsp->pfc_class_code_drop.value.ul = statsp->errlog.class_code_drop;
5796349Sqs148142 	kstatsp->pfc_tcam_drop.value.ul = statsp->errlog.tcam_drop;
5806349Sqs148142 	kstatsp->pfc_vlan_drop.value.ul = statsp->errlog.vlan_drop;
5816349Sqs148142 
5826349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_pfc_stat_update"));
5836349Sqs148142 	return (0);
5846349Sqs148142 }
5856349Sqs148142 
5866349Sqs148142 /* ARGSUSED */
5876349Sqs148142 int
hxge_peu_sys_stat_update(kstat_t * ksp,int rw)5886349Sqs148142 hxge_peu_sys_stat_update(kstat_t *ksp, int rw)
5896349Sqs148142 {
5906349Sqs148142 	p_hxge_t		hxgep;
5916349Sqs148142 	p_hxge_peu_sys_kstat_t	peu_kstatsp;
5926349Sqs148142 	p_hxge_peu_sys_stats_t	statsp;
5936349Sqs148142 
5946349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
5956349Sqs148142 	if (hxgep == NULL)
5966349Sqs148142 		return (-1);
5976349Sqs148142 
5986349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_peu_sys_stat_update"));
5996349Sqs148142 
6006349Sqs148142 	peu_kstatsp = (p_hxge_peu_sys_kstat_t)ksp->ks_data;
6016349Sqs148142 	statsp = (p_hxge_peu_sys_stats_t)&hxgep->statsp->peu_sys_stats;
6026349Sqs148142 
6036349Sqs148142 	peu_kstatsp->spc_acc_err.value.ul = statsp->spc_acc_err;
6046349Sqs148142 	peu_kstatsp->tdc_pioacc_err.value.ul = statsp->tdc_pioacc_err;
6056349Sqs148142 	peu_kstatsp->rdc_pioacc_err.value.ul = statsp->rdc_pioacc_err;
6066349Sqs148142 	peu_kstatsp->pfc_pioacc_err.value.ul = statsp->pfc_pioacc_err;
6076349Sqs148142 	peu_kstatsp->vmac_pioacc_err.value.ul = statsp->vmac_pioacc_err;
6086349Sqs148142 	peu_kstatsp->cpl_hdrq_parerr.value.ul = statsp->cpl_hdrq_parerr;
6096349Sqs148142 	peu_kstatsp->cpl_dataq_parerr.value.ul = statsp->cpl_dataq_parerr;
6106349Sqs148142 	peu_kstatsp->retryram_xdlh_parerr.value.ul =
6116349Sqs148142 	    statsp->retryram_xdlh_parerr;
6126349Sqs148142 	peu_kstatsp->retrysotram_xdlh_parerr.value.ul =
6136349Sqs148142 	    statsp->retrysotram_xdlh_parerr;
6146349Sqs148142 	peu_kstatsp->p_hdrq_parerr.value.ul = statsp->p_hdrq_parerr;
6156349Sqs148142 	peu_kstatsp->p_dataq_parerr.value.ul = statsp->p_dataq_parerr;
6166349Sqs148142 	peu_kstatsp->np_hdrq_parerr.value.ul = statsp->np_hdrq_parerr;
6176349Sqs148142 	peu_kstatsp->np_dataq_parerr.value.ul = statsp->np_dataq_parerr;
6186349Sqs148142 	peu_kstatsp->eic_msix_parerr.value.ul = statsp->eic_msix_parerr;
6196349Sqs148142 	peu_kstatsp->hcr_parerr.value.ul = statsp->hcr_parerr;
6206349Sqs148142 
6216349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_peu_sys_stat_update"));
6226349Sqs148142 	return (0);
6236349Sqs148142 }
6246349Sqs148142 
6256349Sqs148142 static kstat_t *
hxge_setup_local_kstat(p_hxge_t hxgep,int instance,char * name,const hxge_kstat_index_t * ksip,size_t count,int (* update)(kstat_t *,int))6266349Sqs148142 hxge_setup_local_kstat(p_hxge_t hxgep, int instance, char *name,
6276349Sqs148142 	const hxge_kstat_index_t *ksip, size_t count,
6286349Sqs148142 	int (*update) (kstat_t *, int))
6296349Sqs148142 {
6306349Sqs148142 	kstat_t		*ksp;
6316349Sqs148142 	kstat_named_t	*knp;
6326349Sqs148142 	int		i;
6336349Sqs148142 
6346349Sqs148142 	ksp = kstat_create(HXGE_DRIVER_NAME, instance, name, "net",
6356349Sqs148142 	    KSTAT_TYPE_NAMED, count, 0);
6366349Sqs148142 	if (ksp == NULL)
6376349Sqs148142 		return (NULL);
6386349Sqs148142 
6396349Sqs148142 	ksp->ks_private = (void *) hxgep;
6406349Sqs148142 	ksp->ks_update = update;
6416349Sqs148142 	knp = ksp->ks_data;
6426349Sqs148142 
6436349Sqs148142 	for (i = 0; ksip[i].name != NULL; i++) {
6446349Sqs148142 		kstat_named_init(&knp[i], ksip[i].name, ksip[i].type);
6456349Sqs148142 	}
6466349Sqs148142 
6476349Sqs148142 	kstat_install(ksp);
6486349Sqs148142 
6496349Sqs148142 	return (ksp);
6506349Sqs148142 }
6516349Sqs148142 
6526349Sqs148142 void
hxge_setup_kstats(p_hxge_t hxgep)6536349Sqs148142 hxge_setup_kstats(p_hxge_t hxgep)
6546349Sqs148142 {
6556349Sqs148142 	struct kstat		*ksp;
6566349Sqs148142 	p_hxge_port_kstat_t	hxgekp;
6576349Sqs148142 	size_t			hxge_kstat_sz;
6586349Sqs148142 	char			stat_name[64];
6596349Sqs148142 	int			i;
6606349Sqs148142 
6616349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_setup_kstats"));
6626349Sqs148142 
6636349Sqs148142 	/* Setup RDC statistics */
6646349Sqs148142 	for (i = 0; i < hxgep->nrdc; i++) {
6656349Sqs148142 		(void) sprintf(stat_name, "%s"CH_NAME_FORMAT,
6666349Sqs148142 		    RDC_NAME_FORMAT1, i);
6676349Sqs148142 		hxgep->statsp->rdc_ksp[i] = hxge_setup_local_kstat(hxgep,
6686349Sqs148142 		    hxgep->instance, stat_name, &hxge_rdc_stats[0],
6696349Sqs148142 		    RDC_STAT_END, hxge_rdc_stat_update);
6706349Sqs148142 		if (hxgep->statsp->rdc_ksp[i] == NULL)
6716349Sqs148142 			cmn_err(CE_WARN,
6726349Sqs148142 			    "kstat_create failed for rdc channel %d", i);
6736349Sqs148142 	}
6746349Sqs148142 
6756349Sqs148142 	/* Setup RDC System statistics */
6766349Sqs148142 	hxgep->statsp->rdc_sys_ksp = hxge_setup_local_kstat(hxgep,
6776349Sqs148142 	    hxgep->instance, "RDC_system", &hxge_rdc_sys_stats[0],
6786349Sqs148142 	    RDC_SYS_STAT_END, hxge_rdc_sys_stat_update);
6796349Sqs148142 	if (hxgep->statsp->rdc_sys_ksp == NULL)
6806349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for rdc_sys_ksp");
6816349Sqs148142 
6826349Sqs148142 	/* Setup TDC statistics */
6836349Sqs148142 	for (i = 0; i < hxgep->ntdc; i++) {
6846349Sqs148142 		(void) sprintf(stat_name, "%s"CH_NAME_FORMAT,
6856349Sqs148142 		    TDC_NAME_FORMAT1, i);
6866349Sqs148142 		hxgep->statsp->tdc_ksp[i] = hxge_setup_local_kstat(hxgep,
6876349Sqs148142 		    hxgep->instance, stat_name, &hxge_tdc_stats[0],
6886349Sqs148142 		    TDC_STAT_END, hxge_tdc_stat_update);
6896349Sqs148142 		if (hxgep->statsp->tdc_ksp[i] == NULL)
6906349Sqs148142 			cmn_err(CE_WARN,
6916349Sqs148142 			    "kstat_create failed for tdc channel %d", i);
6926349Sqs148142 	}
6936349Sqs148142 
6946349Sqs148142 	/* Setup TDC System statistics */
6956349Sqs148142 	hxgep->statsp->tdc_sys_ksp = hxge_setup_local_kstat(hxgep,
6966349Sqs148142 	    hxgep->instance, "TDC_system", &hxge_tdc_sys_stats[0],
6976349Sqs148142 	    RDC_SYS_STAT_END, hxge_tdc_sys_stat_update);
6986349Sqs148142 	if (hxgep->statsp->tdc_sys_ksp == NULL)
6996349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for tdc_sys_ksp");
7006349Sqs148142 
7016349Sqs148142 	/* Setup PFC statistics */
7026349Sqs148142 	hxgep->statsp->pfc_ksp = hxge_setup_local_kstat(hxgep,
7036349Sqs148142 	    hxgep->instance, "PFC", &hxge_pfc_stats[0],
7046349Sqs148142 	    PFC_STAT_END, hxge_pfc_stat_update);
7056349Sqs148142 	if (hxgep->statsp->pfc_ksp == NULL)
7066349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for pfc");
7076349Sqs148142 
7086349Sqs148142 	/* Setup VMAC statistics */
7096349Sqs148142 	hxgep->statsp->vmac_ksp = hxge_setup_local_kstat(hxgep,
7106349Sqs148142 	    hxgep->instance, "VMAC", &hxge_vmac_stats[0],
7116349Sqs148142 	    VMAC_STAT_END, hxge_vmac_stat_update);
7126349Sqs148142 	if (hxgep->statsp->vmac_ksp == NULL)
7136349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for vmac");
7146349Sqs148142 
7158718SMichael.Speer@Sun.COM 	/* Setup MMAC Statistics. */
7168718SMichael.Speer@Sun.COM 	hxgep->statsp->mmac_ksp = hxge_setup_local_kstat(hxgep,
7178718SMichael.Speer@Sun.COM 	    hxgep->instance, "MMAC", &hxge_mmac_stats[0],
7188718SMichael.Speer@Sun.COM 	    MMAC_STATS_END, hxge_mmac_stat_update);
7198718SMichael.Speer@Sun.COM 	if (hxgep->statsp->mmac_ksp == NULL)
7208718SMichael.Speer@Sun.COM 		cmn_err(CE_WARN, "kstat_create failed for mmac");
7218718SMichael.Speer@Sun.COM 
7226349Sqs148142 	/* Setup PEU System statistics */
7236349Sqs148142 	hxgep->statsp->peu_sys_ksp = hxge_setup_local_kstat(hxgep,
7246349Sqs148142 	    hxgep->instance, "PEU", &hxge_peu_sys_stats[0],
7256349Sqs148142 	    PEU_SYS_STAT_END, hxge_peu_sys_stat_update);
7266349Sqs148142 	if (hxgep->statsp->peu_sys_ksp == NULL)
7276349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for peu sys");
7286349Sqs148142 
7296349Sqs148142 	/* Port stats */
7306349Sqs148142 	hxge_kstat_sz = sizeof (hxge_port_kstat_t);
7316349Sqs148142 
7326349Sqs148142 	if ((ksp = kstat_create(HXGE_DRIVER_NAME, hxgep->instance,
7336349Sqs148142 	    "Port", "net", KSTAT_TYPE_NAMED,
7346349Sqs148142 	    hxge_kstat_sz / sizeof (kstat_named_t), 0)) == NULL) {
7356349Sqs148142 		cmn_err(CE_WARN, "kstat_create failed for port stat");
7366349Sqs148142 		return;
7376349Sqs148142 	}
7386349Sqs148142 
7396349Sqs148142 	hxgekp = (p_hxge_port_kstat_t)ksp->ks_data;
7406349Sqs148142 
7416349Sqs148142 	kstat_named_init(&hxgekp->cap_10gfdx, "cap_10gfdx", KSTAT_DATA_ULONG);
7426349Sqs148142 
7436349Sqs148142 	/*
7446349Sqs148142 	 * Link partner capabilities.
7456349Sqs148142 	 */
7466349Sqs148142 	kstat_named_init(&hxgekp->lp_cap_10gfdx, "lp_cap_10gfdx",
7476349Sqs148142 	    KSTAT_DATA_ULONG);
7486349Sqs148142 
7496349Sqs148142 	/*
7506349Sqs148142 	 * Shared link setup.
7516349Sqs148142 	 */
7526349Sqs148142 	kstat_named_init(&hxgekp->link_speed, "link_speed", KSTAT_DATA_ULONG);
7536349Sqs148142 	kstat_named_init(&hxgekp->link_duplex, "link_duplex", KSTAT_DATA_CHAR);
7546349Sqs148142 	kstat_named_init(&hxgekp->link_up, "link_up", KSTAT_DATA_ULONG);
7556349Sqs148142 
7566349Sqs148142 	/*
7576349Sqs148142 	 * Loopback statistics.
7586349Sqs148142 	 */
7596349Sqs148142 	kstat_named_init(&hxgekp->lb_mode, "lb_mode", KSTAT_DATA_ULONG);
7606349Sqs148142 
7616349Sqs148142 	/* General MAC statistics */
7626349Sqs148142 
7636349Sqs148142 	kstat_named_init(&hxgekp->ifspeed, "ifspeed", KSTAT_DATA_UINT64);
7646349Sqs148142 	kstat_named_init(&hxgekp->promisc, "promisc", KSTAT_DATA_CHAR);
7656349Sqs148142 
7666349Sqs148142 	ksp->ks_update = hxge_port_kstat_update;
7676349Sqs148142 	ksp->ks_private = (void *) hxgep;
7686349Sqs148142 	kstat_install(ksp);
7696349Sqs148142 	hxgep->statsp->port_ksp = ksp;
7706349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_setup_kstats"));
7716349Sqs148142 }
7726349Sqs148142 
7736349Sqs148142 void
hxge_destroy_kstats(p_hxge_t hxgep)7746349Sqs148142 hxge_destroy_kstats(p_hxge_t hxgep)
7756349Sqs148142 {
7766349Sqs148142 	int			channel;
7776349Sqs148142 	p_hxge_dma_pt_cfg_t	p_dma_cfgp;
7786349Sqs148142 	p_hxge_hw_pt_cfg_t	p_cfgp;
7796349Sqs148142 
7806349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_destroy_kstats"));
7816349Sqs148142 	if (hxgep->statsp == NULL)
7826349Sqs148142 		return;
7836349Sqs148142 
7846349Sqs148142 	if (hxgep->statsp->ksp)
7856349Sqs148142 		kstat_delete(hxgep->statsp->ksp);
7866349Sqs148142 
7876349Sqs148142 	p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
7886349Sqs148142 	p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
7896349Sqs148142 
7906349Sqs148142 	for (channel = 0; channel < p_cfgp->max_rdcs; channel++) {
7916349Sqs148142 		if (hxgep->statsp->rdc_ksp[channel]) {
7926349Sqs148142 			kstat_delete(hxgep->statsp->rdc_ksp[channel]);
7936349Sqs148142 		}
7946349Sqs148142 	}
7956349Sqs148142 
7966349Sqs148142 	for (channel = 0; channel < p_cfgp->max_tdcs; channel++) {
7976349Sqs148142 		if (hxgep->statsp->tdc_ksp[channel]) {
7986349Sqs148142 			kstat_delete(hxgep->statsp->tdc_ksp[channel]);
7996349Sqs148142 		}
8006349Sqs148142 	}
8016349Sqs148142 
8026349Sqs148142 	if (hxgep->statsp->rdc_sys_ksp)
8036349Sqs148142 		kstat_delete(hxgep->statsp->rdc_sys_ksp);
8046349Sqs148142 
8056349Sqs148142 	if (hxgep->statsp->tdc_sys_ksp)
8066349Sqs148142 		kstat_delete(hxgep->statsp->tdc_sys_ksp);
8076349Sqs148142 
8086349Sqs148142 	if (hxgep->statsp->peu_sys_ksp)
8096349Sqs148142 		kstat_delete(hxgep->statsp->peu_sys_ksp);
8106349Sqs148142 
8116349Sqs148142 	if (hxgep->statsp->mmac_ksp)
8126349Sqs148142 		kstat_delete(hxgep->statsp->mmac_ksp);
8136349Sqs148142 
8146349Sqs148142 	if (hxgep->statsp->pfc_ksp)
8156349Sqs148142 		kstat_delete(hxgep->statsp->pfc_ksp);
8166349Sqs148142 
8176349Sqs148142 	if (hxgep->statsp->vmac_ksp)
8186349Sqs148142 		kstat_delete(hxgep->statsp->vmac_ksp);
8196349Sqs148142 
8206349Sqs148142 	if (hxgep->statsp->port_ksp)
8216349Sqs148142 		kstat_delete(hxgep->statsp->port_ksp);
8226349Sqs148142 
8236349Sqs148142 	if (hxgep->statsp)
8246349Sqs148142 		KMEM_FREE(hxgep->statsp, hxgep->statsp->stats_size);
8256349Sqs148142 
8266349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_destroy_kstats"));
8276349Sqs148142 }
8286349Sqs148142 
8296349Sqs148142 /* ARGSUSED */
8306349Sqs148142 int
hxge_port_kstat_update(kstat_t * ksp,int rw)8316349Sqs148142 hxge_port_kstat_update(kstat_t *ksp, int rw)
8326349Sqs148142 {
8336349Sqs148142 	p_hxge_t		hxgep;
8346349Sqs148142 	p_hxge_stats_t		statsp;
8356349Sqs148142 	p_hxge_port_kstat_t	hxgekp;
8366349Sqs148142 	p_hxge_port_stats_t	psp;
8376349Sqs148142 
8386349Sqs148142 	hxgep = (p_hxge_t)ksp->ks_private;
8396349Sqs148142 	if (hxgep == NULL)
8406349Sqs148142 		return (-1);
8416349Sqs148142 
8426349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_port_kstat_update"));
8436349Sqs148142 	statsp = (p_hxge_stats_t)hxgep->statsp;
8446349Sqs148142 	hxgekp = (p_hxge_port_kstat_t)ksp->ks_data;
8456349Sqs148142 	psp = &statsp->port_stats;
8466349Sqs148142 
8476349Sqs148142 	if (hxgep->filter.all_phys_cnt)
8486349Sqs148142 		(void) strcpy(hxgekp->promisc.value.c, "phys");
8496349Sqs148142 	else if (hxgep->filter.all_multicast_cnt)
8506349Sqs148142 		(void) strcpy(hxgekp->promisc.value.c, "multi");
8516349Sqs148142 	else
8526349Sqs148142 		(void) strcpy(hxgekp->promisc.value.c, "off");
8536349Sqs148142 	hxgekp->ifspeed.value.ul = statsp->mac_stats.link_speed * 1000000ULL;
8546349Sqs148142 
8556349Sqs148142 	/*
8566349Sqs148142 	 * transceiver state informations.
8576349Sqs148142 	 */
8586349Sqs148142 	hxgekp->cap_10gfdx.value.ul = statsp->mac_stats.cap_10gfdx;
8596349Sqs148142 
8606349Sqs148142 	/*
8616349Sqs148142 	 * Link partner capabilities.
8626349Sqs148142 	 */
8636349Sqs148142 	hxgekp->lp_cap_10gfdx.value.ul = statsp->mac_stats.lp_cap_10gfdx;
8646349Sqs148142 
8656349Sqs148142 	/*
8666349Sqs148142 	 * Physical link statistics.
8676349Sqs148142 	 */
8686349Sqs148142 	hxgekp->link_speed.value.ul = statsp->mac_stats.link_speed;
8696349Sqs148142 	if (statsp->mac_stats.link_duplex == 2)
8706349Sqs148142 		(void) strcpy(hxgekp->link_duplex.value.c, "full");
8716349Sqs148142 	else
8726349Sqs148142 		(void) strcpy(hxgekp->link_duplex.value.c, "unknown");
8736349Sqs148142 	hxgekp->link_up.value.ul = statsp->mac_stats.link_up;
8746349Sqs148142 
8756349Sqs148142 	/*
8766349Sqs148142 	 * Loopback statistics.
8776349Sqs148142 	 */
8786349Sqs148142 	hxgekp->lb_mode.value.ul = psp->lb_mode;
8796349Sqs148142 
8806349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_port_kstat_update"));
8816349Sqs148142 	return (0);
8826349Sqs148142 }
8836349Sqs148142 
884*11878SVenu.Iyer@Sun.COM /*
885*11878SVenu.Iyer@Sun.COM  * Retrieve a value for one of the statistics for a particular rx ring
886*11878SVenu.Iyer@Sun.COM  */
887*11878SVenu.Iyer@Sun.COM int
hxge_rx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)888*11878SVenu.Iyer@Sun.COM hxge_rx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
889*11878SVenu.Iyer@Sun.COM {
890*11878SVenu.Iyer@Sun.COM 	p_hxge_ring_handle_t	rhp = (p_hxge_ring_handle_t)rdriver;
891*11878SVenu.Iyer@Sun.COM 	p_hxge_t		hxgep = rhp->hxgep;
892*11878SVenu.Iyer@Sun.COM 
893*11878SVenu.Iyer@Sun.COM 	ASSERT(rhp != NULL);
894*11878SVenu.Iyer@Sun.COM 	ASSERT(hxgep != NULL);
895*11878SVenu.Iyer@Sun.COM 	ASSERT(hxgep->statsp != NULL);
896*11878SVenu.Iyer@Sun.COM 	ASSERT(0 <= rhp->index < HXGE_MAX_RDCS);
897*11878SVenu.Iyer@Sun.COM 
898*11878SVenu.Iyer@Sun.COM 	switch (stat) {
899*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_IERRORS:
900*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->rdc_stats[rhp->index].ierrors;
901*11878SVenu.Iyer@Sun.COM 		break;
902*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_RBYTES:
903*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->rdc_stats[rhp->index].ibytes;
904*11878SVenu.Iyer@Sun.COM 		break;
905*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_IPACKETS:
906*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->rdc_stats[rhp->index].ipackets;
907*11878SVenu.Iyer@Sun.COM 		break;
908*11878SVenu.Iyer@Sun.COM 	default:
909*11878SVenu.Iyer@Sun.COM 		*val = 0;
910*11878SVenu.Iyer@Sun.COM 		return (ENOTSUP);
911*11878SVenu.Iyer@Sun.COM 	}
912*11878SVenu.Iyer@Sun.COM 
913*11878SVenu.Iyer@Sun.COM 	return (0);
914*11878SVenu.Iyer@Sun.COM }
915*11878SVenu.Iyer@Sun.COM 
916*11878SVenu.Iyer@Sun.COM /*
917*11878SVenu.Iyer@Sun.COM  * Retrieve a value for one of the statistics for a particular tx ring
918*11878SVenu.Iyer@Sun.COM  */
919*11878SVenu.Iyer@Sun.COM int
hxge_tx_ring_stat(mac_ring_driver_t rdriver,uint_t stat,uint64_t * val)920*11878SVenu.Iyer@Sun.COM hxge_tx_ring_stat(mac_ring_driver_t rdriver, uint_t stat, uint64_t *val)
921*11878SVenu.Iyer@Sun.COM {
922*11878SVenu.Iyer@Sun.COM 	p_hxge_ring_handle_t    rhp = (p_hxge_ring_handle_t)rdriver;
923*11878SVenu.Iyer@Sun.COM 	p_hxge_t		hxgep = rhp->hxgep;
924*11878SVenu.Iyer@Sun.COM 
925*11878SVenu.Iyer@Sun.COM 	ASSERT(rhp != NULL);
926*11878SVenu.Iyer@Sun.COM 	ASSERT(hxgep != NULL);
927*11878SVenu.Iyer@Sun.COM 	ASSERT(hxgep->statsp != NULL);
928*11878SVenu.Iyer@Sun.COM 	ASSERT(0 <= rhp->index < HXGE_MAX_TDCS);
929*11878SVenu.Iyer@Sun.COM 
930*11878SVenu.Iyer@Sun.COM 	switch (stat) {
931*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OERRORS:
932*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->tdc_stats[rhp->index].oerrors;
933*11878SVenu.Iyer@Sun.COM 		break;
934*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OBYTES:
935*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->tdc_stats[rhp->index].obytes;
936*11878SVenu.Iyer@Sun.COM 		break;
937*11878SVenu.Iyer@Sun.COM 	case MAC_STAT_OPACKETS:
938*11878SVenu.Iyer@Sun.COM 		*val = hxgep->statsp->tdc_stats[rhp->index].opackets;
939*11878SVenu.Iyer@Sun.COM 		break;
940*11878SVenu.Iyer@Sun.COM 	default:
941*11878SVenu.Iyer@Sun.COM 		*val = 0;
942*11878SVenu.Iyer@Sun.COM 		return (ENOTSUP);
943*11878SVenu.Iyer@Sun.COM 	}
944*11878SVenu.Iyer@Sun.COM 
945*11878SVenu.Iyer@Sun.COM 	return (0);
946*11878SVenu.Iyer@Sun.COM }
947*11878SVenu.Iyer@Sun.COM 
9486349Sqs148142 int
hxge_m_stat(void * arg,uint_t stat,uint64_t * value)9496349Sqs148142 hxge_m_stat(void *arg, uint_t stat, uint64_t *value)
9506349Sqs148142 {
9516349Sqs148142 	p_hxge_t		hxgep = (p_hxge_t)arg;
9526349Sqs148142 	p_hxge_stats_t		statsp;
9536349Sqs148142 	hxge_tx_ring_stats_t	*tx_stats;
9546349Sqs148142 	uint64_t		val = 0;
9556349Sqs148142 	int			channel;
9566349Sqs148142 
9576349Sqs148142 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_m_stat"));
9586349Sqs148142 	statsp = (p_hxge_stats_t)hxgep->statsp;
9596349Sqs148142 
9606349Sqs148142 	switch (stat) {
9616349Sqs148142 	case MAC_STAT_IFSPEED:
9626349Sqs148142 		val = statsp->mac_stats.link_speed * 1000000ull;
9636349Sqs148142 		break;
9646349Sqs148142 
9656349Sqs148142 	case MAC_STAT_MULTIRCV:
9666349Sqs148142 		val = 0;
9676349Sqs148142 		break;
9686349Sqs148142 
9696349Sqs148142 	case MAC_STAT_BRDCSTRCV:
9706349Sqs148142 		val = 0;
9716349Sqs148142 		break;
9726349Sqs148142 
9736349Sqs148142 	case MAC_STAT_MULTIXMT:
9746349Sqs148142 		val = 0;
9756349Sqs148142 		break;
9766349Sqs148142 
9776349Sqs148142 	case MAC_STAT_BRDCSTXMT:
9786349Sqs148142 		val = 0;
9796349Sqs148142 		break;
9806349Sqs148142 
9816349Sqs148142 	case MAC_STAT_NORCVBUF:
9826349Sqs148142 		val = 0;
9836349Sqs148142 		break;
9846349Sqs148142 
9856349Sqs148142 	case MAC_STAT_IERRORS:
9866349Sqs148142 	case ETHER_STAT_MACRCV_ERRORS:
9876349Sqs148142 		val = 0;
9886349Sqs148142 		for (channel = 0; channel < hxgep->nrdc; channel++) {
9896349Sqs148142 			val += statsp->rdc_stats[channel].ierrors;
9906349Sqs148142 		}
9916349Sqs148142 		break;
9926349Sqs148142 
9936349Sqs148142 	case MAC_STAT_NOXMTBUF:
9946349Sqs148142 		val = 0;
9956349Sqs148142 		break;
9966349Sqs148142 
9976349Sqs148142 	case MAC_STAT_OERRORS:
9986349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
9996349Sqs148142 			val += statsp->tdc_stats[channel].oerrors;
10006349Sqs148142 		}
10016349Sqs148142 		break;
10026349Sqs148142 
10036349Sqs148142 	case MAC_STAT_COLLISIONS:
10046349Sqs148142 		val = 0;
10056349Sqs148142 		break;
10066349Sqs148142 
10076349Sqs148142 	case MAC_STAT_RBYTES:
10086349Sqs148142 		for (channel = 0; channel < hxgep->nrdc; channel++) {
10096349Sqs148142 			val += statsp->rdc_stats[channel].ibytes;
10106349Sqs148142 		}
10116349Sqs148142 		break;
10126349Sqs148142 
10136349Sqs148142 	case MAC_STAT_IPACKETS:
10146349Sqs148142 		for (channel = 0; channel < hxgep->nrdc; channel++) {
10156349Sqs148142 			val += statsp->rdc_stats[channel].ipackets;
10166349Sqs148142 		}
10176349Sqs148142 		break;
10186349Sqs148142 
10196349Sqs148142 	case MAC_STAT_OBYTES:
10206349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
10216349Sqs148142 			val += statsp->tdc_stats[channel].obytes;
10226349Sqs148142 		}
10236349Sqs148142 		break;
10246349Sqs148142 
10256349Sqs148142 	case MAC_STAT_OPACKETS:
10266349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
10276349Sqs148142 			val += statsp->tdc_stats[channel].opackets;
10286349Sqs148142 		}
10296349Sqs148142 		break;
10306349Sqs148142 
10316349Sqs148142 	case MAC_STAT_UNKNOWNS:
10326349Sqs148142 		val = 0;
10336349Sqs148142 		break;
10346349Sqs148142 
10356349Sqs148142 	case MAC_STAT_UNDERFLOWS:
10366349Sqs148142 		val = 0;
10376349Sqs148142 		break;
10386349Sqs148142 
10396349Sqs148142 	case MAC_STAT_OVERFLOWS:
10406349Sqs148142 		val = 0;
10416349Sqs148142 		break;
10426349Sqs148142 
10436349Sqs148142 	case MAC_STAT_LINK_STATE:
10446349Sqs148142 		val = statsp->mac_stats.link_duplex;
10456349Sqs148142 		break;
10466349Sqs148142 	case MAC_STAT_LINK_UP:
10476349Sqs148142 		val = statsp->mac_stats.link_up;
10486349Sqs148142 		break;
10496349Sqs148142 	case MAC_STAT_PROMISC:
10506349Sqs148142 		val = statsp->mac_stats.promisc;
10516349Sqs148142 		break;
10526349Sqs148142 	case ETHER_STAT_SQE_ERRORS:
10536349Sqs148142 		val = 0;
10546349Sqs148142 		break;
10556349Sqs148142 
10566349Sqs148142 	case ETHER_STAT_ALIGN_ERRORS:
10576349Sqs148142 		/*
10586349Sqs148142 		 * No similar error in Hydra receive channels
10596349Sqs148142 		 */
10606349Sqs148142 		val = 0;
10616349Sqs148142 		break;
10626349Sqs148142 
10636349Sqs148142 	case ETHER_STAT_FCS_ERRORS:
10646349Sqs148142 		/*
10656349Sqs148142 		 * No similar error in Hydra receive channels
10666349Sqs148142 		 */
10676349Sqs148142 		val = 0;
10686349Sqs148142 		break;
10696349Sqs148142 
10706349Sqs148142 	case ETHER_STAT_FIRST_COLLISIONS:
10716349Sqs148142 		val = 0;
10726349Sqs148142 		break;
10736349Sqs148142 
10746349Sqs148142 	case ETHER_STAT_MULTI_COLLISIONS:
10756349Sqs148142 		val = 0;
10766349Sqs148142 		break;
10776349Sqs148142 
10786349Sqs148142 	case ETHER_STAT_TX_LATE_COLLISIONS:
10796349Sqs148142 		val = 0;
10806349Sqs148142 		break;
10816349Sqs148142 
10826349Sqs148142 	case ETHER_STAT_EX_COLLISIONS:
10836349Sqs148142 		val = 0;
10846349Sqs148142 		break;
10856349Sqs148142 
10866349Sqs148142 	case ETHER_STAT_DEFER_XMTS:
10876349Sqs148142 		val = 0;
10886349Sqs148142 		break;
10896349Sqs148142 
10906349Sqs148142 	case ETHER_STAT_MACXMT_ERRORS:
10916349Sqs148142 		/*
10926349Sqs148142 		 * A count of frames for which transmission on a
10936349Sqs148142 		 * particular interface fails due to an internal
10946349Sqs148142 		 * MAC sublayer transmit error
10956349Sqs148142 		 */
10966349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
10976349Sqs148142 			tx_stats = &statsp->tdc_stats[channel];
10986349Sqs148142 			val += tx_stats->pkt_size_hdr_err +
10996349Sqs148142 			    tx_stats->pkt_size_err +
11006349Sqs148142 			    tx_stats->tx_rng_oflow +
11016349Sqs148142 			    tx_stats->peu_resp_err +
11026349Sqs148142 			    tx_stats->runt_pkt_drop_err +
11036349Sqs148142 			    tx_stats->pref_par_err +
11046349Sqs148142 			    tx_stats->tdr_pref_cpl_to +
11056349Sqs148142 			    tx_stats->pkt_cpl_to +
11066349Sqs148142 			    tx_stats->invalid_sop +
11076349Sqs148142 			    tx_stats->unexpected_sop;
11086349Sqs148142 		}
11096349Sqs148142 		break;
11106349Sqs148142 
11116349Sqs148142 	case ETHER_STAT_CARRIER_ERRORS:
11126349Sqs148142 		/*
11136349Sqs148142 		 * The number of times that the carrier sense
11146349Sqs148142 		 * condition was lost or never asserted when
11156349Sqs148142 		 * attempting to transmit a frame on a particular interface
11166349Sqs148142 		 */
11176349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
11186349Sqs148142 			tx_stats = &statsp->tdc_stats[channel];
11196349Sqs148142 			val += tx_stats->tdr_pref_cpl_to + tx_stats->pkt_cpl_to;
11206349Sqs148142 		}
11216349Sqs148142 		break;
11226349Sqs148142 
11236349Sqs148142 	case ETHER_STAT_TOOLONG_ERRORS:
11246349Sqs148142 		/*
11256349Sqs148142 		 * A count of frames received on a particular
11266349Sqs148142 		 * interface that exceed the maximum permitted frame size
11276349Sqs148142 		 */
11286349Sqs148142 		for (channel = 0; channel < hxgep->ntdc; channel++) {
11296349Sqs148142 			tx_stats = &statsp->tdc_stats[channel];
11306349Sqs148142 			val += tx_stats->pkt_size_err;
11316349Sqs148142 		}
11326349Sqs148142 		break;
11336349Sqs148142 
11346349Sqs148142 	case ETHER_STAT_XCVR_ADDR:
11356349Sqs148142 		val = 0;
11366349Sqs148142 		break;
11376349Sqs148142 	case ETHER_STAT_XCVR_ID:
11386349Sqs148142 		val = 0;
11396349Sqs148142 		break;
11406349Sqs148142 
11416349Sqs148142 	case ETHER_STAT_XCVR_INUSE:
11426349Sqs148142 		val = 0;
11436349Sqs148142 		break;
11446349Sqs148142 
11456349Sqs148142 	case ETHER_STAT_CAP_1000FDX:
11466349Sqs148142 		val = 0;
11476349Sqs148142 		break;
11486349Sqs148142 
11496349Sqs148142 	case ETHER_STAT_CAP_1000HDX:
11506349Sqs148142 		val = 0;
11516349Sqs148142 		break;
11526349Sqs148142 
11536349Sqs148142 	case ETHER_STAT_CAP_100FDX:
11546349Sqs148142 		val = 0;
11556349Sqs148142 		break;
11566349Sqs148142 
11576349Sqs148142 	case ETHER_STAT_CAP_100HDX:
11586349Sqs148142 		val = 0;
11596349Sqs148142 		break;
11606349Sqs148142 
11616349Sqs148142 	case ETHER_STAT_CAP_10FDX:
11626349Sqs148142 		val = 0;
11636349Sqs148142 		break;
11646349Sqs148142 
11656349Sqs148142 	case ETHER_STAT_CAP_10HDX:
11666349Sqs148142 		val = 0;
11676349Sqs148142 		break;
11686349Sqs148142 
11696349Sqs148142 	case ETHER_STAT_CAP_ASMPAUSE:
11706349Sqs148142 		val = 0;
11716349Sqs148142 		break;
11726349Sqs148142 
11736349Sqs148142 	case ETHER_STAT_CAP_PAUSE:
11746349Sqs148142 		val = 0;
11756349Sqs148142 		break;
11766349Sqs148142 
11776349Sqs148142 	case ETHER_STAT_CAP_AUTONEG:
11786349Sqs148142 		val = 0;
11796349Sqs148142 		break;
11806349Sqs148142 
11816349Sqs148142 	case ETHER_STAT_ADV_CAP_1000FDX:
11826349Sqs148142 		val = 0;
11836349Sqs148142 		break;
11846349Sqs148142 
11856349Sqs148142 	case ETHER_STAT_ADV_CAP_1000HDX:
11866349Sqs148142 		val = 0;
11876349Sqs148142 		break;
11886349Sqs148142 
11896349Sqs148142 	case ETHER_STAT_ADV_CAP_100FDX:
11906349Sqs148142 		val = 0;
11916349Sqs148142 		break;
11926349Sqs148142 
11936349Sqs148142 	case ETHER_STAT_ADV_CAP_100HDX:
11946349Sqs148142 		val = 0;
11956349Sqs148142 		break;
11966349Sqs148142 
11976349Sqs148142 	case ETHER_STAT_ADV_CAP_10FDX:
11986349Sqs148142 		val = 0;
11996349Sqs148142 		break;
12006349Sqs148142 
12016349Sqs148142 	case ETHER_STAT_ADV_CAP_10HDX:
12026349Sqs148142 		val = 0;
12036349Sqs148142 		break;
12046349Sqs148142 
12056349Sqs148142 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
12066349Sqs148142 		val = 0;
12076349Sqs148142 		break;
12086349Sqs148142 
12096349Sqs148142 	case ETHER_STAT_ADV_CAP_PAUSE:
12106349Sqs148142 		val = 0;
12116349Sqs148142 		break;
12126349Sqs148142 
12136349Sqs148142 	case ETHER_STAT_ADV_CAP_AUTONEG:
12146349Sqs148142 		val = 0;
12156349Sqs148142 		break;
12166349Sqs148142 
12176349Sqs148142 	case ETHER_STAT_LP_CAP_1000FDX:
12186349Sqs148142 		val = 0;
12196349Sqs148142 		break;
12206349Sqs148142 
12216349Sqs148142 	case ETHER_STAT_LP_CAP_1000HDX:
12226349Sqs148142 		val = 0;
12236349Sqs148142 		break;
12246349Sqs148142 
12256349Sqs148142 	case ETHER_STAT_LP_CAP_100FDX:
12266349Sqs148142 		val = 0;
12276349Sqs148142 		break;
12286349Sqs148142 
12296349Sqs148142 	case ETHER_STAT_LP_CAP_100HDX:
12306349Sqs148142 		val = 0;
12316349Sqs148142 		break;
12326349Sqs148142 
12336349Sqs148142 	case ETHER_STAT_LP_CAP_10FDX:
12346349Sqs148142 		val = 0;
12356349Sqs148142 		break;
12366349Sqs148142 
12376349Sqs148142 	case ETHER_STAT_LP_CAP_10HDX:
12386349Sqs148142 		val = 0;
12396349Sqs148142 		break;
12406349Sqs148142 
12416349Sqs148142 	case ETHER_STAT_LP_CAP_ASMPAUSE:
12426349Sqs148142 		val = 0;
12436349Sqs148142 		break;
12446349Sqs148142 
12456349Sqs148142 	case ETHER_STAT_LP_CAP_PAUSE:
12466349Sqs148142 		val = 0;
12476349Sqs148142 		break;
12486349Sqs148142 
12496349Sqs148142 	case ETHER_STAT_LP_CAP_AUTONEG:
12506349Sqs148142 		val = 0;
12516349Sqs148142 		break;
12526349Sqs148142 
12536349Sqs148142 	case ETHER_STAT_LINK_ASMPAUSE:
12546349Sqs148142 		val = 0;
12556349Sqs148142 		break;
12566349Sqs148142 
12576349Sqs148142 	case ETHER_STAT_LINK_PAUSE:
12586349Sqs148142 		val = 0;
12596349Sqs148142 		break;
12606349Sqs148142 
12616349Sqs148142 	case ETHER_STAT_LINK_AUTONEG:
12626349Sqs148142 		val = 0;
12636349Sqs148142 		break;
12646349Sqs148142 
12656349Sqs148142 	case ETHER_STAT_LINK_DUPLEX:
12666349Sqs148142 		val = statsp->mac_stats.link_duplex;
12676349Sqs148142 		break;
12686349Sqs148142 
12696349Sqs148142 	case ETHER_STAT_TOOSHORT_ERRORS:
12706349Sqs148142 		val = 0;
12716349Sqs148142 		break;
12726349Sqs148142 
12736349Sqs148142 	case ETHER_STAT_CAP_REMFAULT:
12746349Sqs148142 		val = 0;
12756349Sqs148142 		break;
12766349Sqs148142 
12776349Sqs148142 	case ETHER_STAT_ADV_REMFAULT:
12786349Sqs148142 		val = 0;
12796349Sqs148142 		break;
12806349Sqs148142 
12816349Sqs148142 	case ETHER_STAT_LP_REMFAULT:
12826349Sqs148142 		val = 0;
12836349Sqs148142 		break;
12846349Sqs148142 
12856349Sqs148142 	case ETHER_STAT_JABBER_ERRORS:
12866349Sqs148142 		val = 0;
12876349Sqs148142 		break;
12886349Sqs148142 
12896349Sqs148142 	case ETHER_STAT_CAP_100T4:
12906349Sqs148142 		val = 0;
12916349Sqs148142 		break;
12926349Sqs148142 
12936349Sqs148142 	case ETHER_STAT_ADV_CAP_100T4:
12946349Sqs148142 		val = 0;
12956349Sqs148142 		break;
12966349Sqs148142 
12976349Sqs148142 	case ETHER_STAT_LP_CAP_100T4:
12986349Sqs148142 		val = 0;
12996349Sqs148142 		break;
13006349Sqs148142 
130110091SMichael.Speer@Sun.COM 	case ETHER_STAT_ADV_CAP_10GFDX:
130210091SMichael.Speer@Sun.COM 	case ETHER_STAT_CAP_10GFDX:
130310091SMichael.Speer@Sun.COM 	case ETHER_STAT_LP_CAP_10GFDX:
130410091SMichael.Speer@Sun.COM 		val = 0;
130510091SMichael.Speer@Sun.COM 		break;
130610091SMichael.Speer@Sun.COM 
13076349Sqs148142 	default:
13086349Sqs148142 		/*
13096349Sqs148142 		 * Shouldn't reach here...
13106349Sqs148142 		 */
13116349Sqs148142 		cmn_err(CE_WARN,
13126349Sqs148142 		    "hxge_m_stat: unrecognized parameter value = 0x%x", stat);
13136349Sqs148142 		return (ENOTSUP);
13146349Sqs148142 	}
13156349Sqs148142 	*value = val;
13166349Sqs148142 	return (0);
13176349Sqs148142 }
13188718SMichael.Speer@Sun.COM 
13198718SMichael.Speer@Sun.COM static uint64_t
hxge_mac_octet_to_u64(uint8_t * addr)13208718SMichael.Speer@Sun.COM hxge_mac_octet_to_u64(uint8_t *addr)
13218718SMichael.Speer@Sun.COM {
13228718SMichael.Speer@Sun.COM 	int		i;
13238718SMichael.Speer@Sun.COM 	uint64_t	addr64 = 0;
13248718SMichael.Speer@Sun.COM 
13258718SMichael.Speer@Sun.COM 	for (i = ETHERADDRL - 1; i >= 0; i--) {
13268718SMichael.Speer@Sun.COM 		addr64 <<= 8;
13278718SMichael.Speer@Sun.COM 		addr64 |= addr[i];
13288718SMichael.Speer@Sun.COM 	}
13298718SMichael.Speer@Sun.COM 	return (addr64);
13308718SMichael.Speer@Sun.COM }
13318718SMichael.Speer@Sun.COM 
13328718SMichael.Speer@Sun.COM /*ARGSUSED*/
13338718SMichael.Speer@Sun.COM static int
hxge_mmac_stat_update(kstat_t * ksp,int rw)13348718SMichael.Speer@Sun.COM hxge_mmac_stat_update(kstat_t *ksp, int rw)
13358718SMichael.Speer@Sun.COM {
13368718SMichael.Speer@Sun.COM 	p_hxge_t		hxgep;
13378718SMichael.Speer@Sun.COM 	p_hxge_mmac_kstat_t	mmac_kstatsp;
13388718SMichael.Speer@Sun.COM 
13398718SMichael.Speer@Sun.COM 	hxgep = (p_hxge_t)ksp->ks_private;
13408718SMichael.Speer@Sun.COM 	if (hxgep == NULL)
13418718SMichael.Speer@Sun.COM 		return (-1);
13428718SMichael.Speer@Sun.COM 
13438718SMichael.Speer@Sun.COM 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "==> hxge_mmac_stat_update"));
13448718SMichael.Speer@Sun.COM 
13458718SMichael.Speer@Sun.COM 	if (rw == KSTAT_WRITE) {
13468718SMichael.Speer@Sun.COM 		cmn_err(CE_WARN, "Can not write mmac stats");
13478718SMichael.Speer@Sun.COM 	} else {
13488718SMichael.Speer@Sun.COM 		MUTEX_ENTER(hxgep->genlock);
13498718SMichael.Speer@Sun.COM 		mmac_kstatsp = (p_hxge_mmac_kstat_t)ksp->ks_data;
13508718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_max_addr_cnt.value.ul = hxgep->mmac.total;
13518718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_avail_addr_cnt.value.ul =
13528718SMichael.Speer@Sun.COM 		    hxgep->mmac.available;
13538718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr1.value.ul =
13548718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[0].addr);
13558718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr2.value.ul =
13568718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[1].addr);
13578718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr3.value.ul =
13588718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[2].addr);
13598718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr4.value.ul =
13608718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[3].addr);
13618718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr5.value.ul =
13628718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[4].addr);
13638718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr6.value.ul =
13648718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[5].addr);
13658718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr7.value.ul =
13668718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[6].addr);
13678718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr8.value.ul =
13688718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[7].addr);
13698718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr9.value.ul =
13708718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[8].addr);
13718718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr10.value.ul =
13728718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[9].addr);
13738718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr11.value.ul =
13748718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[10].addr);
13758718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr12.value.ul =
13768718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[11].addr);
13778718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr13.value.ul =
13788718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[12].addr);
13798718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr14.value.ul =
13808718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[13].addr);
13818718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr15.value.ul =
13828718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[14].addr);
13838718SMichael.Speer@Sun.COM 		mmac_kstatsp->mmac_addr16.value.ul =
13848718SMichael.Speer@Sun.COM 		    hxge_mac_octet_to_u64(hxgep->mmac.addrs[15].addr);
13858718SMichael.Speer@Sun.COM 		MUTEX_EXIT(hxgep->genlock);
13868718SMichael.Speer@Sun.COM 	}
13878718SMichael.Speer@Sun.COM 
13888718SMichael.Speer@Sun.COM 	HXGE_DEBUG_MSG((hxgep, KST_CTL, "<== hxge_mmac_stat_update"));
13898718SMichael.Speer@Sun.COM 	return (0);
13908718SMichael.Speer@Sun.COM }
1391