xref: /titanic_50/usr/src/uts/common/io/e1000g/e1000g_sw.h (revision 858a4b9997a29c40b725e606eb9bc3ac0a8c765b)
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 /*
588  * A structure that points to the next entry in the queue.
589  */
590 typedef struct _SINGLE_LIST_LINK {
591 	struct _SINGLE_LIST_LINK *Flink;
592 } SINGLE_LIST_LINK, *PSINGLE_LIST_LINK;
593 
594 /*
595  * A "ListHead" structure that points to the head and tail of a queue
596  */
597 typedef struct _LIST_DESCRIBER {
598 	struct _SINGLE_LIST_LINK *volatile Flink;
599 	struct _SINGLE_LIST_LINK *volatile Blink;
600 } LIST_DESCRIBER, *PLIST_DESCRIBER;
601 
602 /*
603  * Address-Length pair structure that stores descriptor info
604  */
605 typedef struct _ADDRESS_LENGTH_PAIR {
606 	uint64_t Address;
607 	uint32_t Length;
608 } ADDRESS_LENGTH_PAIR, *PADDRESS_LENGTH_PAIR;
609 
610 typedef struct _DESCRIPTOR_PAIR {
611 	ADDRESS_LENGTH_PAIR Descriptor[4];
612 	uint32_t Elements;
613 } DESC_ARRAY, *PDESC_ARRAY;
614 
615 typedef enum {
616 	USE_NONE,
617 	USE_BCOPY,
618 	USE_DVMA,
619 	USE_DMA
620 } dma_type_t;
621 
622 typedef struct _dma_buffer {
623 	caddr_t address;
624 	uint64_t dma_address;
625 	ddi_acc_handle_t acc_handle;
626 	ddi_dma_handle_t dma_handle;
627 	size_t size;
628 	size_t len;
629 } dma_buffer_t, *pdma_buffer_t;
630 
631 /*
632  * Transmit Control Block (TCB), Ndis equiv of SWPacket This
633  * structure stores the additional information that is
634  * associated with every packet to be transmitted. It stores the
635  * message block pointer and the TBD addresses associated with
636  * the m_blk and also the link to the next tcb in the chain
637  */
638 typedef struct _TX_SW_PACKET_ {
639 	/* Link to the next TX_SW_PACKET in the list */
640 	SINGLE_LIST_LINK Link;
641 	mblk_t *mp;
642 	UINT num_desc;
643 	UINT num_mblk_frag;
644 	dma_type_t dma_type;
645 	dma_type_t data_transfer_type;
646 	ddi_dma_handle_t tx_dma_handle;
647 	dma_buffer_t tx_buf[1];
648 	ADDRESS_LENGTH_PAIR desc[MAX_TX_DESC_PER_PACKET + 1];
649 } TX_SW_PACKET, *PTX_SW_PACKET;
650 
651 /*
652  * This structure is similar to the RX_SW_PACKET structure used
653  * for Ndis. This structure stores information about the 2k
654  * aligned receive buffer into which the FX1000 DMA's frames.
655  * This structure is maintained as a linked list of many
656  * receiver buffer pointers.
657  */
658 typedef struct _RX_SW_PACKET {
659 	/* Link to the next RX_SW_PACKET in the list */
660 	SINGLE_LIST_LINK Link;
661 	struct _RX_SW_PACKET *next;
662 	uint16_t flag;
663 	mblk_t *mp;
664 	caddr_t rx_ring;
665 	dma_type_t dma_type;
666 	frtn_t free_rtn;
667 	dma_buffer_t rx_buf[1];
668 } RX_SW_PACKET, *PRX_SW_PACKET;
669 
670 typedef struct _e1000g_msg_chain {
671 	mblk_t *head;
672 	mblk_t *tail;
673 	kmutex_t lock;
674 } e1000g_msg_chain_t;
675 
676 typedef struct _cksum_data {
677 	uint32_t ether_header_size;
678 	uint32_t cksum_flags;
679 	uint32_t cksum_start;
680 	uint32_t cksum_stuff;
681 } cksum_data_t;
682 
683 /*
684  * MultiCast Command Block (MULTICAST_CB) The multicast
685  * structure contains an array of multicast addresses and
686  * also a count of the total number of addresses.
687  */
688 typedef struct _multicast_cb_t {
689 	ushort_t mc_count;	/* Number of multicast addresses */
690 	uchar_t MulticastBuffer[(ETH_LENGTH_OF_ADDRESS *
691 		MAX_NUM_MULTICAST_ADDRESSES)];
692 } mltcst_cb_t, *pmltcst_cb_t;
693 
694 typedef union _e1000g_ether_addr {
695 	struct {
696 		uint32_t high;
697 		uint32_t low;
698 	} reg;
699 	struct {
700 		uint8_t set;
701 		uint8_t redundant;
702 		uint8_t addr[NODE_ADDRESS_SIZE];
703 	} mac;
704 } e1000g_ether_addr_t;
705 
706 typedef struct _e1000gstat {
707 
708 	kstat_named_t link_speed;	/* Link Speed */
709 	kstat_named_t rx_none;		/* Rx No Incoming Data */
710 	kstat_named_t rx_error;		/* Rx Error in Packet */
711 	kstat_named_t rx_exceed_pkt;	/* Rx Exceed Max Pkt Count */
712 	kstat_named_t rx_multi_desc;	/* Rx Multi Spanned Pkt */
713 	kstat_named_t rx_no_freepkt;	/* Rx No Free Pkt */
714 	kstat_named_t rx_avail_freepkt;	/* Rx Freelist Avail Buffers */
715 	kstat_named_t rx_esballoc_fail;	/* Rx Desballoc Failure */
716 	kstat_named_t rx_allocb_fail;	/* Rx Allocb Failure */
717 	kstat_named_t rx_seq_intr;	/* Rx Sequencing Errors Intr */
718 	kstat_named_t tx_lack_desc;	/* Tx Lack of Desc */
719 	kstat_named_t tx_no_desc;	/* Tx No Desc */
720 	kstat_named_t tx_no_swpkt;	/* Tx No Pkt Buffer */
721 	kstat_named_t tx_send_fail;	/* Tx SendPkt Failure */
722 	kstat_named_t tx_multi_cookie;	/* Tx Pkt Span Multi Cookies */
723 	kstat_named_t tx_over_size;	/* Tx Pkt Too Long */
724 	kstat_named_t tx_under_size;	/* Tx Allocb Failure */
725 	kstat_named_t tx_reschedule;	/* Tx Reschedule */
726 	kstat_named_t tx_empty_frags;	/* Tx Empty Frags */
727 	kstat_named_t tx_exceed_frags;	/* Tx Exceed Max Frags */
728 	kstat_named_t tx_recycle;	/* Tx Recycle */
729 	kstat_named_t tx_recycle_retry;	/* Tx Recycle Retry */
730 	kstat_named_t tx_recycle_intr;	/* Tx Recycle in Intr */
731 	kstat_named_t tx_recycle_none;	/* Tx No Desc Recycled */
732 	kstat_named_t tx_copy;		/* Tx Send Copy */
733 	kstat_named_t tx_bind;		/* Tx Send Bind */
734 	kstat_named_t tx_multi_copy;	/* Tx Copy Multi Fragments */
735 	kstat_named_t StallWatchdog;	/* Tx Stall Watchdog */
736 	kstat_named_t reset_count;	/* Reset Count */
737 	kstat_named_t intr_type;	/* Interrupt Type */
738 	kstat_named_t Crcerrs;	/* CRC Error Count */
739 	kstat_named_t Symerrs;	/* Symbol Error Count */
740 	kstat_named_t Mpc;	/* Missed Packet Count */
741 	kstat_named_t Scc;	/* Single Collision Count */
742 	kstat_named_t Ecol;	/* Excessive Collision Count */
743 	kstat_named_t Mcc;	/* Multiple Collision Count */
744 	kstat_named_t Latecol;	/* Late Collision Count */
745 	kstat_named_t Colc;	/* Collision Count */
746 	kstat_named_t Dc;	/* Defer Count */
747 	kstat_named_t Sec;	/* Sequence Error Count */
748 	kstat_named_t Rlec;	/* Receive Length Error Count */
749 	kstat_named_t Xonrxc;	/* XON Received Count */
750 	kstat_named_t Xontxc;	/* XON Xmitted Count */
751 	kstat_named_t Xoffrxc;	/* XOFF Received Count */
752 	kstat_named_t Xofftxc;	/* Xoff Xmitted Count */
753 	kstat_named_t Fcruc;	/* Unknown Flow Conrol Packet Rcvd Count */
754 	kstat_named_t Prc64;	/* Packets Received - 64b */
755 	kstat_named_t Prc127;	/* Packets Received - 65-127b */
756 	kstat_named_t Prc255;	/* Packets Received - 127-255b */
757 	kstat_named_t Prc511;	/* Packets Received - 256-511b */
758 	kstat_named_t Prc1023;	/* Packets Received - 511-1023b */
759 	kstat_named_t Prc1522;	/* Packets Received - 1024-1522b */
760 	kstat_named_t Gprc;	/* Good Packets Received Count */
761 	kstat_named_t Bprc;	/* Broadcasts Pkts Received Count */
762 	kstat_named_t Mprc;	/* Multicast Pkts Received Count */
763 	kstat_named_t Gptc;	/* Good Packets Xmitted Count */
764 	kstat_named_t Gorl;	/* Good Octets Recvd Lo Count */
765 	kstat_named_t Gorh;	/* Good Octets Recvd Hi Count */
766 	kstat_named_t Gotl;	/* Good Octets Xmitd Lo Count */
767 	kstat_named_t Goth;	/* Good Octets Xmitd Hi Count */
768 	kstat_named_t Rnbc;	/* Receive No Buffers Count */
769 	kstat_named_t Ruc;	/* Receive Undersize Count */
770 	kstat_named_t Rfc;	/* Receive Frag Count */
771 	kstat_named_t Roc;	/* Receive Oversize Count */
772 	kstat_named_t Rjc;	/* Receive Jabber Count */
773 	kstat_named_t Torl;	/* Total Octets Recvd Lo Count */
774 	kstat_named_t Torh;	/* Total Octets Recvd Hi Count */
775 	kstat_named_t Totl;	/* Total Octets Xmted Lo Count */
776 	kstat_named_t Toth;	/* Total Octets Xmted Hi Count */
777 	kstat_named_t Tpr;	/* Total Packets Received */
778 	kstat_named_t Tpt;	/* Total Packets Xmitted */
779 	kstat_named_t Ptc64;	/* Packets Xmitted (64b) */
780 	kstat_named_t Ptc127;	/* Packets Xmitted (64-127b) */
781 	kstat_named_t Ptc255;	/* Packets Xmitted (128-255b) */
782 	kstat_named_t Ptc511;	/* Packets Xmitted (255-511b) */
783 	kstat_named_t Ptc1023;	/* Packets Xmitted (512-1023b) */
784 	kstat_named_t Ptc1522;	/* Packets Xmitted (1024-1522b */
785 	kstat_named_t Mptc;	/* Multicast Packets Xmited Count */
786 	kstat_named_t Bptc;	/* Broadcast Packets Xmited Count */
787 	/*
788 	 * New Livengood Stat Counters
789 	 */
790 	kstat_named_t Algnerrc;	/* Alignment Error count */
791 	kstat_named_t Tuc;	/* Transmit Underrun count */
792 	kstat_named_t Rxerrc;	/* Rx Error Count */
793 	kstat_named_t Tncrs;	/* Transmit with no CRS */
794 	kstat_named_t Cexterr;	/* Carrier Extension Error count */
795 	kstat_named_t Rutec;	/* Receive DMA too Early count */
796 	kstat_named_t Tsctc;	/* TCP seg contexts xmit count */
797 	kstat_named_t Tsctfc;	/* TCP seg contexts xmit fail count */
798 	/*
799 	 * Jumbo Frame Counters
800 	 */
801 	kstat_named_t JumboTx_4K;	/* 4k Jumbo Frames Transmitted */
802 	kstat_named_t JumboRx_4K;	/* 4k Jumbo Frames Received */
803 	kstat_named_t JumboTx_8K;	/* 8k Jumbo Frames Transmitted */
804 	kstat_named_t JumboRx_8K;	/* 8k Jumbo Frames Received */
805 	kstat_named_t JumboTx_16K;	/* 16k Jumbo Frames Transmitted */
806 	kstat_named_t JumboRx_16K;	/* 16k Jumbo Frames Received */
807 
808 } e1000gstat, *e1000gstatp;
809 
810 typedef struct _e1000g_tx_ring {
811 	kmutex_t tx_lock;
812 	kmutex_t freelist_lock;
813 	kmutex_t usedlist_lock;
814 	/*
815 	 * Descriptor queue definitions
816 	 */
817 	ddi_dma_handle_t tbd_dma_handle;
818 	ddi_acc_handle_t tbd_acc_handle;
819 	struct e1000_tx_desc *tbd_area;
820 	uint64_t tbd_dma_addr;
821 	struct e1000_tx_desc *tbd_first;
822 	struct e1000_tx_desc *tbd_last;
823 	struct e1000_tx_desc *tbd_oldest;
824 	struct e1000_tx_desc *tbd_next;
825 	/*
826 	 * Software packet structures definitions
827 	 */
828 	PTX_SW_PACKET packet_area;
829 	LIST_DESCRIBER used_list;
830 	LIST_DESCRIBER free_list;
831 	/*
832 	 * TCP/UDP checksum offload
833 	 */
834 	cksum_data_t cksum_data;
835 	/*
836 	 * Timer definitions for 82547
837 	 */
838 	timeout_id_t timer_id_82547;
839 	boolean_t timer_enable_82547;
840 	/*
841 	 * Pointer to the adapter
842 	 */
843 	struct e1000g *adapter;
844 } e1000g_tx_ring_t, *pe1000g_tx_ring_t;
845 
846 typedef struct _e1000g_rx_ring {
847 	kmutex_t rx_lock;
848 	kmutex_t freelist_lock;
849 	/*
850 	 * Descriptor queue definitions
851 	 */
852 	ddi_dma_handle_t rbd_dma_handle;
853 	ddi_acc_handle_t rbd_acc_handle;
854 	struct e1000_rx_desc *rbd_area;
855 	uint64_t rbd_dma_addr;
856 	struct e1000_rx_desc *rbd_first;
857 	struct e1000_rx_desc *rbd_last;
858 	struct e1000_rx_desc *rbd_next;
859 	/*
860 	 * Software packet structures definitions
861 	 */
862 	PRX_SW_PACKET packet_area;
863 	LIST_DESCRIBER recv_list;
864 	LIST_DESCRIBER free_list;
865 	/*
866 	 * Pointer to the adapter
867 	 */
868 	struct e1000g *adapter;
869 } e1000g_rx_ring_t, *pe1000g_rx_ring_t;
870 
871 typedef struct e1000g {
872 	mac_handle_t mh;
873 	dev_info_t *dip;
874 	ddi_acc_handle_t handle;
875 	ddi_acc_handle_t E1000_handle;		/* Ws-PCI handle to regs */
876 	int AdapterInstance;
877 	struct e1000_hw Shared;
878 	struct e1000g_osdep osdep;
879 
880 	link_state_t link_state;
881 	UINT link_speed;
882 	UINT link_duplex;
883 	UINT NumRxDescriptors;
884 	UINT NumRxFreeList;
885 	UINT NumTxDescriptors;
886 	UINT NumTxSwPacket;
887 	UINT MaxNumReceivePackets;
888 	UINT bar64;
889 	USHORT TxInterruptDelay;
890 	USHORT MWIEnable;
891 	UINT MasterLatencyTimer;
892 #ifdef e1000g_DEBUG
893 	UINT DebugLevel;
894 	UINT DisplayOnly;
895 	UINT PrintOnly;
896 #endif
897 	UINT smartspeed;	/* smartspeed w/a counter */
898 	uint32_t init_count;
899 	size_t TxBufferSize;
900 	size_t RxBufferSize;
901 	boolean_t intr_adaptive;
902 	uint32_t intr_throttling_rate;
903 	timeout_id_t WatchDogTimer_id;
904 	timeout_id_t link_tid;
905 	boolean_t link_complete;
906 
907 	/*
908 	 * The e1000g_timeout_lock must be held when updateing the
909 	 * timeout fields in struct e1000g, that is,
910 	 * WatchDogTimer_id, timeout_enabled, timeout_started.
911 	 */
912 	kmutex_t e1000g_timeout_lock;
913 	/*
914 	 * The e1000g_linklock protects the link fields in struct e1000g,
915 	 * such as link_state, link_speed, link_duplex, link_complete, and
916 	 * link_tid.
917 	 */
918 	kmutex_t e1000g_linklock;
919 	kmutex_t TbiCntrMutex;
920 	/*
921 	 * The chip_lock assures that the Rx/Tx process must be
922 	 * stopped while other functions change the hardware
923 	 * configuration of e1000g card, such as e1000g_reset(),
924 	 * e1000g_reset_hw() etc are executed.
925 	 */
926 	krwlock_t chip_lock;
927 
928 	e1000g_rx_ring_t rx_ring[1];
929 	e1000g_tx_ring_t tx_ring[1];
930 
931 	uint32_t rx_bcopy_thresh;
932 	uint32_t tx_bcopy_thresh;
933 	uint32_t tx_recycle_low_water;
934 	uint32_t tx_recycle_num;
935 	uint32_t tx_frags_limit;
936 	uint32_t tx_link_down_timeout;
937 
938 	boolean_t tx_intr_enable;
939 	ddi_softint_handle_t tx_softint_handle;
940 	int tx_softint_pri;
941 	/*
942 	 * Message chain that needs to be freed
943 	 */
944 	e1000g_msg_chain_t tx_msg_chain[1];
945 
946 	mblk_t *rx_mblk;
947 	mblk_t *rx_mblk_tail;
948 	USHORT rx_packet_len;
949 
950 	kstat_t *e1000g_ksp;
951 
952 	uint32_t rx_none;
953 	uint32_t rx_error;
954 	uint32_t rx_exceed_pkt;
955 	uint32_t rx_multi_desc;
956 	uint32_t rx_no_freepkt;
957 	uint32_t rx_esballoc_fail;
958 	uint32_t rx_avail_freepkt;
959 	uint32_t rx_allocb_fail;
960 	uint32_t rx_seq_intr;
961 	uint32_t tx_lack_desc;
962 	uint32_t tx_no_desc;
963 	uint32_t tx_no_swpkt;
964 	uint32_t tx_send_fail;
965 	uint32_t tx_multi_cookie;
966 	uint32_t tx_over_size;
967 	uint32_t tx_under_size;
968 	uint32_t tx_reschedule;
969 	uint32_t tx_empty_frags;
970 	uint32_t tx_exceed_frags;
971 	uint32_t tx_recycle;
972 	uint32_t tx_recycle_retry;
973 	uint32_t tx_recycle_intr;
974 	uint32_t tx_recycle_none;
975 	uint32_t tx_copy;
976 	uint32_t tx_bind;
977 	uint32_t tx_multi_copy;
978 
979 	uint32_t JumboTx_4K;
980 	uint32_t JumboRx_4K;
981 	uint32_t JumboTx_8K;
982 	uint32_t JumboRx_8K;
983 	uint32_t JumboTx_16K;
984 	uint32_t JumboRx_16K;
985 
986 	uint32_t StallWatchdog;
987 	uint32_t tx_recycle_fail;
988 	uint32_t reset_count;
989 
990 	uint32_t unicst_avail;
991 	uint32_t unicst_total;
992 	e1000g_ether_addr_t unicst_addr[MAX_NUM_UNICAST_ADDRESSES];
993 
994 	uint32_t mcast_count;
995 	struct ether_addr mcast_table[MAX_NUM_MULTICAST_ADDRESSES];
996 
997 	uint32_t loopback_mode;
998 
999 	UINT ProfileJumboTraffic;
1000 	UINT RcvBufferAlignment;
1001 
1002 	boolean_t timeout_enabled;
1003 	boolean_t timeout_started;
1004 
1005 	boolean_t e1000g_promisc;
1006 	boolean_t started;
1007 	mac_resource_handle_t mrh;
1008 
1009 	uint32_t attach_progress;	/* attach tracking */
1010 	/*
1011 	 * reschedule when tx resource is available
1012 	 */
1013 	boolean_t resched_needed;
1014 
1015 #ifdef __sparc
1016 	ulong_t sys_page_sz;
1017 	uint_t dvma_page_num;
1018 #endif
1019 
1020 	boolean_t msi_enabled;
1021 	int intr_type;
1022 	int intr_cnt;
1023 	int intr_cap;
1024 	size_t intr_size;
1025 	uint_t intr_pri;
1026 	ddi_intr_handle_t *htable;
1027 
1028 	/*
1029 	 * NDD parameters
1030 	 */
1031 	caddr_t nd_data;
1032 	nd_param_t nd_params[PARAM_COUNT];
1033 
1034 } e1000g, *Pe1000g, ADAPTER_STRUCT, *PADAPTER_STRUCT;
1035 
1036 
1037 static ddi_dma_attr_t tx_dma_attr = {
1038 	DMA_ATTR_V0,		/* version of this structure */
1039 	0,			/* lowest usable address */
1040 	0xffffffffffffffffULL,	/* highest usable address */
1041 	0x7fffffff,		/* maximum DMAable byte count */
1042 	1,			/* alignment in bytes */
1043 	0x7ff,			/* burst sizes (any?) */
1044 	1,			/* minimum transfer */
1045 	0xffffffffU,		/* maximum transfer */
1046 	0xffffffffffffffffULL,	/* maximum segment length */
1047 	16,			/* maximum number of segments */
1048 	1,			/* granularity */
1049 	0,			/* flags (reserved) */
1050 };
1051 
1052 static ddi_dma_attr_t buf_dma_attr = {
1053 	DMA_ATTR_V0,		/* version of this structure */
1054 	0,			/* lowest usable address */
1055 	0xffffffffffffffffULL,	/* highest usable address */
1056 	0x7fffffff,		/* maximum DMAable byte count */
1057 	1,			/* alignment in bytes */
1058 	0x7ff,			/* burst sizes (any?) */
1059 	1,			/* minimum transfer */
1060 	0xffffffffU,		/* maximum transfer */
1061 	0xffffffffffffffffULL,	/* maximum segment length */
1062 	1,			/* maximum number of segments */
1063 	1,			/* granularity */
1064 	0,			/* flags (reserved) */
1065 };
1066 
1067 static ddi_dma_attr_t tbd_dma_attr = {
1068 	DMA_ATTR_V0,		/* version of this structure */
1069 	0,			/* lowest usable address */
1070 	0xffffffffffffffffULL,	/* highest usable address */
1071 	0x7fffffff,		/* maximum DMAable byte count */
1072 	E1000_MDALIGN,		/* alignment in bytes 4K! */
1073 	0x7ff,			/* burst sizes (any?) */
1074 	1,			/* minimum transfer */
1075 	0xffffffffU,		/* maximum transfer */
1076 	0xffffffffffffffffULL,	/* maximum segment length */
1077 	1,			/* maximum number of segments */
1078 	1,			/* granularity */
1079 	0,			/* flags (reserved) */
1080 };
1081 
1082 /*
1083  * Function prototypes
1084  */
1085 int e1000g_alloc_dma_resources(struct e1000g *Adapter);
1086 void e1000g_release_dma_resources(struct e1000g *Adapter);
1087 void e1000g_free_rx_sw_packet(PRX_SW_PACKET packet);
1088 void SetupTransmitStructures(struct e1000g *Adapter);
1089 void SetupReceiveStructures(struct e1000g *Adapter);
1090 void SetupMulticastTable(struct e1000g *Adapter);
1091 boolean_t e1000g_reset(struct e1000g *Adapter);
1092 
1093 int e1000g_recycle(e1000g_tx_ring_t *tx_ring);
1094 void FreeTxSwPacket(PTX_SW_PACKET packet);
1095 uint_t e1000g_tx_freemsg(caddr_t arg1, caddr_t arg2);
1096 mblk_t *e1000g_m_tx(void *arg, mblk_t *mp);
1097 mblk_t *e1000g_receive(struct e1000g *Adapter);
1098 void e1000g_rxfree_func(PRX_SW_PACKET packet);
1099 
1100 int e1000g_m_stat(void *arg, uint_t stat, uint64_t *val);
1101 int InitStatsCounters(struct e1000g *Adapter);
1102 void AdjustTbiAcceptedStats(struct e1000g *Adapter, UINT32 FrameLength,
1103     PUCHAR MacAddress);
1104 enum ioc_reply e1000g_nd_ioctl(struct e1000g *Adapter,
1105     queue_t *wq, mblk_t *mp, struct iocblk *iocp);
1106 void e1000g_nd_cleanup(struct e1000g *Adapter);
1107 int e1000g_nd_init(struct e1000g *Adapter);
1108 
1109 void e1000g_DisableInterrupt(struct e1000g *Adapter);
1110 void e1000g_EnableInterrupt(struct e1000g *Adapter);
1111 void e1000g_DisableAllInterrupts(struct e1000g *Adapter);
1112 void e1000g_DisableTxInterrupt(struct e1000g *Adapter);
1113 void e1000g_EnableTxInterrupt(struct e1000g *Adapter);
1114 void phy_spd_state(struct e1000_hw *hw, boolean_t enable);
1115 void e1000_enable_pciex_master(struct e1000_hw *hw);
1116 
1117 /*
1118  * Global variables
1119  */
1120 extern boolean_t force_detach_enabled;
1121 extern uint32_t e1000g_mblks_pending;
1122 extern krwlock_t e1000g_rx_detach_lock;
1123 
1124 
1125 #ifdef __cplusplus
1126 }
1127 #endif
1128 
1129 #endif	/* _E1000G_SW_H */
1130