xref: /titanic_50/usr/src/uts/common/io/ntxn/nic_cmn.h (revision a6d42e7d71324c5193c3b94d57d96ba2925d52e1)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 NetXen, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 #ifndef UNM_NIC_CMN_H
26 #define	UNM_NIC_CMN_H
27 
28 #ifndef sun
29 #include "unm_nic_config.h"
30 #include "unm_compiler_defs.h"
31 #endif
32 
33 #define	IP_ALIGNMENT_BYTES		2  /* make ip aligned on 16byteaddr */
34 #define	P2_MAX_MTU			(8000)
35 #define	P3_MAX_MTU			(9600)
36 #define	NX_ETHERMTU			1500
37 #define	NX_MAX_ETHERHDR			32 /* This contains some padding */
38 
39 #define	NX_RX_NORMAL_BUF_MAX_LEN	(NX_MAX_ETHERHDR + NX_ETHERMTU)
40 #define	NX_P2_RX_JUMBO_BUF_MAX_LEN	(NX_MAX_ETHERHDR + P2_MAX_MTU)
41 #define	NX_P3_RX_JUMBO_BUF_MAX_LEN	(NX_MAX_ETHERHDR + P3_MAX_MTU)
42 
43 #define	MAX_RX_LRO_BUFFER_LENGTH	((8*1024) - 512)
44 #define	RX_LRO_DMA_MAP_LEN		(MAX_RX_LRO_BUFFER_LENGTH -\
45 					    IP_ALIGNMENT_BYTES)
46 
47 /* Opcodes to be used with the commands */
48 #define	TX_ETHER_PKT	0x01
49 /* The following opcodes are for IP checksum    */
50 #define	TX_TCP_PKT		0x02
51 #define	TX_UDP_PKT		0x03
52 #define	TX_IP_PKT		0x04
53 #define	TX_TCP_LSO		0x05
54 #define	TX_IPSEC		0x06
55 #define	TX_IPSEC_CMD	0x07
56 
57 #define	NETXEN_MAC_NOOP		0
58 #define	NETXEN_MAC_ADD		1
59 #define	NETXEN_MAC_DEL		2
60 
61 /* The following opcodes are for internal consumption. */
62 #define	UNM_CONTROL_OP		0x10
63 #define	PEGNET_REQUEST		0x11
64 #define	NX_HOST_REQUEST		0x13
65 #define	NX_NIC_REQUEST		0x14
66 #define	NX_NIC_LRO_REQUEST	0x15
67 
68 #define	NX_MAC_EVENT		0x1
69 
70 enum {
71 	NX_NIC_H2C_OPCODE_START = 0,
72 	NX_NIC_H2C_OPCODE_CONFIG_RSS,
73 	NX_NIC_H2C_OPCODE_CONFIG_RSS_TBL,
74 	NX_NIC_H2C_OPCODE_CONFIG_INTR_COALESCE,
75 	NX_NIC_H2C_OPCODE_CONFIG_LED,
76 	NX_NIC_H2C_OPCODE_CONFIG_PROMISCUOUS,
77 	NX_NIC_H2C_OPCODE_CONFIG_L2_MAC,
78 	NX_NIC_H2C_OPCODE_LRO_REQUEST,
79 	NX_NIC_H2C_OPCODE_GET_SNMP_STATS,
80 	NX_NIC_H2C_OPCODE_PROXY_START_REQUEST,
81 	NX_NIC_H2C_OPCODE_PROXY_STOP_REQUEST,
82 	NX_NIC_H2C_OPCODE_PROXY_SET_MTU,
83 	NX_NIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE,
84 	NX_H2P_OPCODE_GET_FINGER_PRINT_REQUEST,
85 	NX_H2P_OPCODE_INSTALL_LICENSE_REQUEST,
86 	NX_H2P_OPCODE_GET_LICENSE_CAPABILITY_REQUEST,
87 	NX_NIC_H2C_OPCODE_GET_NET_STATS,
88 	NX_NIC_H2C_OPCODE_LAST
89 };
90 
91 #define	VPORT_MISS_MODE_DROP			0 /* drop all unmatched */
92 #define	VPORT_MISS_MODE_ACCEPT_ALL		1 /* accept all packets */
93 #define	VPORT_MISS_MODE_ACCEPT_MULTI	2 /* accept unmatched multicast */
94 
95 #ifdef UNM_RSS
96 #define	RSS_CNTRL_CMD		0x20
97 #endif
98 #define	MAX_NUM_CARDS		4
99 #define	MAX_NUM_PORTS		4 /* Deprecated. donot use this */
100 #define	MAX_NIU_PORTS		MAX_NUM_PORTS
101 #define	PORT1				0
102 #define	PORT2				1
103 #define	PORT3				2
104 #define	PORT4				3
105 
106 
107 #define	DESC_CHAIN		0xFF /* descriptor command continuation */
108 
109 #define	MAX_BUFFERS_PER_CMD		16
110 #define	MAX_BUFFERS_PER_DESC	4
111 
112 #define	NX_P2_C0				0x24
113 #define	NX_P2_C1				0x25
114 
115 #define	DUMMY_BUF_UNINIT	0x55555555
116 #define	DUMMY_BUF_INIT		0
117 
118 /*
119  * Following are the states of the Phantom. Phantom will set them and
120  * Host will read to check if the fields are correct.
121  */
122 #define	PHAN_INITIALIZE_START		0xff00
123 #define	PHAN_INITIALIZE_FAILED		0xffff
124 #define	PHAN_INITIALIZE_COMPLETE	0xff01
125 
126 /* Host writes the following to notify that it has done the init-handshake */
127 #define	PHAN_INITIALIZE_ACK			0xf00f
128 
129 /* Following defines will be used in the status descriptor */
130 #define	TX_ETHER_PKT_COMPLETE  0xB  /* same for both commands */
131 
132 #define	NUM_RCV_DESC_RINGS		3 /* No of Rcv Descriptor contexts */
133 
134 /* descriptor types */
135 #define	RCV_DESC_NORMAL			0x01
136 #define	RCV_DESC_JUMBO			0x02
137 #define	RCV_DESC_LRO			0x04
138 #define	RCV_DESC_NORMAL_CTXID	0
139 #define	RCV_DESC_JUMBO_CTXID	1
140 #define	RCV_DESC_LRO_CTXID		2
141 
142 #define	RCV_DESC_TYPE(ID) \
143 	((ID == RCV_DESC_JUMBO_CTXID) ? RCV_DESC_JUMBO :  \
144 	    ((ID == RCV_DESC_LRO_CTXID) ? RCV_DESC_LRO : (RCV_DESC_NORMAL)))
145 
146 #define	RCV_DESC_TYPE_NAME(ID) \
147 	((ID	==	RCV_DESC_JUMBO_CTXID)	?	"Jumbo"	:	\
148 	(ID == RCV_DESC_LRO_CTXID)    ? "LRO"    :  \
149 	(ID == RCV_DESC_NORMAL_CTXID) ? "Normal" : "Unknown")
150 
151 #define	MAX_CMD_DESCRIPTORS			4096
152 #define	MAX_CMD_DESCRIPTORS_HOST	(MAX_CMD_DESCRIPTORS / 4)
153 
154 #define	MAX_RCV_DESCRIPTORS			8192
155 #define	MAX_JUMBO_RCV_DESCRIPTORS	1024
156 #define	MAX_LRO_RCV_DESCRIPTORS		16
157 
158 #define	NX_MAX_SUPPORTED_RDS_SIZE	(32 * 1024)
159 #define	NX_MAX_SUPPORTED_JUMBO_RDS_SIZE	(4 * 1024)
160 
161 #define	PHAN_PEG_RCV_INITIALIZED		0xff01
162 #define	PHAN_PEG_RCV_START_INITIALIZE	0xff00
163 
164 #define	get_next_index(index, length)  ((((index)  + 1) == length)?0:(index) +1)
165 
166 #define	get_index_range(index, length, count)	\
167 	((((index) + (count)) >= length)? \
168 		(((index)  + (count))-(length)):((index) + (count)))
169 
170 #define	UNM_FLOW_TICKS_PER_SEC    2048
171 #define	UNM_FLOW_TO_TV_SHIFT_SEC  11
172 #define	UNM_FLOW_TO_TV_SHIFT_USEC 9
173 #define	UNM_FLOW_TICK_USEC   (1000000ULL/UNM_FLOW_TICKS_PER_SEC)
174 #define	UNM_GLOBAL_TICKS_PER_SEC  (4*UNM_FLOW_TICKS_PER_SEC)
175 #define	UNM_GLOBAL_TICK_USEC (1000000ULL/UNM_GLOBAL_TICKS_PER_SEC)
176 
177 
178 /*
179  * Following data structures describe the descriptors that will be used.
180  * Added fileds of tcpHdrSize and ipHdrSize, The driver needs to do it only when
181  * we are doing LSO (above the 1500 size packet) only.
182  * This is an overhead but we need it. Let me know if you have questions.
183  */
184 
185 /*
186  * the size of reference handle been changed to 16 bits to pass the MSS fields
187  * for the LSO packet
188  */
189 
190 #define	FLAGS_CHECKSUM_ENABLED		0x01
191 #define	FLAGS_LSO_ENABLED			0x02
192 #define	FLAGS_IPSEC_SA_ADD			0x04
193 #define	FLAGS_IPSEC_SA_DELETE		0x08
194 #define	FLAGS_VLAN_TAGGED			0x10
195 
196 #if UNM_CONF_PROCESSOR == UNM_CONF_X86
197 
198 #ifndef U64
199 typedef unsigned long long U64;
200 typedef uint32_t U32;
201 typedef uint16_t U16;
202 typedef uint8_t  U8;
203 #endif
204 
205 #endif
206 
207 #define	NUM_SUPPORTED_RINGSETS	4
208 #define	MAX_RING_CTX			4
209 #define	UNM_CTX_SIGNATURE		0xdee0
210 #define	UNM_CTX_RESET			0xbad0
211 #define	UNM_CTX_D3_RESET		0xacc0
212 
213 /* define opcode for ctx_msg */
214 #define	RX_PRODUCER				0
215 #define	RX_PRODUCER_JUMBO		1
216 #define	RX_PRODUCER_LRO			2
217 #define	TX_PRODUCER				3
218 #define	UPDATE_STATUS_CONSUMER	4
219 #define	RESET_CTX				5
220 
221 #define	NUM_DB_CODE				6
222 
223 #define	UNM_RCV_PRODUCER(ringid)	(ringid)
224 #define	UNM_CMD_PRODUCER			TX_PRODUCER
225 #define	UNM_RCV_STATUS_CONSUMER		UPDATE_STATUS_CONSUMER
226 
227 typedef struct __msg
228 {
229     __uint32_t  PegId:2,   // 0x2 for tx and 01 for rx.
230 			    privId:1, // must be 1
231 			    Count:15, // for doorbell
232 			    CtxId:10, // Ctx_id
233 			    Opcode:4; /* opcode */
234 }ctx_msg, CTX_MSG, *PCTX_MSG;
235 
236 typedef struct __int_msg
237 {
238     __uint32_t  Count:18, // INT
239 			    ConsumerIdx:10,
240 			    CtxId:4; // Ctx_id
241 
242 }int_msg, INT_MSG, *PINT_MSG;
243 
244 /* For use in CRB_MPORT_MODE */
245 #define	MPORT_SINGLE_FUNCTION_MODE	0x1111
246 #define	MPORT_MULTI_FUNCTION_MODE	0x2222
247 
248 typedef struct _RcvContext
249 {
250 	__uint32_t		RcvRingAddrLo;
251 	__uint32_t		RcvRingAddrHi;
252 	__uint32_t		RcvRingSize;
253 	__uint32_t		Rsrv;
254 }RcvContext;
255 
256 typedef struct PREALIGN(64) _RingContext
257 {
258 
259 	/* one command ring */
260 	__uint64_t		CMD_CONSUMER_OFFSET;
261 	__uint32_t		CmdRingAddrLo;
262 	__uint32_t		CmdRingAddrHi;
263 	__uint32_t		CmdRingSize;
264 	__uint32_t		Rsrv;
265 
266 	/* three receive rings */
267 	RcvContext		RcvContext[3];
268 
269 	/* one status ring */
270 	__uint32_t		StsRingAddrLo;
271 	__uint32_t		StsRingAddrHi;
272 	__uint32_t		StsRingSize;
273 
274 	__uint32_t		CtxId;
275 
276     __uint64_t		D3_STATE_REGISTER;
277     __uint32_t		DummyDmaAddrLo;
278     __uint32_t		DummyDmaAddrHi;
279 
280 }POSTALIGN(64) RingContext, RING_CTX, *PRING_CTX;
281 
282 #ifdef UNM_RSS
283 /*
284  * RSS_SreInfo{} has the information for SRE to calculate the hash value
285  * Will be passed by the host=> as part of comd descriptor...
286  */
287 
288 #if UNM_CONF_PROCESSOR == UNM_CONF_X86
289 typedef struct _RSS_SreInfo {
290 	U32		HashKeySize;
291 	U32		HashInformation;
292 	char	key[40];
293 }RSS_SreInfo;
294 #endif
295 
296 /*
297  * The following Descriptor is used to send RSS commands to the
298  * PEG.... to be do the SRE registers..
299  */
300 typedef struct PREALIGN(64) _rssCmdDesc
301 {
302 
303 	/*
304 	 * To keep the opcode at the same location as
305 	 * the cmdDescType0, we will have to breakup the key into
306 	 * 2 areas.... Dont like it but for now will do... FSL
307 	 */
308 
309 #if UNM_CONF_PROCESSOR == UNM_CONF_X86
310 	U8		Key0[16];
311 
312 	U64		HashMethod:32,
313 			HashKeySize:8,
314 			Unused:	16,
315 			opcode:8;
316 
317 	U8		Key1[24];
318 	U64		Unused1;
319 	U64		Unused2;
320 #else
321 
322 	unm_msgword_t		Key0[2];
323 	unm_halfmsgword_t	HashMethod;
324     unm_halfmsgword_t
325 						HashKeySize:8,
326 						Unused:16,
327 						opcode:8;
328 
329     unm_msgword_t    Key1[3];
330     unm_msgword_t    Unused1;
331     unm_msgword_t    Unused2;
332 
333 #endif
334 
335 } POSTALIGN(64) rssCmdDesc_t;
336 
337 
338 #endif /* UNM_RSS */
339 
340 
341 typedef struct PREALIGN(64) cmdDescType0
342 {
343 	union {
344 		struct {
345 			__uint32_t	tcpHdrOffset:8, /* For LSO only */
346 						ipHdrOffset:8,  // For LSO only
347 						flags:7, /* as defined above */
348 			/* This location/size must not change... */
349 						opcode:6,
350 						Unused:3;
351 			/* total number of segments (buffers */
352 			__uint32_t	numOfBuffers:8,
353 			/* for this packet. (could be more than 4) */
354 
355 						/* Total size of the packet */
356 						totalLength:24;
357 	}s1;
358 	__uint64_t	word0;
359 	}u1;
360 
361     union {
362 		struct {
363 			__uint32_t AddrLowPart2;
364 			__uint32_t AddrHighPart2;
365 		}s1;
366 		__uint64_t AddrBuffer2;
367 		__uint64_t	word1;
368 	}u2;
369 
370 	union {
371 		struct {
372 					/* changed to U16 to add mss */
373 			__uint32_t	referenceHandle:16,
374 					/* passed by NDIS_PACKET for LSO */
375 						mss:16;
376 			__uint32_t	port:4,
377 						ctx_id:4,
378 					/* LSO only : MAC+IP+TCP Hdr size */
379 						totalHdrLength:8,
380 					/* IPSec offoad only */
381 						connID:16;
382 		}s1;
383 		__uint64_t	word2;
384 	}u3;
385 
386 	union {
387 		struct {
388 			__uint32_t AddrLowPart3;
389 			__uint32_t AddrHighPart3;
390 		}s1;
391 		__uint64_t AddrBuffer3;
392 		__uint64_t	word3;
393 	}u4;
394 
395 	union {
396 		struct {
397 			__uint32_t AddrLowPart1;
398 			__uint32_t AddrHighPart1;
399 		}s1;
400 		__uint64_t AddrBuffer1;
401 		__uint64_t	word4;
402 	}u5;
403 
404 	union {
405 		struct {
406 			__uint32_t	buffer1Length:16,
407 						buffer2Length:16;
408 			__uint32_t  buffer3Length:16,
409 						buffer4Length:16;
410 		}s1;
411 		__uint64_t	word5;
412 	}u6;
413 
414 	union {
415 		struct {
416 			__uint32_t AddrLowPart4;
417 			__uint32_t AddrHighPart4;
418 		}s1;
419 		__uint64_t AddrBuffer4;
420 		__uint64_t	word6;
421 	}u7;
422 
423     __uint64_t unused;
424 
425 } POSTALIGN(64) cmdDescType0_t;
426 
427 /* Note: sizeof(rcvDesc) should always be a mutliple of 2 */
428 typedef struct rcvDesc
429 {
430     __uint32_t	referenceHandle:16,
431 				flags:16;
432     __uint32_t
433 		/* allocated buffer length (usually 2K) */
434 				bufferLength:32;
435 	__uint64_t	AddrBuffer;
436 }  rcvDesc_t;
437 
438 /* for status field in statusDesc_t */
439 #define	STATUS_NEED_CKSUM		(1)
440 #define	STATUS_CKSUM_OK			(2)
441 #define	STATUS_CKSUM_NOT_OK		(3)
442 
443 /* owner bits of statusDesc_t */
444 #define	STATUS_OWNER_HOST		(1ULL)
445 #define	STATUS_OWNER_PHANTOM	(2ULL)
446 #define	HOST_STATUS_DESC		((STATUS_OWNER_HOST) << 48)
447 #define	PHANTOM_STATUS_DESC		((STATUS_OWNER_PHANTOM) << 48)
448 
449 #define	UNM_PROT_IP			(1)
450 #define	UNM_PROT_UNKNOWN	(0)
451 
452 /* LRO specific bits of statusDesc_t */
453 #define	LRO_LAST_FRAG			(1)
454 #define	LRO_NORMAL_FRAG			(0)
455 #define	LRO_LAST_FRAG_DESC		((LRO_LAST_FRAG)<<63)
456 #define	LRO_NORMAL_FRAG_DESC	((LRO_NORMAL_FRAG)<<63)
457 
458 typedef struct PREALIGN(16) statusDesc {
459     union {
460 		struct {
461 					/* initially to be used but noe now */
462 			__uint32_t	port:4,
463 					/* completion status may not have use */
464 						status:4,
465 					/* type/index of descriptor ring */
466 						type:4,
467 					/* NIC mode...no use yet */
468 						totalLength:16,
469 					/* handle for the associated packet */
470 						referenceHandle_lo:4;
471 					/* handle for the associated packet */
472 			__uint32_t	referenceHandle_hi:12,
473 					/* Pkt protocol */
474 						prot:4,
475 						pkt_offset:5,
476 /*
477  * This indicates the num of descriptors part of this descriptor chain.
478  */
479 						descCnt:3,
480 						owner:2,
481 						opcode:6;
482 
483 			__uint32_t	HashValue;
484 			__uint16_t	vlan;
485 			__uint8_t	HashType;
486 
487 		union {
488 			/*
489 			 * For LRO count is set
490 			 * Last LRO fragment is set when it is
491 			 * the last frag as the name says.
492 			 */
493 			__uint8_t	lro_frag:7, last_lro_frag:1;
494 
495 			/*
496 			 * Used to indicate direction in case
497 			 * of captured packets. Egress will
498 			 * contain EPG input, while ingress
499 			 * contains an skb copy.
500 			 */
501 #define	NX_CAP_DIRN_OUT	1
502 #define	NX_CAP_DIRN_IN	2
503 			__uint8_t direction;
504 
505 			/*
506 			 * Currently for Legacy this is 0.
507 			 */
508 			__uint8_t	nr_frags;
509 		}u11;
510 
511 		}s1;
512 		__uint64_t	 body[2];
513 		}u1;
514 
515 } POSTALIGN(16) statusDesc_t;
516 
517 
518 #define	STATUS_OWNER_NAME(sd) \
519 	(((sd)->u1.s1.owner == STATUS_OWNER_HOST) ? "Host" : "Phantom")
520 
521 #ifdef	UNM_IPSECOFFLOAD
522 
523 #define	MAX_IPSEC_SAS			1024
524 #define	RECEIVE_IPSEC_SA_BASE	0x8000
525 
526 /*
527  * IPSEC related structures and defines
528  */
529 
530 /* Values for DIrFlag in the ipsec_sa_t structure below: */
531 #define	UNM_IPSEC_SA_DIR_INBOUND	1
532 #define	UNM_IPSEC_SA_DIR_OUTBOUND	2
533 
534 /* Values for Operation Field below: */
535 #define	UNM_IPSEC_SA_AUTHENTICATE	1
536 #define	UNM_IPSEC_SA_ENDECRYPT		2
537 
538 /* COnfidential Algorithm Types: */
539 #define	UNM_IPSEC_CONF_NONE			0    // NULL encryption?
540 #define	UNM_IPSEC_CONF_DES			1
541 #define	UNM_IPSEC_CONF_RESERVED		2
542 #define	UNM_IPSEC_CONF_3DES			3
543 
544 /* Integrity algorithm (AH) types: */
545 #define	UNM_IPSEC_INTEG_NONE	0
546 #define	UNM_IPSEC_INTEG_MD5		1
547 #define	UNM_IPSEC_INTEG_SHA1	2
548 
549 #define	UNM_PROTOCOL_OFFSET		0x9    // from ip header begin, in bytes
550 #define	UNM_PKT_TYPE_AH			0x33
551 #define	UNM_PKT_TYPE_ESP		0x32
552 
553 
554 /* 96 bits of output for MD5/SHA1 algorithms */
555 #define	UNM_AHOUTPUT_LENGTH		12
556 /*
557  * 8 bytes (64 bits) of ICV value for each block of DES_CBC
558  * at the begin of ESP payload
559  */
560 #define	UNM_DES_ICV_LENGTH		8
561 
562 #if UNM_CONF_PROCESSOR == UNM_CONF_X86
563 
564 typedef struct PREALIGN(512) s_ipsec_sa {
565     U32	SrcAddr;
566 	U32	SrcMask;
567 	U32	DestAddr;
568 	U32	DestMask;
569 	U32	Protocol:8,
570 		DirFlag:4,
571 		IntegCtxInit:2,
572 		ConfCtxInit:2,
573 		No_of_keys:8,
574 		Operation:8;
575 	U32	IntegAlg:8,
576 		IntegKeyLen:8,
577 		ConfAlg:8,
578 		ConfAlgKeyLen:8;
579 	U32	SAIndex;
580 	U32	SPI_Id;
581 	U64	Key1[124];
582 } POSTALIGN(512) unm_ipsec_sa_t;
583 
584 #else
585 
586 typedef struct PREALIGN(512) s_ipsec_sa {
587 	unm_halfmsgword_t	SrcAddr;
588 	unm_halfmsgword_t	SrcMask;
589 	unm_halfmsgword_t	DestAddr;
590 	unm_halfmsgword_t	DestMask;
591 	unm_halfmsgword_t	Protocol:8,
592 						DirFlag:4,
593 						IntegCtxInit:2,
594 						ConfCtxInit:2,
595 						No_of_keys:8,
596 						Operation:8;
597 	unm_halfmsgword_t	IntegAlg:8,
598 						IntegKeyLen:8,
599 						ConfAlg:8,
600 						ConfAlgKeyLen:8;
601 	unm_halfmsgword_t	SAIndex:32;
602 	unm_halfmsgword_t	SPI_Id:32;
603 	/* to round up to 1K of structure */
604 	unm_msgword_t		Key1[124];
605 } POSTALIGN(512) unm_ipsec_sa_t;
606 
607 #endif /* NOT-X86 */
608 
609 /* Other common header formats that may be needed */
610 
611 typedef struct _unm_ip_header_s {
612 	U32	HdrVer:8,
613 		diffser:8,
614 		TotalLength:16;
615 	U32	ipId:16,
616 		flagfrag:16;
617 	U32	TTL:8,
618 		Protocol:8,
619 		Chksum:16;
620 	U32	srcaddr;
621 	U32	destaddr;
622 } unm_ip_header_t;
623 
624 typedef struct _unm_ah_header_s {
625 	U32	NextProto:8,
626 		length:8,
627 		reserved:16;
628     U32    SPI;
629     U32    seqno;
630     U16    ICV;
631     U16    ICV1;
632     U16    ICV2;
633     U16    ICV3;
634     U16    ICV4;
635     U16    ICV5;
636 } unm_ah_header_t;
637 
638 typedef struct _unm_esp_hdr_s {
639     U32 SPI;
640     U32 seqno;
641 } unm_esp_hdr_t;
642 
643 #endif /* UNM_IPSECOFFLOAD */
644 
645 /*
646  * Defines for various loop counts. These determine the behaviour of the
647  * system. The classic tradeoff between latency and throughput.
648  */
649 
650 /*
651  * MAX_DMA_LOOPCOUNT : After how many interations do we start the dma for
652  * the status descriptors.
653  */
654 #define	MAX_DMA_LOOPCOUNT    (32)
655 
656 /*
657  * MAX_TX_DMA_LOOP_COUNT : After how many interations do we start the dma for
658  * the command descriptors.
659  */
660 #define	MAX_TX_DMA_LOOP_COUNT    1000
661 
662 /*
663  * MAX_RCV_BUFS : Max number Rx packets that can be buffered before DMA/INT
664  */
665 #define	MAX_RCV_BUFS	(4096)
666 
667 /*
668  * XXX;shouldnt be exposed in nic_cmn.h
669  * DMA_MAX_RCV_BUFS : Max number Rx packets that can be buffered before DMA
670  */
671 #define	DMA_MAX_RCV_BUFS	(4096)
672 
673 /*
674  * XXX;shouldnt be exposed in nic_cmn.h
675  * MAX_DMA_ENTRIES : Max number Rx dma entries can be in dma list
676  */
677 #define	MAX_DMA_ENTRIES		(4096)
678 
679 
680 /*
681  * MAX_INTR_LOOPCOUNT : After how many iterations do we interrupt the
682  * host ?
683  */
684 #define	MAX_INTR_LOOPCOUNT		(1024)
685 
686 /*
687  * XMIT_LOOP_THRESHOLD : How many times do we spin before we process the
688  * transmit buffers.
689  */
690 #define	XMIT_LOOP_THRESHOLD		0x20
691 
692 /*
693  * XMIT_DESC_THRESHOLD : How many descriptors pending before we process
694  * the descriptors.
695  */
696 #define	XMIT_DESC_THRESHOLD		0x4
697 
698 /*
699  * TX_DMA_THRESHOLD : When do we start the dma of the command descriptors.
700  * We need these number of command descriptors, or we need to exceed the
701  * loop count.   P1 only.
702  */
703 #define	TX_DMA_THRESHOLD		16
704 
705 #if defined(UNM_IP_FILTER)
706 /*
707  * Commands. Must match the definitions in nic/Linux/include/unm_nic_ioctl.h
708  */
709 enum {
710     UNM_IP_FILTER_CLEAR = 1,
711     UNM_IP_FILTER_ADD,
712     UNM_IP_FILTER_DEL,
713     UNM_IP_FILTER_SHOW
714 };
715 
716 #define	MAX_FILTER_ENTRIES		16
717 
718 typedef struct {
719     __int32_t count;
720     __uint32_t ip_addr[15];
721 } unm_ip_filter_t;
722 #endif /* UNM_IP_FILTER */
723 
724 enum {
725     UNM_RCV_PEG_0 = 0,
726     UNM_RCV_PEG_1
727 };
728 
729 #endif /* !UNM_NIC_CMN_H */
730