xref: /titanic_50/usr/src/uts/common/sys/nxge/nxge.h (revision 9d58797236c67ab2d8b5da36603dd896b1c6e153)
16f45ec7bSml29623 /*
26f45ec7bSml29623  * CDDL HEADER START
36f45ec7bSml29623  *
46f45ec7bSml29623  * The contents of this file are subject to the terms of the
56f45ec7bSml29623  * Common Development and Distribution License (the "License").
66f45ec7bSml29623  * You may not use this file except in compliance with the License.
76f45ec7bSml29623  *
86f45ec7bSml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96f45ec7bSml29623  * or http://www.opensolaris.org/os/licensing.
106f45ec7bSml29623  * See the License for the specific language governing permissions
116f45ec7bSml29623  * and limitations under the License.
126f45ec7bSml29623  *
136f45ec7bSml29623  * When distributing Covered Code, include this CDDL HEADER in each
146f45ec7bSml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156f45ec7bSml29623  * If applicable, add the following below this CDDL HEADER, with the
166f45ec7bSml29623  * fields enclosed by brackets "[]" replaced with your own identifying
176f45ec7bSml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
186f45ec7bSml29623  *
196f45ec7bSml29623  * CDDL HEADER END
206f45ec7bSml29623  */
216f45ec7bSml29623 /*
2289282175SSantwona Behera  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
236f45ec7bSml29623  */
246f45ec7bSml29623 
256f45ec7bSml29623 #ifndef	_SYS_NXGE_NXGE_H
266f45ec7bSml29623 #define	_SYS_NXGE_NXGE_H
276f45ec7bSml29623 
286f45ec7bSml29623 #ifdef	__cplusplus
296f45ec7bSml29623 extern "C" {
306f45ec7bSml29623 #endif
316f45ec7bSml29623 
326f45ec7bSml29623 #include <nxge_mac.h>
336f45ec7bSml29623 #include <nxge_ipp.h>
346f45ec7bSml29623 #include <nxge_fflp.h>
356f45ec7bSml29623 
366f45ec7bSml29623 /*
376f45ec7bSml29623  * NXGE diagnostics IOCTLS.
386f45ec7bSml29623  */
396f45ec7bSml29623 #define	NXGE_IOC		((((('N' << 8) + 'X') << 8) + 'G') << 8)
406f45ec7bSml29623 
416f45ec7bSml29623 #define	NXGE_GET64		(NXGE_IOC|1)
426f45ec7bSml29623 #define	NXGE_PUT64		(NXGE_IOC|2)
436f45ec7bSml29623 #define	NXGE_GET_TX_RING_SZ	(NXGE_IOC|3)
446f45ec7bSml29623 #define	NXGE_GET_TX_DESC	(NXGE_IOC|4)
456f45ec7bSml29623 #define	NXGE_GLOBAL_RESET	(NXGE_IOC|5)
466f45ec7bSml29623 #define	NXGE_TX_SIDE_RESET	(NXGE_IOC|6)
476f45ec7bSml29623 #define	NXGE_RX_SIDE_RESET	(NXGE_IOC|7)
486f45ec7bSml29623 #define	NXGE_RESET_MAC		(NXGE_IOC|8)
496f45ec7bSml29623 
506f45ec7bSml29623 #define	NXGE_GET_MII		(NXGE_IOC|11)
516f45ec7bSml29623 #define	NXGE_PUT_MII		(NXGE_IOC|12)
526f45ec7bSml29623 #define	NXGE_RTRACE		(NXGE_IOC|13)
536f45ec7bSml29623 #define	NXGE_RTRACE_TEST	(NXGE_IOC|20)
546f45ec7bSml29623 #define	NXGE_TX_REGS_DUMP	(NXGE_IOC|21)
556f45ec7bSml29623 #define	NXGE_RX_REGS_DUMP	(NXGE_IOC|22)
566f45ec7bSml29623 #define	NXGE_INT_REGS_DUMP	(NXGE_IOC|23)
576f45ec7bSml29623 #define	NXGE_VIR_REGS_DUMP	(NXGE_IOC|24)
586f45ec7bSml29623 #define	NXGE_VIR_INT_REGS_DUMP	(NXGE_IOC|25)
596f45ec7bSml29623 #define	NXGE_RDUMP		(NXGE_IOC|26)
606f45ec7bSml29623 #define	NXGE_RDC_GRPS_DUMP	(NXGE_IOC|27)
616f45ec7bSml29623 #define	NXGE_PIO_TEST		(NXGE_IOC|28)
626f45ec7bSml29623 
636f45ec7bSml29623 #define	NXGE_GET_TCAM		(NXGE_IOC|29)
646f45ec7bSml29623 #define	NXGE_PUT_TCAM		(NXGE_IOC|30)
656f45ec7bSml29623 #define	NXGE_INJECT_ERR		(NXGE_IOC|40)
666f45ec7bSml29623 
674df55fdeSJanie Lu #define	NXGE_RX_CLASS		(NXGE_IOC|41)
684df55fdeSJanie Lu #define	NXGE_RX_HASH		(NXGE_IOC|42)
694df55fdeSJanie Lu 
706f45ec7bSml29623 #define	NXGE_OK			0
716f45ec7bSml29623 #define	NXGE_ERROR		0x40000000
726f45ec7bSml29623 #define	NXGE_DDI_FAILED		0x20000000
736f45ec7bSml29623 #define	NXGE_GET_PORT_NUM(n)	n
746f45ec7bSml29623 
756f45ec7bSml29623 /*
766f45ec7bSml29623  * Definitions for module_info.
776f45ec7bSml29623  */
786f45ec7bSml29623 #define	NXGE_IDNUM		(0)			/* module ID number */
796f45ec7bSml29623 #define	NXGE_DRIVER_NAME	"nxge"			/* module name */
806f45ec7bSml29623 
816f45ec7bSml29623 #define	NXGE_MINPSZ		(0)			/* min packet size */
826f45ec7bSml29623 #define	NXGE_MAXPSZ		(ETHERMTU)		/* max packet size */
836f45ec7bSml29623 #define	NXGE_HIWAT		(2048 * NXGE_MAXPSZ)	/* hi-water mark */
846f45ec7bSml29623 #define	NXGE_LOWAT		(1)			/* lo-water mark */
856f45ec7bSml29623 #define	NXGE_HIWAT_MAX		(192000 * NXGE_MAXPSZ)
866f45ec7bSml29623 #define	NXGE_HIWAT_MIN		(2 * NXGE_MAXPSZ)
876f45ec7bSml29623 #define	NXGE_LOWAT_MAX		(192000 * NXGE_MAXPSZ)
886f45ec7bSml29623 #define	NXGE_LOWAT_MIN		(1)
896f45ec7bSml29623 
906f45ec7bSml29623 #ifndef	D_HOTPLUG
916f45ec7bSml29623 #define	D_HOTPLUG		0x00
926f45ec7bSml29623 #endif
936f45ec7bSml29623 
946f45ec7bSml29623 #define	INIT_BUCKET_SIZE	16	/* Initial Hash Bucket Size */
956f45ec7bSml29623 
966f45ec7bSml29623 #define	NXGE_CHECK_TIMER	(5000)
976f45ec7bSml29623 
984df55fdeSJanie Lu /* KT/NIU OBP creates a compatible property for KT */
994df55fdeSJanie Lu #define	KT_NIU_COMPATIBLE	"SUNW,niusl-kt"
1004df55fdeSJanie Lu 
1016f45ec7bSml29623 typedef enum {
1026f45ec7bSml29623 	param_instance,
1036f45ec7bSml29623 	param_main_instance,
1046f45ec7bSml29623 	param_function_number,
1056f45ec7bSml29623 	param_partition_id,
1066f45ec7bSml29623 	param_read_write_mode,
10756d930aeSspeer 	param_fw_version,
1082e59129aSraghus 	param_port_mode,
1096f45ec7bSml29623 	param_niu_cfg_type,
1106f45ec7bSml29623 	param_tx_quick_cfg,
1116f45ec7bSml29623 	param_rx_quick_cfg,
1126f45ec7bSml29623 	param_master_cfg_enable,
1136f45ec7bSml29623 	param_master_cfg_value,
1146f45ec7bSml29623 
1156f45ec7bSml29623 	param_autoneg,
1166f45ec7bSml29623 	param_anar_10gfdx,
1176f45ec7bSml29623 	param_anar_10ghdx,
1186f45ec7bSml29623 	param_anar_1000fdx,
1196f45ec7bSml29623 	param_anar_1000hdx,
1206f45ec7bSml29623 	param_anar_100T4,
1216f45ec7bSml29623 	param_anar_100fdx,
1226f45ec7bSml29623 	param_anar_100hdx,
1236f45ec7bSml29623 	param_anar_10fdx,
1246f45ec7bSml29623 	param_anar_10hdx,
1256f45ec7bSml29623 
1266f45ec7bSml29623 	param_anar_asmpause,
1276f45ec7bSml29623 	param_anar_pause,
1286f45ec7bSml29623 	param_use_int_xcvr,
1296f45ec7bSml29623 	param_enable_ipg0,
1306f45ec7bSml29623 	param_ipg0,
1316f45ec7bSml29623 	param_ipg1,
1326f45ec7bSml29623 	param_ipg2,
1336f45ec7bSml29623 	param_txdma_weight,
1346f45ec7bSml29623 	param_txdma_channels_begin,
1356f45ec7bSml29623 
1366f45ec7bSml29623 	param_txdma_channels,
1376f45ec7bSml29623 	param_txdma_info,
1386f45ec7bSml29623 	param_rxdma_channels_begin,
1396f45ec7bSml29623 	param_rxdma_channels,
1406f45ec7bSml29623 	param_rxdma_drr_weight,
1416f45ec7bSml29623 	param_rxdma_full_header,
1426f45ec7bSml29623 	param_rxdma_info,
1436f45ec7bSml29623 	param_rxdma_rbr_size,
1446f45ec7bSml29623 	param_rxdma_rcr_size,
1456f45ec7bSml29623 	param_default_port_rdc,
1466f45ec7bSml29623 	param_rxdma_intr_time,
1476f45ec7bSml29623 	param_rxdma_intr_pkts,
1486f45ec7bSml29623 
1496f45ec7bSml29623 	param_rdc_grps_start,
1506f45ec7bSml29623 	param_rx_rdc_grps,
1516f45ec7bSml29623 	param_default_grp0_rdc,
1526f45ec7bSml29623 	param_default_grp1_rdc,
1536f45ec7bSml29623 	param_default_grp2_rdc,
1546f45ec7bSml29623 	param_default_grp3_rdc,
1556f45ec7bSml29623 	param_default_grp4_rdc,
1566f45ec7bSml29623 	param_default_grp5_rdc,
1576f45ec7bSml29623 	param_default_grp6_rdc,
1586f45ec7bSml29623 	param_default_grp7_rdc,
1596f45ec7bSml29623 
1606f45ec7bSml29623 	param_info_rdc_groups,
1616f45ec7bSml29623 	param_start_ldg,
1626f45ec7bSml29623 	param_max_ldg,
1636f45ec7bSml29623 	param_mac_2rdc_grp,
1646f45ec7bSml29623 	param_vlan_2rdc_grp,
1656f45ec7bSml29623 	param_fcram_part_cfg,
1666f45ec7bSml29623 	param_fcram_access_ratio,
1676f45ec7bSml29623 	param_tcam_access_ratio,
1686f45ec7bSml29623 	param_tcam_enable,
1696f45ec7bSml29623 	param_hash_lookup_enable,
1706f45ec7bSml29623 	param_llc_snap_enable,
1716f45ec7bSml29623 
1726f45ec7bSml29623 	param_h1_init_value,
1736f45ec7bSml29623 	param_h2_init_value,
1746f45ec7bSml29623 	param_class_cfg_ether_usr1,
1756f45ec7bSml29623 	param_class_cfg_ether_usr2,
1766f45ec7bSml29623 	param_class_cfg_ip_usr4,
1776f45ec7bSml29623 	param_class_cfg_ip_usr5,
1786f45ec7bSml29623 	param_class_cfg_ip_usr6,
1796f45ec7bSml29623 	param_class_cfg_ip_usr7,
1806f45ec7bSml29623 	param_class_opt_ip_usr4,
1816f45ec7bSml29623 	param_class_opt_ip_usr5,
1826f45ec7bSml29623 	param_class_opt_ip_usr6,
1836f45ec7bSml29623 	param_class_opt_ip_usr7,
1846f45ec7bSml29623 	param_class_opt_ipv4_tcp,
1856f45ec7bSml29623 	param_class_opt_ipv4_udp,
1866f45ec7bSml29623 	param_class_opt_ipv4_ah,
1876f45ec7bSml29623 	param_class_opt_ipv4_sctp,
1886f45ec7bSml29623 	param_class_opt_ipv6_tcp,
1896f45ec7bSml29623 	param_class_opt_ipv6_udp,
1906f45ec7bSml29623 	param_class_opt_ipv6_ah,
1916f45ec7bSml29623 	param_class_opt_ipv6_sctp,
1926f45ec7bSml29623 	param_nxge_debug_flag,
1936f45ec7bSml29623 	param_npi_debug_flag,
1946f45ec7bSml29623 	param_dump_rdc,
1956f45ec7bSml29623 	param_dump_tdc,
1966f45ec7bSml29623 	param_dump_mac_regs,
1976f45ec7bSml29623 	param_dump_ipp_regs,
1986f45ec7bSml29623 	param_dump_fflp_regs,
1996f45ec7bSml29623 	param_dump_vlan_table,
2006f45ec7bSml29623 	param_dump_rdc_table,
2016f45ec7bSml29623 	param_dump_ptrs,
2026f45ec7bSml29623 	param_end
2036f45ec7bSml29623 } nxge_param_index_t;
2046f45ec7bSml29623 
205678453a8Sspeer typedef enum {
206678453a8Sspeer 	SOLARIS_DOMAIN,
207678453a8Sspeer 	SOLARIS_SERVICE_DOMAIN,
208678453a8Sspeer 	SOLARIS_GUEST_DOMAIN,
209678453a8Sspeer 	LINUX_SERVICE_DOMAIN,
210678453a8Sspeer 	LINUX_GUEST_DOMAIN
211678453a8Sspeer } nxge_environs_t;
2126f45ec7bSml29623 
2136f45ec7bSml29623 /*
2146f45ec7bSml29623  * Named Dispatch Parameter Management Structure
2156f45ec7bSml29623  */
2166f45ec7bSml29623 typedef	int (*nxge_ndgetf_t)(p_nxge_t, queue_t *, MBLKP, caddr_t, cred_t *);
2176f45ec7bSml29623 typedef	int (*nxge_ndsetf_t)(p_nxge_t, queue_t *,
2186f45ec7bSml29623 	    MBLKP, char *, caddr_t, cred_t *);
2196f45ec7bSml29623 
2206f45ec7bSml29623 #define	NXGE_PARAM_READ			0x00000001ULL
2216f45ec7bSml29623 #define	NXGE_PARAM_WRITE		0x00000002ULL
2226f45ec7bSml29623 #define	NXGE_PARAM_SHARED		0x00000004ULL
2236f45ec7bSml29623 #define	NXGE_PARAM_PRIV			0x00000008ULL
2246f45ec7bSml29623 #define	NXGE_PARAM_RW			NXGE_PARAM_READ | NXGE_PARAM_WRITE
2256f45ec7bSml29623 #define	NXGE_PARAM_RWS			NXGE_PARAM_RW | NXGE_PARAM_SHARED
2266f45ec7bSml29623 #define	NXGE_PARAM_RWP			NXGE_PARAM_RW | NXGE_PARAM_PRIV
2276f45ec7bSml29623 
2286f45ec7bSml29623 #define	NXGE_PARAM_RXDMA		0x00000010ULL
2296f45ec7bSml29623 #define	NXGE_PARAM_TXDMA		0x00000020ULL
2306f45ec7bSml29623 #define	NXGE_PARAM_CLASS_GEN	0x00000040ULL
2316f45ec7bSml29623 #define	NXGE_PARAM_MAC			0x00000080ULL
2326f45ec7bSml29623 #define	NXGE_PARAM_CLASS_BIN	NXGE_PARAM_CLASS_GEN | NXGE_PARAM_BASE_BIN
2336f45ec7bSml29623 #define	NXGE_PARAM_CLASS_HEX	NXGE_PARAM_CLASS_GEN | NXGE_PARAM_BASE_HEX
2346f45ec7bSml29623 #define	NXGE_PARAM_CLASS		NXGE_PARAM_CLASS_HEX
2356f45ec7bSml29623 
2366f45ec7bSml29623 #define	NXGE_PARAM_CMPLX		0x00010000ULL
2376f45ec7bSml29623 #define	NXGE_PARAM_NDD_WR_OK		0x00020000ULL
2386f45ec7bSml29623 #define	NXGE_PARAM_INIT_ONLY		0x00040000ULL
2396f45ec7bSml29623 #define	NXGE_PARAM_INIT_CONFIG		0x00080000ULL
2406f45ec7bSml29623 
2416f45ec7bSml29623 #define	NXGE_PARAM_READ_PROP		0x00100000ULL
2426f45ec7bSml29623 #define	NXGE_PARAM_PROP_ARR32		0x00200000ULL
2436f45ec7bSml29623 #define	NXGE_PARAM_PROP_ARR64		0x00400000ULL
2446f45ec7bSml29623 #define	NXGE_PARAM_PROP_STR		0x00800000ULL
2456f45ec7bSml29623 
2466f45ec7bSml29623 #define	NXGE_PARAM_BASE_DEC		0x00000000ULL
2476f45ec7bSml29623 #define	NXGE_PARAM_BASE_BIN		0x10000000ULL
2486f45ec7bSml29623 #define	NXGE_PARAM_BASE_HEX		0x20000000ULL
2496f45ec7bSml29623 #define	NXGE_PARAM_BASE_STR		0x40000000ULL
2506f45ec7bSml29623 #define	NXGE_PARAM_DONT_SHOW		0x80000000ULL
2516f45ec7bSml29623 
2526f45ec7bSml29623 #define	NXGE_PARAM_ARRAY_CNT_MASK	0x0000ffff00000000ULL
2536f45ec7bSml29623 #define	NXGE_PARAM_ARRAY_CNT_SHIFT	32ULL
2546f45ec7bSml29623 #define	NXGE_PARAM_ARRAY_ALLOC_MASK	0xffff000000000000ULL
2556f45ec7bSml29623 #define	NXGE_PARAM_ARRAY_ALLOC_SHIFT	48ULL
2566f45ec7bSml29623 
2576f45ec7bSml29623 typedef struct _nxge_param_t {
2586f45ec7bSml29623 	int (*getf)();
2596f45ec7bSml29623 	int (*setf)();   /* null for read only */
2606f45ec7bSml29623 	uint64_t type;  /* R/W/ Common/Port/ .... */
2616f45ec7bSml29623 	uint64_t minimum;
2626f45ec7bSml29623 	uint64_t maximum;
2636f45ec7bSml29623 	uint64_t value;	/* for array params, pointer to value array */
2646f45ec7bSml29623 	uint64_t old_value; /* for array params, pointer to old_value array */
2656f45ec7bSml29623 	char   *fcode_name;
2666f45ec7bSml29623 	char   *name;
2676f45ec7bSml29623 } nxge_param_t, *p_nxge_param_t;
2686f45ec7bSml29623 
2696f45ec7bSml29623 
270321febdeSsbehera /*
271321febdeSsbehera  * Do not change the order of the elements of this enum as that will
272321febdeSsbehera  * break the driver code.
273321febdeSsbehera  */
2746f45ec7bSml29623 typedef enum {
2756f45ec7bSml29623 	nxge_lb_normal,
2766f45ec7bSml29623 	nxge_lb_ext10g,
2776f45ec7bSml29623 	nxge_lb_ext1000,
2786f45ec7bSml29623 	nxge_lb_ext100,
2796f45ec7bSml29623 	nxge_lb_ext10,
2806f45ec7bSml29623 	nxge_lb_phy10g,
2816f45ec7bSml29623 	nxge_lb_phy1000,
2826f45ec7bSml29623 	nxge_lb_phy,
2836f45ec7bSml29623 	nxge_lb_serdes10g,
2846f45ec7bSml29623 	nxge_lb_serdes1000,
2856f45ec7bSml29623 	nxge_lb_serdes,
2866f45ec7bSml29623 	nxge_lb_mac10g,
2876f45ec7bSml29623 	nxge_lb_mac1000,
2886f45ec7bSml29623 	nxge_lb_mac
2896f45ec7bSml29623 } nxge_lb_t;
2906f45ec7bSml29623 
2916f45ec7bSml29623 enum nxge_mac_state {
2926f45ec7bSml29623 	NXGE_MAC_STOPPED = 0,
293678453a8Sspeer 	NXGE_MAC_STARTED,
294678453a8Sspeer 	NXGE_MAC_STOPPING
2956f45ec7bSml29623 };
2966f45ec7bSml29623 
2976f45ec7bSml29623 /*
2986f45ec7bSml29623  * Private DLPI full dlsap address format.
2996f45ec7bSml29623  */
3006f45ec7bSml29623 typedef struct _nxge_dladdr_t {
3016f45ec7bSml29623 	ether_addr_st dl_phys;
3026f45ec7bSml29623 	uint16_t dl_sap;
3036f45ec7bSml29623 } nxge_dladdr_t, *p_nxge_dladdr_t;
3046f45ec7bSml29623 
3056f45ec7bSml29623 typedef struct _mc_addr_t {
3066f45ec7bSml29623 	ether_addr_st multcast_addr;
3076f45ec7bSml29623 	uint_t mc_addr_cnt;
3086f45ec7bSml29623 } mc_addr_t, *p_mc_addr_t;
3096f45ec7bSml29623 
3106f45ec7bSml29623 typedef struct _mc_bucket_t {
3116f45ec7bSml29623 	p_mc_addr_t addr_list;
3126f45ec7bSml29623 	uint_t list_size;
3136f45ec7bSml29623 } mc_bucket_t, *p_mc_bucket_t;
3146f45ec7bSml29623 
3156f45ec7bSml29623 typedef struct _mc_table_t {
3166f45ec7bSml29623 	p_mc_bucket_t bucket_list;
3176f45ec7bSml29623 	uint_t buckets_used;
3186f45ec7bSml29623 } mc_table_t, *p_mc_table_t;
3196f45ec7bSml29623 
3206f45ec7bSml29623 typedef struct _filter_t {
3216f45ec7bSml29623 	uint32_t all_phys_cnt;
3226f45ec7bSml29623 	uint32_t all_multicast_cnt;
3236f45ec7bSml29623 	uint32_t all_sap_cnt;
3246f45ec7bSml29623 } filter_t, *p_filter_t;
3256f45ec7bSml29623 
326da14cebeSEric Cheng 
3276f45ec7bSml29623 typedef struct _nxge_port_stats_t {
3286f45ec7bSml29623 	/*
3296f45ec7bSml29623 	 *  Overall structure size
3306f45ec7bSml29623 	 */
3316f45ec7bSml29623 	size_t			stats_size;
3326f45ec7bSml29623 
3336f45ec7bSml29623 	/*
3346f45ec7bSml29623 	 * Link Input/Output stats
3356f45ec7bSml29623 	 */
3366f45ec7bSml29623 	uint64_t		ipackets;
3376f45ec7bSml29623 	uint64_t		ierrors;
3386f45ec7bSml29623 	uint64_t		opackets;
3396f45ec7bSml29623 	uint64_t		oerrors;
3406f45ec7bSml29623 	uint64_t		collisions;
3416f45ec7bSml29623 
3426f45ec7bSml29623 	/*
3436f45ec7bSml29623 	 * MIB II variables
3446f45ec7bSml29623 	 */
3456f45ec7bSml29623 	uint64_t		rbytes;    /* # bytes received */
3466f45ec7bSml29623 	uint64_t		obytes;    /* # bytes transmitted */
3476f45ec7bSml29623 	uint32_t		multircv;  /* # multicast packets received */
3486f45ec7bSml29623 	uint32_t		multixmt;  /* # multicast packets for xmit */
3496f45ec7bSml29623 	uint32_t		brdcstrcv; /* # broadcast packets received */
3506f45ec7bSml29623 	uint32_t		brdcstxmt; /* # broadcast packets for xmit */
3516f45ec7bSml29623 	uint32_t		norcvbuf;  /* # rcv packets discarded */
3526f45ec7bSml29623 	uint32_t		noxmtbuf;  /* # xmit packets discarded */
3536f45ec7bSml29623 
3546f45ec7bSml29623 	/*
3556f45ec7bSml29623 	 * Lets the user know the MTU currently in use by
3566f45ec7bSml29623 	 * the physical MAC port.
3576f45ec7bSml29623 	 */
3586f45ec7bSml29623 	nxge_lb_t		lb_mode;
3596f45ec7bSml29623 	uint32_t		qos_mode;
3606f45ec7bSml29623 	uint32_t		trunk_mode;
3616f45ec7bSml29623 	uint32_t		poll_mode;
3626f45ec7bSml29623 
3636f45ec7bSml29623 	/*
3646f45ec7bSml29623 	 * Tx Statistics.
3656f45ec7bSml29623 	 */
3666f45ec7bSml29623 	uint32_t		tx_inits;
3676f45ec7bSml29623 	uint32_t		tx_starts;
3686f45ec7bSml29623 	uint32_t		tx_nocanput;
3696f45ec7bSml29623 	uint32_t		tx_msgdup_fail;
3706f45ec7bSml29623 	uint32_t		tx_allocb_fail;
3716f45ec7bSml29623 	uint32_t		tx_no_desc;
3726f45ec7bSml29623 	uint32_t		tx_dma_bind_fail;
3736f45ec7bSml29623 	uint32_t		tx_uflo;
3746f45ec7bSml29623 	uint32_t		tx_hdr_pkts;
3756f45ec7bSml29623 	uint32_t		tx_ddi_pkts;
3766f45ec7bSml29623 	uint32_t		tx_dvma_pkts;
3776f45ec7bSml29623 
3786f45ec7bSml29623 	uint32_t		tx_max_pend;
3796f45ec7bSml29623 
3806f45ec7bSml29623 	/*
3816f45ec7bSml29623 	 * Rx Statistics.
3826f45ec7bSml29623 	 */
3836f45ec7bSml29623 	uint32_t		rx_inits;
3846f45ec7bSml29623 	uint32_t		rx_hdr_pkts;
3856f45ec7bSml29623 	uint32_t		rx_mtu_pkts;
3866f45ec7bSml29623 	uint32_t		rx_split_pkts;
3876f45ec7bSml29623 	uint32_t		rx_no_buf;
3886f45ec7bSml29623 	uint32_t		rx_no_comp_wb;
3896f45ec7bSml29623 	uint32_t		rx_ov_flow;
3906f45ec7bSml29623 	uint32_t		rx_len_mm;
3916f45ec7bSml29623 	uint32_t		rx_tag_err;
3926f45ec7bSml29623 	uint32_t		rx_nocanput;
3936f45ec7bSml29623 	uint32_t		rx_msgdup_fail;
3946f45ec7bSml29623 	uint32_t		rx_allocb_fail;
3956f45ec7bSml29623 
3966f45ec7bSml29623 	/*
3976f45ec7bSml29623 	 * Receive buffer management statistics.
3986f45ec7bSml29623 	 */
3996f45ec7bSml29623 	uint32_t		rx_new_pages;
4006f45ec7bSml29623 	uint32_t		rx_new_hdr_pgs;
4016f45ec7bSml29623 	uint32_t		rx_new_mtu_pgs;
4026f45ec7bSml29623 	uint32_t		rx_new_nxt_pgs;
4036f45ec7bSml29623 	uint32_t		rx_reused_pgs;
4046f45ec7bSml29623 	uint32_t		rx_hdr_drops;
4056f45ec7bSml29623 	uint32_t		rx_mtu_drops;
4066f45ec7bSml29623 	uint32_t		rx_nxt_drops;
4076f45ec7bSml29623 
4086f45ec7bSml29623 	/*
4096f45ec7bSml29623 	 * Receive flow statistics
4106f45ec7bSml29623 	 */
4116f45ec7bSml29623 	uint32_t		rx_rel_flow;
4126f45ec7bSml29623 	uint32_t		rx_rel_bit;
4136f45ec7bSml29623 
4146f45ec7bSml29623 	uint32_t		rx_pkts_dropped;
4156f45ec7bSml29623 
4166f45ec7bSml29623 	/*
4176f45ec7bSml29623 	 * PCI-E Bus Statistics.
4186f45ec7bSml29623 	 */
4196f45ec7bSml29623 	uint32_t		pci_bus_speed;
4206f45ec7bSml29623 	uint32_t		pci_err;
4216f45ec7bSml29623 	uint32_t		pci_rta_err;
4226f45ec7bSml29623 	uint32_t		pci_rma_err;
4236f45ec7bSml29623 	uint32_t		pci_parity_err;
4246f45ec7bSml29623 	uint32_t		pci_bad_ack_err;
4256f45ec7bSml29623 	uint32_t		pci_drto_err;
4266f45ec7bSml29623 	uint32_t		pci_dmawz_err;
4276f45ec7bSml29623 	uint32_t		pci_dmarz_err;
4286f45ec7bSml29623 
4296f45ec7bSml29623 	uint32_t		rx_taskq_waits;
4306f45ec7bSml29623 
4316f45ec7bSml29623 	uint32_t		tx_jumbo_pkts;
4326f45ec7bSml29623 
4336f45ec7bSml29623 	/*
4346f45ec7bSml29623 	 * Some statistics added to support bringup, these
4356f45ec7bSml29623 	 * should be removed.
4366f45ec7bSml29623 	 */
4376f45ec7bSml29623 	uint32_t		user_defined;
4386f45ec7bSml29623 } nxge_port_stats_t, *p_nxge_port_stats_t;
4396f45ec7bSml29623 
4406f45ec7bSml29623 
4416f45ec7bSml29623 typedef struct _nxge_stats_t {
4426f45ec7bSml29623 	/*
4436f45ec7bSml29623 	 *  Overall structure size
4446f45ec7bSml29623 	 */
4456f45ec7bSml29623 	size_t			stats_size;
4466f45ec7bSml29623 
4476f45ec7bSml29623 	kstat_t			*ksp;
4486f45ec7bSml29623 	kstat_t			*rdc_ksp[NXGE_MAX_RDCS];
4496f45ec7bSml29623 	kstat_t			*tdc_ksp[NXGE_MAX_TDCS];
4506f45ec7bSml29623 	kstat_t			*rdc_sys_ksp;
4516f45ec7bSml29623 	kstat_t			*fflp_ksp[1];
4526f45ec7bSml29623 	kstat_t			*ipp_ksp;
4536f45ec7bSml29623 	kstat_t			*txc_ksp;
4546f45ec7bSml29623 	kstat_t			*mac_ksp;
4556f45ec7bSml29623 	kstat_t			*zcp_ksp;
4566f45ec7bSml29623 	kstat_t			*port_ksp;
4576f45ec7bSml29623 	kstat_t			*mmac_ksp;
4586f45ec7bSml29623 
4596f45ec7bSml29623 	nxge_mac_stats_t	mac_stats;	/* Common MAC Statistics */
4606f45ec7bSml29623 	nxge_xmac_stats_t	xmac_stats;	/* XMAC Statistics */
4616f45ec7bSml29623 	nxge_bmac_stats_t	bmac_stats;	/* BMAC Statistics */
4626f45ec7bSml29623 
4636f45ec7bSml29623 	nxge_rx_ring_stats_t	rx_stats;	/* per port RX stats */
4646f45ec7bSml29623 	nxge_ipp_stats_t	ipp_stats;	/* per port IPP stats */
4656f45ec7bSml29623 	nxge_zcp_stats_t	zcp_stats;	/* per port IPP stats */
4666f45ec7bSml29623 	nxge_rx_ring_stats_t	rdc_stats[NXGE_MAX_RDCS]; /* per rdc stats */
4676f45ec7bSml29623 	nxge_rdc_sys_stats_t	rdc_sys_stats;	/* per port RDC stats */
4686f45ec7bSml29623 
4696f45ec7bSml29623 	nxge_tx_ring_stats_t	tx_stats;	/* per port TX stats */
4706f45ec7bSml29623 	nxge_txc_stats_t	txc_stats;	/* per port TX stats */
4716f45ec7bSml29623 	nxge_tx_ring_stats_t	tdc_stats[NXGE_MAX_TDCS]; /* per tdc stats */
4726f45ec7bSml29623 	nxge_fflp_stats_t	fflp_stats;	/* fflp stats */
4736f45ec7bSml29623 	nxge_port_stats_t	port_stats;	/* fflp stats */
4746f45ec7bSml29623 	nxge_mmac_stats_t	mmac_stats;	/* Multi mac. stats */
4756f45ec7bSml29623 
4766f45ec7bSml29623 } nxge_stats_t, *p_nxge_stats_t;
4776f45ec7bSml29623 
478da14cebeSEric Cheng 
479da14cebeSEric Cheng 
4806f45ec7bSml29623 typedef struct _nxge_intr_t {
4816f45ec7bSml29623 	boolean_t		intr_registered; /* interrupts are registered */
4826f45ec7bSml29623 	boolean_t		intr_enabled; 	/* interrupts are enabled */
4836f45ec7bSml29623 	boolean_t		niu_msi_enable;	/* debug or configurable? */
4846f45ec7bSml29623 	int			intr_types;	/* interrupt types supported */
4856f45ec7bSml29623 	int			intr_type;	/* interrupt type to add */
4866f45ec7bSml29623 	int			max_int_cnt;	/* max MSIX/INT HW supports */
4876f45ec7bSml29623 	int			start_inum;	/* start inum (in sequence?) */
4886f45ec7bSml29623 	int			msi_intx_cnt;	/* # msi/intx ints returned */
4896f45ec7bSml29623 	int			intr_added;	/* # ints actually needed */
4906f45ec7bSml29623 	int			intr_cap;	/* interrupt capabilities */
4916f45ec7bSml29623 	size_t			intr_size;	/* size of array to allocate */
4926f45ec7bSml29623 	ddi_intr_handle_t 	*htable;	/* For array of interrupts */
4936f45ec7bSml29623 	/* Add interrupt number for each interrupt vector */
4946f45ec7bSml29623 	int			pri;
4956f45ec7bSml29623 } nxge_intr_t, *p_nxge_intr_t;
4966f45ec7bSml29623 
4976f45ec7bSml29623 typedef struct _nxge_ldgv_t {
4986f45ec7bSml29623 	uint8_t			ndma_ldvs;
4996f45ec7bSml29623 	uint8_t			nldvs;
5006f45ec7bSml29623 	uint8_t			maxldgs;
5016f45ec7bSml29623 	uint8_t			maxldvs;
5026f45ec7bSml29623 	uint8_t			ldg_intrs;
5036f45ec7bSml29623 	uint32_t		tmres;
5046f45ec7bSml29623 	p_nxge_ldg_t		ldgp;
5056f45ec7bSml29623 	p_nxge_ldv_t		ldvp;
5066f45ec7bSml29623 	p_nxge_ldv_t		ldvp_syserr;
507da14cebeSEric Cheng 	boolean_t		ldvp_syserr_alloced;
5086f45ec7bSml29623 } nxge_ldgv_t, *p_nxge_ldgv_t;
5096f45ec7bSml29623 
510678453a8Sspeer typedef enum {
511678453a8Sspeer 	NXGE_TRANSMIT_GROUP,	/* Legacy transmit group */
512678453a8Sspeer 	NXGE_RECEIVE_GROUP,	/* Legacy receive group */
513678453a8Sspeer 	NXGE_VR_GROUP,		/* Virtualization Region group */
514678453a8Sspeer 	EXT_TRANSMIT_GROUP,	/* External (Crossbow) transmit group */
515678453a8Sspeer 	EXT_RECEIVE_GROUP	/* External (Crossbow) receive group */
516678453a8Sspeer } nxge_grp_type_t;
517678453a8Sspeer 
518678453a8Sspeer #define	NXGE_ILLEGAL_CHANNEL	(NXGE_MAX_TDCS + 1)
519678453a8Sspeer 
520678453a8Sspeer typedef uint8_t nxge_channel_t;
521678453a8Sspeer 
522678453a8Sspeer typedef struct nxge_grp {
523678453a8Sspeer 	nxge_t			*nxge;
524678453a8Sspeer 	nxge_grp_type_t		type; /* Tx or Rx */
525678453a8Sspeer 
526678453a8Sspeer 	int			sequence; /* When it was created. */
527678453a8Sspeer 	int			index; /* nxge_grp_set_t.group[index] */
528678453a8Sspeer 
529678453a8Sspeer 	struct nx_dc		*dc; /* Linked list of DMA channels. */
530678453a8Sspeer 	size_t			count; /* A count of <dc> above. */
531678453a8Sspeer 
532678453a8Sspeer 	boolean_t		active;	/* Is it being used? */
533678453a8Sspeer 
534678453a8Sspeer 	dc_map_t		map; /* A bitmap of the channels in <dc>. */
535678453a8Sspeer 	nxge_channel_t		legend[NXGE_MAX_TDCS];
536678453a8Sspeer 
537678453a8Sspeer } nxge_grp_t;
538678453a8Sspeer 
539678453a8Sspeer typedef struct {
540678453a8Sspeer 	lg_map_t		map;
541678453a8Sspeer 	size_t			count;
542678453a8Sspeer } lg_data_t;
543678453a8Sspeer 
544678453a8Sspeer typedef struct {
545678453a8Sspeer 	dc_map_t		map;
546678453a8Sspeer 	size_t			count;
547678453a8Sspeer } dc_data_t;
548678453a8Sspeer 
549678453a8Sspeer #define	NXGE_DC_SET(map, channel)	map |= (1 << channel)
550678453a8Sspeer #define	NXGE_DC_RESET(map, channel)	map &= (~(1 << channel))
551678453a8Sspeer 
552da14cebeSEric Cheng /* For now, we only support up to 8 RDC/TDC groups */
553da14cebeSEric Cheng #define	NXGE_LOGICAL_GROUP_MAX	NXGE_MAX_RDC_GROUPS
554678453a8Sspeer 
555678453a8Sspeer typedef struct {
556678453a8Sspeer 	int			sequence; /* To order groups in time. */
557678453a8Sspeer 
558678453a8Sspeer 	/* These are this instance's logical groups. */
559678453a8Sspeer 	nxge_grp_t		*group[NXGE_LOGICAL_GROUP_MAX];
560678453a8Sspeer 	lg_data_t		lg;
561678453a8Sspeer 
562678453a8Sspeer 	dc_data_t		shared;	/* These DCs are being shared. */
563678453a8Sspeer 	dc_data_t		owned; /* These DCs belong to me. */
564678453a8Sspeer 	dc_data_t		dead; /* These DCs are in an error state. */
565678453a8Sspeer 
566678453a8Sspeer } nxge_grp_set_t;
567678453a8Sspeer 
568678453a8Sspeer /*
569da14cebeSEric Cheng  * Transmit Ring Group
570da14cebeSEric Cheng  * TX groups will be used exclusively for the purpose of Hybrid I/O.  From
571da14cebeSEric Cheng  * the point of view of the nxge driver, the groups will be software
572da14cebeSEric Cheng  * constructs which will be used to establish the relationship between TX
573da14cebeSEric Cheng  * rings and shares.
574da14cebeSEric Cheng  *
575678453a8Sspeer  * Receive Ring Group
576678453a8Sspeer  * One of the advanced virtualization features is the ability to bundle
577678453a8Sspeer  * multiple Receive Rings in a single group.  One or more MAC addresses may
578678453a8Sspeer  * be assigned to a group.  Incoming packets destined to the group's MAC
579678453a8Sspeer  * address(es) are delivered to any ring member, according to a programmable
580678453a8Sspeer  * or predefined RTS policy.  Member rings can be polled individually.
581678453a8Sspeer  * RX ring groups can come with a predefined set of member rings, or they
582678453a8Sspeer  * are programmable by adding and removing rings to/from them.
583678453a8Sspeer  */
584da14cebeSEric Cheng typedef struct _nxge_ring_group_t {
585678453a8Sspeer 	mac_group_handle_t	ghandle;
586678453a8Sspeer 	p_nxge_t		nxgep;
587da14cebeSEric Cheng 	boolean_t		started;
5882cf06b0dSMichael Speer 	boolean_t		port_default_grp;
589da14cebeSEric Cheng 	mac_ring_type_t		type;
590678453a8Sspeer 	int			gindex;
591678453a8Sspeer 	int			sindex;
592da14cebeSEric Cheng 	int			rdctbl;
593da14cebeSEric Cheng 	int			n_mac_addrs;
594da14cebeSEric Cheng } nxge_ring_group_t;
595678453a8Sspeer 
596678453a8Sspeer /*
597678453a8Sspeer  * Ring Handle
598678453a8Sspeer  */
599678453a8Sspeer typedef struct _nxge_ring_handle_t {
600678453a8Sspeer 	p_nxge_t		nxgep;
601678453a8Sspeer 	int			index;		/* port-wise */
602678453a8Sspeer 	mac_ring_handle_t	ring_handle;
6030dc2366fSVenugopal Iyer 	uint64_t		ring_gen_num;	/* For RX Ring Start */
6040dc2366fSVenugopal Iyer 	uint32_t		channel;
605da14cebeSEric Cheng } nxge_ring_handle_t, *p_nxge_ring_handle_t;
606678453a8Sspeer 
607678453a8Sspeer /*
608678453a8Sspeer  * Share Handle
609678453a8Sspeer  */
610678453a8Sspeer typedef struct _nxge_share_handle_t {
611678453a8Sspeer 	p_nxge_t		nxgep;		/* Driver Handle */
612678453a8Sspeer 	int			index;
613678453a8Sspeer 	void			*vrp;
614678453a8Sspeer 	uint64_t		tmap;
615678453a8Sspeer 	uint64_t		rmap;
616678453a8Sspeer 	int			rxgroup;
617678453a8Sspeer 	boolean_t		active;
618678453a8Sspeer } nxge_share_handle_t;
619678453a8Sspeer 
6206f45ec7bSml29623 /*
6216f45ec7bSml29623  * Neptune Device instance state information.
6226f45ec7bSml29623  *
6236f45ec7bSml29623  * Each instance is dynamically allocated on first attach.
6246f45ec7bSml29623  */
6256f45ec7bSml29623 struct _nxge_t {
6266f45ec7bSml29623 	dev_info_t		*dip;		/* device instance */
6276f45ec7bSml29623 	dev_info_t		*p_dip;		/* Parent's device instance */
6286f45ec7bSml29623 	int			instance;	/* instance number */
6296f45ec7bSml29623 	int			function_num;	/* device function number */
6306f45ec7bSml29623 	int			nports;		/* # of ports on this device */
6316f45ec7bSml29623 	int			board_ver;	/* Board Version */
6326f45ec7bSml29623 	int			use_partition;	/* partition is enabled */
6336f45ec7bSml29623 	uint32_t		drv_state;	/* driver state bit flags */
6346f45ec7bSml29623 	uint64_t		nxge_debug_level; /* driver state bit flags */
6356f45ec7bSml29623 	kmutex_t		genlock[1];
6366f45ec7bSml29623 	enum nxge_mac_state	nxge_mac_state;
6376f45ec7bSml29623 
6386f45ec7bSml29623 	p_dev_regs_t		dev_regs;
6396f45ec7bSml29623 	npi_handle_t		npi_handle;
6406f45ec7bSml29623 	npi_handle_t		npi_pci_handle;
6416f45ec7bSml29623 	npi_handle_t		npi_reg_handle;
6426f45ec7bSml29623 	npi_handle_t		npi_msi_handle;
6436f45ec7bSml29623 	npi_handle_t		npi_vreg_handle;
6446f45ec7bSml29623 	npi_handle_t		npi_v2reg_handle;
6456f45ec7bSml29623 
64659ac0c16Sdavemq 	nxge_xcvr_table_t	xcvr;
6472d17280bSsbehera 	boolean_t		hot_swappable_phy;
6482d17280bSsbehera 	boolean_t		phy_absent;
6492d17280bSsbehera 	uint32_t		xcvr_addr;
6502d17280bSsbehera 	uint16_t		chip_id;
65189282175SSantwona Behera 	nxge_nlp_conn_t		nlp_conn;
652*9d587972SSantwona Behera 	nxge_phy_prop_t		phy_prop;
653*9d587972SSantwona Behera 	nxge_serdes_prop_t	srds_prop;
65489282175SSantwona Behera 
6556f45ec7bSml29623 	nxge_mac_t		mac;
6566f45ec7bSml29623 	nxge_ipp_t		ipp;
6576f45ec7bSml29623 	nxge_txc_t		txc;
6586f45ec7bSml29623 	nxge_classify_t		classifier;
6596f45ec7bSml29623 
6606f45ec7bSml29623 	mac_handle_t		mach;	/* mac module handle */
6616f45ec7bSml29623 	p_nxge_stats_t		statsp;
6626f45ec7bSml29623 	uint32_t		param_count;
6636f45ec7bSml29623 	p_nxge_param_t		param_arr;
6641bd6825cSml29623 
6651bd6825cSml29623 	uint32_t		param_en_pause:1,
6661bd6825cSml29623 				param_en_asym_pause:1,
6671bd6825cSml29623 				param_en_1000fdx:1,
6681bd6825cSml29623 				param_en_100fdx:1,
6691bd6825cSml29623 				param_en_10fdx:1,
6701bd6825cSml29623 				param_pad_to_32:27;
6711bd6825cSml29623 
6726f45ec7bSml29623 	nxge_hw_list_t		*nxge_hw_p; 	/* pointer to per Neptune */
6736f45ec7bSml29623 	niu_type_t		niu_type;
6742e59129aSraghus 	platform_type_t		platform_type;
6756f45ec7bSml29623 	boolean_t		os_addr_mode32;	/* set to 1 for 32 bit mode */
676678453a8Sspeer 
6776f45ec7bSml29623 	uint8_t			def_rdc;
6786f45ec7bSml29623 
6796f45ec7bSml29623 	nxge_intr_t		nxge_intr_type;
6806f45ec7bSml29623 	nxge_dma_pt_cfg_t 	pt_config;
6816f45ec7bSml29623 	nxge_class_pt_cfg_t 	class_config;
6826f45ec7bSml29623 
6836f45ec7bSml29623 	/* Logical device and group data structures. */
6846f45ec7bSml29623 	p_nxge_ldgv_t		ldgvp;
6856f45ec7bSml29623 
68656d930aeSspeer 	npi_vpd_info_t		vpd_info;
6876f45ec7bSml29623 
6886f45ec7bSml29623 	ether_addr_st		factaddr;	/* factory mac address	    */
6896f45ec7bSml29623 	ether_addr_st		ouraddr;	/* individual address	    */
6902cf06b0dSMichael Speer 	boolean_t		primary;	/* primary addr set?.	    */
6916f45ec7bSml29623 	kmutex_t		ouraddr_lock;	/* lock to protect to uradd */
6926f45ec7bSml29623 
6936f45ec7bSml29623 	ddi_iblock_cookie_t	interrupt_cookie;
6946f45ec7bSml29623 
6956f45ec7bSml29623 	/*
6966f45ec7bSml29623 	 * Blocks of memory may be pre-allocated by the
6976f45ec7bSml29623 	 * partition manager or the driver. They may include
6986f45ec7bSml29623 	 * blocks for configuration and buffers. The idea is
6996f45ec7bSml29623 	 * to preallocate big blocks of contiguous areas in
7006f45ec7bSml29623 	 * system memory (i.e. with IOMMU). These blocks then
7016f45ec7bSml29623 	 * will be broken up to a fixed number of blocks with
7026f45ec7bSml29623 	 * each block having the same block size (4K, 8K, 16K or
7036f45ec7bSml29623 	 * 32K) in the case of buffer blocks. For systems that
7046f45ec7bSml29623 	 * do not support DVMA, more than one big block will be
7056f45ec7bSml29623 	 * allocated.
7066f45ec7bSml29623 	 */
7076f45ec7bSml29623 	uint32_t		rx_default_block_size;
7086f45ec7bSml29623 	nxge_rx_block_size_t	rx_bksize_code;
7096f45ec7bSml29623 
7106f45ec7bSml29623 	p_nxge_dma_pool_t	rx_buf_pool_p;
7116f45ec7bSml29623 	p_nxge_dma_pool_t	rx_cntl_pool_p;
7126f45ec7bSml29623 
7136f45ec7bSml29623 	p_nxge_dma_pool_t	tx_buf_pool_p;
7146f45ec7bSml29623 	p_nxge_dma_pool_t	tx_cntl_pool_p;
7156f45ec7bSml29623 
7166f45ec7bSml29623 	/* Receive buffer block ring and completion ring. */
7176f45ec7bSml29623 	p_rx_rbr_rings_t 	rx_rbr_rings;
7186f45ec7bSml29623 	p_rx_rcr_rings_t 	rx_rcr_rings;
7196f45ec7bSml29623 	p_rx_mbox_areas_t 	rx_mbox_areas_p;
7206f45ec7bSml29623 
7216f45ec7bSml29623 	uint32_t		rdc_mask;
7226f45ec7bSml29623 
7236f45ec7bSml29623 	/* Transmit descriptors rings */
7246f45ec7bSml29623 	p_tx_rings_t 		tx_rings;
7256f45ec7bSml29623 	p_tx_mbox_areas_t	tx_mbox_areas_p;
7266f45ec7bSml29623 
7276f45ec7bSml29623 	ddi_dma_handle_t 	dmasparehandle;
7286f45ec7bSml29623 
7296f45ec7bSml29623 	ulong_t 		sys_page_sz;
7306f45ec7bSml29623 	ulong_t 		sys_page_mask;
7316f45ec7bSml29623 	int 			suspended;
7326f45ec7bSml29623 
7336f45ec7bSml29623 	mii_bmsr_t 		bmsr;		/* xcvr status at last poll. */
7346f45ec7bSml29623 	mii_bmsr_t 		soft_bmsr;	/* xcvr status kept by SW. */
7356f45ec7bSml29623 
7366f45ec7bSml29623 	kmutex_t 		mif_lock;	/* Lock to protect the list. */
7376f45ec7bSml29623 
7386f45ec7bSml29623 	void 			(*mii_read)();
7396f45ec7bSml29623 	void 			(*mii_write)();
7406f45ec7bSml29623 	void 			(*mii_poll)();
7416f45ec7bSml29623 	filter_t 		filter;		/* Current instance filter */
7426f45ec7bSml29623 	p_hash_filter_t 	hash_filter;	/* Multicast hash filter. */
7436f45ec7bSml29623 	krwlock_t		filter_lock;	/* Lock to protect filters. */
7446f45ec7bSml29623 
7456f45ec7bSml29623 	ulong_t 		sys_burst_sz;
7466f45ec7bSml29623 
7476f45ec7bSml29623 	uint8_t 		cache_line;
7486f45ec7bSml29623 
7496f45ec7bSml29623 	timeout_id_t 		nxge_link_poll_timerid;
7506f45ec7bSml29623 	timeout_id_t 		nxge_timerid;
7516f45ec7bSml29623 
7526f45ec7bSml29623 	uint_t 			need_periodic_reclaim;
7536f45ec7bSml29623 	timeout_id_t 		reclaim_timer;
7546f45ec7bSml29623 
7556f45ec7bSml29623 	uint8_t 		msg_min;
7566f45ec7bSml29623 	uint8_t 		crc_size;
7576f45ec7bSml29623 
7586f45ec7bSml29623 	boolean_t 		hard_props_read;
7596f45ec7bSml29623 
7606f45ec7bSml29623 	uint32_t 		nxge_ncpus;
7616f45ec7bSml29623 	uint16_t 		intr_timeout;
7626f45ec7bSml29623 	uint16_t 		intr_threshold;
7636f45ec7bSml29623 
7646f45ec7bSml29623 	int			fm_capabilities; /* FMA capabilities */
7656f45ec7bSml29623 
7666f45ec7bSml29623 	uint32_t 		nxge_port_rbr_size;
767678453a8Sspeer 	uint32_t 		nxge_port_rbr_spare_size;
7686f45ec7bSml29623 	uint32_t 		nxge_port_rcr_size;
769678453a8Sspeer 	uint32_t		nxge_port_rx_cntl_alloc_size;
7706f45ec7bSml29623 	uint32_t 		nxge_port_tx_ring_size;
7716f45ec7bSml29623 	nxge_mmac_t		nxge_mmac_info;
7726f45ec7bSml29623 #if	defined(sun4v)
7736f45ec7bSml29623 	boolean_t		niu_hsvc_available;
7746f45ec7bSml29623 	hsvc_info_t		niu_hsvc;
7756f45ec7bSml29623 	uint64_t		niu_min_ver;
7766f45ec7bSml29623 #endif
7776f45ec7bSml29623 	boolean_t		link_notify;
778774da109Stc99174@train 	int			link_check_count;
77998ecde52Stm144005 
78098ecde52Stm144005 	kmutex_t		poll_lock;
78198ecde52Stm144005 	kcondvar_t		poll_cv;
78298ecde52Stm144005 	link_mon_enable_t	poll_state;
78398ecde52Stm144005 #define	NXGE_MAGIC		0x3ab434e3
78498ecde52Stm144005 	uint32_t		nxge_magic;
7853d16f8e7Sml29623 
7863d16f8e7Sml29623 	int			soft_lso_enable;
787678453a8Sspeer 	/* The following fields are LDOMs-specific additions. */
788678453a8Sspeer 	nxge_environs_t		environs;
789678453a8Sspeer 	ether_addr_t		hio_mac_addr;
790678453a8Sspeer 	uint32_t		niu_cfg_hdl;
791678453a8Sspeer 	kmutex_t		group_lock;
792678453a8Sspeer 
793678453a8Sspeer 	struct nxge_hio_vr	*hio_vr;
794678453a8Sspeer 
795678453a8Sspeer 	nxge_grp_set_t		rx_set;
796678453a8Sspeer 	nxge_grp_set_t		tx_set;
797330cd344SMichael Speer 	boolean_t		tdc_is_shared[NXGE_MAX_TDCS];
798678453a8Sspeer 
799da14cebeSEric Cheng 	/* Ring Handles */
800da14cebeSEric Cheng 	nxge_ring_handle_t	tx_ring_handles[NXGE_MAX_TDCS];
801da14cebeSEric Cheng 	nxge_ring_handle_t	rx_ring_handles[NXGE_MAX_RDCS];
802da14cebeSEric Cheng 
803da14cebeSEric Cheng 	nxge_ring_group_t	tx_hio_groups[NXGE_MAX_TDC_GROUPS];
804da14cebeSEric Cheng 	nxge_ring_group_t	rx_hio_groups[NXGE_MAX_RDC_GROUPS];
805da14cebeSEric Cheng 
806678453a8Sspeer 	nxge_share_handle_t	shares[NXGE_MAX_VRS];
8074df55fdeSJanie Lu 
8084df55fdeSJanie Lu 	/*
8094df55fdeSJanie Lu 	 * KT-NIU:
8104df55fdeSJanie Lu 	 *	KT family will have up to 4 NIUs per system.
8114df55fdeSJanie Lu 	 *	Differences between N2/NIU and KT/NIU:
8124df55fdeSJanie Lu 	 *		SerDes, Hypervisor interfaces,
8134df55fdeSJanie Lu 	 *		additional NIU classification features.
8144df55fdeSJanie Lu 	 */
8154df55fdeSJanie Lu 	niu_hw_type_t		niu_hw_type;
8166f45ec7bSml29623 };
8176f45ec7bSml29623 
8186f45ec7bSml29623 /*
8196f45ec7bSml29623  * Driver state flags.
8206f45ec7bSml29623  */
8216f45ec7bSml29623 #define	STATE_REGS_MAPPED	0x000000001	/* device registers mapped */
8226f45ec7bSml29623 #define	STATE_KSTATS_SETUP	0x000000002	/* kstats allocated	*/
8236f45ec7bSml29623 #define	STATE_NODE_CREATED	0x000000004	/* device node created	*/
8246f45ec7bSml29623 #define	STATE_HW_CONFIG_CREATED	0x000000008	/* hardware properties	*/
8256f45ec7bSml29623 #define	STATE_HW_INITIALIZED	0x000000010	/* hardware initialized	*/
8266f45ec7bSml29623 #define	STATE_MDIO_LOCK_INIT	0x000000020	/* mdio lock initialized */
8276f45ec7bSml29623 #define	STATE_MII_LOCK_INIT	0x000000040	/* mii lock initialized */
8286f45ec7bSml29623 
8296f45ec7bSml29623 #define	STOP_POLL_THRESH 	9
8306f45ec7bSml29623 #define	START_POLL_THRESH	2
8316f45ec7bSml29623 
8326f45ec7bSml29623 typedef struct _nxge_port_kstat_t {
8336f45ec7bSml29623 	/*
8346f45ec7bSml29623 	 * Transciever state informations.
8356f45ec7bSml29623 	 */
8366f45ec7bSml29623 	kstat_named_t	xcvr_inits;
8376f45ec7bSml29623 	kstat_named_t	xcvr_inuse;
8386f45ec7bSml29623 	kstat_named_t	xcvr_addr;
8396f45ec7bSml29623 	kstat_named_t	xcvr_id;
8406f45ec7bSml29623 	kstat_named_t	cap_autoneg;
8416f45ec7bSml29623 	kstat_named_t	cap_10gfdx;
8426f45ec7bSml29623 	kstat_named_t	cap_10ghdx;
8436f45ec7bSml29623 	kstat_named_t	cap_1000fdx;
8446f45ec7bSml29623 	kstat_named_t	cap_1000hdx;
8456f45ec7bSml29623 	kstat_named_t	cap_100T4;
8466f45ec7bSml29623 	kstat_named_t	cap_100fdx;
8476f45ec7bSml29623 	kstat_named_t	cap_100hdx;
8486f45ec7bSml29623 	kstat_named_t	cap_10fdx;
8496f45ec7bSml29623 	kstat_named_t	cap_10hdx;
8506f45ec7bSml29623 	kstat_named_t	cap_asmpause;
8516f45ec7bSml29623 	kstat_named_t	cap_pause;
8526f45ec7bSml29623 
8536f45ec7bSml29623 	/*
8546f45ec7bSml29623 	 * Link partner capabilities.
8556f45ec7bSml29623 	 */
8566f45ec7bSml29623 	kstat_named_t	lp_cap_autoneg;
8576f45ec7bSml29623 	kstat_named_t	lp_cap_10gfdx;
8586f45ec7bSml29623 	kstat_named_t	lp_cap_10ghdx;
8596f45ec7bSml29623 	kstat_named_t	lp_cap_1000fdx;
8606f45ec7bSml29623 	kstat_named_t	lp_cap_1000hdx;
8616f45ec7bSml29623 	kstat_named_t	lp_cap_100T4;
8626f45ec7bSml29623 	kstat_named_t	lp_cap_100fdx;
8636f45ec7bSml29623 	kstat_named_t	lp_cap_100hdx;
8646f45ec7bSml29623 	kstat_named_t	lp_cap_10fdx;
8656f45ec7bSml29623 	kstat_named_t	lp_cap_10hdx;
8666f45ec7bSml29623 	kstat_named_t	lp_cap_asmpause;
8676f45ec7bSml29623 	kstat_named_t	lp_cap_pause;
8686f45ec7bSml29623 
8696f45ec7bSml29623 	/*
8706f45ec7bSml29623 	 * Shared link setup.
8716f45ec7bSml29623 	 */
8726f45ec7bSml29623 	kstat_named_t	link_T4;
8736f45ec7bSml29623 	kstat_named_t	link_speed;
8746f45ec7bSml29623 	kstat_named_t	link_duplex;
8756f45ec7bSml29623 	kstat_named_t	link_asmpause;
8766f45ec7bSml29623 	kstat_named_t	link_pause;
8776f45ec7bSml29623 	kstat_named_t	link_up;
8786f45ec7bSml29623 
8796f45ec7bSml29623 	/*
8806f45ec7bSml29623 	 * Lets the user know the MTU currently in use by
8816f45ec7bSml29623 	 * the physical MAC port.
8826f45ec7bSml29623 	 */
8836f45ec7bSml29623 	kstat_named_t	mac_mtu;
8846f45ec7bSml29623 	kstat_named_t	lb_mode;
8856f45ec7bSml29623 	kstat_named_t	qos_mode;
8866f45ec7bSml29623 	kstat_named_t	trunk_mode;
8876f45ec7bSml29623 
8886f45ec7bSml29623 	/*
8896f45ec7bSml29623 	 * Misc MAC statistics.
8906f45ec7bSml29623 	 */
8916f45ec7bSml29623 	kstat_named_t	ifspeed;
8926f45ec7bSml29623 	kstat_named_t	promisc;
8936f45ec7bSml29623 	kstat_named_t	rev_id;
8946f45ec7bSml29623 
8956f45ec7bSml29623 	/*
8966f45ec7bSml29623 	 * Some statistics added to support bringup, these
8976f45ec7bSml29623 	 * should be removed.
8986f45ec7bSml29623 	 */
8996f45ec7bSml29623 	kstat_named_t	user_defined;
9006f45ec7bSml29623 } nxge_port_kstat_t, *p_nxge_port_kstat_t;
9016f45ec7bSml29623 
9026f45ec7bSml29623 typedef struct _nxge_rdc_kstat {
9036f45ec7bSml29623 	/*
9046f45ec7bSml29623 	 * Receive DMA channel statistics.
9056f45ec7bSml29623 	 */
9066f45ec7bSml29623 	kstat_named_t	ipackets;
9076f45ec7bSml29623 	kstat_named_t	rbytes;
9086f45ec7bSml29623 	kstat_named_t	errors;
9096f45ec7bSml29623 	kstat_named_t	dcf_err;
9106f45ec7bSml29623 	kstat_named_t	rcr_ack_err;
9116f45ec7bSml29623 
9126f45ec7bSml29623 	kstat_named_t	dc_fifoflow_err;
9136f45ec7bSml29623 	kstat_named_t	rcr_sha_par_err;
9146f45ec7bSml29623 	kstat_named_t	rbr_pre_par_err;
9156f45ec7bSml29623 	kstat_named_t	wred_drop;
9166f45ec7bSml29623 	kstat_named_t	rbr_pre_emty;
9176f45ec7bSml29623 
9186f45ec7bSml29623 	kstat_named_t	rcr_shadow_full;
9196f45ec7bSml29623 	kstat_named_t	rbr_tmout;
9206f45ec7bSml29623 	kstat_named_t	rsp_cnt_err;
9216f45ec7bSml29623 	kstat_named_t	byte_en_bus;
9226f45ec7bSml29623 	kstat_named_t	rsp_dat_err;
9236f45ec7bSml29623 
9244202ea4bSsbehera 	kstat_named_t	pkt_too_long_err;
9256f45ec7bSml29623 	kstat_named_t	compl_l2_err;
9266f45ec7bSml29623 	kstat_named_t	compl_l4_cksum_err;
9276f45ec7bSml29623 	kstat_named_t	compl_zcp_soft_err;
9286f45ec7bSml29623 	kstat_named_t	compl_fflp_soft_err;
9296f45ec7bSml29623 	kstat_named_t	config_err;
9306f45ec7bSml29623 
9316f45ec7bSml29623 	kstat_named_t	rcrincon;
9326f45ec7bSml29623 	kstat_named_t	rcrfull;
9336f45ec7bSml29623 	kstat_named_t	rbr_empty;
9346f45ec7bSml29623 	kstat_named_t	rbrfull;
9356f45ec7bSml29623 	kstat_named_t	rbrlogpage;
9366f45ec7bSml29623 
9376f45ec7bSml29623 	kstat_named_t	cfiglogpage;
9386f45ec7bSml29623 	kstat_named_t	port_drop_pkt;
9396f45ec7bSml29623 	kstat_named_t	rcr_to;
9406f45ec7bSml29623 	kstat_named_t	rcr_thresh;
9416f45ec7bSml29623 	kstat_named_t	rcr_mex;
9426f45ec7bSml29623 	kstat_named_t	id_mismatch;
9436f45ec7bSml29623 	kstat_named_t	zcp_eop_err;
9446f45ec7bSml29623 	kstat_named_t	ipp_eop_err;
9456f45ec7bSml29623 } nxge_rdc_kstat_t, *p_nxge_rdc_kstat_t;
9466f45ec7bSml29623 
9476f45ec7bSml29623 typedef struct _nxge_rdc_sys_kstat {
9486f45ec7bSml29623 	/*
9496f45ec7bSml29623 	 * Receive DMA system statistics.
9506f45ec7bSml29623 	 */
9516f45ec7bSml29623 	kstat_named_t	pre_par;
9526f45ec7bSml29623 	kstat_named_t	sha_par;
9536f45ec7bSml29623 	kstat_named_t	id_mismatch;
9546f45ec7bSml29623 	kstat_named_t	ipp_eop_err;
9556f45ec7bSml29623 	kstat_named_t	zcp_eop_err;
9566f45ec7bSml29623 } nxge_rdc_sys_kstat_t, *p_nxge_rdc_sys_kstat_t;
9576f45ec7bSml29623 
9586f45ec7bSml29623 typedef	struct _nxge_tdc_kstat {
9596f45ec7bSml29623 	/*
9606f45ec7bSml29623 	 * Transmit DMA channel statistics.
9616f45ec7bSml29623 	 */
9626f45ec7bSml29623 	kstat_named_t	opackets;
9636f45ec7bSml29623 	kstat_named_t	obytes;
9646f45ec7bSml29623 	kstat_named_t	oerrors;
9656f45ec7bSml29623 	kstat_named_t	tx_inits;
9666f45ec7bSml29623 	kstat_named_t	tx_no_buf;
9676f45ec7bSml29623 
9686f45ec7bSml29623 	kstat_named_t	mbox_err;
9696f45ec7bSml29623 	kstat_named_t	pkt_size_err;
9706f45ec7bSml29623 	kstat_named_t	tx_ring_oflow;
9716f45ec7bSml29623 	kstat_named_t	pref_buf_ecc_err;
9726f45ec7bSml29623 	kstat_named_t	nack_pref;
9736f45ec7bSml29623 	kstat_named_t	nack_pkt_rd;
9746f45ec7bSml29623 	kstat_named_t	conf_part_err;
9756f45ec7bSml29623 	kstat_named_t	pkt_prt_err;
9766f45ec7bSml29623 	kstat_named_t	reset_fail;
9776f45ec7bSml29623 /* used to in the common (per port) counter */
9786f45ec7bSml29623 
9796f45ec7bSml29623 	kstat_named_t	tx_starts;
9806f45ec7bSml29623 	kstat_named_t	tx_nocanput;
9816f45ec7bSml29623 	kstat_named_t	tx_msgdup_fail;
9826f45ec7bSml29623 	kstat_named_t	tx_allocb_fail;
9836f45ec7bSml29623 	kstat_named_t	tx_no_desc;
9846f45ec7bSml29623 	kstat_named_t	tx_dma_bind_fail;
9856f45ec7bSml29623 	kstat_named_t	tx_uflo;
9866f45ec7bSml29623 	kstat_named_t	tx_hdr_pkts;
9876f45ec7bSml29623 	kstat_named_t	tx_ddi_pkts;
9886f45ec7bSml29623 	kstat_named_t	tx_dvma_pkts;
9896f45ec7bSml29623 	kstat_named_t	tx_max_pend;
9906f45ec7bSml29623 } nxge_tdc_kstat_t, *p_nxge_tdc_kstat_t;
9916f45ec7bSml29623 
9926f45ec7bSml29623 typedef	struct _nxge_txc_kstat {
9936f45ec7bSml29623 	/*
9946f45ec7bSml29623 	 * Transmit port TXC block statistics.
9956f45ec7bSml29623 	 */
9966f45ec7bSml29623 	kstat_named_t	pkt_stuffed;
9976f45ec7bSml29623 	kstat_named_t	pkt_xmit;
9986f45ec7bSml29623 	kstat_named_t	ro_correct_err;
9996f45ec7bSml29623 	kstat_named_t	ro_uncorrect_err;
10006f45ec7bSml29623 	kstat_named_t	sf_correct_err;
10016f45ec7bSml29623 	kstat_named_t	sf_uncorrect_err;
10026f45ec7bSml29623 	kstat_named_t	address_failed;
10036f45ec7bSml29623 	kstat_named_t	dma_failed;
10046f45ec7bSml29623 	kstat_named_t	length_failed;
10056f45ec7bSml29623 	kstat_named_t	pkt_assy_dead;
10066f45ec7bSml29623 	kstat_named_t	reorder_err;
10076f45ec7bSml29623 } nxge_txc_kstat_t, *p_nxge_txc_kstat_t;
10086f45ec7bSml29623 
10096f45ec7bSml29623 typedef struct _nxge_ipp_kstat {
10106f45ec7bSml29623 	/*
10116f45ec7bSml29623 	 * Receive port IPP block statistics.
10126f45ec7bSml29623 	 */
10136f45ec7bSml29623 	kstat_named_t	eop_miss;
10146f45ec7bSml29623 	kstat_named_t	sop_miss;
10156f45ec7bSml29623 	kstat_named_t	dfifo_ue;
10166f45ec7bSml29623 	kstat_named_t	ecc_err_cnt;
1017846a903dSml29623 	kstat_named_t	pfifo_perr;
10186f45ec7bSml29623 	kstat_named_t	pfifo_over;
10196f45ec7bSml29623 	kstat_named_t	pfifo_und;
10206f45ec7bSml29623 	kstat_named_t	bad_cs_cnt;
10216f45ec7bSml29623 	kstat_named_t	pkt_dis_cnt;
10226f45ec7bSml29623 } nxge_ipp_kstat_t, *p_nxge_ipp_kstat_t;
10236f45ec7bSml29623 
10246f45ec7bSml29623 typedef	struct _nxge_zcp_kstat {
10256f45ec7bSml29623 	/*
10266f45ec7bSml29623 	 * ZCP statistics.
10276f45ec7bSml29623 	 */
10286f45ec7bSml29623 	kstat_named_t	errors;
10296f45ec7bSml29623 	kstat_named_t	inits;
10306f45ec7bSml29623 	kstat_named_t	rrfifo_underrun;
10316f45ec7bSml29623 	kstat_named_t	rrfifo_overrun;
10326f45ec7bSml29623 	kstat_named_t	rspfifo_uncorr_err;
10336f45ec7bSml29623 	kstat_named_t	buffer_overflow;
10346f45ec7bSml29623 	kstat_named_t	stat_tbl_perr;
10356f45ec7bSml29623 	kstat_named_t	dyn_tbl_perr;
10366f45ec7bSml29623 	kstat_named_t	buf_tbl_perr;
10376f45ec7bSml29623 	kstat_named_t	tt_program_err;
10386f45ec7bSml29623 	kstat_named_t	rsp_tt_index_err;
10396f45ec7bSml29623 	kstat_named_t	slv_tt_index_err;
10406f45ec7bSml29623 	kstat_named_t	zcp_tt_index_err;
10416f45ec7bSml29623 	kstat_named_t	access_fail;
10426f45ec7bSml29623 	kstat_named_t	cfifo_ecc;
10436f45ec7bSml29623 } nxge_zcp_kstat_t, *p_nxge_zcp_kstat_t;
10446f45ec7bSml29623 
10456f45ec7bSml29623 typedef	struct _nxge_mac_kstat {
10466f45ec7bSml29623 	/*
10476f45ec7bSml29623 	 * Transmit MAC statistics.
10486f45ec7bSml29623 	 */
10496f45ec7bSml29623 	kstat_named_t	tx_frame_cnt;
10506f45ec7bSml29623 	kstat_named_t	tx_underflow_err;
10516f45ec7bSml29623 	kstat_named_t	tx_overflow_err;
10526f45ec7bSml29623 	kstat_named_t	tx_maxpktsize_err;
10536f45ec7bSml29623 	kstat_named_t	tx_fifo_xfr_err;
10546f45ec7bSml29623 	kstat_named_t	tx_byte_cnt;
10556f45ec7bSml29623 
10566f45ec7bSml29623 	/*
10576f45ec7bSml29623 	 * Receive MAC statistics.
10586f45ec7bSml29623 	 */
10596f45ec7bSml29623 	kstat_named_t	rx_frame_cnt;
10606f45ec7bSml29623 	kstat_named_t	rx_underflow_err;
10616f45ec7bSml29623 	kstat_named_t	rx_overflow_err;
10626f45ec7bSml29623 	kstat_named_t	rx_len_err_cnt;
10636f45ec7bSml29623 	kstat_named_t	rx_crc_err_cnt;
10646f45ec7bSml29623 	kstat_named_t	rx_viol_err_cnt;
10656f45ec7bSml29623 	kstat_named_t	rx_byte_cnt;
10666f45ec7bSml29623 	kstat_named_t	rx_hist1_cnt;
10676f45ec7bSml29623 	kstat_named_t	rx_hist2_cnt;
10686f45ec7bSml29623 	kstat_named_t	rx_hist3_cnt;
10696f45ec7bSml29623 	kstat_named_t	rx_hist4_cnt;
10706f45ec7bSml29623 	kstat_named_t	rx_hist5_cnt;
10716f45ec7bSml29623 	kstat_named_t	rx_hist6_cnt;
1072321febdeSsbehera 	kstat_named_t	rx_hist7_cnt;
10736f45ec7bSml29623 	kstat_named_t	rx_broadcast_cnt;
10746f45ec7bSml29623 	kstat_named_t	rx_mult_cnt;
10756f45ec7bSml29623 	kstat_named_t	rx_frag_cnt;
10766f45ec7bSml29623 	kstat_named_t	rx_frame_align_err_cnt;
10776f45ec7bSml29623 	kstat_named_t	rx_linkfault_err_cnt;
10786f45ec7bSml29623 	kstat_named_t	rx_local_fault_err_cnt;
10796f45ec7bSml29623 	kstat_named_t	rx_remote_fault_err_cnt;
10806f45ec7bSml29623 } nxge_mac_kstat_t, *p_nxge_mac_kstat_t;
10816f45ec7bSml29623 
10826f45ec7bSml29623 typedef	struct _nxge_xmac_kstat {
10836f45ec7bSml29623 	/*
10846f45ec7bSml29623 	 * XMAC statistics.
10856f45ec7bSml29623 	 */
10866f45ec7bSml29623 	kstat_named_t	tx_frame_cnt;
10876f45ec7bSml29623 	kstat_named_t	tx_underflow_err;
10886f45ec7bSml29623 	kstat_named_t	tx_maxpktsize_err;
10896f45ec7bSml29623 	kstat_named_t	tx_overflow_err;
10906f45ec7bSml29623 	kstat_named_t	tx_fifo_xfr_err;
10916f45ec7bSml29623 	kstat_named_t	tx_byte_cnt;
10926f45ec7bSml29623 	kstat_named_t	rx_frame_cnt;
10936f45ec7bSml29623 	kstat_named_t	rx_underflow_err;
10946f45ec7bSml29623 	kstat_named_t	rx_overflow_err;
10956f45ec7bSml29623 	kstat_named_t	rx_crc_err_cnt;
10966f45ec7bSml29623 	kstat_named_t	rx_len_err_cnt;
10976f45ec7bSml29623 	kstat_named_t	rx_viol_err_cnt;
10986f45ec7bSml29623 	kstat_named_t	rx_byte_cnt;
10996f45ec7bSml29623 	kstat_named_t	rx_hist1_cnt;
11006f45ec7bSml29623 	kstat_named_t	rx_hist2_cnt;
11016f45ec7bSml29623 	kstat_named_t	rx_hist3_cnt;
11026f45ec7bSml29623 	kstat_named_t	rx_hist4_cnt;
11036f45ec7bSml29623 	kstat_named_t	rx_hist5_cnt;
11046f45ec7bSml29623 	kstat_named_t	rx_hist6_cnt;
11056f45ec7bSml29623 	kstat_named_t	rx_hist7_cnt;
11066f45ec7bSml29623 	kstat_named_t	rx_broadcast_cnt;
11076f45ec7bSml29623 	kstat_named_t	rx_mult_cnt;
11086f45ec7bSml29623 	kstat_named_t	rx_frag_cnt;
11096f45ec7bSml29623 	kstat_named_t	rx_frame_align_err_cnt;
11106f45ec7bSml29623 	kstat_named_t	rx_linkfault_err_cnt;
11116f45ec7bSml29623 	kstat_named_t	rx_remote_fault_err_cnt;
11126f45ec7bSml29623 	kstat_named_t	rx_local_fault_err_cnt;
11136f45ec7bSml29623 	kstat_named_t	rx_pause_cnt;
11146f45ec7bSml29623 	kstat_named_t	xpcs_deskew_err_cnt;
11156f45ec7bSml29623 	kstat_named_t	xpcs_ln0_symbol_err_cnt;
11166f45ec7bSml29623 	kstat_named_t	xpcs_ln1_symbol_err_cnt;
11176f45ec7bSml29623 	kstat_named_t	xpcs_ln2_symbol_err_cnt;
11186f45ec7bSml29623 	kstat_named_t	xpcs_ln3_symbol_err_cnt;
11196f45ec7bSml29623 } nxge_xmac_kstat_t, *p_nxge_xmac_kstat_t;
11206f45ec7bSml29623 
11216f45ec7bSml29623 typedef	struct _nxge_bmac_kstat {
11226f45ec7bSml29623 	/*
11236f45ec7bSml29623 	 * BMAC statistics.
11246f45ec7bSml29623 	 */
11256f45ec7bSml29623 	kstat_named_t tx_frame_cnt;
11266f45ec7bSml29623 	kstat_named_t tx_underrun_err;
11276f45ec7bSml29623 	kstat_named_t tx_max_pkt_err;
11286f45ec7bSml29623 	kstat_named_t tx_byte_cnt;
11296f45ec7bSml29623 	kstat_named_t rx_frame_cnt;
11306f45ec7bSml29623 	kstat_named_t rx_byte_cnt;
11316f45ec7bSml29623 	kstat_named_t rx_overflow_err;
11326f45ec7bSml29623 	kstat_named_t rx_align_err_cnt;
11336f45ec7bSml29623 	kstat_named_t rx_crc_err_cnt;
11346f45ec7bSml29623 	kstat_named_t rx_len_err_cnt;
11356f45ec7bSml29623 	kstat_named_t rx_viol_err_cnt;
11366f45ec7bSml29623 	kstat_named_t rx_pause_cnt;
11376f45ec7bSml29623 	kstat_named_t tx_pause_state;
11386f45ec7bSml29623 	kstat_named_t tx_nopause_state;
11396f45ec7bSml29623 } nxge_bmac_kstat_t, *p_nxge_bmac_kstat_t;
11406f45ec7bSml29623 
11416f45ec7bSml29623 
11426f45ec7bSml29623 typedef struct _nxge_fflp_kstat {
11436f45ec7bSml29623 	/*
11446f45ec7bSml29623 	 * FFLP statistics.
11456f45ec7bSml29623 	 */
11466f45ec7bSml29623 
11476f45ec7bSml29623 	kstat_named_t	fflp_tcam_perr;
1148979818aeSmisaki 	kstat_named_t	fflp_tcam_ecc_err;
11496f45ec7bSml29623 	kstat_named_t	fflp_vlan_perr;
11506f45ec7bSml29623 	kstat_named_t	fflp_hasht_lookup_err;
11516f45ec7bSml29623 	kstat_named_t	fflp_hasht_data_err[MAX_PARTITION];
11526f45ec7bSml29623 } nxge_fflp_kstat_t, *p_nxge_fflp_kstat_t;
11536f45ec7bSml29623 
11546f45ec7bSml29623 typedef struct _nxge_mmac_kstat {
11556f45ec7bSml29623 	kstat_named_t	mmac_max_addr_cnt;
11566f45ec7bSml29623 	kstat_named_t	mmac_avail_addr_cnt;
11576f45ec7bSml29623 	kstat_named_t	mmac_addr1;
11586f45ec7bSml29623 	kstat_named_t	mmac_addr2;
11596f45ec7bSml29623 	kstat_named_t	mmac_addr3;
11606f45ec7bSml29623 	kstat_named_t	mmac_addr4;
11616f45ec7bSml29623 	kstat_named_t	mmac_addr5;
11626f45ec7bSml29623 	kstat_named_t	mmac_addr6;
11636f45ec7bSml29623 	kstat_named_t	mmac_addr7;
11646f45ec7bSml29623 	kstat_named_t	mmac_addr8;
11656f45ec7bSml29623 	kstat_named_t	mmac_addr9;
11666f45ec7bSml29623 	kstat_named_t	mmac_addr10;
11676f45ec7bSml29623 	kstat_named_t	mmac_addr11;
11686f45ec7bSml29623 	kstat_named_t	mmac_addr12;
11696f45ec7bSml29623 	kstat_named_t	mmac_addr13;
11706f45ec7bSml29623 	kstat_named_t	mmac_addr14;
11716f45ec7bSml29623 	kstat_named_t	mmac_addr15;
11726f45ec7bSml29623 	kstat_named_t	mmac_addr16;
11736f45ec7bSml29623 } nxge_mmac_kstat_t, *p_nxge_mmac_kstat_t;
11746f45ec7bSml29623 
11756f45ec7bSml29623 /*
11766f45ec7bSml29623  * Prototype definitions.
11776f45ec7bSml29623  */
11786f45ec7bSml29623 nxge_status_t nxge_init(p_nxge_t);
11796f45ec7bSml29623 void nxge_uninit(p_nxge_t);
11806f45ec7bSml29623 void nxge_get64(p_nxge_t, p_mblk_t);
11816f45ec7bSml29623 void nxge_put64(p_nxge_t, p_mblk_t);
11826f45ec7bSml29623 void nxge_pio_loop(p_nxge_t, p_mblk_t);
11836f45ec7bSml29623 
11846f45ec7bSml29623 typedef	void	(*fptrv_t)();
11856f45ec7bSml29623 timeout_id_t	nxge_start_timer(p_nxge_t, fptrv_t, int);
11866f45ec7bSml29623 void		nxge_stop_timer(p_nxge_t, timeout_id_t);
11876f45ec7bSml29623 
11886f45ec7bSml29623 #ifdef	__cplusplus
11896f45ec7bSml29623 }
11906f45ec7bSml29623 #endif
11916f45ec7bSml29623 
11926f45ec7bSml29623 #endif	/* _SYS_NXGE_NXGE_H */
1193