xref: /onnv-gate/usr/src/uts/common/io/ntxn/nic_cmn.h (revision 9436:a16f20c9c068)
17956Sxiuyan.wang@Sun.COM /*
27956Sxiuyan.wang@Sun.COM  * CDDL HEADER START
37956Sxiuyan.wang@Sun.COM  *
47956Sxiuyan.wang@Sun.COM  * The contents of this file are subject to the terms of the
57956Sxiuyan.wang@Sun.COM  * Common Development and Distribution License (the "License").
67956Sxiuyan.wang@Sun.COM  * You may not use this file except in compliance with the License.
77956Sxiuyan.wang@Sun.COM  *
87956Sxiuyan.wang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97956Sxiuyan.wang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
107956Sxiuyan.wang@Sun.COM  * See the License for the specific language governing permissions
117956Sxiuyan.wang@Sun.COM  * and limitations under the License.
127956Sxiuyan.wang@Sun.COM  *
137956Sxiuyan.wang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
147956Sxiuyan.wang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157956Sxiuyan.wang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
167956Sxiuyan.wang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
177956Sxiuyan.wang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
187956Sxiuyan.wang@Sun.COM  *
197956Sxiuyan.wang@Sun.COM  * CDDL HEADER END
207956Sxiuyan.wang@Sun.COM  */
218687SJing.Xiong@Sun.COM 
227956Sxiuyan.wang@Sun.COM /*
237956Sxiuyan.wang@Sun.COM  * Copyright 2008 NetXen, Inc.  All rights reserved.
247956Sxiuyan.wang@Sun.COM  * Use is subject to license terms.
257956Sxiuyan.wang@Sun.COM  */
268687SJing.Xiong@Sun.COM 
278687SJing.Xiong@Sun.COM #ifndef _UNM_NIC_CMN_H_
288687SJing.Xiong@Sun.COM #define	_UNM_NIC_CMN_H_
298687SJing.Xiong@Sun.COM 
308687SJing.Xiong@Sun.COM #ifdef __cplusplus
318687SJing.Xiong@Sun.COM extern "C" {
328687SJing.Xiong@Sun.COM #endif
337956Sxiuyan.wang@Sun.COM 
347956Sxiuyan.wang@Sun.COM #ifndef sun
357956Sxiuyan.wang@Sun.COM #include "unm_nic_config.h"
367956Sxiuyan.wang@Sun.COM #include "unm_compiler_defs.h"
377956Sxiuyan.wang@Sun.COM #endif
387956Sxiuyan.wang@Sun.COM 
397956Sxiuyan.wang@Sun.COM #define	IP_ALIGNMENT_BYTES		2  /* make ip aligned on 16byteaddr */
407956Sxiuyan.wang@Sun.COM #define	P2_MAX_MTU			(8000)
417956Sxiuyan.wang@Sun.COM #define	P3_MAX_MTU			(9600)
427956Sxiuyan.wang@Sun.COM #define	NX_ETHERMTU			1500
437956Sxiuyan.wang@Sun.COM #define	NX_MAX_ETHERHDR			32 /* This contains some padding */
447956Sxiuyan.wang@Sun.COM 
457956Sxiuyan.wang@Sun.COM #define	NX_RX_NORMAL_BUF_MAX_LEN	(NX_MAX_ETHERHDR + NX_ETHERMTU)
467956Sxiuyan.wang@Sun.COM #define	NX_P2_RX_JUMBO_BUF_MAX_LEN	(NX_MAX_ETHERHDR + P2_MAX_MTU)
477956Sxiuyan.wang@Sun.COM #define	NX_P3_RX_JUMBO_BUF_MAX_LEN	(NX_MAX_ETHERHDR + P3_MAX_MTU)
487956Sxiuyan.wang@Sun.COM 
497956Sxiuyan.wang@Sun.COM #define	MAX_RX_LRO_BUFFER_LENGTH	((8*1024) - 512)
507956Sxiuyan.wang@Sun.COM #define	RX_LRO_DMA_MAP_LEN		(MAX_RX_LRO_BUFFER_LENGTH -\
517956Sxiuyan.wang@Sun.COM 					    IP_ALIGNMENT_BYTES)
527956Sxiuyan.wang@Sun.COM 
537956Sxiuyan.wang@Sun.COM /* Opcodes to be used with the commands */
547956Sxiuyan.wang@Sun.COM #define	TX_ETHER_PKT	0x01
557956Sxiuyan.wang@Sun.COM /* The following opcodes are for IP checksum    */
567956Sxiuyan.wang@Sun.COM #define	TX_TCP_PKT		0x02
577956Sxiuyan.wang@Sun.COM #define	TX_UDP_PKT		0x03
587956Sxiuyan.wang@Sun.COM #define	TX_IP_PKT		0x04
597956Sxiuyan.wang@Sun.COM #define	TX_TCP_LSO		0x05
607956Sxiuyan.wang@Sun.COM #define	TX_IPSEC		0x06
617956Sxiuyan.wang@Sun.COM #define	TX_IPSEC_CMD	0x07
627956Sxiuyan.wang@Sun.COM 
637956Sxiuyan.wang@Sun.COM #define	NETXEN_MAC_NOOP		0
647956Sxiuyan.wang@Sun.COM #define	NETXEN_MAC_ADD		1
657956Sxiuyan.wang@Sun.COM #define	NETXEN_MAC_DEL		2
667956Sxiuyan.wang@Sun.COM 
677956Sxiuyan.wang@Sun.COM /* The following opcodes are for internal consumption. */
687956Sxiuyan.wang@Sun.COM #define	UNM_CONTROL_OP		0x10
697956Sxiuyan.wang@Sun.COM #define	PEGNET_REQUEST		0x11
707956Sxiuyan.wang@Sun.COM #define	NX_HOST_REQUEST		0x13
717956Sxiuyan.wang@Sun.COM #define	NX_NIC_REQUEST		0x14
727956Sxiuyan.wang@Sun.COM #define	NX_NIC_LRO_REQUEST	0x15
737956Sxiuyan.wang@Sun.COM 
747956Sxiuyan.wang@Sun.COM #define	NX_MAC_EVENT		0x1
757956Sxiuyan.wang@Sun.COM 
767956Sxiuyan.wang@Sun.COM enum {
777956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_START = 0,
787956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_RSS,
797956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_RSS_TBL,
807956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_INTR_COALESCE,
817956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_LED,
827956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_PROMISCUOUS,
837956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_CONFIG_L2_MAC,
847956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_LRO_REQUEST,
857956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_GET_SNMP_STATS,
867956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_PROXY_START_REQUEST,
877956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_PROXY_STOP_REQUEST,
887956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_PROXY_SET_MTU,
897956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE,
907956Sxiuyan.wang@Sun.COM 	NX_H2P_OPCODE_GET_FINGER_PRINT_REQUEST,
917956Sxiuyan.wang@Sun.COM 	NX_H2P_OPCODE_INSTALL_LICENSE_REQUEST,
927956Sxiuyan.wang@Sun.COM 	NX_H2P_OPCODE_GET_LICENSE_CAPABILITY_REQUEST,
937956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_GET_NET_STATS,
947956Sxiuyan.wang@Sun.COM 	NX_NIC_H2C_OPCODE_LAST
957956Sxiuyan.wang@Sun.COM };
967956Sxiuyan.wang@Sun.COM 
977956Sxiuyan.wang@Sun.COM #define	VPORT_MISS_MODE_DROP			0 /* drop all unmatched */
987956Sxiuyan.wang@Sun.COM #define	VPORT_MISS_MODE_ACCEPT_ALL		1 /* accept all packets */
997956Sxiuyan.wang@Sun.COM #define	VPORT_MISS_MODE_ACCEPT_MULTI	2 /* accept unmatched multicast */
1007956Sxiuyan.wang@Sun.COM 
1017956Sxiuyan.wang@Sun.COM #ifdef UNM_RSS
1027956Sxiuyan.wang@Sun.COM #define	RSS_CNTRL_CMD		0x20
1037956Sxiuyan.wang@Sun.COM #endif
1047956Sxiuyan.wang@Sun.COM #define	MAX_NUM_CARDS		4
1057956Sxiuyan.wang@Sun.COM #define	MAX_NUM_PORTS		4 /* Deprecated. donot use this */
1067956Sxiuyan.wang@Sun.COM #define	MAX_NIU_PORTS		MAX_NUM_PORTS
1077956Sxiuyan.wang@Sun.COM #define	PORT1				0
1087956Sxiuyan.wang@Sun.COM #define	PORT2				1
1097956Sxiuyan.wang@Sun.COM #define	PORT3				2
1107956Sxiuyan.wang@Sun.COM #define	PORT4				3
1117956Sxiuyan.wang@Sun.COM 
1127956Sxiuyan.wang@Sun.COM 
1137956Sxiuyan.wang@Sun.COM #define	DESC_CHAIN		0xFF /* descriptor command continuation */
1147956Sxiuyan.wang@Sun.COM 
1157956Sxiuyan.wang@Sun.COM #define	MAX_BUFFERS_PER_CMD		16
1167956Sxiuyan.wang@Sun.COM #define	MAX_BUFFERS_PER_DESC	4
1177956Sxiuyan.wang@Sun.COM 
1187956Sxiuyan.wang@Sun.COM #define	NX_P2_C0				0x24
1197956Sxiuyan.wang@Sun.COM #define	NX_P2_C1				0x25
1207956Sxiuyan.wang@Sun.COM 
1217956Sxiuyan.wang@Sun.COM #define	DUMMY_BUF_UNINIT	0x55555555
1227956Sxiuyan.wang@Sun.COM #define	DUMMY_BUF_INIT		0
1237956Sxiuyan.wang@Sun.COM 
1247956Sxiuyan.wang@Sun.COM /*
1257956Sxiuyan.wang@Sun.COM  * Following are the states of the Phantom. Phantom will set them and
1267956Sxiuyan.wang@Sun.COM  * Host will read to check if the fields are correct.
1277956Sxiuyan.wang@Sun.COM  */
1287956Sxiuyan.wang@Sun.COM #define	PHAN_INITIALIZE_START		0xff00
1297956Sxiuyan.wang@Sun.COM #define	PHAN_INITIALIZE_FAILED		0xffff
1307956Sxiuyan.wang@Sun.COM #define	PHAN_INITIALIZE_COMPLETE	0xff01
1317956Sxiuyan.wang@Sun.COM 
1327956Sxiuyan.wang@Sun.COM /* Host writes the following to notify that it has done the init-handshake */
1337956Sxiuyan.wang@Sun.COM #define	PHAN_INITIALIZE_ACK			0xf00f
1347956Sxiuyan.wang@Sun.COM 
1357956Sxiuyan.wang@Sun.COM /* Following defines will be used in the status descriptor */
1367956Sxiuyan.wang@Sun.COM #define	TX_ETHER_PKT_COMPLETE  0xB  /* same for both commands */
1377956Sxiuyan.wang@Sun.COM 
1387956Sxiuyan.wang@Sun.COM #define	NUM_RCV_DESC_RINGS		3 /* No of Rcv Descriptor contexts */
1397956Sxiuyan.wang@Sun.COM 
1407956Sxiuyan.wang@Sun.COM /* descriptor types */
1417956Sxiuyan.wang@Sun.COM #define	RCV_DESC_NORMAL			0x01
1427956Sxiuyan.wang@Sun.COM #define	RCV_DESC_JUMBO			0x02
1437956Sxiuyan.wang@Sun.COM #define	RCV_DESC_LRO			0x04
1447956Sxiuyan.wang@Sun.COM #define	RCV_DESC_NORMAL_CTXID	0
1457956Sxiuyan.wang@Sun.COM #define	RCV_DESC_JUMBO_CTXID	1
1467956Sxiuyan.wang@Sun.COM #define	RCV_DESC_LRO_CTXID		2
1477956Sxiuyan.wang@Sun.COM 
1487956Sxiuyan.wang@Sun.COM #define	RCV_DESC_TYPE(ID) \
1497956Sxiuyan.wang@Sun.COM 	((ID == RCV_DESC_JUMBO_CTXID) ? RCV_DESC_JUMBO :  \
1507956Sxiuyan.wang@Sun.COM 	    ((ID == RCV_DESC_LRO_CTXID) ? RCV_DESC_LRO : (RCV_DESC_NORMAL)))
1517956Sxiuyan.wang@Sun.COM 
1527956Sxiuyan.wang@Sun.COM #define	RCV_DESC_TYPE_NAME(ID) \
1537956Sxiuyan.wang@Sun.COM 	((ID	==	RCV_DESC_JUMBO_CTXID)	?	"Jumbo"	:	\
1547956Sxiuyan.wang@Sun.COM 	(ID == RCV_DESC_LRO_CTXID)    ? "LRO"    :  \
1557956Sxiuyan.wang@Sun.COM 	(ID == RCV_DESC_NORMAL_CTXID) ? "Normal" : "Unknown")
1567956Sxiuyan.wang@Sun.COM 
1577956Sxiuyan.wang@Sun.COM #define	MAX_CMD_DESCRIPTORS			4096
1587956Sxiuyan.wang@Sun.COM #define	MAX_CMD_DESCRIPTORS_HOST	(MAX_CMD_DESCRIPTORS / 4)
1597956Sxiuyan.wang@Sun.COM 
1607956Sxiuyan.wang@Sun.COM #define	MAX_RCV_DESCRIPTORS			8192
1617956Sxiuyan.wang@Sun.COM #define	MAX_JUMBO_RCV_DESCRIPTORS	1024
1627956Sxiuyan.wang@Sun.COM #define	MAX_LRO_RCV_DESCRIPTORS		16
1637956Sxiuyan.wang@Sun.COM 
1647956Sxiuyan.wang@Sun.COM #define	NX_MAX_SUPPORTED_RDS_SIZE	(32 * 1024)
1657956Sxiuyan.wang@Sun.COM #define	NX_MAX_SUPPORTED_JUMBO_RDS_SIZE	(4 * 1024)
1667956Sxiuyan.wang@Sun.COM 
1677956Sxiuyan.wang@Sun.COM #define	PHAN_PEG_RCV_INITIALIZED		0xff01
1687956Sxiuyan.wang@Sun.COM #define	PHAN_PEG_RCV_START_INITIALIZE	0xff00
1697956Sxiuyan.wang@Sun.COM 
1707956Sxiuyan.wang@Sun.COM #define	get_next_index(index, length)  ((((index)  + 1) == length)?0:(index) +1)
1717956Sxiuyan.wang@Sun.COM 
1727956Sxiuyan.wang@Sun.COM #define	get_index_range(index, length, count)	\
1737956Sxiuyan.wang@Sun.COM 	((((index) + (count)) >= length)? \
1747956Sxiuyan.wang@Sun.COM 		(((index)  + (count))-(length)):((index) + (count)))
1757956Sxiuyan.wang@Sun.COM 
1767956Sxiuyan.wang@Sun.COM #define	UNM_FLOW_TICKS_PER_SEC    2048
1777956Sxiuyan.wang@Sun.COM #define	UNM_FLOW_TO_TV_SHIFT_SEC  11
1787956Sxiuyan.wang@Sun.COM #define	UNM_FLOW_TO_TV_SHIFT_USEC 9
1797956Sxiuyan.wang@Sun.COM #define	UNM_FLOW_TICK_USEC   (1000000ULL/UNM_FLOW_TICKS_PER_SEC)
1807956Sxiuyan.wang@Sun.COM #define	UNM_GLOBAL_TICKS_PER_SEC  (4*UNM_FLOW_TICKS_PER_SEC)
1817956Sxiuyan.wang@Sun.COM #define	UNM_GLOBAL_TICK_USEC (1000000ULL/UNM_GLOBAL_TICKS_PER_SEC)
1827956Sxiuyan.wang@Sun.COM 
1837956Sxiuyan.wang@Sun.COM 
1847956Sxiuyan.wang@Sun.COM /*
1857956Sxiuyan.wang@Sun.COM  * Following data structures describe the descriptors that will be used.
1867956Sxiuyan.wang@Sun.COM  * Added fileds of tcpHdrSize and ipHdrSize, The driver needs to do it only when
1877956Sxiuyan.wang@Sun.COM  * we are doing LSO (above the 1500 size packet) only.
1887956Sxiuyan.wang@Sun.COM  * This is an overhead but we need it. Let me know if you have questions.
1897956Sxiuyan.wang@Sun.COM  */
1907956Sxiuyan.wang@Sun.COM 
1917956Sxiuyan.wang@Sun.COM /*
1927956Sxiuyan.wang@Sun.COM  * the size of reference handle been changed to 16 bits to pass the MSS fields
1937956Sxiuyan.wang@Sun.COM  * for the LSO packet
1947956Sxiuyan.wang@Sun.COM  */
1957956Sxiuyan.wang@Sun.COM 
196*9436SJing.Xiong@Sun.COM #define	FLAGS_MCAST				0x01
1977956Sxiuyan.wang@Sun.COM #define	FLAGS_LSO_ENABLED			0x02
1987956Sxiuyan.wang@Sun.COM #define	FLAGS_IPSEC_SA_ADD			0x04
199*9436SJing.Xiong@Sun.COM #define	FLAGS_IPSEC_SA_DELETE			0x08
2007956Sxiuyan.wang@Sun.COM #define	FLAGS_VLAN_TAGGED			0x10
2017956Sxiuyan.wang@Sun.COM 
2027956Sxiuyan.wang@Sun.COM #if UNM_CONF_PROCESSOR == UNM_CONF_X86
2037956Sxiuyan.wang@Sun.COM 
2047956Sxiuyan.wang@Sun.COM #ifndef U64
2057956Sxiuyan.wang@Sun.COM typedef unsigned long long U64;
2067956Sxiuyan.wang@Sun.COM typedef uint32_t U32;
2077956Sxiuyan.wang@Sun.COM typedef uint16_t U16;
2087956Sxiuyan.wang@Sun.COM typedef uint8_t  U8;
2097956Sxiuyan.wang@Sun.COM #endif
2107956Sxiuyan.wang@Sun.COM 
2117956Sxiuyan.wang@Sun.COM #endif
2127956Sxiuyan.wang@Sun.COM 
2137956Sxiuyan.wang@Sun.COM #define	NUM_SUPPORTED_RINGSETS	4
2147956Sxiuyan.wang@Sun.COM #define	MAX_RING_CTX			4
2157956Sxiuyan.wang@Sun.COM #define	UNM_CTX_SIGNATURE		0xdee0
2167956Sxiuyan.wang@Sun.COM #define	UNM_CTX_RESET			0xbad0
2177956Sxiuyan.wang@Sun.COM #define	UNM_CTX_D3_RESET		0xacc0
2187956Sxiuyan.wang@Sun.COM 
2197956Sxiuyan.wang@Sun.COM /* define opcode for ctx_msg */
2207956Sxiuyan.wang@Sun.COM #define	RX_PRODUCER				0
2217956Sxiuyan.wang@Sun.COM #define	RX_PRODUCER_JUMBO		1
2227956Sxiuyan.wang@Sun.COM #define	RX_PRODUCER_LRO			2
2237956Sxiuyan.wang@Sun.COM #define	TX_PRODUCER				3
2247956Sxiuyan.wang@Sun.COM #define	UPDATE_STATUS_CONSUMER	4
2257956Sxiuyan.wang@Sun.COM #define	RESET_CTX				5
2267956Sxiuyan.wang@Sun.COM 
2277956Sxiuyan.wang@Sun.COM #define	NUM_DB_CODE				6
2287956Sxiuyan.wang@Sun.COM 
2297956Sxiuyan.wang@Sun.COM #define	UNM_RCV_PRODUCER(ringid)	(ringid)
2307956Sxiuyan.wang@Sun.COM #define	UNM_CMD_PRODUCER			TX_PRODUCER
2317956Sxiuyan.wang@Sun.COM #define	UNM_RCV_STATUS_CONSUMER		UPDATE_STATUS_CONSUMER
2327956Sxiuyan.wang@Sun.COM 
2337956Sxiuyan.wang@Sun.COM typedef struct __msg
2347956Sxiuyan.wang@Sun.COM {
2358687SJing.Xiong@Sun.COM     __uint32_t  PegId:2,   /* 0x2 for tx and 01 for rx */
2368687SJing.Xiong@Sun.COM 			    privId:1, /* must be 1 */
2378687SJing.Xiong@Sun.COM 			    Count:15, /* for doorbell */
2388687SJing.Xiong@Sun.COM 			    CtxId:10, /* Ctx_id */
2397956Sxiuyan.wang@Sun.COM 			    Opcode:4; /* opcode */
2407956Sxiuyan.wang@Sun.COM }ctx_msg, CTX_MSG, *PCTX_MSG;
2417956Sxiuyan.wang@Sun.COM 
2427956Sxiuyan.wang@Sun.COM typedef struct __int_msg
2437956Sxiuyan.wang@Sun.COM {
2448687SJing.Xiong@Sun.COM     __uint32_t  Count:18, /* INT */
2457956Sxiuyan.wang@Sun.COM 			    ConsumerIdx:10,
2468687SJing.Xiong@Sun.COM 			    CtxId:4; /* Ctx_id */
2477956Sxiuyan.wang@Sun.COM 
2487956Sxiuyan.wang@Sun.COM }int_msg, INT_MSG, *PINT_MSG;
2497956Sxiuyan.wang@Sun.COM 
2507956Sxiuyan.wang@Sun.COM /* For use in CRB_MPORT_MODE */
2517956Sxiuyan.wang@Sun.COM #define	MPORT_SINGLE_FUNCTION_MODE	0x1111
2527956Sxiuyan.wang@Sun.COM #define	MPORT_MULTI_FUNCTION_MODE	0x2222
2537956Sxiuyan.wang@Sun.COM 
2547956Sxiuyan.wang@Sun.COM typedef struct _RcvContext
2557956Sxiuyan.wang@Sun.COM {
2567956Sxiuyan.wang@Sun.COM 	__uint32_t		RcvRingAddrLo;
2577956Sxiuyan.wang@Sun.COM 	__uint32_t		RcvRingAddrHi;
2587956Sxiuyan.wang@Sun.COM 	__uint32_t		RcvRingSize;
2597956Sxiuyan.wang@Sun.COM 	__uint32_t		Rsrv;
2607956Sxiuyan.wang@Sun.COM }RcvContext;
2617956Sxiuyan.wang@Sun.COM 
2627956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(64) _RingContext
2637956Sxiuyan.wang@Sun.COM {
2647956Sxiuyan.wang@Sun.COM 
2657956Sxiuyan.wang@Sun.COM 	/* one command ring */
2667956Sxiuyan.wang@Sun.COM 	__uint64_t		CMD_CONSUMER_OFFSET;
2677956Sxiuyan.wang@Sun.COM 	__uint32_t		CmdRingAddrLo;
2687956Sxiuyan.wang@Sun.COM 	__uint32_t		CmdRingAddrHi;
2697956Sxiuyan.wang@Sun.COM 	__uint32_t		CmdRingSize;
2707956Sxiuyan.wang@Sun.COM 	__uint32_t		Rsrv;
2717956Sxiuyan.wang@Sun.COM 
2727956Sxiuyan.wang@Sun.COM 	/* three receive rings */
2737956Sxiuyan.wang@Sun.COM 	RcvContext		RcvContext[3];
2747956Sxiuyan.wang@Sun.COM 
2757956Sxiuyan.wang@Sun.COM 	/* one status ring */
2767956Sxiuyan.wang@Sun.COM 	__uint32_t		StsRingAddrLo;
2777956Sxiuyan.wang@Sun.COM 	__uint32_t		StsRingAddrHi;
2787956Sxiuyan.wang@Sun.COM 	__uint32_t		StsRingSize;
2797956Sxiuyan.wang@Sun.COM 
2807956Sxiuyan.wang@Sun.COM 	__uint32_t		CtxId;
2817956Sxiuyan.wang@Sun.COM 
2828687SJing.Xiong@Sun.COM 	__uint64_t		D3_STATE_REGISTER;
2838687SJing.Xiong@Sun.COM 	__uint32_t		DummyDmaAddrLo;
2848687SJing.Xiong@Sun.COM 	__uint32_t		DummyDmaAddrHi;
2857956Sxiuyan.wang@Sun.COM 
2867956Sxiuyan.wang@Sun.COM }POSTALIGN(64) RingContext, RING_CTX, *PRING_CTX;
2877956Sxiuyan.wang@Sun.COM 
2887956Sxiuyan.wang@Sun.COM #ifdef UNM_RSS
2897956Sxiuyan.wang@Sun.COM /*
2907956Sxiuyan.wang@Sun.COM  * RSS_SreInfo{} has the information for SRE to calculate the hash value
2917956Sxiuyan.wang@Sun.COM  * Will be passed by the host=> as part of comd descriptor...
2927956Sxiuyan.wang@Sun.COM  */
2937956Sxiuyan.wang@Sun.COM 
2947956Sxiuyan.wang@Sun.COM #if UNM_CONF_PROCESSOR == UNM_CONF_X86
2957956Sxiuyan.wang@Sun.COM typedef struct _RSS_SreInfo {
2967956Sxiuyan.wang@Sun.COM 	U32		HashKeySize;
2977956Sxiuyan.wang@Sun.COM 	U32		HashInformation;
2987956Sxiuyan.wang@Sun.COM 	char	key[40];
2997956Sxiuyan.wang@Sun.COM }RSS_SreInfo;
3007956Sxiuyan.wang@Sun.COM #endif
3017956Sxiuyan.wang@Sun.COM 
3027956Sxiuyan.wang@Sun.COM /*
3037956Sxiuyan.wang@Sun.COM  * The following Descriptor is used to send RSS commands to the
3047956Sxiuyan.wang@Sun.COM  * PEG.... to be do the SRE registers..
3057956Sxiuyan.wang@Sun.COM  */
3067956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(64) _rssCmdDesc
3077956Sxiuyan.wang@Sun.COM {
3087956Sxiuyan.wang@Sun.COM 
3097956Sxiuyan.wang@Sun.COM 	/*
3107956Sxiuyan.wang@Sun.COM 	 * To keep the opcode at the same location as
3117956Sxiuyan.wang@Sun.COM 	 * the cmdDescType0, we will have to breakup the key into
3127956Sxiuyan.wang@Sun.COM 	 * 2 areas.... Dont like it but for now will do... FSL
3137956Sxiuyan.wang@Sun.COM 	 */
3147956Sxiuyan.wang@Sun.COM 
3157956Sxiuyan.wang@Sun.COM #if UNM_CONF_PROCESSOR == UNM_CONF_X86
3167956Sxiuyan.wang@Sun.COM 	U8		Key0[16];
3177956Sxiuyan.wang@Sun.COM 
3187956Sxiuyan.wang@Sun.COM 	U64		HashMethod:32,
3197956Sxiuyan.wang@Sun.COM 			HashKeySize:8,
3207956Sxiuyan.wang@Sun.COM 			Unused:	16,
3217956Sxiuyan.wang@Sun.COM 			opcode:8;
3227956Sxiuyan.wang@Sun.COM 
3237956Sxiuyan.wang@Sun.COM 	U8		Key1[24];
3247956Sxiuyan.wang@Sun.COM 	U64		Unused1;
3257956Sxiuyan.wang@Sun.COM 	U64		Unused2;
3267956Sxiuyan.wang@Sun.COM #else
3277956Sxiuyan.wang@Sun.COM 
3287956Sxiuyan.wang@Sun.COM 	unm_msgword_t		Key0[2];
3297956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	HashMethod;
3308687SJing.Xiong@Sun.COM 	unm_halfmsgword_t
3317956Sxiuyan.wang@Sun.COM 						HashKeySize:8,
3327956Sxiuyan.wang@Sun.COM 						Unused:16,
3337956Sxiuyan.wang@Sun.COM 						opcode:8;
3347956Sxiuyan.wang@Sun.COM 
3358687SJing.Xiong@Sun.COM 	unm_msgword_t    Key1[3];
3368687SJing.Xiong@Sun.COM 	unm_msgword_t    Unused1;
3378687SJing.Xiong@Sun.COM 	unm_msgword_t    Unused2;
3387956Sxiuyan.wang@Sun.COM 
3397956Sxiuyan.wang@Sun.COM #endif
3407956Sxiuyan.wang@Sun.COM 
3417956Sxiuyan.wang@Sun.COM } POSTALIGN(64) rssCmdDesc_t;
3427956Sxiuyan.wang@Sun.COM 
3437956Sxiuyan.wang@Sun.COM 
3447956Sxiuyan.wang@Sun.COM #endif /* UNM_RSS */
3457956Sxiuyan.wang@Sun.COM 
3467956Sxiuyan.wang@Sun.COM 
3477956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(64) cmdDescType0
3487956Sxiuyan.wang@Sun.COM {
3497956Sxiuyan.wang@Sun.COM 	union {
3507956Sxiuyan.wang@Sun.COM 		struct {
3517956Sxiuyan.wang@Sun.COM 			__uint32_t	tcpHdrOffset:8, /* For LSO only */
3528687SJing.Xiong@Sun.COM 			ipHdrOffset:8,  /* For LSO only */
3538687SJing.Xiong@Sun.COM 			flags:7, /* as defined above */
3547956Sxiuyan.wang@Sun.COM 			/* This location/size must not change... */
3558687SJing.Xiong@Sun.COM 			opcode:6,
3568687SJing.Xiong@Sun.COM 			Unused:3;
3577956Sxiuyan.wang@Sun.COM 			/* total number of segments (buffers */
3587956Sxiuyan.wang@Sun.COM 			__uint32_t	numOfBuffers:8,
3597956Sxiuyan.wang@Sun.COM 			/* for this packet. (could be more than 4) */
3607956Sxiuyan.wang@Sun.COM 
3618687SJing.Xiong@Sun.COM 			/* Total size of the packet */
3628687SJing.Xiong@Sun.COM 			totalLength:24;
3638687SJing.Xiong@Sun.COM 		}s1;
3648687SJing.Xiong@Sun.COM 		__uint64_t	word0;
3657956Sxiuyan.wang@Sun.COM 	}u1;
3667956Sxiuyan.wang@Sun.COM 
3678687SJing.Xiong@Sun.COM 	union {
3687956Sxiuyan.wang@Sun.COM 		struct {
3697956Sxiuyan.wang@Sun.COM 			__uint32_t AddrLowPart2;
3707956Sxiuyan.wang@Sun.COM 			__uint32_t AddrHighPart2;
3717956Sxiuyan.wang@Sun.COM 		}s1;
3727956Sxiuyan.wang@Sun.COM 		__uint64_t AddrBuffer2;
3737956Sxiuyan.wang@Sun.COM 		__uint64_t	word1;
3747956Sxiuyan.wang@Sun.COM 	}u2;
3757956Sxiuyan.wang@Sun.COM 
3767956Sxiuyan.wang@Sun.COM 	union {
3777956Sxiuyan.wang@Sun.COM 		struct {
3787956Sxiuyan.wang@Sun.COM 					/* changed to U16 to add mss */
3797956Sxiuyan.wang@Sun.COM 			__uint32_t	referenceHandle:16,
3807956Sxiuyan.wang@Sun.COM 					/* passed by NDIS_PACKET for LSO */
3817956Sxiuyan.wang@Sun.COM 						mss:16;
3827956Sxiuyan.wang@Sun.COM 			__uint32_t	port:4,
3837956Sxiuyan.wang@Sun.COM 						ctx_id:4,
3847956Sxiuyan.wang@Sun.COM 					/* LSO only : MAC+IP+TCP Hdr size */
3857956Sxiuyan.wang@Sun.COM 						totalHdrLength:8,
3867956Sxiuyan.wang@Sun.COM 					/* IPSec offoad only */
3877956Sxiuyan.wang@Sun.COM 						connID:16;
3887956Sxiuyan.wang@Sun.COM 		}s1;
3897956Sxiuyan.wang@Sun.COM 		__uint64_t	word2;
3907956Sxiuyan.wang@Sun.COM 	}u3;
3917956Sxiuyan.wang@Sun.COM 
3927956Sxiuyan.wang@Sun.COM 	union {
3937956Sxiuyan.wang@Sun.COM 		struct {
3947956Sxiuyan.wang@Sun.COM 			__uint32_t AddrLowPart3;
3957956Sxiuyan.wang@Sun.COM 			__uint32_t AddrHighPart3;
3967956Sxiuyan.wang@Sun.COM 		}s1;
3977956Sxiuyan.wang@Sun.COM 		__uint64_t AddrBuffer3;
3987956Sxiuyan.wang@Sun.COM 		__uint64_t	word3;
3997956Sxiuyan.wang@Sun.COM 	}u4;
4007956Sxiuyan.wang@Sun.COM 
4017956Sxiuyan.wang@Sun.COM 	union {
4027956Sxiuyan.wang@Sun.COM 		struct {
4037956Sxiuyan.wang@Sun.COM 			__uint32_t AddrLowPart1;
4047956Sxiuyan.wang@Sun.COM 			__uint32_t AddrHighPart1;
4057956Sxiuyan.wang@Sun.COM 		}s1;
4067956Sxiuyan.wang@Sun.COM 		__uint64_t AddrBuffer1;
4077956Sxiuyan.wang@Sun.COM 		__uint64_t	word4;
4087956Sxiuyan.wang@Sun.COM 	}u5;
4097956Sxiuyan.wang@Sun.COM 
4107956Sxiuyan.wang@Sun.COM 	union {
4117956Sxiuyan.wang@Sun.COM 		struct {
4127956Sxiuyan.wang@Sun.COM 			__uint32_t	buffer1Length:16,
4137956Sxiuyan.wang@Sun.COM 						buffer2Length:16;
4147956Sxiuyan.wang@Sun.COM 			__uint32_t  buffer3Length:16,
4157956Sxiuyan.wang@Sun.COM 						buffer4Length:16;
4167956Sxiuyan.wang@Sun.COM 		}s1;
4177956Sxiuyan.wang@Sun.COM 		__uint64_t	word5;
4187956Sxiuyan.wang@Sun.COM 	}u6;
4197956Sxiuyan.wang@Sun.COM 
4207956Sxiuyan.wang@Sun.COM 	union {
4217956Sxiuyan.wang@Sun.COM 		struct {
4227956Sxiuyan.wang@Sun.COM 			__uint32_t AddrLowPart4;
4237956Sxiuyan.wang@Sun.COM 			__uint32_t AddrHighPart4;
4247956Sxiuyan.wang@Sun.COM 		}s1;
4257956Sxiuyan.wang@Sun.COM 		__uint64_t AddrBuffer4;
4267956Sxiuyan.wang@Sun.COM 		__uint64_t	word6;
4277956Sxiuyan.wang@Sun.COM 	}u7;
4287956Sxiuyan.wang@Sun.COM 
429*9436SJing.Xiong@Sun.COM 	__uint64_t mcastAddr;
4307956Sxiuyan.wang@Sun.COM 
4317956Sxiuyan.wang@Sun.COM } POSTALIGN(64) cmdDescType0_t;
4327956Sxiuyan.wang@Sun.COM 
4337956Sxiuyan.wang@Sun.COM /* Note: sizeof(rcvDesc) should always be a mutliple of 2 */
4347956Sxiuyan.wang@Sun.COM typedef struct rcvDesc
4357956Sxiuyan.wang@Sun.COM {
4368687SJing.Xiong@Sun.COM 	__uint32_t	referenceHandle:16,
4377956Sxiuyan.wang@Sun.COM 				flags:16;
4388687SJing.Xiong@Sun.COM 	__uint32_t
4397956Sxiuyan.wang@Sun.COM 		/* allocated buffer length (usually 2K) */
4407956Sxiuyan.wang@Sun.COM 				bufferLength:32;
4417956Sxiuyan.wang@Sun.COM 	__uint64_t	AddrBuffer;
4427956Sxiuyan.wang@Sun.COM }  rcvDesc_t;
4437956Sxiuyan.wang@Sun.COM 
4447956Sxiuyan.wang@Sun.COM /* for status field in statusDesc_t */
4457956Sxiuyan.wang@Sun.COM #define	STATUS_NEED_CKSUM		(1)
4467956Sxiuyan.wang@Sun.COM #define	STATUS_CKSUM_OK			(2)
4477956Sxiuyan.wang@Sun.COM #define	STATUS_CKSUM_NOT_OK		(3)
4487956Sxiuyan.wang@Sun.COM 
4497956Sxiuyan.wang@Sun.COM /* owner bits of statusDesc_t */
4507956Sxiuyan.wang@Sun.COM #define	STATUS_OWNER_HOST		(1ULL)
4517956Sxiuyan.wang@Sun.COM #define	STATUS_OWNER_PHANTOM	(2ULL)
4527956Sxiuyan.wang@Sun.COM #define	HOST_STATUS_DESC		((STATUS_OWNER_HOST) << 48)
4537956Sxiuyan.wang@Sun.COM #define	PHANTOM_STATUS_DESC		((STATUS_OWNER_PHANTOM) << 48)
4547956Sxiuyan.wang@Sun.COM 
4557956Sxiuyan.wang@Sun.COM #define	UNM_PROT_IP			(1)
4567956Sxiuyan.wang@Sun.COM #define	UNM_PROT_UNKNOWN	(0)
4577956Sxiuyan.wang@Sun.COM 
4587956Sxiuyan.wang@Sun.COM /* LRO specific bits of statusDesc_t */
4597956Sxiuyan.wang@Sun.COM #define	LRO_LAST_FRAG			(1)
4607956Sxiuyan.wang@Sun.COM #define	LRO_NORMAL_FRAG			(0)
4617956Sxiuyan.wang@Sun.COM #define	LRO_LAST_FRAG_DESC		((LRO_LAST_FRAG)<<63)
4627956Sxiuyan.wang@Sun.COM #define	LRO_NORMAL_FRAG_DESC	((LRO_NORMAL_FRAG)<<63)
4637956Sxiuyan.wang@Sun.COM 
4647956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(16) statusDesc {
4658687SJing.Xiong@Sun.COM 	union {
4667956Sxiuyan.wang@Sun.COM 		struct {
4677956Sxiuyan.wang@Sun.COM 					/* initially to be used but noe now */
4687956Sxiuyan.wang@Sun.COM 			__uint32_t	port:4,
4697956Sxiuyan.wang@Sun.COM 					/* completion status may not have use */
4707956Sxiuyan.wang@Sun.COM 						status:4,
4717956Sxiuyan.wang@Sun.COM 					/* type/index of descriptor ring */
4727956Sxiuyan.wang@Sun.COM 						type:4,
4737956Sxiuyan.wang@Sun.COM 					/* NIC mode...no use yet */
4747956Sxiuyan.wang@Sun.COM 						totalLength:16,
4757956Sxiuyan.wang@Sun.COM 					/* handle for the associated packet */
4767956Sxiuyan.wang@Sun.COM 						referenceHandle_lo:4;
4777956Sxiuyan.wang@Sun.COM 					/* handle for the associated packet */
4787956Sxiuyan.wang@Sun.COM 			__uint32_t	referenceHandle_hi:12,
4797956Sxiuyan.wang@Sun.COM 					/* Pkt protocol */
4807956Sxiuyan.wang@Sun.COM 						prot:4,
4817956Sxiuyan.wang@Sun.COM 						pkt_offset:5,
4827956Sxiuyan.wang@Sun.COM /*
4837956Sxiuyan.wang@Sun.COM  * This indicates the num of descriptors part of this descriptor chain.
4847956Sxiuyan.wang@Sun.COM  */
4857956Sxiuyan.wang@Sun.COM 						descCnt:3,
4867956Sxiuyan.wang@Sun.COM 						owner:2,
4877956Sxiuyan.wang@Sun.COM 						opcode:6;
4887956Sxiuyan.wang@Sun.COM 
4897956Sxiuyan.wang@Sun.COM 			__uint32_t	HashValue;
4907956Sxiuyan.wang@Sun.COM 			__uint16_t	vlan;
4917956Sxiuyan.wang@Sun.COM 			__uint8_t	HashType;
4927956Sxiuyan.wang@Sun.COM 
4937956Sxiuyan.wang@Sun.COM 		union {
4947956Sxiuyan.wang@Sun.COM 			/*
4957956Sxiuyan.wang@Sun.COM 			 * For LRO count is set
4967956Sxiuyan.wang@Sun.COM 			 * Last LRO fragment is set when it is
4977956Sxiuyan.wang@Sun.COM 			 * the last frag as the name says.
4987956Sxiuyan.wang@Sun.COM 			 */
4997956Sxiuyan.wang@Sun.COM 			__uint8_t	lro_frag:7, last_lro_frag:1;
5007956Sxiuyan.wang@Sun.COM 
5017956Sxiuyan.wang@Sun.COM 			/*
5027956Sxiuyan.wang@Sun.COM 			 * Used to indicate direction in case
5037956Sxiuyan.wang@Sun.COM 			 * of captured packets. Egress will
5047956Sxiuyan.wang@Sun.COM 			 * contain EPG input, while ingress
5057956Sxiuyan.wang@Sun.COM 			 * contains an skb copy.
5067956Sxiuyan.wang@Sun.COM 			 */
5077956Sxiuyan.wang@Sun.COM #define	NX_CAP_DIRN_OUT	1
5087956Sxiuyan.wang@Sun.COM #define	NX_CAP_DIRN_IN	2
5097956Sxiuyan.wang@Sun.COM 			__uint8_t direction;
5107956Sxiuyan.wang@Sun.COM 
5117956Sxiuyan.wang@Sun.COM 			/*
5127956Sxiuyan.wang@Sun.COM 			 * Currently for Legacy this is 0.
5137956Sxiuyan.wang@Sun.COM 			 */
5147956Sxiuyan.wang@Sun.COM 			__uint8_t	nr_frags;
5157956Sxiuyan.wang@Sun.COM 		}u11;
5167956Sxiuyan.wang@Sun.COM 
5177956Sxiuyan.wang@Sun.COM 		}s1;
5187956Sxiuyan.wang@Sun.COM 		__uint64_t	 body[2];
5197956Sxiuyan.wang@Sun.COM 		}u1;
5207956Sxiuyan.wang@Sun.COM 
5217956Sxiuyan.wang@Sun.COM } POSTALIGN(16) statusDesc_t;
5227956Sxiuyan.wang@Sun.COM 
5237956Sxiuyan.wang@Sun.COM 
5247956Sxiuyan.wang@Sun.COM #define	STATUS_OWNER_NAME(sd) \
5257956Sxiuyan.wang@Sun.COM 	(((sd)->u1.s1.owner == STATUS_OWNER_HOST) ? "Host" : "Phantom")
5267956Sxiuyan.wang@Sun.COM 
5277956Sxiuyan.wang@Sun.COM #ifdef	UNM_IPSECOFFLOAD
5287956Sxiuyan.wang@Sun.COM 
5297956Sxiuyan.wang@Sun.COM #define	MAX_IPSEC_SAS			1024
5307956Sxiuyan.wang@Sun.COM #define	RECEIVE_IPSEC_SA_BASE	0x8000
5317956Sxiuyan.wang@Sun.COM 
5327956Sxiuyan.wang@Sun.COM /*
5337956Sxiuyan.wang@Sun.COM  * IPSEC related structures and defines
5347956Sxiuyan.wang@Sun.COM  */
5357956Sxiuyan.wang@Sun.COM 
5367956Sxiuyan.wang@Sun.COM /* Values for DIrFlag in the ipsec_sa_t structure below: */
5377956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_SA_DIR_INBOUND	1
5387956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_SA_DIR_OUTBOUND	2
5397956Sxiuyan.wang@Sun.COM 
5407956Sxiuyan.wang@Sun.COM /* Values for Operation Field below: */
5417956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_SA_AUTHENTICATE	1
5427956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_SA_ENDECRYPT		2
5437956Sxiuyan.wang@Sun.COM 
5447956Sxiuyan.wang@Sun.COM /* COnfidential Algorithm Types: */
5457956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_CONF_NONE			0    // NULL encryption?
5467956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_CONF_DES			1
5477956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_CONF_RESERVED		2
5487956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_CONF_3DES			3
5497956Sxiuyan.wang@Sun.COM 
5507956Sxiuyan.wang@Sun.COM /* Integrity algorithm (AH) types: */
5517956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_INTEG_NONE	0
5527956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_INTEG_MD5		1
5537956Sxiuyan.wang@Sun.COM #define	UNM_IPSEC_INTEG_SHA1	2
5547956Sxiuyan.wang@Sun.COM 
5557956Sxiuyan.wang@Sun.COM #define	UNM_PROTOCOL_OFFSET		0x9    // from ip header begin, in bytes
5567956Sxiuyan.wang@Sun.COM #define	UNM_PKT_TYPE_AH			0x33
5577956Sxiuyan.wang@Sun.COM #define	UNM_PKT_TYPE_ESP		0x32
5587956Sxiuyan.wang@Sun.COM 
5597956Sxiuyan.wang@Sun.COM 
5607956Sxiuyan.wang@Sun.COM /* 96 bits of output for MD5/SHA1 algorithms */
5617956Sxiuyan.wang@Sun.COM #define	UNM_AHOUTPUT_LENGTH		12
5627956Sxiuyan.wang@Sun.COM /*
5637956Sxiuyan.wang@Sun.COM  * 8 bytes (64 bits) of ICV value for each block of DES_CBC
5647956Sxiuyan.wang@Sun.COM  * at the begin of ESP payload
5657956Sxiuyan.wang@Sun.COM  */
5667956Sxiuyan.wang@Sun.COM #define	UNM_DES_ICV_LENGTH		8
5677956Sxiuyan.wang@Sun.COM 
5687956Sxiuyan.wang@Sun.COM #if UNM_CONF_PROCESSOR == UNM_CONF_X86
5697956Sxiuyan.wang@Sun.COM 
5707956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(512) s_ipsec_sa {
5718687SJing.Xiong@Sun.COM 	U32	SrcAddr;
5727956Sxiuyan.wang@Sun.COM 	U32	SrcMask;
5737956Sxiuyan.wang@Sun.COM 	U32	DestAddr;
5747956Sxiuyan.wang@Sun.COM 	U32	DestMask;
5757956Sxiuyan.wang@Sun.COM 	U32	Protocol:8,
5767956Sxiuyan.wang@Sun.COM 		DirFlag:4,
5777956Sxiuyan.wang@Sun.COM 		IntegCtxInit:2,
5787956Sxiuyan.wang@Sun.COM 		ConfCtxInit:2,
5797956Sxiuyan.wang@Sun.COM 		No_of_keys:8,
5807956Sxiuyan.wang@Sun.COM 		Operation:8;
5817956Sxiuyan.wang@Sun.COM 	U32	IntegAlg:8,
5827956Sxiuyan.wang@Sun.COM 		IntegKeyLen:8,
5837956Sxiuyan.wang@Sun.COM 		ConfAlg:8,
5847956Sxiuyan.wang@Sun.COM 		ConfAlgKeyLen:8;
5857956Sxiuyan.wang@Sun.COM 	U32	SAIndex;
5867956Sxiuyan.wang@Sun.COM 	U32	SPI_Id;
5877956Sxiuyan.wang@Sun.COM 	U64	Key1[124];
5887956Sxiuyan.wang@Sun.COM } POSTALIGN(512) unm_ipsec_sa_t;
5897956Sxiuyan.wang@Sun.COM 
5907956Sxiuyan.wang@Sun.COM #else
5917956Sxiuyan.wang@Sun.COM 
5927956Sxiuyan.wang@Sun.COM typedef struct PREALIGN(512) s_ipsec_sa {
5937956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	SrcAddr;
5947956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	SrcMask;
5957956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	DestAddr;
5967956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	DestMask;
5977956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	Protocol:8,
5987956Sxiuyan.wang@Sun.COM 						DirFlag:4,
5997956Sxiuyan.wang@Sun.COM 						IntegCtxInit:2,
6007956Sxiuyan.wang@Sun.COM 						ConfCtxInit:2,
6017956Sxiuyan.wang@Sun.COM 						No_of_keys:8,
6027956Sxiuyan.wang@Sun.COM 						Operation:8;
6037956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	IntegAlg:8,
6047956Sxiuyan.wang@Sun.COM 						IntegKeyLen:8,
6057956Sxiuyan.wang@Sun.COM 						ConfAlg:8,
6067956Sxiuyan.wang@Sun.COM 						ConfAlgKeyLen:8;
6077956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	SAIndex:32;
6087956Sxiuyan.wang@Sun.COM 	unm_halfmsgword_t	SPI_Id:32;
6097956Sxiuyan.wang@Sun.COM 	/* to round up to 1K of structure */
6107956Sxiuyan.wang@Sun.COM 	unm_msgword_t		Key1[124];
6117956Sxiuyan.wang@Sun.COM } POSTALIGN(512) unm_ipsec_sa_t;
6127956Sxiuyan.wang@Sun.COM 
6137956Sxiuyan.wang@Sun.COM #endif /* NOT-X86 */
6147956Sxiuyan.wang@Sun.COM 
6157956Sxiuyan.wang@Sun.COM /* Other common header formats that may be needed */
6167956Sxiuyan.wang@Sun.COM 
6177956Sxiuyan.wang@Sun.COM typedef struct _unm_ip_header_s {
6187956Sxiuyan.wang@Sun.COM 	U32	HdrVer:8,
6197956Sxiuyan.wang@Sun.COM 		diffser:8,
6207956Sxiuyan.wang@Sun.COM 		TotalLength:16;
6217956Sxiuyan.wang@Sun.COM 	U32	ipId:16,
6227956Sxiuyan.wang@Sun.COM 		flagfrag:16;
6237956Sxiuyan.wang@Sun.COM 	U32	TTL:8,
6247956Sxiuyan.wang@Sun.COM 		Protocol:8,
6257956Sxiuyan.wang@Sun.COM 		Chksum:16;
6267956Sxiuyan.wang@Sun.COM 	U32	srcaddr;
6277956Sxiuyan.wang@Sun.COM 	U32	destaddr;
6287956Sxiuyan.wang@Sun.COM } unm_ip_header_t;
6297956Sxiuyan.wang@Sun.COM 
6307956Sxiuyan.wang@Sun.COM typedef struct _unm_ah_header_s {
6317956Sxiuyan.wang@Sun.COM 	U32	NextProto:8,
6327956Sxiuyan.wang@Sun.COM 		length:8,
6337956Sxiuyan.wang@Sun.COM 		reserved:16;
6348687SJing.Xiong@Sun.COM 	U32    SPI;
6358687SJing.Xiong@Sun.COM 	U32    seqno;
6368687SJing.Xiong@Sun.COM 	U16    ICV;
6378687SJing.Xiong@Sun.COM 	U16    ICV1;
6388687SJing.Xiong@Sun.COM 	U16    ICV2;
6398687SJing.Xiong@Sun.COM 	U16    ICV3;
6408687SJing.Xiong@Sun.COM 	U16    ICV4;
6418687SJing.Xiong@Sun.COM 	U16    ICV5;
6427956Sxiuyan.wang@Sun.COM } unm_ah_header_t;
6437956Sxiuyan.wang@Sun.COM 
6447956Sxiuyan.wang@Sun.COM typedef struct _unm_esp_hdr_s {
6458687SJing.Xiong@Sun.COM 	U32 SPI;
6468687SJing.Xiong@Sun.COM 	U32 seqno;
6477956Sxiuyan.wang@Sun.COM } unm_esp_hdr_t;
6487956Sxiuyan.wang@Sun.COM 
6497956Sxiuyan.wang@Sun.COM #endif /* UNM_IPSECOFFLOAD */
6507956Sxiuyan.wang@Sun.COM 
6517956Sxiuyan.wang@Sun.COM /*
6527956Sxiuyan.wang@Sun.COM  * Defines for various loop counts. These determine the behaviour of the
6537956Sxiuyan.wang@Sun.COM  * system. The classic tradeoff between latency and throughput.
6547956Sxiuyan.wang@Sun.COM  */
6557956Sxiuyan.wang@Sun.COM 
6567956Sxiuyan.wang@Sun.COM /*
6577956Sxiuyan.wang@Sun.COM  * MAX_DMA_LOOPCOUNT : After how many interations do we start the dma for
6587956Sxiuyan.wang@Sun.COM  * the status descriptors.
6597956Sxiuyan.wang@Sun.COM  */
6607956Sxiuyan.wang@Sun.COM #define	MAX_DMA_LOOPCOUNT    (32)
6617956Sxiuyan.wang@Sun.COM 
6627956Sxiuyan.wang@Sun.COM /*
6637956Sxiuyan.wang@Sun.COM  * MAX_TX_DMA_LOOP_COUNT : After how many interations do we start the dma for
6647956Sxiuyan.wang@Sun.COM  * the command descriptors.
6657956Sxiuyan.wang@Sun.COM  */
6667956Sxiuyan.wang@Sun.COM #define	MAX_TX_DMA_LOOP_COUNT    1000
6677956Sxiuyan.wang@Sun.COM 
6687956Sxiuyan.wang@Sun.COM /*
6697956Sxiuyan.wang@Sun.COM  * MAX_RCV_BUFS : Max number Rx packets that can be buffered before DMA/INT
6707956Sxiuyan.wang@Sun.COM  */
6717956Sxiuyan.wang@Sun.COM #define	MAX_RCV_BUFS	(4096)
6727956Sxiuyan.wang@Sun.COM 
6737956Sxiuyan.wang@Sun.COM /*
6747956Sxiuyan.wang@Sun.COM  * XXX;shouldnt be exposed in nic_cmn.h
6757956Sxiuyan.wang@Sun.COM  * DMA_MAX_RCV_BUFS : Max number Rx packets that can be buffered before DMA
6767956Sxiuyan.wang@Sun.COM  */
6777956Sxiuyan.wang@Sun.COM #define	DMA_MAX_RCV_BUFS	(4096)
6787956Sxiuyan.wang@Sun.COM 
6797956Sxiuyan.wang@Sun.COM /*
6807956Sxiuyan.wang@Sun.COM  * XXX;shouldnt be exposed in nic_cmn.h
6817956Sxiuyan.wang@Sun.COM  * MAX_DMA_ENTRIES : Max number Rx dma entries can be in dma list
6827956Sxiuyan.wang@Sun.COM  */
6837956Sxiuyan.wang@Sun.COM #define	MAX_DMA_ENTRIES		(4096)
6847956Sxiuyan.wang@Sun.COM 
6857956Sxiuyan.wang@Sun.COM 
6867956Sxiuyan.wang@Sun.COM /*
6877956Sxiuyan.wang@Sun.COM  * MAX_INTR_LOOPCOUNT : After how many iterations do we interrupt the
6887956Sxiuyan.wang@Sun.COM  * host ?
6897956Sxiuyan.wang@Sun.COM  */
6907956Sxiuyan.wang@Sun.COM #define	MAX_INTR_LOOPCOUNT		(1024)
6917956Sxiuyan.wang@Sun.COM 
6927956Sxiuyan.wang@Sun.COM /*
6937956Sxiuyan.wang@Sun.COM  * XMIT_LOOP_THRESHOLD : How many times do we spin before we process the
6947956Sxiuyan.wang@Sun.COM  * transmit buffers.
6957956Sxiuyan.wang@Sun.COM  */
6967956Sxiuyan.wang@Sun.COM #define	XMIT_LOOP_THRESHOLD		0x20
6977956Sxiuyan.wang@Sun.COM 
6987956Sxiuyan.wang@Sun.COM /*
6997956Sxiuyan.wang@Sun.COM  * XMIT_DESC_THRESHOLD : How many descriptors pending before we process
7007956Sxiuyan.wang@Sun.COM  * the descriptors.
7017956Sxiuyan.wang@Sun.COM  */
7027956Sxiuyan.wang@Sun.COM #define	XMIT_DESC_THRESHOLD		0x4
7037956Sxiuyan.wang@Sun.COM 
7047956Sxiuyan.wang@Sun.COM /*
7057956Sxiuyan.wang@Sun.COM  * TX_DMA_THRESHOLD : When do we start the dma of the command descriptors.
7067956Sxiuyan.wang@Sun.COM  * We need these number of command descriptors, or we need to exceed the
7077956Sxiuyan.wang@Sun.COM  * loop count.   P1 only.
7087956Sxiuyan.wang@Sun.COM  */
7097956Sxiuyan.wang@Sun.COM #define	TX_DMA_THRESHOLD		16
7107956Sxiuyan.wang@Sun.COM 
7117956Sxiuyan.wang@Sun.COM #if defined(UNM_IP_FILTER)
7127956Sxiuyan.wang@Sun.COM /*
7137956Sxiuyan.wang@Sun.COM  * Commands. Must match the definitions in nic/Linux/include/unm_nic_ioctl.h
7147956Sxiuyan.wang@Sun.COM  */
7157956Sxiuyan.wang@Sun.COM enum {
7168687SJing.Xiong@Sun.COM 	UNM_IP_FILTER_CLEAR = 1,
7178687SJing.Xiong@Sun.COM 	UNM_IP_FILTER_ADD,
7188687SJing.Xiong@Sun.COM 	UNM_IP_FILTER_DEL,
7198687SJing.Xiong@Sun.COM 	UNM_IP_FILTER_SHOW
7207956Sxiuyan.wang@Sun.COM };
7217956Sxiuyan.wang@Sun.COM 
7227956Sxiuyan.wang@Sun.COM #define	MAX_FILTER_ENTRIES		16
7237956Sxiuyan.wang@Sun.COM 
7247956Sxiuyan.wang@Sun.COM typedef struct {
7258687SJing.Xiong@Sun.COM 	__int32_t count;
7268687SJing.Xiong@Sun.COM 	__uint32_t ip_addr[15];
7277956Sxiuyan.wang@Sun.COM } unm_ip_filter_t;
7287956Sxiuyan.wang@Sun.COM #endif /* UNM_IP_FILTER */
7297956Sxiuyan.wang@Sun.COM 
7307956Sxiuyan.wang@Sun.COM enum {
7318687SJing.Xiong@Sun.COM 	UNM_RCV_PEG_0 = 0,
7328687SJing.Xiong@Sun.COM 	UNM_RCV_PEG_1
7337956Sxiuyan.wang@Sun.COM };
7347956Sxiuyan.wang@Sun.COM 
7358687SJing.Xiong@Sun.COM #ifdef __cplusplus
7368687SJing.Xiong@Sun.COM }
7378687SJing.Xiong@Sun.COM #endif
7388687SJing.Xiong@Sun.COM 
7398687SJing.Xiong@Sun.COM #endif /* !_UNM_NIC_CMN_H_ */
740