xref: /titanic_52/usr/src/uts/common/io/e1000g/e1000g_sw.h (revision a83cadce5d3331b64803bfc641036cec23602c74)
1 /*
2  * This file is provided under a CDDLv1 license.  When using or
3  * redistributing this file, you may do so under this license.
4  * In redistributing this file this license must be included
5  * and no other modification of this header file is permitted.
6  *
7  * CDDL LICENSE SUMMARY
8  *
9  * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved.
10  *
11  * The contents of this file are subject to the terms of Version
12  * 1.0 of the Common Development and Distribution License (the "License").
13  *
14  * You should have received a copy of the License with this software.
15  * You can obtain a copy of the License at
16  *	http://www.opensolaris.org/os/licensing.
17  * See the License for the specific language governing permissions
18  * and limitations under the License.
19  */
20 
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms of the CDDLv1.
24  */
25 
26 #ifndef _E1000G_SW_H
27 #define	_E1000G_SW_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 /*
36  * **********************************************************************
37  * Module Name:								*
38  *   e1000g_sw.h							*
39  *									*
40  * Abstract:								*
41  *   This header file contains Software-related data structures		*
42  *   definitions.							*
43  *									*
44  *   This driver runs on the following hardware:			*
45  *   - Wisemane based PCI gigabit ethernet adapters			*
46  *									*
47  * Environment:								*
48  *   Kernel Mode -							*
49  *									*
50  * **********************************************************************
51  */
52 
53 #ifdef DEBUG
54 #define	e1000g_DEBUG
55 #endif
56 
57 /*
58  *  Solaris Multithreaded GLD wiseman PCI Ethernet Driver
59  */
60 
61 #include <sys/types.h>
62 #include <sys/conf.h>
63 #include <sys/debug.h>
64 #include <sys/stropts.h>
65 #include <sys/stream.h>
66 #include <sys/strsun.h>
67 #include <sys/strlog.h>
68 #include <sys/kmem.h>
69 #include <sys/stat.h>
70 #include <sys/kstat.h>
71 #include <sys/modctl.h>
72 #include <sys/errno.h>
73 #include <sys/mac.h>
74 #include <sys/mac_ether.h>
75 #include <sys/vlan.h>
76 #include <sys/ddi.h>
77 #include <sys/sunddi.h>
78 #include <sys/pci.h>
79 #include <sys/sdt.h>
80 #include <sys/ethernet.h>
81 #include <sys/pattr.h>
82 #include <sys/strsubr.h>
83 #include <sys/netlb.h>
84 #include <inet/common.h>
85 #include <inet/ip.h>
86 #include <inet/mi.h>
87 #include <inet/nd.h>
88 #include "e1000_hw.h"
89 
90 /*
91  * PCI Command Register Bit Definitions
92  * Configuration Space Header
93  */
94 #define	CMD_IO_SPACE			0x0001	/* BIT_0 */
95 #define	CMD_MEMORY_SPACE		0x0002	/* BIT_1 */
96 #define	CMD_BUS_MASTER			0x0004	/* BIT_2 */
97 #define	CMD_SPECIAL_CYCLES		0x0008	/* BIT_3 */
98 
99 #define	CMD_VGA_PALLETTE_SNOOP		0x0020	/* BIT_5 */
100 #define	CMD_PARITY_RESPONSE		0x0040	/* BIT_6 */
101 #define	CMD_WAIT_CYCLE_CONTROL		0x0080	/* BIT_7 */
102 #define	CMD_SERR_ENABLE			0x0100	/* BIT_8 */
103 #define	CMD_BACK_TO_BACK		0x0200	/* BIT_9 */
104 
105 #define	WSDRAINTIME		(200)	/* # milliseconds xmit drain */
106 
107 #ifdef __sparc
108 #ifdef _LP64
109 #define	DWORD_SWAP(value)	(value)
110 #else
111 #define	DWORD_SWAP(value)	\
112 	(uint64_t)((((uint64_t)value & 0x00000000FFFFFFFF) << 32) | \
113 	(((uint64_t)value & 0xFFFFFFFF00000000) >> 32))
114 #endif
115 #else
116 #define	DWORD_SWAP(value)	(value)
117 #endif
118 
119 #define	JUMBO_FRAG_LENGTH		4096
120 
121 #define	LAST_RAR_ENTRY			(E1000_RAR_ENTRIES - 1)
122 #define	MAX_NUM_UNICAST_ADDRESSES	E1000_RAR_ENTRIES
123 #define	MAX_NUM_MULTICAST_ADDRESSES	256
124 
125 #define	MAX_TX_DESC_PER_PACKET		16
126 
127 /*
128  * constants used in setting flow control thresholds
129  */
130 #define	E1000_PBA_MASK		0xffff
131 #define	E1000_PBA_SHIFT		10
132 #define	E1000_FC_HIGH_DIFF	0x1638 /* High: 5688 bytes below Rx FIFO size */
133 #define	E1000_FC_LOW_DIFF	0x1640 /* Low: 5696 bytes below Rx FIFO size */
134 #define	E1000_FC_PAUSE_TIME	0x0680 /* 858 usec */
135 
136 #define	MAXNUMTXDESCRIPTOR		4096
137 #define	MAXNUMRXDESCRIPTOR		4096
138 #define	MAXNUMRXFREELIST		4096
139 #define	MAXNUMTXSWPACKET		4096
140 #define	MAXNUMRCVPKTONINTR		4096
141 #define	MAXTXFRAGSLIMIT			1024
142 #define	MAXTXINTERRUPTDELAYVAL		65535
143 #define	MAXINTERRUPTTHROTTLINGVAL	65535
144 #define	MAXRXBCOPYTHRESHOLD		E1000_RX_BUFFER_SIZE_2K
145 #define	MAXTXBCOPYTHRESHOLD		E1000_TX_BUFFER_SIZE_2K
146 #define	MAXTXRECYCLELOWWATER		\
147 	(DEFAULTNUMTXDESCRIPTOR - MAX_TX_DESC_PER_PACKET)
148 #define	MAXTXRECYCLENUM			DEFAULTNUMTXDESCRIPTOR
149 
150 #define	MINNUMTXDESCRIPTOR		80
151 #define	MINNUMRXDESCRIPTOR		80
152 #define	MINNUMRXFREELIST		64
153 #define	MINNUMTXSWPACKET		80
154 #define	MINNUMRCVPKTONINTR		16
155 #define	MINTXFRAGSLIMIT			2
156 #define	MINTXINTERRUPTDELAYVAL		0
157 #define	MININTERRUPTTHROTTLINGVAL	0
158 #define	MINRXBCOPYTHRESHOLD		0
159 #define	MINTXBCOPYTHRESHOLD		MINIMUM_ETHERNET_PACKET_SIZE
160 #define	MINTXRECYCLELOWWATER		MAX_TX_DESC_PER_PACKET
161 #define	MINTXRECYCLENUM			MAX_TX_DESC_PER_PACKET
162 
163 #define	DEFAULTNUMTXDESCRIPTOR		2048
164 #define	DEFAULTNUMRXDESCRIPTOR		2048
165 #define	DEFAULTNUMRXFREELIST		4096
166 #define	DEFAULTNUMTXSWPACKET		2048
167 #define	DEFAULTMAXNUMRCVPKTONINTR	256
168 #define	DEFAULTTXFRAGSLIMIT		4
169 #define	DEFAULTFLOWCONTROLVAL		3
170 #define	DEFAULTTXINTERRUPTDELAYVAL	300
171 #define	DEFAULTINTERRUPTTHROTTLINGVAL	0x225
172 #define	DEFAULTMWIENABLEVAL		1	/* Only PCI 450NX chipset */
173 						/* needs this value to be 0 */
174 #define	DEFAULTMASTERLATENCYTIMERVAL	0	/* BIOS should decide */
175 						/* which is normally 0x040 */
176 #define	DEFAULTRXPCIPRIORITYVAL		1	/* Boolean value */
177 #define	DEFAULTPROFILEJUMBOTRAFFIC	1	/* Profile Jumbo Traffic */
178 #define	DEFAULTTBICOMPATIBILITYENABLE	1	/* Enable SBP workaround */
179 #define	DEFAULTMSIENABLE		1	/* MSI Enable */
180 
181 #define	DEFAULTRXBCOPYTHRESHOLD		0
182 #define	DEFAULTTXBCOPYTHRESHOLD		512
183 #define	DEFAULTTXRECYCLELOWWATER	64
184 #define	DEFAULTTXRECYCLENUM		128
185 
186 /*
187  * The size of the receive/transmite buffers
188  */
189 #define	E1000_RX_BUFFER_SIZE_2K		(2048)
190 #define	E1000_RX_BUFFER_SIZE_4K		(4096)
191 #define	E1000_RX_BUFFER_SIZE_8K		(8192)
192 #define	E1000_RX_BUFFER_SIZE_16K	(16384)
193 
194 #define	E1000_TX_BUFFER_SIZE_2K		(2048)
195 #define	E1000_TX_BUFFER_SIZE_4K		(4096)
196 #define	E1000_TX_BUFFER_SIZE_8K		(8192)
197 #define	E1000_TX_BUFFER_SIZE_16K	(16384)
198 
199 #define	FORCE_BCOPY_EXCEED_FRAGS	0x1
200 #define	FORCE_BCOPY_UNDER_SIZE		0x2
201 
202 #define	E1000G_RX_SW_FREE		0x0
203 #define	E1000G_RX_SW_SENDUP		0x1
204 #define	E1000G_RX_SW_DETACHED		0x2
205 
206 /*
207  * By default it will print only to log
208  */
209 #define	DEFAULTDEBUGLEVEL		0x004
210 #define	DEFAULTDISPLAYONLY		0
211 #define	DEFAULTPRINTONLY		1
212 
213 /*
214  * definitions for smartspeed workaround
215  */
216 #define	  E1000_SMARTSPEED_MAX		30	/* 30 watchdog iterations */
217 						/* or 30 seconds */
218 #define	  E1000_SMARTSPEED_DOWNSHIFT	6	/* 6 watchdog iterations */
219 						/* or 6 seconds */
220 
221 /*
222  * Definitions for module_info.
223  */
224 #define	 WSNAME			"e1000g"	/* module name */
225 
226 /*
227  * Defined for IP header alignment. We also need to preserve space for
228  * VLAN tag (4 bytes)
229  */
230 #define	E1000G_IPALIGNROOM		6
231 #define	E1000G_IPALIGNPRESERVEROOM	64
232 
233 #define	E1000G_IMS_TX_INTR	(E1000_IMS_TXDW | E1000_IMS_TXQE)
234 #define	E1000G_IMC_TX_INTR	(E1000_IMC_TXDW | E1000_IMC_TXQE)
235 #define	E1000G_ICR_TX_INTR	(E1000_ICR_TXDW | E1000_ICR_TXQE)
236 
237 /*
238  * bit flags for 'attach_progress' which is a member variable in struct e1000g
239  */
240 #define	ATTACH_PROGRESS_SOFTINTR	0x0001	/* Soft interrupt added */
241 #define	ATTACH_PROGRESS_REGSMAPPED	0x0002	/* registers mapped */
242 #define	ATTACH_PROGRESS_LOCKS		0x0004	/* locks initialized */
243 #define	ATTACH_PROGRESS_PCICONFIG	0x0008	/* PCI config set up */
244 #define	ATTACH_PROGRESS_KSTATS		0x0010	/* kstats created */
245 #define	ATTACH_PROGRESS_INIT		0x0020	/* reset */
246 #define	ATTACH_PROGRESS_INTRADDED	0x0040	/* interrupts added */
247 #define	ATTACH_PROGRESS_MACREGISTERED	0x0080	/* MAC registered */
248 #define	ATTACH_PROGRESS_PROP		0x0100	/* properties initialized */
249 #define	ATTACH_PROGRESS_NDD		0x0200	/* NDD initialized */
250 #define	ATTACH_PROGRESS_INTRENABLED	0x0400	/* DDI interrupts enabled */
251 #define	ATTACH_PROGRESS_ALLOC		0x0800	/* DMA resources allocated */
252 
253 /*
254  * Speed and Duplex Settings
255  */
256 #define	GDIAG_10_HALF		1
257 #define	GDIAG_10_FULL		2
258 #define	GDIAG_100_HALF		3
259 #define	GDIAG_100_FULL		4
260 #define	GDIAG_1000_FULL		6
261 #define	GDIAG_ANY		7
262 #define	MAX_DEVICES		256
263 
264 /*
265  * Coexist Workaround RP: 07/04/03
266  * 82544 Workaround : Co-existence
267  */
268 #define	MAX_TX_BUF_SIZE		(8 * 1024)
269 
270 #define	ROUNDOFF		0x1000
271 
272 /*
273  * Defines for Jumbo Frame
274  */
275 #define	FRAME_SIZE_UPTO_2K	2048
276 #define	FRAME_SIZE_UPTO_4K	4096
277 #define	FRAME_SIZE_UPTO_8K	8192
278 #define	FRAME_SIZE_UPTO_16K	16384
279 #define	FRAME_SIZE_UPTO_10K	10500
280 
281 /*
282  * Max microsecond for ITR (Interrupt Throttling Register)
283  */
284 #define	E1000_ITR_MAX_MICROSECOND	0x3fff
285 
286 /* Defines for Tx stall check */
287 #define	E1000G_STALL_WATCHDOG_COUNT	8
288 
289 #define	MAX_TX_LINK_DOWN_TIMEOUT	8
290 
291 /* Defines for DVMA */
292 #ifdef __sparc
293 #define	E1000G_DEFAULT_DVMA_PAGE_NUM	2
294 #endif
295 
296 /*
297  * Loopback definitions
298  */
299 #define	E1000G_LB_NONE			0
300 #define	E1000G_LB_EXTERNAL_1000		1
301 #define	E1000G_LB_EXTERNAL_100		2
302 #define	E1000G_LB_EXTERNAL_10		3
303 #define	E1000G_LB_INTERNAL_PHY		4
304 
305 
306 #define	GET_ETHER_TYPE(ptr)	(\
307 	(((uint8_t *)&((struct ether_header *)ptr)->ether_type)[0] << 8) | \
308 	(((uint8_t *)&((struct ether_header *)ptr)->ether_type)[1]))
309 
310 /*
311  * QUEUE_INIT_LIST -- Macro which will init ialize a queue to NULL.
312  */
313 #define	QUEUE_INIT_LIST(_LH)	\
314 	(_LH)->Flink = (_LH)->Blink = (PSINGLE_LIST_LINK)0
315 
316 /*
317  * IS_QUEUE_EMPTY -- Macro which checks to see if a queue is empty.
318  */
319 #define	IS_QUEUE_EMPTY(_LH)	\
320 	((_LH)->Flink == (PSINGLE_LIST_LINK)0)
321 
322 /*
323  * QUEUE_GET_HEAD -- Macro which returns the head of the queue, but does
324  * not remove the head from the queue.
325  */
326 #define	QUEUE_GET_HEAD(_LH)	((PSINGLE_LIST_LINK)((_LH)->Flink))
327 
328 /*
329  * QUEUE_REMOVE_HEAD -- Macro which removes the head of the head of a queue.
330  */
331 #define	QUEUE_REMOVE_HEAD(_LH)	\
332 { \
333 	PSINGLE_LIST_LINK ListElem; \
334 	if (ListElem = (_LH)->Flink) \
335 	{ \
336 		if (!((_LH)->Flink = ListElem->Flink)) \
337 			(_LH)->Blink = (PSINGLE_LIST_LINK) 0; \
338 	} \
339 }
340 
341 /*
342  * QUEUE_POP_HEAD -- Macro which  will pop the head off of a queue (list),
343  *	and return it (this differs from QUEUE_REMOVE_HEAD only in
344  *	the 1st line).
345  */
346 #define	QUEUE_POP_HEAD(_LH)	\
347 	(PSINGLE_LIST_LINK)(_LH)->Flink; \
348 	{ \
349 		PSINGLE_LIST_LINK ListElem; \
350 		ListElem = (_LH)->Flink; \
351 		if (ListElem) \
352 		{ \
353 			(_LH)->Flink = ListElem->Flink; \
354 			if (!(_LH)->Flink) \
355 				(_LH)->Blink = (PSINGLE_LIST_LINK)0; \
356 		} \
357 	}
358 
359 /*
360  * QUEUE_GET_TAIL -- Macro which returns the tail of the queue, but does not
361  *	remove the tail from the queue.
362  */
363 #define	QUEUE_GET_TAIL(_LH)	((PSINGLE_LIST_LINK)((_LH)->Blink))
364 
365 /*
366  * QUEUE_PUSH_TAIL -- Macro which puts an element at the tail (end) of the queue
367  */
368 #define	QUEUE_PUSH_TAIL(_LH, _E)	\
369 	if ((_LH)->Blink) \
370 	{ \
371 		((PSINGLE_LIST_LINK)(_LH)->Blink)->Flink = \
372 			(PSINGLE_LIST_LINK)(_E); \
373 		(_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
374 	} else { \
375 		(_LH)->Flink = \
376 			(_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
377 	} \
378 	(_E)->Flink = (PSINGLE_LIST_LINK)0;
379 
380 /*
381  * QUEUE_PUSH_HEAD -- Macro which puts an element at the head of the queue.
382  */
383 #define	QUEUE_PUSH_HEAD(_LH, _E)	\
384 	if (!((_E)->Flink = (_LH)->Flink)) \
385 	{ \
386 		(_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \
387 	} \
388 	(_LH)->Flink = (PSINGLE_LIST_LINK)(_E);
389 
390 /*
391  * QUEUE_GET_NEXT -- Macro which returns the next element linked to the
392  *	current element.
393  */
394 #define	QUEUE_GET_NEXT(_LH, _E)		\
395 	(PSINGLE_LIST_LINK)((((_LH)->Blink) == (_E)) ? \
396 	(0) : ((_E)->Flink))
397 
398 /*
399  * QUEUE_APPEND -- Macro which appends a queue to the tail of another queue
400  */
401 #define	QUEUE_APPEND(_LH1, _LH2)	\
402 	if ((_LH2)->Flink) { \
403 		if ((_LH1)->Flink) { \
404 			((PSINGLE_LIST_LINK)(_LH1)->Blink)->Flink = \
405 				((PSINGLE_LIST_LINK)(_LH2)->Flink); \
406 		} else { \
407 			(_LH1)->Flink = \
408 				((PSINGLE_LIST_LINK)(_LH2)->Flink); \
409 		} \
410 		(_LH1)->Blink = ((PSINGLE_LIST_LINK)(_LH2)->Blink); \
411 	}
412 
413 /*
414  * Property lookups
415  */
416 #define	E1000G_PROP_EXISTS(d, n)	ddi_prop_exists(DDI_DEV_T_ANY, (d), \
417 						DDI_PROP_DONTPASS, (n))
418 #define	E1000G_PROP_GET_INT(d, n)	ddi_prop_get_int(DDI_DEV_T_ANY, (d), \
419 						DDI_PROP_DONTPASS, (n), -1)
420 
421 /*
422  * Shorthand for the NDD parameters
423  */
424 #define	param_adv_autoneg	nd_params[PARAM_ADV_AUTONEG_CAP].ndp_val
425 #define	param_adv_pause		nd_params[PARAM_ADV_PAUSE_CAP].ndp_val
426 #define	param_adv_asym_pause	nd_params[PARAM_ADV_ASYM_PAUSE_CAP].ndp_val
427 #define	param_adv_1000fdx	nd_params[PARAM_ADV_1000FDX_CAP].ndp_val
428 #define	param_adv_1000hdx	nd_params[PARAM_ADV_1000HDX_CAP].ndp_val
429 #define	param_adv_100fdx	nd_params[PARAM_ADV_100FDX_CAP].ndp_val
430 #define	param_adv_100hdx	nd_params[PARAM_ADV_100HDX_CAP].ndp_val
431 #define	param_adv_10fdx		nd_params[PARAM_ADV_10FDX_CAP].ndp_val
432 #define	param_adv_10hdx		nd_params[PARAM_ADV_10HDX_CAP].ndp_val
433 
434 #define	param_force_speed_duplex nd_params[PARAM_FORCE_SPEED_DUPLEX].ndp_val
435 
436 #define	param_link_up		nd_params[PARAM_LINK_STATUS].ndp_val
437 #define	param_link_speed	nd_params[PARAM_LINK_SPEED].ndp_val
438 #define	param_link_duplex	nd_params[PARAM_LINK_DUPLEX].ndp_val
439 #define	param_link_autoneg	nd_params[PARAM_LINK_AUTONEG].ndp_val
440 
441 /*
442  * E1000G-specific ioctls ...
443  */
444 #define	E1000G_IOC		((((((('E' << 4) + '1') << 4) \
445 				+ 'K') << 4) + 'G') << 4)
446 
447 /*
448  * These diagnostic IOCTLS are enabled only in DEBUG drivers
449  */
450 #define	E1000G_IOC_REG_PEEK	(E1000G_IOC | 1)
451 #define	E1000G_IOC_REG_POKE	(E1000G_IOC | 2)
452 #define	E1000G_IOC_CHIP_RESET	(E1000G_IOC | 3)
453 
454 #define	E1000G_PP_SPACE_REG	0	/* PCI memory space	*/
455 #define	E1000G_PP_SPACE_E1000G	1	/* driver's soft state	*/
456 
457 typedef struct {
458 	uint64_t pp_acc_size;	/* It's 1, 2, 4 or 8	*/
459 	uint64_t pp_acc_space;	/* See #defines below	*/
460 	uint64_t pp_acc_offset;	/* See regs definition	*/
461 	uint64_t pp_acc_data;	/* output for peek	*/
462 				/* input for poke	*/
463 } e1000g_peekpoke_t;
464 
465 /*
466  * (Internal) return values from ioctl subroutines
467  */
468 enum ioc_reply {
469 	IOC_INVAL = -1,		/* bad, NAK with EINVAL	*/
470 	IOC_DONE,		/* OK, reply sent	*/
471 	IOC_ACK,		/* OK, just send ACK	*/
472 	IOC_REPLY		/* OK, just send reply	*/
473 };
474 
475 /*
476  * Named Data (ND) Parameter Management Structure
477  */
478 typedef struct {
479 	uint32_t ndp_info;
480 	uint32_t ndp_min;
481 	uint32_t ndp_max;
482 	uint32_t ndp_val;
483 	struct e1000g *ndp_instance;
484 	char *ndp_name;
485 } nd_param_t;
486 
487 /*
488  * NDD parameter indexes, divided into:
489  *
490  *	read-only parameters describing the hardware's capabilities
491  *	read-write parameters controlling the advertised capabilities
492  *	read-only parameters describing the partner's capabilities
493  *	read-write parameters controlling the force speed and duplex
494  *	read-only parameters describing the link state
495  *	read-only parameters describing the driver properties
496  *	read-write parameters controlling the driver properties
497  */
498 enum {
499 	PARAM_AUTONEG_CAP,
500 	PARAM_PAUSE_CAP,
501 	PARAM_ASYM_PAUSE_CAP,
502 	PARAM_1000FDX_CAP,
503 	PARAM_1000HDX_CAP,
504 	PARAM_100T4_CAP,
505 	PARAM_100FDX_CAP,
506 	PARAM_100HDX_CAP,
507 	PARAM_10FDX_CAP,
508 	PARAM_10HDX_CAP,
509 
510 	PARAM_ADV_AUTONEG_CAP,
511 	PARAM_ADV_PAUSE_CAP,
512 	PARAM_ADV_ASYM_PAUSE_CAP,
513 	PARAM_ADV_1000FDX_CAP,
514 	PARAM_ADV_1000HDX_CAP,
515 	PARAM_ADV_100T4_CAP,
516 	PARAM_ADV_100FDX_CAP,
517 	PARAM_ADV_100HDX_CAP,
518 	PARAM_ADV_10FDX_CAP,
519 	PARAM_ADV_10HDX_CAP,
520 
521 	PARAM_LP_AUTONEG_CAP,
522 	PARAM_LP_PAUSE_CAP,
523 	PARAM_LP_ASYM_PAUSE_CAP,
524 	PARAM_LP_1000FDX_CAP,
525 	PARAM_LP_1000HDX_CAP,
526 	PARAM_LP_100T4_CAP,
527 	PARAM_LP_100FDX_CAP,
528 	PARAM_LP_100HDX_CAP,
529 	PARAM_LP_10FDX_CAP,
530 	PARAM_LP_10HDX_CAP,
531 
532 	PARAM_FORCE_SPEED_DUPLEX,
533 
534 	PARAM_LINK_STATUS,
535 	PARAM_LINK_SPEED,
536 	PARAM_LINK_DUPLEX,
537 	PARAM_LINK_AUTONEG,
538 
539 	PARAM_MAX_FRAME_SIZE,
540 	PARAM_LOOP_MODE,
541 	PARAM_INTR_TYPE,
542 
543 	PARAM_TX_BCOPY_THRESHOLD,
544 	PARAM_TX_FRAGS_LIMIT,
545 	PARAM_TX_RECYCLE_LOW_WATER,
546 	PARAM_TX_RECYCLE_NUM,
547 	PARAM_TX_INTR_ENABLE,
548 	PARAM_TX_INTR_DELAY,
549 	PARAM_RX_BCOPY_THRESHOLD,
550 	PARAM_RX_PKT_ON_INTR,
551 	PARAM_RX_RDTR,
552 	PARAM_RX_RADV,
553 
554 	PARAM_COUNT
555 };
556 
557 static struct ether_addr etherbroadcastaddr = {
558 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
559 };
560 
561 /*
562  * DMA access attributes <Little Endian Card>
563  */
564 static ddi_device_acc_attr_t accattr = {
565 	DDI_DEVICE_ATTR_V0,
566 	DDI_STRUCTURE_LE_ACC,
567 	DDI_STRICTORDER_ACC,
568 };
569 
570 /*
571  * DMA access attributes for receive buffer <Big Endian> for Sparc
572  */
573 #ifdef __sparc
574 static ddi_device_acc_attr_t accattr2 = {
575 	DDI_DEVICE_ATTR_V0,
576 	DDI_STRUCTURE_BE_ACC,
577 	DDI_STRICTORDER_ACC,
578 };
579 #else
580 static ddi_device_acc_attr_t accattr2 = {
581 	DDI_DEVICE_ATTR_V0,
582 	DDI_STRUCTURE_LE_ACC,
583 	DDI_STRICTORDER_ACC,
584 };
585 #endif
586 
587 typedef struct _private_devi_list {
588 	dev_info_t *dip;
589 	dev_info_t *priv_dip;
590 	struct _private_devi_list *next;
591 } private_devi_list_t;
592 
593 /*
594  * A structure that points to the next entry in the queue.
595  */
596 typedef struct _SINGLE_LIST_LINK {
597 	struct _SINGLE_LIST_LINK *Flink;
598 } SINGLE_LIST_LINK, *PSINGLE_LIST_LINK;
599 
600 /*
601  * A "ListHead" structure that points to the head and tail of a queue
602  */
603 typedef struct _LIST_DESCRIBER {
604 	struct _SINGLE_LIST_LINK *volatile Flink;
605 	struct _SINGLE_LIST_LINK *volatile Blink;
606 } LIST_DESCRIBER, *PLIST_DESCRIBER;
607 
608 /*
609  * Address-Length pair structure that stores descriptor info
610  */
611 typedef struct _ADDRESS_LENGTH_PAIR {
612 	uint64_t Address;
613 	uint32_t Length;
614 } ADDRESS_LENGTH_PAIR, *PADDRESS_LENGTH_PAIR;
615 
616 typedef struct _DESCRIPTOR_PAIR {
617 	ADDRESS_LENGTH_PAIR Descriptor[4];
618 	uint32_t Elements;
619 } DESC_ARRAY, *PDESC_ARRAY;
620 
621 typedef enum {
622 	USE_NONE,
623 	USE_BCOPY,
624 	USE_DVMA,
625 	USE_DMA
626 } dma_type_t;
627 
628 typedef struct _dma_buffer {
629 	caddr_t address;
630 	uint64_t dma_address;
631 	ddi_acc_handle_t acc_handle;
632 	ddi_dma_handle_t dma_handle;
633 	size_t size;
634 	size_t len;
635 } dma_buffer_t, *pdma_buffer_t;
636 
637 /*
638  * Transmit Control Block (TCB), Ndis equiv of SWPacket This
639  * structure stores the additional information that is
640  * associated with every packet to be transmitted. It stores the
641  * message block pointer and the TBD addresses associated with
642  * the m_blk and also the link to the next tcb in the chain
643  */
644 typedef struct _TX_SW_PACKET_ {
645 	/* Link to the next TX_SW_PACKET in the list */
646 	SINGLE_LIST_LINK Link;
647 	mblk_t *mp;
648 	UINT num_desc;
649 	UINT num_mblk_frag;
650 	dma_type_t dma_type;
651 	dma_type_t data_transfer_type;
652 	ddi_dma_handle_t tx_dma_handle;
653 	dma_buffer_t tx_buf[1];
654 	ADDRESS_LENGTH_PAIR desc[MAX_TX_DESC_PER_PACKET + 1];
655 } TX_SW_PACKET, *PTX_SW_PACKET;
656 
657 /*
658  * This structure is similar to the RX_SW_PACKET structure used
659  * for Ndis. This structure stores information about the 2k
660  * aligned receive buffer into which the FX1000 DMA's frames.
661  * This structure is maintained as a linked list of many
662  * receiver buffer pointers.
663  */
664 typedef struct _RX_SW_PACKET {
665 	/* Link to the next RX_SW_PACKET in the list */
666 	SINGLE_LIST_LINK Link;
667 	struct _RX_SW_PACKET *next;
668 	uint16_t flag;
669 	mblk_t *mp;
670 	caddr_t rx_ring;
671 	dma_type_t dma_type;
672 	frtn_t free_rtn;
673 	dma_buffer_t rx_buf[1];
674 } RX_SW_PACKET, *PRX_SW_PACKET;
675 
676 typedef struct _e1000g_msg_chain {
677 	mblk_t *head;
678 	mblk_t *tail;
679 	kmutex_t lock;
680 } e1000g_msg_chain_t;
681 
682 typedef struct _cksum_data {
683 	uint32_t ether_header_size;
684 	uint32_t cksum_flags;
685 	uint32_t cksum_start;
686 	uint32_t cksum_stuff;
687 } cksum_data_t;
688 
689 /*
690  * MultiCast Command Block (MULTICAST_CB) The multicast
691  * structure contains an array of multicast addresses and
692  * also a count of the total number of addresses.
693  */
694 typedef struct _multicast_cb_t {
695 	ushort_t mc_count;	/* Number of multicast addresses */
696 	uchar_t MulticastBuffer[(ETH_LENGTH_OF_ADDRESS *
697 		MAX_NUM_MULTICAST_ADDRESSES)];
698 } mltcst_cb_t, *pmltcst_cb_t;
699 
700 typedef union _e1000g_ether_addr {
701 	struct {
702 		uint32_t high;
703 		uint32_t low;
704 	} reg;
705 	struct {
706 		uint8_t set;
707 		uint8_t redundant;
708 		uint8_t addr[NODE_ADDRESS_SIZE];
709 	} mac;
710 } e1000g_ether_addr_t;
711 
712 typedef struct _e1000gstat {
713 
714 	kstat_named_t link_speed;	/* Link Speed */
715 	kstat_named_t rx_none;		/* Rx No Incoming Data */
716 	kstat_named_t rx_error;		/* Rx Error in Packet */
717 	kstat_named_t rx_exceed_pkt;	/* Rx Exceed Max Pkt Count */
718 	kstat_named_t rx_multi_desc;	/* Rx Multi Spanned Pkt */
719 	kstat_named_t rx_no_freepkt;	/* Rx No Free Pkt */
720 	kstat_named_t rx_avail_freepkt;	/* Rx Freelist Avail Buffers */
721 	kstat_named_t rx_esballoc_fail;	/* Rx Desballoc Failure */
722 	kstat_named_t rx_allocb_fail;	/* Rx Allocb Failure */
723 	kstat_named_t rx_seq_intr;	/* Rx Sequencing Errors Intr */
724 	kstat_named_t tx_lack_desc;	/* Tx Lack of Desc */
725 	kstat_named_t tx_no_desc;	/* Tx No Desc */
726 	kstat_named_t tx_no_swpkt;	/* Tx No Pkt Buffer */
727 	kstat_named_t tx_send_fail;	/* Tx SendPkt Failure */
728 	kstat_named_t tx_multi_cookie;	/* Tx Pkt Span Multi Cookies */
729 	kstat_named_t tx_over_size;	/* Tx Pkt Too Long */
730 	kstat_named_t tx_under_size;	/* Tx Allocb Failure */
731 	kstat_named_t tx_reschedule;	/* Tx Reschedule */
732 	kstat_named_t tx_empty_frags;	/* Tx Empty Frags */
733 	kstat_named_t tx_exceed_frags;	/* Tx Exceed Max Frags */
734 	kstat_named_t tx_recycle;	/* Tx Recycle */
735 	kstat_named_t tx_recycle_retry;	/* Tx Recycle Retry */
736 	kstat_named_t tx_recycle_intr;	/* Tx Recycle in Intr */
737 	kstat_named_t tx_recycle_none;	/* Tx No Desc Recycled */
738 	kstat_named_t tx_copy;		/* Tx Send Copy */
739 	kstat_named_t tx_bind;		/* Tx Send Bind */
740 	kstat_named_t tx_multi_copy;	/* Tx Copy Multi Fragments */
741 	kstat_named_t StallWatchdog;	/* Tx Stall Watchdog */
742 	kstat_named_t reset_count;	/* Reset Count */
743 	kstat_named_t intr_type;	/* Interrupt Type */
744 	kstat_named_t Crcerrs;	/* CRC Error Count */
745 	kstat_named_t Symerrs;	/* Symbol Error Count */
746 	kstat_named_t Mpc;	/* Missed Packet Count */
747 	kstat_named_t Scc;	/* Single Collision Count */
748 	kstat_named_t Ecol;	/* Excessive Collision Count */
749 	kstat_named_t Mcc;	/* Multiple Collision Count */
750 	kstat_named_t Latecol;	/* Late Collision Count */
751 	kstat_named_t Colc;	/* Collision Count */
752 	kstat_named_t Dc;	/* Defer Count */
753 	kstat_named_t Sec;	/* Sequence Error Count */
754 	kstat_named_t Rlec;	/* Receive Length Error Count */
755 	kstat_named_t Xonrxc;	/* XON Received Count */
756 	kstat_named_t Xontxc;	/* XON Xmitted Count */
757 	kstat_named_t Xoffrxc;	/* XOFF Received Count */
758 	kstat_named_t Xofftxc;	/* Xoff Xmitted Count */
759 	kstat_named_t Fcruc;	/* Unknown Flow Conrol Packet Rcvd Count */
760 	kstat_named_t Prc64;	/* Packets Received - 64b */
761 	kstat_named_t Prc127;	/* Packets Received - 65-127b */
762 	kstat_named_t Prc255;	/* Packets Received - 127-255b */
763 	kstat_named_t Prc511;	/* Packets Received - 256-511b */
764 	kstat_named_t Prc1023;	/* Packets Received - 511-1023b */
765 	kstat_named_t Prc1522;	/* Packets Received - 1024-1522b */
766 	kstat_named_t Gprc;	/* Good Packets Received Count */
767 	kstat_named_t Bprc;	/* Broadcasts Pkts Received Count */
768 	kstat_named_t Mprc;	/* Multicast Pkts Received Count */
769 	kstat_named_t Gptc;	/* Good Packets Xmitted Count */
770 	kstat_named_t Gorl;	/* Good Octets Recvd Lo Count */
771 	kstat_named_t Gorh;	/* Good Octets Recvd Hi Count */
772 	kstat_named_t Gotl;	/* Good Octets Xmitd Lo Count */
773 	kstat_named_t Goth;	/* Good Octets Xmitd Hi Count */
774 	kstat_named_t Rnbc;	/* Receive No Buffers Count */
775 	kstat_named_t Ruc;	/* Receive Undersize Count */
776 	kstat_named_t Rfc;	/* Receive Frag Count */
777 	kstat_named_t Roc;	/* Receive Oversize Count */
778 	kstat_named_t Rjc;	/* Receive Jabber Count */
779 	kstat_named_t Torl;	/* Total Octets Recvd Lo Count */
780 	kstat_named_t Torh;	/* Total Octets Recvd Hi Count */
781 	kstat_named_t Totl;	/* Total Octets Xmted Lo Count */
782 	kstat_named_t Toth;	/* Total Octets Xmted Hi Count */
783 	kstat_named_t Tpr;	/* Total Packets Received */
784 	kstat_named_t Tpt;	/* Total Packets Xmitted */
785 	kstat_named_t Ptc64;	/* Packets Xmitted (64b) */
786 	kstat_named_t Ptc127;	/* Packets Xmitted (64-127b) */
787 	kstat_named_t Ptc255;	/* Packets Xmitted (128-255b) */
788 	kstat_named_t Ptc511;	/* Packets Xmitted (255-511b) */
789 	kstat_named_t Ptc1023;	/* Packets Xmitted (512-1023b) */
790 	kstat_named_t Ptc1522;	/* Packets Xmitted (1024-1522b */
791 	kstat_named_t Mptc;	/* Multicast Packets Xmited Count */
792 	kstat_named_t Bptc;	/* Broadcast Packets Xmited Count */
793 	/*
794 	 * New Livengood Stat Counters
795 	 */
796 	kstat_named_t Algnerrc;	/* Alignment Error count */
797 	kstat_named_t Tuc;	/* Transmit Underrun count */
798 	kstat_named_t Rxerrc;	/* Rx Error Count */
799 	kstat_named_t Tncrs;	/* Transmit with no CRS */
800 	kstat_named_t Cexterr;	/* Carrier Extension Error count */
801 	kstat_named_t Rutec;	/* Receive DMA too Early count */
802 	kstat_named_t Tsctc;	/* TCP seg contexts xmit count */
803 	kstat_named_t Tsctfc;	/* TCP seg contexts xmit fail count */
804 	/*
805 	 * Jumbo Frame Counters
806 	 */
807 	kstat_named_t JumboTx_4K;	/* 4k Jumbo Frames Transmitted */
808 	kstat_named_t JumboRx_4K;	/* 4k Jumbo Frames Received */
809 	kstat_named_t JumboTx_8K;	/* 8k Jumbo Frames Transmitted */
810 	kstat_named_t JumboRx_8K;	/* 8k Jumbo Frames Received */
811 	kstat_named_t JumboTx_16K;	/* 16k Jumbo Frames Transmitted */
812 	kstat_named_t JumboRx_16K;	/* 16k Jumbo Frames Received */
813 
814 } e1000gstat, *e1000gstatp;
815 
816 typedef struct _e1000g_tx_ring {
817 	kmutex_t tx_lock;
818 	kmutex_t freelist_lock;
819 	kmutex_t usedlist_lock;
820 	/*
821 	 * Descriptor queue definitions
822 	 */
823 	ddi_dma_handle_t tbd_dma_handle;
824 	ddi_acc_handle_t tbd_acc_handle;
825 	struct e1000_tx_desc *tbd_area;
826 	uint64_t tbd_dma_addr;
827 	struct e1000_tx_desc *tbd_first;
828 	struct e1000_tx_desc *tbd_last;
829 	struct e1000_tx_desc *tbd_oldest;
830 	struct e1000_tx_desc *tbd_next;
831 	/*
832 	 * Software packet structures definitions
833 	 */
834 	PTX_SW_PACKET packet_area;
835 	LIST_DESCRIBER used_list;
836 	LIST_DESCRIBER free_list;
837 	/*
838 	 * TCP/UDP checksum offload
839 	 */
840 	cksum_data_t cksum_data;
841 	/*
842 	 * Timer definitions for 82547
843 	 */
844 	timeout_id_t timer_id_82547;
845 	boolean_t timer_enable_82547;
846 	/*
847 	 * Pointer to the adapter
848 	 */
849 	struct e1000g *adapter;
850 } e1000g_tx_ring_t, *pe1000g_tx_ring_t;
851 
852 typedef struct _e1000g_rx_ring {
853 	kmutex_t rx_lock;
854 	kmutex_t freelist_lock;
855 	/*
856 	 * Descriptor queue definitions
857 	 */
858 	ddi_dma_handle_t rbd_dma_handle;
859 	ddi_acc_handle_t rbd_acc_handle;
860 	struct e1000_rx_desc *rbd_area;
861 	uint64_t rbd_dma_addr;
862 	struct e1000_rx_desc *rbd_first;
863 	struct e1000_rx_desc *rbd_last;
864 	struct e1000_rx_desc *rbd_next;
865 	/*
866 	 * Software packet structures definitions
867 	 */
868 	PRX_SW_PACKET packet_area;
869 	LIST_DESCRIBER recv_list;
870 	LIST_DESCRIBER free_list;
871 	/*
872 	 * Pointer to the adapter
873 	 */
874 	struct e1000g *adapter;
875 } e1000g_rx_ring_t, *pe1000g_rx_ring_t;
876 
877 typedef struct e1000g {
878 	mac_handle_t mh;
879 	dev_info_t *dip;
880 	dev_info_t *priv_dip;
881 	ddi_acc_handle_t handle;
882 	ddi_acc_handle_t E1000_handle;		/* Ws-PCI handle to regs */
883 	int AdapterInstance;
884 	struct e1000_hw Shared;
885 	struct e1000g_osdep osdep;
886 
887 	link_state_t link_state;
888 	UINT link_speed;
889 	UINT link_duplex;
890 	UINT NumRxDescriptors;
891 	UINT NumRxFreeList;
892 	UINT NumTxDescriptors;
893 	UINT NumTxSwPacket;
894 	UINT MaxNumReceivePackets;
895 	UINT bar64;
896 	USHORT TxInterruptDelay;
897 	USHORT MWIEnable;
898 	UINT MasterLatencyTimer;
899 #ifdef e1000g_DEBUG
900 	UINT DebugLevel;
901 	UINT DisplayOnly;
902 	UINT PrintOnly;
903 #endif
904 	UINT smartspeed;	/* smartspeed w/a counter */
905 	uint32_t init_count;
906 	size_t TxBufferSize;
907 	size_t RxBufferSize;
908 	boolean_t intr_adaptive;
909 	uint32_t intr_throttling_rate;
910 	timeout_id_t WatchDogTimer_id;
911 	timeout_id_t link_tid;
912 	boolean_t link_complete;
913 	boolean_t strip_crc;
914 
915 	/*
916 	 * The e1000g_timeout_lock must be held when updateing the
917 	 * timeout fields in struct e1000g, that is,
918 	 * WatchDogTimer_id, timeout_enabled, timeout_started.
919 	 */
920 	kmutex_t e1000g_timeout_lock;
921 	/*
922 	 * The e1000g_linklock protects the link fields in struct e1000g,
923 	 * such as link_state, link_speed, link_duplex, link_complete, and
924 	 * link_tid.
925 	 */
926 	kmutex_t e1000g_linklock;
927 	kmutex_t TbiCntrMutex;
928 	/*
929 	 * The chip_lock assures that the Rx/Tx process must be
930 	 * stopped while other functions change the hardware
931 	 * configuration of e1000g card, such as e1000g_reset(),
932 	 * e1000g_reset_hw() etc are executed.
933 	 */
934 	krwlock_t chip_lock;
935 
936 	e1000g_rx_ring_t rx_ring[1];
937 	e1000g_tx_ring_t tx_ring[1];
938 
939 	uint32_t rx_bcopy_thresh;
940 	uint32_t tx_bcopy_thresh;
941 	uint32_t tx_recycle_low_water;
942 	uint32_t tx_recycle_num;
943 	uint32_t tx_frags_limit;
944 	uint32_t tx_link_down_timeout;
945 
946 	boolean_t tx_intr_enable;
947 	ddi_softint_handle_t tx_softint_handle;
948 	int tx_softint_pri;
949 	/*
950 	 * Message chain that needs to be freed
951 	 */
952 	e1000g_msg_chain_t tx_msg_chain[1];
953 
954 	mblk_t *rx_mblk;
955 	mblk_t *rx_mblk_tail;
956 	USHORT rx_packet_len;
957 
958 	kstat_t *e1000g_ksp;
959 
960 	uint32_t rx_none;
961 	uint32_t rx_error;
962 	uint32_t rx_exceed_pkt;
963 	uint32_t rx_multi_desc;
964 	uint32_t rx_no_freepkt;
965 	uint32_t rx_esballoc_fail;
966 	uint32_t rx_avail_freepkt;
967 	uint32_t rx_allocb_fail;
968 	uint32_t rx_seq_intr;
969 	uint32_t tx_lack_desc;
970 	uint32_t tx_no_desc;
971 	uint32_t tx_no_swpkt;
972 	uint32_t tx_send_fail;
973 	uint32_t tx_multi_cookie;
974 	uint32_t tx_over_size;
975 	uint32_t tx_under_size;
976 	uint32_t tx_reschedule;
977 	uint32_t tx_empty_frags;
978 	uint32_t tx_exceed_frags;
979 	uint32_t tx_recycle;
980 	uint32_t tx_recycle_retry;
981 	uint32_t tx_recycle_intr;
982 	uint32_t tx_recycle_none;
983 	uint32_t tx_copy;
984 	uint32_t tx_bind;
985 	uint32_t tx_multi_copy;
986 
987 	uint32_t JumboTx_4K;
988 	uint32_t JumboRx_4K;
989 	uint32_t JumboTx_8K;
990 	uint32_t JumboRx_8K;
991 	uint32_t JumboTx_16K;
992 	uint32_t JumboRx_16K;
993 
994 	uint32_t StallWatchdog;
995 	uint32_t tx_recycle_fail;
996 	uint32_t reset_count;
997 
998 	uint32_t unicst_avail;
999 	uint32_t unicst_total;
1000 	e1000g_ether_addr_t unicst_addr[MAX_NUM_UNICAST_ADDRESSES];
1001 
1002 	uint32_t mcast_count;
1003 	struct ether_addr mcast_table[MAX_NUM_MULTICAST_ADDRESSES];
1004 
1005 	uint32_t loopback_mode;
1006 
1007 	UINT ProfileJumboTraffic;
1008 	UINT RcvBufferAlignment;
1009 
1010 	boolean_t timeout_enabled;
1011 	boolean_t timeout_started;
1012 
1013 	boolean_t e1000g_promisc;
1014 	boolean_t started;
1015 	mac_resource_handle_t mrh;
1016 
1017 	uint32_t attach_progress;	/* attach tracking */
1018 	/*
1019 	 * reschedule when tx resource is available
1020 	 */
1021 	boolean_t resched_needed;
1022 
1023 #ifdef __sparc
1024 	ulong_t sys_page_sz;
1025 	uint_t dvma_page_num;
1026 #endif
1027 
1028 	boolean_t msi_enabled;
1029 	int intr_type;
1030 	int intr_cnt;
1031 	int intr_cap;
1032 	size_t intr_size;
1033 	uint_t intr_pri;
1034 	ddi_intr_handle_t *htable;
1035 
1036 	/*
1037 	 * NDD parameters
1038 	 */
1039 	caddr_t nd_data;
1040 	nd_param_t nd_params[PARAM_COUNT];
1041 
1042 } e1000g, *Pe1000g, ADAPTER_STRUCT, *PADAPTER_STRUCT;
1043 
1044 
1045 static ddi_dma_attr_t tx_dma_attr = {
1046 	DMA_ATTR_V0,		/* version of this structure */
1047 	0,			/* lowest usable address */
1048 	0xffffffffffffffffULL,	/* highest usable address */
1049 	0x7fffffff,		/* maximum DMAable byte count */
1050 	1,			/* alignment in bytes */
1051 	0x7ff,			/* burst sizes (any?) */
1052 	1,			/* minimum transfer */
1053 	0xffffffffU,		/* maximum transfer */
1054 	0xffffffffffffffffULL,	/* maximum segment length */
1055 	16,			/* maximum number of segments */
1056 	1,			/* granularity */
1057 	0,			/* flags (reserved) */
1058 };
1059 
1060 static ddi_dma_attr_t buf_dma_attr = {
1061 	DMA_ATTR_V0,		/* version of this structure */
1062 	0,			/* lowest usable address */
1063 	0xffffffffffffffffULL,	/* highest usable address */
1064 	0x7fffffff,		/* maximum DMAable byte count */
1065 	1,			/* alignment in bytes */
1066 	0x7ff,			/* burst sizes (any?) */
1067 	1,			/* minimum transfer */
1068 	0xffffffffU,		/* maximum transfer */
1069 	0xffffffffffffffffULL,	/* maximum segment length */
1070 	1,			/* maximum number of segments */
1071 	1,			/* granularity */
1072 	0,			/* flags (reserved) */
1073 };
1074 
1075 static ddi_dma_attr_t tbd_dma_attr = {
1076 	DMA_ATTR_V0,		/* version of this structure */
1077 	0,			/* lowest usable address */
1078 	0xffffffffffffffffULL,	/* highest usable address */
1079 	0x7fffffff,		/* maximum DMAable byte count */
1080 	E1000_MDALIGN,		/* alignment in bytes 4K! */
1081 	0x7ff,			/* burst sizes (any?) */
1082 	1,			/* minimum transfer */
1083 	0xffffffffU,		/* maximum transfer */
1084 	0xffffffffffffffffULL,	/* maximum segment length */
1085 	1,			/* maximum number of segments */
1086 	1,			/* granularity */
1087 	0,			/* flags (reserved) */
1088 };
1089 
1090 /*
1091  * Function prototypes
1092  */
1093 int e1000g_alloc_dma_resources(struct e1000g *Adapter);
1094 void e1000g_release_dma_resources(struct e1000g *Adapter);
1095 void e1000g_free_rx_sw_packet(PRX_SW_PACKET packet);
1096 void SetupTransmitStructures(struct e1000g *Adapter);
1097 void SetupReceiveStructures(struct e1000g *Adapter);
1098 void SetupMulticastTable(struct e1000g *Adapter);
1099 boolean_t e1000g_reset(struct e1000g *Adapter);
1100 
1101 int e1000g_recycle(e1000g_tx_ring_t *tx_ring);
1102 void FreeTxSwPacket(PTX_SW_PACKET packet);
1103 uint_t e1000g_tx_freemsg(caddr_t arg1, caddr_t arg2);
1104 mblk_t *e1000g_m_tx(void *arg, mblk_t *mp);
1105 mblk_t *e1000g_receive(struct e1000g *Adapter);
1106 void e1000g_rxfree_func(PRX_SW_PACKET packet);
1107 
1108 int e1000g_m_stat(void *arg, uint_t stat, uint64_t *val);
1109 int InitStatsCounters(struct e1000g *Adapter);
1110 void AdjustTbiAcceptedStats(struct e1000g *Adapter, UINT32 FrameLength,
1111     PUCHAR MacAddress);
1112 enum ioc_reply e1000g_nd_ioctl(struct e1000g *Adapter,
1113     queue_t *wq, mblk_t *mp, struct iocblk *iocp);
1114 void e1000g_nd_cleanup(struct e1000g *Adapter);
1115 int e1000g_nd_init(struct e1000g *Adapter);
1116 
1117 void e1000g_DisableInterrupt(struct e1000g *Adapter);
1118 void e1000g_EnableInterrupt(struct e1000g *Adapter);
1119 void e1000g_DisableAllInterrupts(struct e1000g *Adapter);
1120 void e1000g_DisableTxInterrupt(struct e1000g *Adapter);
1121 void e1000g_EnableTxInterrupt(struct e1000g *Adapter);
1122 void phy_spd_state(struct e1000_hw *hw, boolean_t enable);
1123 void e1000_enable_pciex_master(struct e1000_hw *hw);
1124 
1125 /*
1126  * Global variables
1127  */
1128 extern boolean_t e1000g_force_detach;
1129 extern uint32_t e1000g_mblks_pending;
1130 extern krwlock_t e1000g_rx_detach_lock;
1131 
1132 
1133 #ifdef __cplusplus
1134 }
1135 #endif
1136 
1137 #endif	/* _E1000G_SW_H */
1138