xref: /onnv-gate/usr/src/uts/common/io/hxge/hxge.h (revision 11257:9e958eb3e4e3)
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  */
21*10091SMichael.Speer@Sun.COM 
226349Sqs148142 /*
238718SMichael.Speer@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
246349Sqs148142  * Use is subject to license terms.
256349Sqs148142  */
266349Sqs148142 
276349Sqs148142 #ifndef	_SYS_HXGE_HXGE_H
286349Sqs148142 #define	_SYS_HXGE_HXGE_H
296349Sqs148142 
306349Sqs148142 #ifdef	__cplusplus
316349Sqs148142 extern "C" {
326349Sqs148142 #endif
336349Sqs148142 
346349Sqs148142 #include <hxge_vmac.h>
356349Sqs148142 #include <hxge_pfc.h>
366349Sqs148142 #include <hxge_classify.h>
376349Sqs148142 
386349Sqs148142 /*
396349Sqs148142  * HXGE diagnostics IOCTLS.
406349Sqs148142  */
416349Sqs148142 #define	HXGE_IOC		((((('N' << 8) + 'X') << 8) + 'G') << 8)
426349Sqs148142 
438718SMichael.Speer@Sun.COM #define	HXGE_GET_TX_RING_SZ	(HXGE_IOC|1)
448718SMichael.Speer@Sun.COM #define	HXGE_GET_TX_DESC	(HXGE_IOC|2)
458718SMichael.Speer@Sun.COM #define	HXGE_GLOBAL_RESET	(HXGE_IOC|3)
468718SMichael.Speer@Sun.COM #define	HXGE_TX_SIDE_RESET	(HXGE_IOC|4)
478718SMichael.Speer@Sun.COM #define	HXGE_RX_SIDE_RESET	(HXGE_IOC|5)
488718SMichael.Speer@Sun.COM #define	HXGE_RESET_MAC		(HXGE_IOC|6)
498718SMichael.Speer@Sun.COM #define	HXGE_RTRACE		(HXGE_IOC|7)
508718SMichael.Speer@Sun.COM #define	HXGE_GET_TCAM		(HXGE_IOC|8)
518718SMichael.Speer@Sun.COM #define	HXGE_PUT_TCAM		(HXGE_IOC|9)
526349Sqs148142 
536349Sqs148142 #define	HXGE_OK			0
546349Sqs148142 #define	HXGE_ERROR		0x40000000
556349Sqs148142 #define	HXGE_DDI_FAILED		0x20000000
566349Sqs148142 
576349Sqs148142 /*
586349Sqs148142  * Definitions for module_info.
596349Sqs148142  */
606349Sqs148142 #define	HXGE_DRIVER_NAME	"hxge"			/* module name */
616349Sqs148142 #define	HXGE_CHECK_TIMER	(5000)
626349Sqs148142 
636349Sqs148142 typedef enum {
646349Sqs148142 	param_instance,
656349Sqs148142 
666349Sqs148142 	param_accept_jumbo,
676349Sqs148142 	param_rxdma_rbr_size,
686349Sqs148142 	param_rxdma_rcr_size,
696349Sqs148142 	param_rxdma_intr_time,
706349Sqs148142 	param_rxdma_intr_pkts,
716349Sqs148142 	param_vlan_ids,
726349Sqs148142 	param_implicit_vlan_id,
736349Sqs148142 	param_tcam_enable,
746349Sqs148142 
756349Sqs148142 	param_hash_init_value,
766349Sqs148142 	param_class_cfg_ether_usr1,
776349Sqs148142 	param_class_cfg_ether_usr2,
786349Sqs148142 	param_class_opt_ipv4_tcp,
796349Sqs148142 	param_class_opt_ipv4_udp,
806349Sqs148142 	param_class_opt_ipv4_ah,
816349Sqs148142 	param_class_opt_ipv4_sctp,
826349Sqs148142 	param_class_opt_ipv6_tcp,
836349Sqs148142 	param_class_opt_ipv6_udp,
846349Sqs148142 	param_class_opt_ipv6_ah,
856349Sqs148142 	param_class_opt_ipv6_sctp,
866349Sqs148142 	param_hxge_debug_flag,
876349Sqs148142 	param_hpi_debug_flag,
886349Sqs148142 	param_dump_ptrs,
896349Sqs148142 	param_end
906349Sqs148142 } hxge_param_index_t;
916349Sqs148142 
926349Sqs148142 
936349Sqs148142 #define	HXGE_PARAM_READ			0x00000001ULL
946349Sqs148142 #define	HXGE_PARAM_WRITE		0x00000002ULL
956349Sqs148142 #define	HXGE_PARAM_SHARED		0x00000004ULL
966349Sqs148142 #define	HXGE_PARAM_PRIV			0x00000008ULL
976349Sqs148142 #define	HXGE_PARAM_RW			HXGE_PARAM_READ | HXGE_PARAM_WRITE
986349Sqs148142 #define	HXGE_PARAM_RWS			HXGE_PARAM_RW | HXGE_PARAM_SHARED
996349Sqs148142 #define	HXGE_PARAM_RWP			HXGE_PARAM_RW | HXGE_PARAM_PRIV
1006349Sqs148142 
1016349Sqs148142 #define	HXGE_PARAM_RXDMA		0x00000010ULL
1026349Sqs148142 #define	HXGE_PARAM_TXDMA		0x00000020ULL
1036349Sqs148142 #define	HXGE_PARAM_MAC			0x00000040ULL
1046349Sqs148142 
1056349Sqs148142 #define	HXGE_PARAM_CMPLX		0x00010000ULL
1066349Sqs148142 #define	HXGE_PARAM_NDD_WR_OK		0x00020000ULL
1076349Sqs148142 #define	HXGE_PARAM_INIT_ONLY		0x00040000ULL
1086349Sqs148142 #define	HXGE_PARAM_INIT_CONFIG		0x00080000ULL
1096349Sqs148142 
1106349Sqs148142 #define	HXGE_PARAM_READ_PROP		0x00100000ULL
1116349Sqs148142 #define	HXGE_PARAM_PROP_ARR32		0x00200000ULL
1126349Sqs148142 #define	HXGE_PARAM_PROP_ARR64		0x00400000ULL
1136349Sqs148142 #define	HXGE_PARAM_PROP_STR		0x00800000ULL
1146349Sqs148142 
1156349Sqs148142 #define	HXGE_PARAM_DONT_SHOW		0x80000000ULL
1166349Sqs148142 
1176349Sqs148142 #define	HXGE_PARAM_ARRAY_CNT_MASK	0x0000ffff00000000ULL
1186349Sqs148142 #define	HXGE_PARAM_ARRAY_CNT_SHIFT	32ULL
1196349Sqs148142 #define	HXGE_PARAM_ARRAY_ALLOC_MASK	0xffff000000000000ULL
1206349Sqs148142 #define	HXGE_PARAM_ARRAY_ALLOC_SHIFT	48ULL
1216349Sqs148142 
1226349Sqs148142 typedef struct _hxge_param_t {
1236349Sqs148142 	int (*getf)();
1246349Sqs148142 	int (*setf)();		/* null for read only */
1256349Sqs148142 	uint64_t type;		/* R/W/ Common/Port/ .... */
1266349Sqs148142 	uint64_t minimum;
1276349Sqs148142 	uint64_t maximum;
1286349Sqs148142 	uint64_t value;		/* for array params, pointer to value array */
1296349Sqs148142 	uint64_t old_value; /* for array params, pointer to old_value array */
1306349Sqs148142 	char   *fcode_name;
1316349Sqs148142 	char   *name;
1326349Sqs148142 } hxge_param_t, *p_hxge_param_t;
1336349Sqs148142 
1346349Sqs148142 
1356349Sqs148142 typedef enum {
1366349Sqs148142 	hxge_lb_normal,
1376349Sqs148142 	hxge_lb_mac10g
1386349Sqs148142 } hxge_lb_t;
1396349Sqs148142 
1406349Sqs148142 enum hxge_mac_state {
1416349Sqs148142 	HXGE_MAC_STOPPED = 0,
1426349Sqs148142 	HXGE_MAC_STARTED
1436349Sqs148142 };
1446349Sqs148142 
1456349Sqs148142 typedef struct _filter_t {
1466349Sqs148142 	uint32_t all_phys_cnt;
1476349Sqs148142 	uint32_t all_multicast_cnt;
1486349Sqs148142 	uint32_t all_sap_cnt;
1496349Sqs148142 } filter_t, *p_filter_t;
1506349Sqs148142 
1516349Sqs148142 typedef struct _hxge_port_stats_t {
1526349Sqs148142 	hxge_lb_t		lb_mode;
1536349Sqs148142 	uint32_t		poll_mode;
1546349Sqs148142 } hxge_port_stats_t, *p_hxge_port_stats_t;
1556349Sqs148142 
1566349Sqs148142 
1576349Sqs148142 typedef struct _hxge_peu_sys_stats {
1586349Sqs148142 	uint32_t	spc_acc_err;
1596349Sqs148142 	uint32_t	tdc_pioacc_err;
1606349Sqs148142 	uint32_t	rdc_pioacc_err;
1616349Sqs148142 	uint32_t	pfc_pioacc_err;
1626349Sqs148142 	uint32_t	vmac_pioacc_err;
1636349Sqs148142 	uint32_t	cpl_hdrq_parerr;
1646349Sqs148142 	uint32_t	cpl_dataq_parerr;
1656349Sqs148142 	uint32_t	retryram_xdlh_parerr;
1666349Sqs148142 	uint32_t	retrysotram_xdlh_parerr;
1676349Sqs148142 	uint32_t	p_hdrq_parerr;
1686349Sqs148142 	uint32_t	p_dataq_parerr;
1696349Sqs148142 	uint32_t	np_hdrq_parerr;
1706349Sqs148142 	uint32_t	np_dataq_parerr;
1716349Sqs148142 	uint32_t	eic_msix_parerr;
1726349Sqs148142 	uint32_t	hcr_parerr;
1736349Sqs148142 } hxge_peu_sys_stats_t, *p_hxge_peu_sys_stats_t;
1746349Sqs148142 
1756349Sqs148142 
1766349Sqs148142 typedef struct _hxge_stats_t {
1776349Sqs148142 	/*
1786349Sqs148142 	 *  Overall structure size
1796349Sqs148142 	 */
1806349Sqs148142 	size_t			stats_size;
1816349Sqs148142 
1826349Sqs148142 	kstat_t			*ksp;
1836349Sqs148142 	kstat_t			*rdc_ksp[HXGE_MAX_RDCS];
1846349Sqs148142 	kstat_t			*tdc_ksp[HXGE_MAX_TDCS];
1856349Sqs148142 	kstat_t			*rdc_sys_ksp;
1866349Sqs148142 	kstat_t			*tdc_sys_ksp;
1876349Sqs148142 	kstat_t			*pfc_ksp;
1886349Sqs148142 	kstat_t			*vmac_ksp;
1896349Sqs148142 	kstat_t			*port_ksp;
1906349Sqs148142 	kstat_t			*mmac_ksp;
1916349Sqs148142 	kstat_t			*peu_sys_ksp;
1926349Sqs148142 
1936349Sqs148142 	hxge_mac_stats_t	mac_stats;
1946349Sqs148142 	hxge_vmac_stats_t	vmac_stats;	/* VMAC Statistics */
1956349Sqs148142 
1966349Sqs148142 	hxge_rx_ring_stats_t	rdc_stats[HXGE_MAX_RDCS]; /* per rdc stats */
1976349Sqs148142 	hxge_rdc_sys_stats_t	rdc_sys_stats;	/* RDC system stats */
1986349Sqs148142 
1996349Sqs148142 	hxge_tx_ring_stats_t	tdc_stats[HXGE_MAX_TDCS]; /* per tdc stats */
2006349Sqs148142 	hxge_tdc_sys_stats_t	tdc_sys_stats;	/* TDC system stats */
2016349Sqs148142 
2026349Sqs148142 	hxge_pfc_stats_t	pfc_stats;	/* pfc stats */
2036349Sqs148142 	hxge_port_stats_t	port_stats;	/* port stats */
2046349Sqs148142 
2056349Sqs148142 	hxge_peu_sys_stats_t	peu_sys_stats;	/* PEU system stats */
2066349Sqs148142 } hxge_stats_t, *p_hxge_stats_t;
2076349Sqs148142 
2086349Sqs148142 typedef struct _hxge_intr_t {
2096349Sqs148142 	boolean_t		intr_registered; /* interrupts are registered */
2106349Sqs148142 	boolean_t		intr_enabled; 	/* interrupts are enabled */
2116349Sqs148142 	boolean_t		niu_msi_enable;	/* debug or configurable? */
2126349Sqs148142 	uint8_t			nldevs;		/* # of logical devices */
2136349Sqs148142 	int			intr_types;	/* interrupt types supported */
2146349Sqs148142 	int			intr_type;	/* interrupt type to add */
2156349Sqs148142 	int			msi_intx_cnt;	/* # msi/intx ints returned */
2166349Sqs148142 	int			intr_added;	/* # ints actually needed */
2176349Sqs148142 	int			intr_cap;	/* interrupt capabilities */
2186349Sqs148142 	size_t			intr_size;	/* size of array to allocate */
2196349Sqs148142 	ddi_intr_handle_t 	*htable;	/* For array of interrupts */
2206349Sqs148142 	/* Add interrupt number for each interrupt vector */
2216349Sqs148142 	int			pri;
2226349Sqs148142 } hxge_intr_t, *p_hxge_intr_t;
2236349Sqs148142 
2246349Sqs148142 typedef struct _hxge_ldgv_t {
2256349Sqs148142 	uint8_t			ndma_ldvs;
2266349Sqs148142 	uint8_t			nldvs;
2276349Sqs148142 	uint8_t			start_ldg;
2286349Sqs148142 	uint8_t			maxldgs;
2296349Sqs148142 	uint8_t			maxldvs;
2306349Sqs148142 	uint8_t			ldg_intrs;
2316349Sqs148142 	uint32_t		tmres;
2326349Sqs148142 	p_hxge_ldg_t		ldgp;
2336349Sqs148142 	p_hxge_ldv_t		ldvp;
2346349Sqs148142 	p_hxge_ldv_t		ldvp_syserr;
2356349Sqs148142 } hxge_ldgv_t, *p_hxge_ldgv_t;
2366349Sqs148142 
2377584SQiyan.Sun@Sun.COM typedef struct _hxge_timeout {
2387584SQiyan.Sun@Sun.COM 	timeout_id_t	id;
2397584SQiyan.Sun@Sun.COM 	clock_t		ticks;
2407584SQiyan.Sun@Sun.COM 	kmutex_t	lock;
2417584SQiyan.Sun@Sun.COM 	uint32_t	link_status;
2427949SQiyan.Sun@Sun.COM 	boolean_t	report_link_status;
2437584SQiyan.Sun@Sun.COM } hxge_timeout;
2447584SQiyan.Sun@Sun.COM 
2458718SMichael.Speer@Sun.COM typedef struct _hxge_addr {
2468718SMichael.Speer@Sun.COM 	boolean_t	set;
2478718SMichael.Speer@Sun.COM 	boolean_t	primary;
2488718SMichael.Speer@Sun.COM 	uint8_t		addr[ETHERADDRL];
2498718SMichael.Speer@Sun.COM } hxge_addr_t;
2508718SMichael.Speer@Sun.COM 
2518718SMichael.Speer@Sun.COM #define	HXGE_MAX_MAC_ADDRS	16
2528718SMichael.Speer@Sun.COM 
2538718SMichael.Speer@Sun.COM typedef struct _hxge_mmac {
2548718SMichael.Speer@Sun.COM 	uint8_t		total;
2558718SMichael.Speer@Sun.COM 	uint8_t		available;
2568718SMichael.Speer@Sun.COM 	hxge_addr_t	addrs[HXGE_MAX_MAC_ADDRS];
2578718SMichael.Speer@Sun.COM } hxge_mmac_t;
2588718SMichael.Speer@Sun.COM 
2598718SMichael.Speer@Sun.COM /*
2608718SMichael.Speer@Sun.COM  * Ring Group Strucuture.
2618718SMichael.Speer@Sun.COM  */
2628718SMichael.Speer@Sun.COM #define	HXGE_MAX_RX_GROUPS	1
2638718SMichael.Speer@Sun.COM 
2648718SMichael.Speer@Sun.COM typedef struct _hxge_rx_ring_group_t {
2658718SMichael.Speer@Sun.COM 	mac_ring_type_t		type;
2668718SMichael.Speer@Sun.COM 	mac_group_handle_t	ghandle;
2678718SMichael.Speer@Sun.COM 	struct _hxge_t		*hxgep;
2688718SMichael.Speer@Sun.COM 	int			index;
2698718SMichael.Speer@Sun.COM 	boolean_t		started;
2708718SMichael.Speer@Sun.COM } hxge_ring_group_t;
2718718SMichael.Speer@Sun.COM 
2728718SMichael.Speer@Sun.COM /*
2738718SMichael.Speer@Sun.COM  * Ring Handle
2748718SMichael.Speer@Sun.COM  */
2758718SMichael.Speer@Sun.COM typedef struct _hxge_ring_handle_t {
2768718SMichael.Speer@Sun.COM 	struct _hxge_t		*hxgep;
2778718SMichael.Speer@Sun.COM 	int			index;		/* port-wise */
2788718SMichael.Speer@Sun.COM 	mac_ring_handle_t	ring_handle;
2798718SMichael.Speer@Sun.COM 	boolean_t		started;
2808718SMichael.Speer@Sun.COM } hxge_ring_handle_t;
2818718SMichael.Speer@Sun.COM 
2828718SMichael.Speer@Sun.COM typedef hxge_ring_handle_t 	*p_hxge_ring_handle_t;
2838718SMichael.Speer@Sun.COM 
2846349Sqs148142 /*
2856349Sqs148142  * Hydra Device instance state information.
2866349Sqs148142  * Each instance is dynamically allocated on first attach.
2876349Sqs148142  */
2886349Sqs148142 struct _hxge_t {
2896349Sqs148142 	dev_info_t		*dip;		/* device instance */
2906349Sqs148142 	dev_info_t		*p_dip;		/* Parent's device instance */
2916349Sqs148142 	int			instance;	/* instance number */
2926349Sqs148142 	uint32_t		drv_state;	/* driver state bit flags */
2936349Sqs148142 	uint64_t		hxge_debug_level; /* driver state bit flags */
2946349Sqs148142 	kmutex_t		genlock[1];
2956349Sqs148142 	enum hxge_mac_state	hxge_mac_state;
2966349Sqs148142 
2976349Sqs148142 	p_dev_regs_t		dev_regs;
2986349Sqs148142 	hpi_handle_t		hpi_handle;
2996349Sqs148142 	hpi_handle_t		hpi_pci_handle;
3006349Sqs148142 	hpi_handle_t		hpi_reg_handle;
3016349Sqs148142 	hpi_handle_t		hpi_msi_handle;
3026349Sqs148142 
3036349Sqs148142 	hxge_vmac_t		vmac;
3046349Sqs148142 	hxge_classify_t		classifier;
3056349Sqs148142 
3066349Sqs148142 	mac_handle_t		mach;		/* mac module handle */
3076349Sqs148142 
3086349Sqs148142 	p_hxge_stats_t		statsp;
3096349Sqs148142 	uint32_t		param_count;
3106349Sqs148142 	p_hxge_param_t		param_arr;
3116349Sqs148142 	hxge_hw_list_t		*hxge_hw_p; 	/* pointer to per Hydra */
3126349Sqs148142 	uint8_t			nrdc;
3136349Sqs148142 	uint8_t			rdc[HXGE_MAX_RDCS];
3148422SMichael.Speer@Sun.COM 	boolean_t		rdc_first_intr[HXGE_MAX_RDCS];
3156349Sqs148142 	uint8_t			ntdc;
3166349Sqs148142 	uint8_t			tdc[HXGE_MAX_TDCS];
3176349Sqs148142 
3188718SMichael.Speer@Sun.COM 	hxge_ring_handle_t	tx_ring_handles[HXGE_MAX_TDCS];
3198718SMichael.Speer@Sun.COM 	hxge_ring_handle_t	rx_ring_handles[HXGE_MAX_RDCS];
3208718SMichael.Speer@Sun.COM 	hxge_ring_group_t	rx_groups[HXGE_MAX_RX_GROUPS];
3218718SMichael.Speer@Sun.COM 
3226349Sqs148142 	hxge_intr_t		hxge_intr_type;
3236349Sqs148142 	hxge_dma_pt_cfg_t 	pt_config;
3246349Sqs148142 	hxge_class_pt_cfg_t 	class_config;
3256349Sqs148142 
3266349Sqs148142 	/* Logical device and group data structures. */
3276349Sqs148142 	p_hxge_ldgv_t		ldgvp;
3286349Sqs148142 
3296349Sqs148142 	caddr_t			param_list;	/* Parameter list */
3306349Sqs148142 
3316349Sqs148142 	ether_addr_st		factaddr;	/* factory mac address	    */
3326349Sqs148142 	ether_addr_st		ouraddr;	/* individual address	    */
3336349Sqs148142 	kmutex_t		ouraddr_lock;	/* lock to protect to uradd */
3348718SMichael.Speer@Sun.COM 	hxge_mmac_t		mmac;
3356349Sqs148142 
3366349Sqs148142 	ddi_iblock_cookie_t	interrupt_cookie;
3376349Sqs148142 
3386349Sqs148142 	/*
3396349Sqs148142 	 * Blocks of memory may be pre-allocated by the
3406349Sqs148142 	 * partition manager or the driver. They may include
3416349Sqs148142 	 * blocks for configuration and buffers. The idea is
3426349Sqs148142 	 * to preallocate big blocks of contiguous areas in
3436349Sqs148142 	 * system memory (i.e. with IOMMU). These blocks then
3446349Sqs148142 	 * will be broken up to a fixed number of blocks with
3456349Sqs148142 	 * each block having the same block size (4K, 8K, 16K or
3466349Sqs148142 	 * 32K) in the case of buffer blocks. For systems that
3476349Sqs148142 	 * do not support DVMA, more than one big block will be
3486349Sqs148142 	 * allocated.
3496349Sqs148142 	 */
3506349Sqs148142 	uint32_t		rx_default_block_size;
3516349Sqs148142 	hxge_rx_block_size_t	rx_bksize_code;
3526349Sqs148142 
3536349Sqs148142 	p_hxge_dma_pool_t	rx_buf_pool_p;
3547618SMichael.Speer@Sun.COM 	p_hxge_dma_pool_t	rx_rbr_cntl_pool_p;
3557618SMichael.Speer@Sun.COM 	p_hxge_dma_pool_t	rx_rcr_cntl_pool_p;
3567618SMichael.Speer@Sun.COM 	p_hxge_dma_pool_t	rx_mbox_cntl_pool_p;
3576349Sqs148142 
3586349Sqs148142 	p_hxge_dma_pool_t	tx_buf_pool_p;
3596349Sqs148142 	p_hxge_dma_pool_t	tx_cntl_pool_p;
3606349Sqs148142 
3616349Sqs148142 	/* Receive buffer block ring and completion ring. */
3626349Sqs148142 	p_rx_rbr_rings_t 	rx_rbr_rings;
3636349Sqs148142 	p_rx_rcr_rings_t 	rx_rcr_rings;
3646349Sqs148142 	p_rx_mbox_areas_t 	rx_mbox_areas_p;
3656349Sqs148142 
3666349Sqs148142 	uint32_t		start_rdc;
3676349Sqs148142 	uint32_t		max_rdcs;
3686349Sqs148142 
3696349Sqs148142 	/* Transmit descriptors rings */
3706349Sqs148142 	p_tx_rings_t 		tx_rings;
3716349Sqs148142 	p_tx_mbox_areas_t	tx_mbox_areas_p;
3726349Sqs148142 
3736349Sqs148142 	uint32_t		start_tdc;
3746349Sqs148142 	uint32_t		max_tdcs;
3756349Sqs148142 	uint32_t		tdc_mask;
3766349Sqs148142 
3776349Sqs148142 	ddi_dma_handle_t 	dmasparehandle;
3786349Sqs148142 
3796349Sqs148142 	ulong_t 		sys_page_sz;
3806349Sqs148142 	ulong_t 		sys_page_mask;
3816349Sqs148142 	int 			suspended;
3826349Sqs148142 
3836349Sqs148142 	filter_t 		filter;		/* Current instance filter */
3846349Sqs148142 	p_hash_filter_t 	hash_filter;	/* Multicast hash filter. */
3856349Sqs148142 	krwlock_t		filter_lock;	/* Lock to protect filters. */
3866349Sqs148142 
3876349Sqs148142 	ulong_t 		sys_burst_sz;
3886349Sqs148142 	timeout_id_t 		hxge_timerid;
3896349Sqs148142 	uint8_t 		msg_min;
3906349Sqs148142 
3916349Sqs148142 	uint16_t		intr_timeout;
3926349Sqs148142 	uint16_t		intr_threshold;
3936349Sqs148142 
3946349Sqs148142 	rtrace_t		rtrace;
3956349Sqs148142 	int			fm_capabilities; /* FMA capabilities */
3966349Sqs148142 
3976349Sqs148142 	uint32_t 		hxge_port_rbr_size;
3986349Sqs148142 	uint32_t 		hxge_port_rcr_size;
3996349Sqs148142 	uint32_t 		hxge_port_tx_ring_size;
4006864Sqs148142 
401*10091SMichael.Speer@Sun.COM 	kmutex_t		vmac_lock;
4026864Sqs148142 	kmutex_t		pio_lock;
4037584SQiyan.Sun@Sun.COM 	hxge_timeout		timeout;
4046349Sqs148142 };
4056349Sqs148142 
4066349Sqs148142 /*
4076349Sqs148142  * Driver state flags.
4086349Sqs148142  */
4096349Sqs148142 #define	STATE_REGS_MAPPED	0x000000001	/* device registers mapped */
4106349Sqs148142 #define	STATE_KSTATS_SETUP	0x000000002	/* kstats allocated	*/
4116349Sqs148142 #define	STATE_NODE_CREATED	0x000000004	/* device node created	*/
4126349Sqs148142 #define	STATE_HW_CONFIG_CREATED	0x000000008	/* hardware properties	*/
4136349Sqs148142 #define	STATE_HW_INITIALIZED	0x000000010	/* hardware initialized	*/
4146349Sqs148142 
4156349Sqs148142 typedef struct _hxge_port_kstat_t {
4166349Sqs148142 	/*
4176349Sqs148142 	 * Transciever state informations.
4186349Sqs148142 	 */
4196349Sqs148142 	kstat_named_t	cap_autoneg;
4206349Sqs148142 	kstat_named_t	cap_10gfdx;
4216349Sqs148142 
4226349Sqs148142 	/*
4236349Sqs148142 	 * Link partner capabilities.
4246349Sqs148142 	 */
4256349Sqs148142 	kstat_named_t	lp_cap_autoneg;
4266349Sqs148142 	kstat_named_t	lp_cap_10gfdx;
4276349Sqs148142 
4286349Sqs148142 	/*
4296349Sqs148142 	 * Shared link setup.
4306349Sqs148142 	 */
4316349Sqs148142 	kstat_named_t	link_speed;
4326349Sqs148142 	kstat_named_t	link_duplex;
4336349Sqs148142 	kstat_named_t	link_up;
4346349Sqs148142 
4356349Sqs148142 	/*
4366349Sqs148142 	 * Lets the user know the MTU currently in use by
4376349Sqs148142 	 * the physical MAC port.
4386349Sqs148142 	 */
4396349Sqs148142 	kstat_named_t	lb_mode;
4406349Sqs148142 
4416349Sqs148142 	kstat_named_t	tx_max_pend;
4426349Sqs148142 	kstat_named_t	rx_jumbo_pkts;
4436349Sqs148142 
4446349Sqs148142 	/*
4456349Sqs148142 	 * Misc MAC statistics.
4466349Sqs148142 	 */
4476349Sqs148142 	kstat_named_t	ifspeed;
4486349Sqs148142 	kstat_named_t	promisc;
4496349Sqs148142 } hxge_port_kstat_t, *p_hxge_port_kstat_t;
4506349Sqs148142 
4516349Sqs148142 typedef struct _hxge_rdc_kstat {
4526349Sqs148142 	/*
4536349Sqs148142 	 * Receive DMA channel statistics.
4546349Sqs148142 	 * This structure needs to be consistent with hxge_rdc_stat_index_t
4556349Sqs148142 	 * in hxge_kstat.c
4566349Sqs148142 	 */
4576349Sqs148142 	kstat_named_t	ipackets;
4586349Sqs148142 	kstat_named_t	rbytes;
4596349Sqs148142 	kstat_named_t	errors;
4606349Sqs148142 	kstat_named_t	jumbo_pkts;
4616349Sqs148142 
4626349Sqs148142 	kstat_named_t	rcr_unknown_err;
4636349Sqs148142 	kstat_named_t	rcr_sha_par_err;
4646349Sqs148142 	kstat_named_t	rbr_pre_par_err;
4656349Sqs148142 	kstat_named_t	rbr_pre_emty;
4666349Sqs148142 
4676349Sqs148142 	kstat_named_t	rcr_shadow_full;
4686349Sqs148142 	kstat_named_t	rbr_tmout;
4696349Sqs148142 	kstat_named_t	peu_resp_err;
4706349Sqs148142 
4716349Sqs148142 	kstat_named_t	ctrl_fifo_ecc_err;
4726349Sqs148142 	kstat_named_t	data_fifo_ecc_err;
4736349Sqs148142 
4746349Sqs148142 	kstat_named_t	rcrfull;
4756349Sqs148142 	kstat_named_t	rbr_empty;
4768141SMichael.Speer@Sun.COM 	kstat_named_t	rbr_empty_fail;
4778236SQiyan.Sun@Sun.COM 	kstat_named_t	rbr_empty_restore;
4786349Sqs148142 	kstat_named_t	rbrfull;
4797618SMichael.Speer@Sun.COM 	kstat_named_t	rcr_invalids;	/* Account for invalid RCR entries. */
4806349Sqs148142 
4816349Sqs148142 	kstat_named_t	rcr_to;
4826349Sqs148142 	kstat_named_t	rcr_thresh;
4838103SQiyan.Sun@Sun.COM 	kstat_named_t	pkt_drop;
4846349Sqs148142 } hxge_rdc_kstat_t, *p_hxge_rdc_kstat_t;
4856349Sqs148142 
4866349Sqs148142 typedef struct _hxge_rdc_sys_kstat {
4876349Sqs148142 	/*
4886349Sqs148142 	 * Receive DMA system statistics.
4896349Sqs148142 	 * This structure needs to be consistent with hxge_rdc_sys_stat_idx_t
4906349Sqs148142 	 * in hxge_kstat.c
4916349Sqs148142 	 */
4926349Sqs148142 	kstat_named_t	ctrl_fifo_sec;
4936349Sqs148142 	kstat_named_t	ctrl_fifo_ded;
4946349Sqs148142 	kstat_named_t	data_fifo_sec;
4956349Sqs148142 	kstat_named_t	data_fifo_ded;
4966349Sqs148142 } hxge_rdc_sys_kstat_t, *p_hxge_rdc_sys_kstat_t;
4976349Sqs148142 
4986349Sqs148142 typedef	struct _hxge_tdc_kstat {
4996349Sqs148142 	/*
5006349Sqs148142 	 * Transmit DMA channel statistics.
5016349Sqs148142 	 * This structure needs to be consistent with hxge_tdc_stats_index_t
5026349Sqs148142 	 * in hxge_kstat.c
5036349Sqs148142 	 */
5046349Sqs148142 	kstat_named_t	opackets;
5056349Sqs148142 	kstat_named_t	obytes;
5066349Sqs148142 	kstat_named_t	obytes_with_pad;
5076349Sqs148142 	kstat_named_t	oerrors;
5086349Sqs148142 	kstat_named_t	tx_inits;
5096349Sqs148142 	kstat_named_t	tx_no_buf;
5106349Sqs148142 
5116349Sqs148142 	kstat_named_t	peu_resp_err;
5126349Sqs148142 	kstat_named_t	pkt_size_err;
5136349Sqs148142 	kstat_named_t	tx_rng_oflow;
5146349Sqs148142 	kstat_named_t	pkt_size_hdr_err;
5156349Sqs148142 	kstat_named_t	runt_pkt_drop_err;
5166349Sqs148142 	kstat_named_t	pref_par_err;
5176349Sqs148142 	kstat_named_t	tdr_pref_cpl_to;
5186349Sqs148142 	kstat_named_t	pkt_cpl_to;
5196349Sqs148142 	kstat_named_t	invalid_sop;
5206349Sqs148142 	kstat_named_t	unexpected_sop;
5216349Sqs148142 
5226349Sqs148142 	kstat_named_t	count_hdr_size_err;
5236349Sqs148142 	kstat_named_t	count_runt;
5246349Sqs148142 	kstat_named_t	count_abort;
5256349Sqs148142 
5266349Sqs148142 	kstat_named_t	tx_starts;
5276349Sqs148142 	kstat_named_t	tx_no_desc;
5286349Sqs148142 	kstat_named_t	tx_dma_bind_fail;
5296349Sqs148142 	kstat_named_t	tx_hdr_pkts;
5306349Sqs148142 	kstat_named_t	tx_ddi_pkts;
5316349Sqs148142 	kstat_named_t	tx_jumbo_pkts;
5326349Sqs148142 	kstat_named_t	tx_max_pend;
5336349Sqs148142 	kstat_named_t	tx_marks;
5346349Sqs148142 } hxge_tdc_kstat_t, *p_hxge_tdc_kstat_t;
5356349Sqs148142 
5366349Sqs148142 typedef struct _hxge_tdc_sys_kstat {
5376349Sqs148142 	/*
5386349Sqs148142 	 * Transmit DMA system statistics.
5396349Sqs148142 	 * This structure needs to be consistent with hxge_tdc_sys_stat_idx_t
5406349Sqs148142 	 * in hxge_kstat.c
5416349Sqs148142 	 */
5426349Sqs148142 	kstat_named_t	reord_tbl_par_err;
5436349Sqs148142 	kstat_named_t	reord_buf_ded_err;
5446349Sqs148142 	kstat_named_t	reord_buf_sec_err;
5456349Sqs148142 } hxge_tdc_sys_kstat_t, *p_hxge_tdc_sys_kstat_t;
5466349Sqs148142 
5476349Sqs148142 typedef	struct _hxge_vmac_kstat {
5486349Sqs148142 	/*
5496349Sqs148142 	 * VMAC statistics.
5506349Sqs148142 	 * This structure needs to be consistent with hxge_vmac_stat_index_t
5516349Sqs148142 	 * in hxge_kstat.c
5526349Sqs148142 	 */
5536349Sqs148142 	kstat_named_t	tx_frame_cnt;
5546349Sqs148142 	kstat_named_t	tx_byte_cnt;
5556349Sqs148142 
5566349Sqs148142 	kstat_named_t	rx_frame_cnt;
5576349Sqs148142 	kstat_named_t	rx_byte_cnt;
5586349Sqs148142 	kstat_named_t	rx_drop_frame_cnt;
5596349Sqs148142 	kstat_named_t	rx_drop_byte_cnt;
5606349Sqs148142 	kstat_named_t	rx_crc_cnt;
5616349Sqs148142 	kstat_named_t	rx_pause_cnt;
5626349Sqs148142 	kstat_named_t	rx_bcast_fr_cnt;
5636349Sqs148142 	kstat_named_t	rx_mcast_fr_cnt;
5646349Sqs148142 } hxge_vmac_kstat_t, *p_hxge_vmac_kstat_t;
5656349Sqs148142 
5666349Sqs148142 typedef struct _hxge_pfc_kstat {
5676349Sqs148142 	/*
5686349Sqs148142 	 * This structure needs to be consistent with hxge_pfc_stat_index_t
5696349Sqs148142 	 * in hxge_kstat.c
5706349Sqs148142 	 */
5716349Sqs148142 	kstat_named_t	pfc_pkt_drop;
5726349Sqs148142 	kstat_named_t	pfc_tcam_parity_err;
5736349Sqs148142 	kstat_named_t	pfc_vlan_parity_err;
5746349Sqs148142 	kstat_named_t	pfc_bad_cs_count;
5756349Sqs148142 	kstat_named_t	pfc_drop_count;
5766349Sqs148142 	kstat_named_t	pfc_tcp_ctrl_drop;
5776349Sqs148142 	kstat_named_t	pfc_l2_addr_drop;
5786349Sqs148142 	kstat_named_t	pfc_class_code_drop;
5796349Sqs148142 	kstat_named_t	pfc_tcam_drop;
5806349Sqs148142 	kstat_named_t	pfc_vlan_drop;
5816349Sqs148142 } hxge_pfc_kstat_t, *p_hxge_pfc_kstat_t;
5826349Sqs148142 
5836349Sqs148142 typedef struct _hxge_mmac_kstat {
5846349Sqs148142 	/*
5856349Sqs148142 	 * This structure needs to be consistent with hxge_mmac_stat_index_t
5866349Sqs148142 	 * in hxge_kstat.c
5876349Sqs148142 	 */
5886349Sqs148142 	kstat_named_t	mmac_max_addr_cnt;
5896349Sqs148142 	kstat_named_t	mmac_avail_addr_cnt;
5906349Sqs148142 	kstat_named_t	mmac_addr1;
5916349Sqs148142 	kstat_named_t	mmac_addr2;
5926349Sqs148142 	kstat_named_t	mmac_addr3;
5936349Sqs148142 	kstat_named_t	mmac_addr4;
5946349Sqs148142 	kstat_named_t	mmac_addr5;
5956349Sqs148142 	kstat_named_t	mmac_addr6;
5966349Sqs148142 	kstat_named_t	mmac_addr7;
5976349Sqs148142 	kstat_named_t	mmac_addr8;
5986349Sqs148142 	kstat_named_t	mmac_addr9;
5996349Sqs148142 	kstat_named_t	mmac_addr10;
6006349Sqs148142 	kstat_named_t	mmac_addr11;
6016349Sqs148142 	kstat_named_t	mmac_addr12;
6026349Sqs148142 	kstat_named_t	mmac_addr13;
6036349Sqs148142 	kstat_named_t	mmac_addr14;
6046349Sqs148142 	kstat_named_t	mmac_addr15;
6056349Sqs148142 	kstat_named_t	mmac_addr16;
6066349Sqs148142 } hxge_mmac_kstat_t, *p_hxge_mmac_kstat_t;
6076349Sqs148142 
6086349Sqs148142 typedef struct _hxge_peu_sys_kstat {
6096349Sqs148142 	/*
6106349Sqs148142 	 * This structure needs to be consistent with hxge_peu_sys_stat_idx_t
6116349Sqs148142 	 * in hxge_kstat.c
6126349Sqs148142 	 */
6136349Sqs148142 	kstat_named_t	spc_acc_err;
6146349Sqs148142 	kstat_named_t	tdc_pioacc_err;
6156349Sqs148142 	kstat_named_t	rdc_pioacc_err;
6166349Sqs148142 	kstat_named_t	pfc_pioacc_err;
6176349Sqs148142 	kstat_named_t	vmac_pioacc_err;
6186349Sqs148142 	kstat_named_t	cpl_hdrq_parerr;
6196349Sqs148142 	kstat_named_t	cpl_dataq_parerr;
6206349Sqs148142 	kstat_named_t	retryram_xdlh_parerr;
6216349Sqs148142 	kstat_named_t	retrysotram_xdlh_parerr;
6226349Sqs148142 	kstat_named_t	p_hdrq_parerr;
6236349Sqs148142 	kstat_named_t	p_dataq_parerr;
6246349Sqs148142 	kstat_named_t	np_hdrq_parerr;
6256349Sqs148142 	kstat_named_t	np_dataq_parerr;
6266349Sqs148142 	kstat_named_t	eic_msix_parerr;
6276349Sqs148142 	kstat_named_t	hcr_parerr;
6286349Sqs148142 } hxge_peu_sys_kstat_t, *p_hxge_peu_sys_kstat_t;
6296349Sqs148142 
6306349Sqs148142 /*
6316349Sqs148142  * Prototype definitions.
6326349Sqs148142  */
6336349Sqs148142 hxge_status_t hxge_init(p_hxge_t);
6346349Sqs148142 void hxge_uninit(p_hxge_t);
6356349Sqs148142 
6366349Sqs148142 typedef	void	(*fptrv_t)();
6376349Sqs148142 timeout_id_t hxge_start_timer(p_hxge_t hxgep, fptrv_t func, int msec);
6386349Sqs148142 void hxge_stop_timer(p_hxge_t hxgep, timeout_id_t timerid);
6396349Sqs148142 
6406349Sqs148142 #ifdef	__cplusplus
6416349Sqs148142 }
6426349Sqs148142 #endif
6436349Sqs148142 
6446349Sqs148142 #endif	/* _SYS_HXGE_HXGE_H */
645