xref: /titanic_44/usr/src/uts/common/io/sfe/sfe.c (revision 406882169e00272f14067d948324d690893e6fe3)
1 /*
2  *  sfe.c : DP83815/DP83816/SiS900 Fast Ethernet MAC driver for Solaris
3  *
4  * Copyright (c) 2002-2008 Masayuki Murayama.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of the author nor the names of its contributors may be
17  *    used to endorse or promote products derived from this software without
18  *    specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31  * DAMAGE.
32  */
33 
34 /* Avoid undefined symbol for non IA architectures */
35 #pragma weak	inb
36 #pragma weak	outb
37 
38 /*
39  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
40  * Use is subject to license terms.
41  */
42 
43 /*
44  * System Header files.
45  */
46 #include <sys/types.h>
47 #include <sys/conf.h>
48 #include <sys/debug.h>
49 #include <sys/kmem.h>
50 #include <sys/modctl.h>
51 #include <sys/errno.h>
52 #include <sys/ddi.h>
53 #include <sys/sunddi.h>
54 #include <sys/byteorder.h>
55 #include <sys/ethernet.h>
56 #include <sys/pci.h>
57 
58 #include "sfe_mii.h"
59 #include "sfe_util.h"
60 #include "sfereg.h"
61 
62 char	ident[] = "sis900/dp83815 driver v" "2.6.1t30os";
63 
64 /* Debugging support */
65 #ifdef DEBUG_LEVEL
66 static int sfe_debug = DEBUG_LEVEL;
67 #if DEBUG_LEVEL > 4
68 #define	CONS	"^"
69 #else
70 #define	CONS	"!"
71 #endif
72 #define	DPRINTF(n, args)	if (sfe_debug > (n)) cmn_err args
73 #else
74 #define	CONS	"!"
75 #define	DPRINTF(n, args)
76 #endif
77 
78 /*
79  * Useful macros and typedefs
80  */
81 #define	ONESEC		(drv_usectohz(1*1000000))
82 #define	ROUNDUP2(x, a)	(((x) + (a) - 1) & ~((a) - 1))
83 
84 /*
85  * Our configuration
86  */
87 #define	MAXTXFRAGS	1
88 #define	MAXRXFRAGS	1
89 
90 #ifndef	TX_BUF_SIZE
91 #define	TX_BUF_SIZE	64
92 #endif
93 #ifndef	TX_RING_SIZE
94 #if MAXTXFRAGS == 1
95 #define	TX_RING_SIZE	TX_BUF_SIZE
96 #else
97 #define	TX_RING_SIZE	(TX_BUF_SIZE * 4)
98 #endif
99 #endif
100 
101 #ifndef	RX_BUF_SIZE
102 #define	RX_BUF_SIZE	256
103 #endif
104 #ifndef	RX_RING_SIZE
105 #define	RX_RING_SIZE	RX_BUF_SIZE
106 #endif
107 
108 #define	OUR_INTR_BITS	\
109 	(ISR_DPERR | ISR_SSERR | ISR_RMABT | ISR_RTABT | ISR_RXSOVR |	\
110 	ISR_TXURN | ISR_TXDESC | ISR_TXERR |	\
111 	ISR_RXORN | ISR_RXIDLE | ISR_RXOK | ISR_RXERR)
112 
113 #define	USE_MULTICAST_HASHTBL
114 
115 static int	sfe_tx_copy_thresh = 256;
116 static int	sfe_rx_copy_thresh = 256;
117 
118 /* special PHY registers for SIS900 */
119 #define	MII_CONFIG1	0x0010
120 #define	MII_CONFIG2	0x0011
121 #define	MII_MASK	0x0013
122 #define	MII_RESV	0x0014
123 
124 #define	PHY_MASK		0xfffffff0
125 #define	PHY_SIS900_INTERNAL	0x001d8000
126 #define	PHY_ICS1893		0x0015f440
127 
128 
129 #define	SFE_DESC_SIZE	16	/* including pads rounding up to power of 2 */
130 
131 /*
132  * Supported chips
133  */
134 struct chip_info {
135 	uint16_t	venid;
136 	uint16_t	devid;
137 	char		*chip_name;
138 	int		chip_type;
139 #define	CHIPTYPE_DP83815	0
140 #define	CHIPTYPE_SIS900		1
141 };
142 
143 /*
144  * Chip dependent MAC state
145  */
146 struct sfe_dev {
147 	/* misc HW information */
148 	struct chip_info	*chip;
149 	uint32_t		our_intr_bits;
150 	uint32_t		isr_pended;
151 	uint32_t		cr;
152 	uint_t			tx_drain_threshold;
153 	uint_t			tx_fill_threshold;
154 	uint_t			rx_drain_threshold;
155 	uint_t			rx_fill_threshold;
156 	uint8_t			revid;	/* revision from PCI configuration */
157 	boolean_t		(*get_mac_addr)(struct gem_dev *);
158 	uint8_t			mac_addr[ETHERADDRL];
159 	uint8_t			bridge_revid;
160 };
161 
162 /*
163  * Hardware information
164  */
165 struct chip_info sfe_chiptbl[] = {
166 	{ 0x1039, 0x0900, "SiS900", CHIPTYPE_SIS900, },
167 	{ 0x100b, 0x0020, "DP83815/83816", CHIPTYPE_DP83815, },
168 	{ 0x1039, 0x7016, "SiS7016", CHIPTYPE_SIS900, },
169 };
170 #define	CHIPTABLESIZE (sizeof (sfe_chiptbl)/sizeof (struct chip_info))
171 
172 /* ======================================================== */
173 
174 /* mii operations */
175 static void  sfe_mii_sync_dp83815(struct gem_dev *);
176 static void  sfe_mii_sync_sis900(struct gem_dev *);
177 static uint16_t  sfe_mii_read_dp83815(struct gem_dev *, uint_t);
178 static uint16_t  sfe_mii_read_sis900(struct gem_dev *, uint_t);
179 static void sfe_mii_write_dp83815(struct gem_dev *, uint_t, uint16_t);
180 static void sfe_mii_write_sis900(struct gem_dev *, uint_t, uint16_t);
181 static void sfe_set_eq_sis630(struct gem_dev *dp);
182 /* nic operations */
183 static int sfe_reset_chip_sis900(struct gem_dev *);
184 static int sfe_reset_chip_dp83815(struct gem_dev *);
185 static int sfe_init_chip(struct gem_dev *);
186 static int sfe_start_chip(struct gem_dev *);
187 static int sfe_stop_chip(struct gem_dev *);
188 static int sfe_set_media(struct gem_dev *);
189 static int sfe_set_rx_filter_dp83815(struct gem_dev *);
190 static int sfe_set_rx_filter_sis900(struct gem_dev *);
191 static int sfe_get_stats(struct gem_dev *);
192 static int sfe_attach_chip(struct gem_dev *);
193 
194 /* descriptor operations */
195 static int sfe_tx_desc_write(struct gem_dev *dp, int slot,
196 		    ddi_dma_cookie_t *dmacookie, int frags, uint64_t flags);
197 static void sfe_tx_start(struct gem_dev *dp, int startslot, int nslot);
198 static void sfe_rx_desc_write(struct gem_dev *dp, int slot,
199 		    ddi_dma_cookie_t *dmacookie, int frags);
200 static uint_t sfe_tx_desc_stat(struct gem_dev *dp, int slot, int ndesc);
201 static uint64_t sfe_rx_desc_stat(struct gem_dev *dp, int slot, int ndesc);
202 
203 static void sfe_tx_desc_init(struct gem_dev *dp, int slot);
204 static void sfe_rx_desc_init(struct gem_dev *dp, int slot);
205 static void sfe_tx_desc_clean(struct gem_dev *dp, int slot);
206 static void sfe_rx_desc_clean(struct gem_dev *dp, int slot);
207 
208 /* interrupt handler */
209 static uint_t sfe_interrupt(struct gem_dev *dp);
210 
211 /* ======================================================== */
212 
213 /* mapping attributes */
214 /* Data access requirements. */
215 static struct ddi_device_acc_attr sfe_dev_attr = {
216 	DDI_DEVICE_ATTR_V0,
217 	DDI_STRUCTURE_LE_ACC,
218 	DDI_STRICTORDER_ACC
219 };
220 
221 /* On sparc, Buffers should be native endian for speed */
222 static struct ddi_device_acc_attr sfe_buf_attr = {
223 	DDI_DEVICE_ATTR_V0,
224 	DDI_NEVERSWAP_ACC,	/* native endianness */
225 	DDI_STRICTORDER_ACC
226 };
227 
228 static ddi_dma_attr_t sfe_dma_attr_buf = {
229 	DMA_ATTR_V0,		/* dma_attr_version */
230 	0,			/* dma_attr_addr_lo */
231 	0xffffffffull,		/* dma_attr_addr_hi */
232 	0x00000fffull,		/* dma_attr_count_max */
233 	0, /* patched later */	/* dma_attr_align */
234 	0x000003fc,		/* dma_attr_burstsizes */
235 	1,			/* dma_attr_minxfer */
236 	0x00000fffull,		/* dma_attr_maxxfer */
237 	0xffffffffull,		/* dma_attr_seg */
238 	0, /* patched later */	/* dma_attr_sgllen */
239 	1,			/* dma_attr_granular */
240 	0			/* dma_attr_flags */
241 };
242 
243 static ddi_dma_attr_t sfe_dma_attr_desc = {
244 	DMA_ATTR_V0,		/* dma_attr_version */
245 	16,			/* dma_attr_addr_lo */
246 	0xffffffffull,		/* dma_attr_addr_hi */
247 	0xffffffffull,		/* dma_attr_count_max */
248 	16,			/* dma_attr_align */
249 	0x000003fc,		/* dma_attr_burstsizes */
250 	1,			/* dma_attr_minxfer */
251 	0xffffffffull,		/* dma_attr_maxxfer */
252 	0xffffffffull,		/* dma_attr_seg */
253 	1,			/* dma_attr_sgllen */
254 	1,			/* dma_attr_granular */
255 	0			/* dma_attr_flags */
256 };
257 
258 uint32_t sfe_use_pcimemspace = 0;
259 
260 /* ======================================================== */
261 /*
262  * HW manipulation routines
263  */
264 /* ======================================================== */
265 
266 #define	SFE_EEPROM_DELAY(dp)	\
267 	{ (void) INL(dp, EROMAR); (void) INL(dp, EROMAR); }
268 #define	EE_CMD_READ	6
269 #define	EE_CMD_SHIFT	6
270 
271 static uint16_t
272 sfe_read_eeprom(struct gem_dev *dp, uint_t offset)
273 {
274 	int		eedi;
275 	int		i;
276 	uint16_t	ret;
277 
278 	/* ensure de-assert chip select */
279 	OUTL(dp, EROMAR, 0);
280 	SFE_EEPROM_DELAY(dp);
281 	OUTL(dp, EROMAR, EROMAR_EESK);
282 	SFE_EEPROM_DELAY(dp);
283 
284 	/* assert chip select */
285 	offset |= EE_CMD_READ << EE_CMD_SHIFT;
286 
287 	for (i = 8; i >= 0; i--) {
288 		/* make command */
289 		eedi = ((offset >> i) & 1) << EROMAR_EEDI_SHIFT;
290 
291 		/* send 1 bit */
292 		OUTL(dp, EROMAR, EROMAR_EECS | eedi);
293 		SFE_EEPROM_DELAY(dp);
294 		OUTL(dp, EROMAR, EROMAR_EECS | eedi | EROMAR_EESK);
295 		SFE_EEPROM_DELAY(dp);
296 	}
297 
298 	OUTL(dp, EROMAR, EROMAR_EECS);
299 
300 	ret = 0;
301 	for (i = 0; i < 16; i++) {
302 		/* Get 1 bit */
303 		OUTL(dp, EROMAR, EROMAR_EECS);
304 		SFE_EEPROM_DELAY(dp);
305 		OUTL(dp, EROMAR, EROMAR_EECS | EROMAR_EESK);
306 		SFE_EEPROM_DELAY(dp);
307 
308 		ret = (ret << 1) | ((INL(dp, EROMAR) >> EROMAR_EEDO_SHIFT) & 1);
309 	}
310 
311 	OUTL(dp, EROMAR, 0);
312 	SFE_EEPROM_DELAY(dp);
313 
314 	return (ret);
315 }
316 #undef SFE_EEPROM_DELAY
317 
318 static boolean_t
319 sfe_get_mac_addr_dp83815(struct gem_dev *dp)
320 {
321 	uint8_t		*mac;
322 	uint_t		val;
323 	int		i;
324 
325 #define	BITSET(p, ix, v)	(p)[(ix)/8] |= ((v) ? 1 : 0) << ((ix) & 0x7)
326 
327 	DPRINTF(4, (CE_CONT, CONS "%s: %s: called", dp->name, __func__));
328 
329 	mac = dp->dev_addr.ether_addr_octet;
330 
331 	/* first of all, clear MAC address buffer */
332 	bzero(mac, ETHERADDRL);
333 
334 	/* get bit 0 */
335 	val = sfe_read_eeprom(dp, 0x6);
336 	BITSET(mac, 0, val & 1);
337 
338 	/* get bit 1 - 16 */
339 	val = sfe_read_eeprom(dp, 0x7);
340 	for (i = 0; i < 16; i++) {
341 		BITSET(mac, 1 + i, val & (1 << (15 - i)));
342 	}
343 
344 	/* get bit 17 -  32 */
345 	val = sfe_read_eeprom(dp, 0x8);
346 	for (i = 0; i < 16; i++) {
347 		BITSET(mac, 17 + i, val & (1 << (15 - i)));
348 	}
349 
350 	/* get bit 33 -  47 */
351 	val = sfe_read_eeprom(dp, 0x9);
352 	for (i = 0; i < 15; i++) {
353 		BITSET(mac, 33 + i, val & (1 << (15 - i)));
354 	}
355 
356 	return (B_TRUE);
357 #undef BITSET
358 }
359 
360 static boolean_t
361 sfe_get_mac_addr_sis900(struct gem_dev *dp)
362 {
363 	uint_t		val;
364 	int		i;
365 	uint8_t		*mac;
366 
367 	mac = dp->dev_addr.ether_addr_octet;
368 
369 	for (i = 0; i < ETHERADDRL/2; i++) {
370 		val = sfe_read_eeprom(dp, 0x8 + i);
371 		*mac++ = (uint8_t)val;
372 		*mac++ = (uint8_t)(val >> 8);
373 	}
374 
375 	return (B_TRUE);
376 }
377 
378 static dev_info_t *
379 sfe_search_pci_dev_subr(dev_info_t *cur_node, int vendor_id, int device_id)
380 {
381 	dev_info_t	*child_id;
382 	dev_info_t	*ret;
383 	int		vid, did;
384 
385 	if (cur_node == NULL) {
386 		return (NULL);
387 	}
388 
389 	/* check brothers */
390 	do {
391 		vid = ddi_prop_get_int(DDI_DEV_T_ANY, cur_node,
392 		    DDI_PROP_DONTPASS, "vendor-id", -1);
393 		did = ddi_prop_get_int(DDI_DEV_T_ANY, cur_node,
394 		    DDI_PROP_DONTPASS, "device-id", -1);
395 
396 		if (vid == vendor_id && did == device_id) {
397 			/* found */
398 			return (cur_node);
399 		}
400 
401 		/* check children */
402 		if ((child_id = ddi_get_child(cur_node)) != NULL) {
403 			if ((ret = sfe_search_pci_dev_subr(child_id,
404 			    vendor_id, device_id)) != NULL) {
405 				return (ret);
406 			}
407 		}
408 
409 	} while ((cur_node = ddi_get_next_sibling(cur_node)) != NULL);
410 
411 	/* not found */
412 	return (NULL);
413 }
414 
415 static dev_info_t *
416 sfe_search_pci_dev(int vendor_id, int device_id)
417 {
418 	return (sfe_search_pci_dev_subr(ddi_root_node(), vendor_id, device_id));
419 }
420 
421 static boolean_t
422 sfe_get_mac_addr_sis630e(struct gem_dev *dp)
423 {
424 	int		i;
425 	dev_info_t	*isa_bridge;
426 	ddi_acc_handle_t isa_handle;
427 	int		reg;
428 
429 	if (inb == NULL || outb == NULL) {
430 		/* this is not IA architecture */
431 		return (B_FALSE);
432 	}
433 
434 	if ((isa_bridge = sfe_search_pci_dev(0x1039, 0x8)) == NULL) {
435 		cmn_err(CE_WARN, "%s: failed to find isa-bridge pci1039,8",
436 		    dp->name);
437 		return (B_FALSE);
438 	}
439 
440 	if (pci_config_setup(isa_bridge, &isa_handle) != DDI_SUCCESS) {
441 		cmn_err(CE_WARN, "%s: ddi_regs_map_setup failed",
442 		    dp->name);
443 		return (B_FALSE);
444 	}
445 
446 	/* enable to access CMOS RAM */
447 	reg = pci_config_get8(isa_handle, 0x48);
448 	pci_config_put8(isa_handle, 0x48, reg | 0x40);
449 
450 	for (i = 0; i < ETHERADDRL; i++) {
451 		outb(0x70, 0x09 + i);
452 		dp->dev_addr.ether_addr_octet[i] = inb(0x71);
453 	}
454 
455 	/* disable to access CMOS RAM */
456 	pci_config_put8(isa_handle, 0x48, reg);
457 	pci_config_teardown(&isa_handle);
458 
459 	return (B_TRUE);
460 }
461 
462 static boolean_t
463 sfe_get_mac_addr_sis635(struct gem_dev *dp)
464 {
465 	int		i;
466 	uint32_t	rfcr;
467 	uint16_t	v;
468 	struct sfe_dev	*lp = dp->private;
469 
470 	DPRINTF(2, (CE_CONT, CONS "%s: %s: called", dp->name, __func__));
471 	rfcr = INL(dp, RFCR);
472 
473 	OUTL(dp, CR, lp->cr | CR_RELOAD);
474 	OUTL(dp, CR, lp->cr);
475 
476 	/* disable packet filtering before reading filter */
477 	OUTL(dp, RFCR, rfcr & ~RFCR_RFEN);
478 
479 	/* load MAC addr from filter data register */
480 	for (i = 0; i < ETHERADDRL; i += 2) {
481 		OUTL(dp, RFCR,
482 		    (RFADDR_MAC_SIS900 + (i/2)) << RFCR_RFADDR_SHIFT_SIS900);
483 		v = INL(dp, RFDR);
484 		dp->dev_addr.ether_addr_octet[i] = (uint8_t)v;
485 		dp->dev_addr.ether_addr_octet[i+1] = (uint8_t)(v >> 8);
486 	}
487 
488 	/* re-enable packet filtering */
489 	OUTL(dp, RFCR, rfcr | RFCR_RFEN);
490 
491 	return (B_TRUE);
492 }
493 
494 static boolean_t
495 sfe_get_mac_addr_sis962(struct gem_dev *dp)
496 {
497 	boolean_t	ret;
498 	int		i;
499 
500 	ret = B_FALSE;
501 
502 	/* rise request signal to access EEPROM */
503 	OUTL(dp, MEAR, EROMAR_EEREQ);
504 	for (i = 0; (INL(dp, MEAR) & EROMAR_EEGNT) == 0; i++) {
505 		if (i > 200) {
506 			/* failed to acquire eeprom */
507 			cmn_err(CE_NOTE,
508 			    CONS "%s: failed to access eeprom", dp->name);
509 			goto x;
510 		}
511 		drv_usecwait(10);
512 	}
513 	ret = sfe_get_mac_addr_sis900(dp);
514 x:
515 	/* release EEPROM */
516 	OUTL(dp, MEAR, EROMAR_EEDONE);
517 
518 	return (ret);
519 }
520 
521 static int
522 sfe_reset_chip_sis900(struct gem_dev *dp)
523 {
524 	int		i;
525 	uint32_t	done;
526 	uint32_t	val;
527 	struct sfe_dev	*lp = dp->private;
528 
529 	DPRINTF(4, (CE_CONT, CONS "%s: %s called", dp->name, __func__));
530 
531 	/* invalidate mac addr cache */
532 	bzero(lp->mac_addr, sizeof (lp->mac_addr));
533 
534 	lp->cr = 0;
535 
536 	/* inhibit interrupt */
537 	OUTL(dp, IMR, 0);
538 	lp->isr_pended |= INL(dp, ISR) & lp->our_intr_bits;
539 
540 	OUTLINL(dp, RFCR, 0);
541 
542 	OUTL(dp, CR, CR_RST | CR_TXR | CR_RXR);
543 	drv_usecwait(10);
544 
545 	done = 0;
546 	for (i = 0; done != (ISR_TXRCMP | ISR_RXRCMP); i++) {
547 		if (i > 1000) {
548 			cmn_err(CE_WARN, "%s: chip reset timeout", dp->name);
549 			return (GEM_FAILURE);
550 		}
551 		done |= INL(dp, ISR) & (ISR_TXRCMP | ISR_RXRCMP);
552 		drv_usecwait(10);
553 	}
554 
555 	if (lp->revid == SIS630ET_900_REV) {
556 		lp->cr |= CR_ACCESSMODE;
557 		OUTL(dp, CR, lp->cr | INL(dp, CR));
558 	}
559 
560 	/* Configuration register: enable PCI parity */
561 	DPRINTF(2, (CE_CONT, CONS "%s: cfg:%b",
562 	    dp->name, INL(dp, CFG), CFG_BITS_SIS900));
563 	val = 0;
564 	if (lp->revid >= SIS635A_900_REV ||
565 	    lp->revid == SIS900B_900_REV) {
566 		/* what is this ? */
567 		val |= CFG_RND_CNT;
568 	}
569 	OUTL(dp, CFG, val);
570 	DPRINTF(2, (CE_CONT, CONS "%s: cfg:%b", dp->name,
571 	    INL(dp, CFG), CFG_BITS_SIS900));
572 
573 	return (GEM_SUCCESS);
574 }
575 
576 static int
577 sfe_reset_chip_dp83815(struct gem_dev *dp)
578 {
579 	int		i;
580 	uint32_t	val;
581 	struct sfe_dev	*lp = dp->private;
582 
583 	DPRINTF(4, (CE_CONT, CONS "%s: %s called", dp->name, __func__));
584 
585 	/* invalidate mac addr cache */
586 	bzero(lp->mac_addr, sizeof (lp->mac_addr));
587 
588 	lp->cr = 0;
589 
590 	/* inhibit interrupts */
591 	OUTL(dp, IMR, 0);
592 	lp->isr_pended |= INL(dp, ISR) & lp->our_intr_bits;
593 
594 	OUTL(dp, RFCR, 0);
595 
596 	OUTL(dp, CR, CR_RST);
597 	drv_usecwait(10);
598 
599 	for (i = 0; INL(dp, CR) & CR_RST; i++) {
600 		if (i > 100) {
601 			cmn_err(CE_WARN, "!%s: chip reset timeout", dp->name);
602 			return (GEM_FAILURE);
603 		}
604 		drv_usecwait(10);
605 	}
606 	DPRINTF(0, (CE_CONT, "!%s: chip reset in %duS", dp->name, i*10));
607 
608 	OUTL(dp, CCSR, CCSR_PMESTS);
609 	OUTL(dp, CCSR, 0);
610 
611 	/* Configuration register: enable PCI parity */
612 	DPRINTF(2, (CE_CONT, CONS "%s: cfg:%b",
613 	    dp->name, INL(dp, CFG), CFG_BITS_DP83815));
614 	val = INL(dp, CFG) & (CFG_ANEG_SEL | CFG_PHY_CFG);
615 	OUTL(dp, CFG, val | CFG_PAUSE_ADV);
616 	DPRINTF(2, (CE_CONT, CONS "%s: cfg:%b", dp->name,
617 	    INL(dp, CFG), CFG_BITS_DP83815));
618 
619 	return (GEM_SUCCESS);
620 }
621 
622 static int
623 sfe_init_chip(struct gem_dev *dp)
624 {
625 	/* Configuration register: have been set up in sfe_chip_reset */
626 
627 	/* PCI test control register: do nothing */
628 
629 	/* Interrupt status register : do nothing */
630 
631 	/* Interrupt mask register: clear, but leave lp->our_intr_bits */
632 	OUTL(dp, IMR, 0);
633 
634 	/* Enhanced PHY Access register (sis900): do nothing */
635 
636 	/* Transmit Descriptor Pointer register: base addr of TX ring */
637 	OUTL(dp, TXDP, dp->tx_ring_dma);
638 
639 	/* Receive descriptor pointer register: base addr of RX ring */
640 	OUTL(dp, RXDP, dp->rx_ring_dma);
641 
642 	return (GEM_SUCCESS);
643 }
644 
645 static uint_t
646 sfe_mcast_hash(struct gem_dev *dp, uint8_t *addr)
647 {
648 	return (gem_ether_crc_be(addr, ETHERADDRL));
649 }
650 
651 #ifdef DEBUG_LEVEL
652 static void
653 sfe_rxfilter_dump(struct gem_dev *dp, int start, int end)
654 {
655 	int		i;
656 	int		j;
657 	uint16_t	ram[0x10];
658 
659 	cmn_err(CE_CONT, "!%s: rx filter ram dump:", dp->name);
660 #define	WORDS_PER_LINE	4
661 	for (i = start; i < end; i += WORDS_PER_LINE*2) {
662 		for (j = 0; j < WORDS_PER_LINE; j++) {
663 			OUTL(dp, RFCR, RFADDR_MAC_DP83815 + i + j*2);
664 			ram[j] = INL(dp, RFDR);
665 		}
666 
667 		cmn_err(CE_CONT, "!0x%02x: 0x%04x 0x%04x 0x%04x 0x%04x",
668 		    i, ram[0], ram[1], ram[2], ram[3]);
669 		}
670 
671 #undef	WORDS_PER_LINE
672 }
673 #endif
674 
675 static uint_t	sfe_rf_perfect_base_dp83815[] = {
676 	RFADDR_PMATCH0_DP83815,
677 	RFADDR_PMATCH1_DP83815,
678 	RFADDR_PMATCH2_DP83815,
679 	RFADDR_PMATCH3_DP83815,
680 };
681 
682 static int
683 sfe_set_rx_filter_dp83815(struct gem_dev *dp)
684 {
685 	int		i;
686 	int		j;
687 	uint32_t	mode;
688 	uint8_t		*mac = dp->cur_addr.ether_addr_octet;
689 	uint16_t	hash_tbl[32];
690 	struct sfe_dev	*lp = dp->private;
691 
692 	DPRINTF(1, (CE_CONT, CONS "%s: %s: called, mc_count:%d, mode:0x%b",
693 	    dp->name, __func__, dp->mc_count, dp->rxmode, RXMODE_BITS));
694 
695 #if DEBUG_LEVEL > 0
696 	for (i = 0; i < dp->mc_count; i++) {
697 		cmn_err(CE_CONT,
698 		"!%s: adding mcast(%d) %02x:%02x:%02x:%02x:%02x:%02x",
699 		    dp->name, i,
700 		    dp->mc_list[i].addr.ether_addr_octet[0],
701 		    dp->mc_list[i].addr.ether_addr_octet[1],
702 		    dp->mc_list[i].addr.ether_addr_octet[2],
703 		    dp->mc_list[i].addr.ether_addr_octet[3],
704 		    dp->mc_list[i].addr.ether_addr_octet[4],
705 		    dp->mc_list[i].addr.ether_addr_octet[5]);
706 	}
707 #endif
708 	if ((dp->rxmode & RXMODE_ENABLE) == 0) {
709 		/* disable rx filter */
710 		OUTL(dp, RFCR, 0);
711 		return (GEM_SUCCESS);
712 	}
713 
714 	/*
715 	 * Set Receive filter control register
716 	 */
717 	if (dp->rxmode & RXMODE_PROMISC) {
718 		/* all broadcast, all multicast, all physical */
719 		mode = RFCR_AAB | RFCR_AAM | RFCR_AAP;
720 	} else if ((dp->rxmode & RXMODE_ALLMULTI) || dp->mc_count > 16*32/2) {
721 		/* all broadcast, all multicast, physical for the chip */
722 		mode = RFCR_AAB | RFCR_AAM | RFCR_APM_DP83815;
723 	} else if (dp->mc_count > 4) {
724 		/*
725 		 * Use multicast hash table,
726 		 * accept all broadcast and physical for the chip.
727 		 */
728 		mode = RFCR_AAB | RFCR_MHEN_DP83815 | RFCR_APM_DP83815;
729 
730 		bzero(hash_tbl, sizeof (hash_tbl));
731 		for (i = 0; i < dp->mc_count; i++) {
732 			j = dp->mc_list[i].hash >> (32 - 9);
733 			hash_tbl[j / 16] |= 1 << (j % 16);
734 		}
735 	} else {
736 		/*
737 		 * Use pattern mach filter for multicast address,
738 		 * accept all broadcast and physical for the chip
739 		 */
740 		/* need to enable corresponding pattern registers */
741 		mode = RFCR_AAB | RFCR_APM_DP83815 |
742 		    (((1 << dp->mc_count) - 1) << RFCR_APAT_SHIFT);
743 	}
744 
745 #if DEBUG_LEVEL > 1
746 	cmn_err(CE_CONT,
747 	    "!%s: mac %02x:%02x:%02x:%02x:%02x:%02x"
748 	    "  cache %02x:%02x:%02x:%02x:%02x:%02x",
749 	    dp->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
750 	    lp->mac_addr[0], lp->mac_addr[1],
751 	    lp->mac_addr[2], lp->mac_addr[3],
752 	    lp->mac_addr[4], lp->mac_addr[5]);
753 #endif
754 	if (bcmp(mac, lp->mac_addr, ETHERADDRL) != 0) {
755 		/*
756 		 * XXX - need to *disable* rx filter to load mac address for
757 		 * the chip. otherwise, we cannot setup rxfilter correctly.
758 		 */
759 		/* setup perfect match register for my station address */
760 		for (i = 0; i < ETHERADDRL; i += 2) {
761 			OUTL(dp, RFCR, RFADDR_MAC_DP83815 + i);
762 			OUTL(dp, RFDR, (mac[i+1] << 8) | mac[i]);
763 		}
764 
765 		bcopy(mac, lp->mac_addr, ETHERADDRL);
766 	}
767 
768 #if DEBUG_LEVEL > 3
769 	/* clear pattern ram */
770 	for (j = 0x200; j < 0x380; j += 2) {
771 		OUTL(dp, RFCR, j);
772 		OUTL(dp, RFDR, 0);
773 	}
774 #endif
775 	if (mode & RFCR_APAT_DP83815) {
776 		/* setup multicast address into pattern match registers */
777 		for (j = 0; j < dp->mc_count; j++) {
778 			mac = &dp->mc_list[j].addr.ether_addr_octet[0];
779 			for (i = 0; i < ETHERADDRL; i += 2) {
780 				OUTL(dp, RFCR,
781 				    sfe_rf_perfect_base_dp83815[j] + i*2);
782 				OUTL(dp, RFDR, (mac[i+1] << 8) | mac[i]);
783 			}
784 		}
785 
786 		/* setup pattern count registers */
787 		OUTL(dp, RFCR, RFADDR_PCOUNT01_DP83815);
788 		OUTL(dp, RFDR, (ETHERADDRL << 8) | ETHERADDRL);
789 		OUTL(dp, RFCR, RFADDR_PCOUNT23_DP83815);
790 		OUTL(dp, RFDR, (ETHERADDRL << 8) | ETHERADDRL);
791 	}
792 
793 	if (mode & RFCR_MHEN_DP83815) {
794 		/* Load Multicast hash table */
795 		for (i = 0; i < 32; i++) {
796 			/* for DP83815, index is in byte */
797 			OUTL(dp, RFCR, RFADDR_MULTICAST_DP83815 + i*2);
798 			OUTL(dp, RFDR, hash_tbl[i]);
799 		}
800 	}
801 #if DEBUG_LEVEL > 2
802 	sfe_rxfilter_dump(dp, 0, 0x10);
803 	sfe_rxfilter_dump(dp, 0x200, 0x380);
804 #endif
805 	/* Set rx filter mode and enable rx filter */
806 	OUTL(dp, RFCR, RFCR_RFEN | mode);
807 
808 	return (GEM_SUCCESS);
809 }
810 
811 static int
812 sfe_set_rx_filter_sis900(struct gem_dev *dp)
813 {
814 	int		i;
815 	uint32_t	mode;
816 	uint16_t	hash_tbl[16];
817 	uint8_t		*mac = dp->cur_addr.ether_addr_octet;
818 	int		hash_size;
819 	int		hash_shift;
820 	struct sfe_dev	*lp = dp->private;
821 
822 	DPRINTF(4, (CE_CONT, CONS "%s: %s: called", dp->name, __func__));
823 
824 	if ((dp->rxmode & RXMODE_ENABLE) == 0) {
825 		/* disable rx filter */
826 		OUTLINL(dp, RFCR, 0);
827 		return (GEM_SUCCESS);
828 	}
829 
830 	/*
831 	 * determine hardware hash table size in word.
832 	 */
833 	hash_shift = 25;
834 	if (lp->revid >= SIS635A_900_REV || lp->revid == SIS900B_900_REV) {
835 		hash_shift = 24;
836 	}
837 	hash_size = (1 << (32 - hash_shift)) / 16;
838 	bzero(hash_tbl, sizeof (hash_tbl));
839 
840 	/* Set Receive filter control register */
841 
842 	if (dp->rxmode & RXMODE_PROMISC) {
843 		/* all broadcast, all multicast, all physical */
844 		mode = RFCR_AAB | RFCR_AAM | RFCR_AAP;
845 	} else if ((dp->rxmode & RXMODE_ALLMULTI) ||
846 	    dp->mc_count > hash_size*16/2) {
847 		/* all broadcast, all multicast, physical for the chip */
848 		mode = RFCR_AAB | RFCR_AAM;
849 	} else {
850 		/* all broadcast, physical for the chip */
851 		mode = RFCR_AAB;
852 	}
853 
854 	/* make hash table */
855 	for (i = 0; i < dp->mc_count; i++) {
856 		uint_t	h;
857 		h = dp->mc_list[i].hash >> hash_shift;
858 		hash_tbl[h / 16] |= 1 << (h % 16);
859 	}
860 
861 	if (bcmp(mac, lp->mac_addr, ETHERADDRL) != 0) {
862 		/* Disable Rx filter and load mac address */
863 		for (i = 0; i < ETHERADDRL/2; i++) {
864 			/* For sis900, index is in word */
865 			OUTLINL(dp, RFCR,
866 			    (RFADDR_MAC_SIS900+i) << RFCR_RFADDR_SHIFT_SIS900);
867 			OUTLINL(dp, RFDR, (mac[i*2+1] << 8) | mac[i*2]);
868 		}
869 
870 		bcopy(mac, lp->mac_addr, ETHERADDRL);
871 	}
872 
873 	/* Load Multicast hash table */
874 	for (i = 0; i < hash_size; i++) {
875 		/* For sis900, index is in word */
876 		OUTLINL(dp, RFCR,
877 		    (RFADDR_MULTICAST_SIS900 + i) << RFCR_RFADDR_SHIFT_SIS900);
878 		OUTLINL(dp, RFDR, hash_tbl[i]);
879 	}
880 
881 	/* Load rx filter mode and enable rx filter */
882 	OUTLINL(dp, RFCR, RFCR_RFEN | mode);
883 
884 	return (GEM_SUCCESS);
885 }
886 
887 static int
888 sfe_start_chip(struct gem_dev *dp)
889 {
890 	struct sfe_dev	*lp = dp->private;
891 
892 	DPRINTF(4, (CE_CONT, CONS "%s: %s: called", dp->name, __func__));
893 
894 	/*
895 	 * setup interrupt mask, which shouldn't include ISR_TOK
896 	 * to improve performance.
897 	 */
898 	lp->our_intr_bits = OUR_INTR_BITS;
899 
900 	/* enable interrupt */
901 	if ((dp->misc_flag & GEM_NOINTR) == 0) {
902 		OUTL(dp, IER, 1);
903 		OUTL(dp, IMR, lp->our_intr_bits);
904 	}
905 
906 	/* Kick RX */
907 	OUTL(dp, CR, lp->cr | CR_RXE);
908 
909 	return (GEM_SUCCESS);
910 }
911 
912 /*
913  * Stop nic core gracefully.
914  */
915 static int
916 sfe_stop_chip(struct gem_dev *dp)
917 {
918 	struct sfe_dev	*lp = dp->private;
919 	uint32_t	done;
920 	int		i;
921 	uint32_t	val;
922 
923 	DPRINTF(4, (CE_CONT, CONS "%s: %s: called", dp->name, __func__));
924 
925 	/*
926 	 * Although we inhibit interrupt here, we don't clear soft copy of
927 	 * interrupt mask to avoid bogus interrupts.
928 	 */
929 	OUTL(dp, IMR, 0);
930 
931 	/* stop TX and RX immediately */
932 	OUTL(dp, CR, lp->cr | CR_TXR | CR_RXR);
933 
934 	done = 0;
935 	for (i = 0; done != (ISR_RXRCMP | ISR_TXRCMP); i++) {
936 		if (i > 1000) {
937 			/*
938 			 * As gem layer will call sfe_reset_chip(),
939 			 * we don't neet to reset futher
940 			 */
941 			cmn_err(CE_NOTE, "!%s: %s: Tx/Rx reset timeout",
942 			    dp->name, __func__);
943 
944 			return (GEM_FAILURE);
945 		}
946 		val = INL(dp, ISR);
947 		done |= val & (ISR_RXRCMP | ISR_TXRCMP);
948 		lp->isr_pended |= val & lp->our_intr_bits;
949 		drv_usecwait(10);
950 	}
951 
952 	return (GEM_SUCCESS);
953 }
954 
955 #ifndef	__sparc
956 /*
957  * Stop nic core gracefully for quiesce
958  */
959 static int
960 sfe_stop_chip_quiesce(struct gem_dev *dp)
961 {
962 	struct sfe_dev	*lp = dp->private;
963 	uint32_t	done;
964 	int		i;
965 	uint32_t	val;
966 
967 	/*
968 	 * Although we inhibit interrupt here, we don't clear soft copy of
969 	 * interrupt mask to avoid bogus interrupts.
970 	 */
971 	OUTL(dp, IMR, 0);
972 
973 	/* stop TX and RX immediately */
974 	OUTL(dp, CR, CR_TXR | CR_RXR);
975 
976 	done = 0;
977 	for (i = 0; done != (ISR_RXRCMP | ISR_TXRCMP); i++) {
978 		if (i > 1000) {
979 			/*
980 			 * As gem layer will call sfe_reset_chip(),
981 			 * we don't neet to reset futher
982 			 */
983 
984 			return (DDI_FAILURE);
985 		}
986 		val = INL(dp, ISR);
987 		done |= val & (ISR_RXRCMP | ISR_TXRCMP);
988 		lp->isr_pended |= val & lp->our_intr_bits;
989 		drv_usecwait(10);
990 	}
991 	return (DDI_SUCCESS);
992 }
993 #endif
994 
995 /*
996  * Setup media mode
997  */
998 static uint_t
999 sfe_mxdma_value[] = { 512, 4, 8, 16, 32, 64, 128, 256, };
1000 
1001 static uint_t
1002 sfe_encode_mxdma(uint_t burstsize)
1003 {
1004 	int	i;
1005 
1006 	if (burstsize > 256) {
1007 		/* choose 512 */
1008 		return (0);
1009 	}
1010 
1011 	for (i = 1; i < 8; i++) {
1012 		if (burstsize <= sfe_mxdma_value[i]) {
1013 			break;
1014 		}
1015 	}
1016 	return (i);
1017 }
1018 
1019 static int
1020 sfe_set_media(struct gem_dev *dp)
1021 {
1022 	uint32_t	txcfg;
1023 	uint32_t	rxcfg;
1024 	uint32_t	pcr;
1025 	uint32_t	val;
1026 	uint32_t	txmxdma;
1027 	uint32_t	rxmxdma;
1028 	struct sfe_dev	*lp = dp->private;
1029 #ifdef DEBUG_LEVEL
1030 	extern int	gem_speed_value[];
1031 #endif
1032 	DPRINTF(2, (CE_CONT, CONS "%s: %s: %s duplex, %d Mbps",
1033 	    dp->name, __func__,
1034 	    dp->full_duplex ? "full" : "half", gem_speed_value[dp->speed]));
1035 
1036 	/* initialize txcfg and rxcfg */
1037 	txcfg = TXCFG_ATP;
1038 	if (dp->full_duplex) {
1039 		txcfg |= (TXCFG_CSI | TXCFG_HBI);
1040 	}
1041 	rxcfg = RXCFG_AEP | RXCFG_ARP;
1042 	if (dp->full_duplex) {
1043 		rxcfg |= RXCFG_ATX;
1044 	}
1045 
1046 	/* select txmxdma and rxmxdma, maxmum burst length */
1047 	if (lp->chip->chip_type == CHIPTYPE_SIS900) {
1048 #ifdef DEBUG_SIS900_EDB
1049 		val = CFG_EDB_MASTER;
1050 #else
1051 		val = INL(dp, CFG) & CFG_EDB_MASTER;
1052 #endif
1053 		if (val) {
1054 			/*
1055 			 * sis900 built-in cores:
1056 			 * max burst length must be fixed to 64
1057 			 */
1058 			txmxdma = 64;
1059 			rxmxdma = 64;
1060 		} else {
1061 			/*
1062 			 * sis900 pci chipset:
1063 			 * the vendor recommended to fix max burst length
1064 			 * to 512
1065 			 */
1066 			txmxdma = 512;
1067 			rxmxdma = 512;
1068 		}
1069 	} else {
1070 		/*
1071 		 * NS dp83815/816:
1072 		 * use user defined or default for tx/rx max burst length
1073 		 */
1074 		txmxdma = max(dp->txmaxdma, 256);
1075 		rxmxdma = max(dp->rxmaxdma, 256);
1076 	}
1077 
1078 
1079 	/* tx high water mark */
1080 	lp->tx_drain_threshold = ROUNDUP2(dp->txthr, TXCFG_FIFO_UNIT);
1081 
1082 	/* determine tx_fill_threshold accroding drain threshold */
1083 	lp->tx_fill_threshold =
1084 	    TXFIFOSIZE - lp->tx_drain_threshold - TXCFG_FIFO_UNIT;
1085 
1086 	/* tune txmxdma not to exceed tx_fill_threshold */
1087 	for (; ; ) {
1088 		/* normalize txmxdma requested */
1089 		val = sfe_encode_mxdma(txmxdma);
1090 		txmxdma = sfe_mxdma_value[val];
1091 
1092 		if (txmxdma <= lp->tx_fill_threshold) {
1093 			break;
1094 		}
1095 		/* select new txmxdma */
1096 		txmxdma = txmxdma / 2;
1097 	}
1098 	txcfg |= val << TXCFG_MXDMA_SHIFT;
1099 
1100 	/* encode rxmxdma, maxmum burst length for rx */
1101 	val = sfe_encode_mxdma(rxmxdma);
1102 	rxcfg |= val << RXCFG_MXDMA_SHIFT;
1103 	rxmxdma = sfe_mxdma_value[val];
1104 
1105 	/* receive starting threshold - it have only 5bit-wide field */
1106 	val = ROUNDUP2(max(dp->rxthr, ETHERMIN), RXCFG_FIFO_UNIT);
1107 	lp->rx_drain_threshold =
1108 	    min(val, (RXCFG_DRTH >> RXCFG_DRTH_SHIFT) * RXCFG_FIFO_UNIT);
1109 
1110 	DPRINTF(0, (CE_CONT,
1111 	    "%s: %s: tx: drain:%d(rest %d) fill:%d mxdma:%d,"
1112 	    " rx: drain:%d mxdma:%d",
1113 	    dp->name, __func__,
1114 	    lp->tx_drain_threshold, TXFIFOSIZE - lp->tx_drain_threshold,
1115 	    lp->tx_fill_threshold, txmxdma,
1116 	    lp->rx_drain_threshold, rxmxdma));
1117 
1118 	ASSERT(lp->tx_drain_threshold < 64*TXCFG_FIFO_UNIT);
1119 	ASSERT(lp->tx_fill_threshold < 64*TXCFG_FIFO_UNIT);
1120 	ASSERT(lp->rx_drain_threshold < 32*RXCFG_FIFO_UNIT);
1121 
1122 	txcfg |= ((lp->tx_fill_threshold/TXCFG_FIFO_UNIT) << TXCFG_FLTH_SHIFT)
1123 	    | (lp->tx_drain_threshold/TXCFG_FIFO_UNIT);
1124 	OUTL(dp, TXCFG, txcfg);
1125 
1126 	rxcfg |= ((lp->rx_drain_threshold/RXCFG_FIFO_UNIT) << RXCFG_DRTH_SHIFT);
1127 	if (lp->chip->chip_type == CHIPTYPE_DP83815) {
1128 		rxcfg |= RXCFG_ALP_DP83815;
1129 	}
1130 	OUTL(dp, RXCFG, rxcfg);
1131 
1132 	DPRINTF(0, (CE_CONT, CONS "%s: %s: txcfg:%b rxcfg:%b",
1133 	    dp->name, __func__,
1134 	    txcfg, TXCFG_BITS, rxcfg, RXCFG_BITS));
1135 
1136 	/* Flow control */
1137 	if (lp->chip->chip_type == CHIPTYPE_DP83815) {
1138 		pcr = INL(dp, PCR);
1139 		switch (dp->flow_control) {
1140 		case FLOW_CONTROL_SYMMETRIC:
1141 		case FLOW_CONTROL_RX_PAUSE:
1142 			OUTL(dp, PCR, pcr | PCR_PSEN | PCR_PS_MCAST);
1143 			break;
1144 
1145 		default:
1146 			OUTL(dp, PCR,
1147 			    pcr & ~(PCR_PSEN | PCR_PS_MCAST | PCR_PS_DA));
1148 			break;
1149 		}
1150 		DPRINTF(2, (CE_CONT, CONS "%s: PCR: %b", dp->name,
1151 		    INL(dp, PCR), PCR_BITS));
1152 
1153 	} else if (lp->chip->chip_type == CHIPTYPE_SIS900) {
1154 		switch (dp->flow_control) {
1155 		case FLOW_CONTROL_SYMMETRIC:
1156 		case FLOW_CONTROL_RX_PAUSE:
1157 			OUTL(dp, FLOWCTL, FLOWCTL_FLOWEN);
1158 			break;
1159 		default:
1160 			OUTL(dp, FLOWCTL, 0);
1161 			break;
1162 		}
1163 		DPRINTF(2, (CE_CONT, CONS "%s: FLOWCTL: %b",
1164 		    dp->name, INL(dp, FLOWCTL), FLOWCTL_BITS));
1165 	}
1166 	return (GEM_SUCCESS);
1167 }
1168 
1169 static int
1170 sfe_get_stats(struct gem_dev *dp)
1171 {
1172 	/* do nothing */
1173 	return (GEM_SUCCESS);
1174 }
1175 
1176 /*
1177  * descriptor manipulations
1178  */
1179 static int
1180 sfe_tx_desc_write(struct gem_dev *dp, int slot,
1181 		ddi_dma_cookie_t *dmacookie, int frags, uint64_t flags)
1182 {
1183 	uint32_t		mark;
1184 	struct sfe_desc		*tdp;
1185 	ddi_dma_cookie_t	*dcp;
1186 	uint32_t		tmp0;
1187 #if DEBUG_LEVEL > 2
1188 	int			i;
1189 
1190 	cmn_err(CE_CONT,
1191 	    CONS "%s: time:%d %s seqnum: %d, slot %d, frags: %d flags: %llx",
1192 	    dp->name, ddi_get_lbolt(), __func__,
1193 	    dp->tx_desc_tail, slot, frags, flags);
1194 
1195 	for (i = 0; i < frags; i++) {
1196 		cmn_err(CE_CONT, CONS "%d: addr: 0x%x, len: 0x%x",
1197 		    i, dmacookie[i].dmac_address, dmacookie[i].dmac_size);
1198 	}
1199 #endif
1200 	/*
1201 	 * write tx descriptor in reversed order.
1202 	 */
1203 #if DEBUG_LEVEL > 3
1204 	flags |= GEM_TXFLAG_INTR;
1205 #endif
1206 	mark = (flags & GEM_TXFLAG_INTR)
1207 	    ? (CMDSTS_OWN | CMDSTS_INTR) : CMDSTS_OWN;
1208 
1209 	ASSERT(frags == 1);
1210 	dcp = &dmacookie[0];
1211 	if (flags & GEM_TXFLAG_HEAD) {
1212 		mark &= ~CMDSTS_OWN;
1213 	}
1214 
1215 	tdp = (void *)&dp->tx_ring[SFE_DESC_SIZE * slot];
1216 	tmp0 = (uint32_t)dcp->dmac_address;
1217 	mark |= (uint32_t)dcp->dmac_size;
1218 	tdp->d_bufptr = LE_32(tmp0);
1219 	tdp->d_cmdsts = LE_32(mark);
1220 
1221 	return (frags);
1222 }
1223 
1224 static void
1225 sfe_tx_start(struct gem_dev *dp, int start_slot, int nslot)
1226 {
1227 	uint_t			tx_ring_size = dp->gc.gc_tx_ring_size;
1228 	struct sfe_desc		*tdp;
1229 	struct sfe_dev		*lp = dp->private;
1230 
1231 	if (nslot > 1) {
1232 		gem_tx_desc_dma_sync(dp,
1233 		    SLOT(start_slot + 1, tx_ring_size),
1234 		    nslot - 1, DDI_DMA_SYNC_FORDEV);
1235 	}
1236 
1237 	tdp = (void *)&dp->tx_ring[SFE_DESC_SIZE * start_slot];
1238 	tdp->d_cmdsts |= LE_32(CMDSTS_OWN);
1239 
1240 	gem_tx_desc_dma_sync(dp, start_slot, 1, DDI_DMA_SYNC_FORDEV);
1241 
1242 	/*
1243 	 * Let the Transmit Buffer Manager Fill state machine active.
1244 	 */
1245 	if (dp->mac_active) {
1246 		OUTL(dp, CR, lp->cr | CR_TXE);
1247 	}
1248 }
1249 
1250 static void
1251 sfe_rx_desc_write(struct gem_dev *dp, int slot,
1252 	    ddi_dma_cookie_t *dmacookie, int frags)
1253 {
1254 	struct sfe_desc		*rdp;
1255 	uint32_t		tmp0;
1256 	uint32_t		tmp1;
1257 #if DEBUG_LEVEL > 2
1258 	int			i;
1259 
1260 	ASSERT(frags == 1);
1261 
1262 	cmn_err(CE_CONT, CONS
1263 	    "%s: %s seqnum: %d, slot %d, frags: %d",
1264 	    dp->name, __func__, dp->rx_active_tail, slot, frags);
1265 	for (i = 0; i < frags; i++) {
1266 		cmn_err(CE_CONT, CONS "  frag: %d addr: 0x%llx, len: 0x%lx",
1267 		    i, dmacookie[i].dmac_address, dmacookie[i].dmac_size);
1268 	}
1269 #endif
1270 	/* for the last slot of the packet */
1271 	rdp = (void *)&dp->rx_ring[SFE_DESC_SIZE * slot];
1272 
1273 	tmp0 = (uint32_t)dmacookie->dmac_address;
1274 	tmp1 = CMDSTS_INTR | (uint32_t)dmacookie->dmac_size;
1275 	rdp->d_bufptr = LE_32(tmp0);
1276 	rdp->d_cmdsts = LE_32(tmp1);
1277 }
1278 
1279 static uint_t
1280 sfe_tx_desc_stat(struct gem_dev *dp, int slot, int ndesc)
1281 {
1282 	uint_t			tx_ring_size = dp->gc.gc_tx_ring_size;
1283 	struct sfe_desc		*tdp;
1284 	uint32_t		status;
1285 	int			cols;
1286 	struct sfe_dev		*lp = dp->private;
1287 #ifdef DEBUG_LEVEL
1288 	int			i;
1289 	clock_t			delay;
1290 #endif
1291 	/* check status of the last descriptor */
1292 	tdp = (void *)
1293 	    &dp->tx_ring[SFE_DESC_SIZE * SLOT(slot + ndesc - 1, tx_ring_size)];
1294 
1295 	/*
1296 	 * Don't use LE_32() directly to refer tdp->d_cmdsts.
1297 	 * It is not atomic for big endian cpus.
1298 	 */
1299 	status = tdp->d_cmdsts;
1300 	status = LE_32(status);
1301 
1302 	DPRINTF(2, (CE_CONT, CONS "%s: time:%ld %s: slot:%d, status:0x%b",
1303 	    dp->name, ddi_get_lbolt(), __func__,
1304 	    slot, status, TXSTAT_BITS));
1305 
1306 	if (status & CMDSTS_OWN) {
1307 		/*
1308 		 * not yet transmitted
1309 		 */
1310 		/* workaround for tx hang */
1311 		if (lp->chip->chip_type == CHIPTYPE_DP83815 &&
1312 		    dp->mac_active) {
1313 			OUTL(dp, CR, lp->cr | CR_TXE);
1314 		}
1315 		return (0);
1316 	}
1317 
1318 	if (status & CMDSTS_MORE) {
1319 		/* XXX - the hardware problem but don't panic the system */
1320 		/* avoid lint bug for %b format string including 32nd bit */
1321 		cmn_err(CE_NOTE, CONS
1322 		    "%s: tx status bits incorrect:  slot:%d, status:0x%x",
1323 		    dp->name, slot, status);
1324 	}
1325 
1326 #if DEBUG_LEVEL > 3
1327 	delay = (ddi_get_lbolt() - dp->tx_buf_head->txb_stime) * 10;
1328 	if (delay >= 50) {
1329 		DPRINTF(0, (CE_NOTE, "%s: tx deferred %d mS: slot %d",
1330 		    dp->name, delay, slot));
1331 	}
1332 #endif
1333 
1334 #if DEBUG_LEVEL > 3
1335 	for (i = 0; i < nfrag-1; i++) {
1336 		uint32_t	s;
1337 		int		n;
1338 
1339 		n = SLOT(slot + i, tx_ring_size);
1340 		s = LE_32(
1341 		    ((struct sfe_desc *)((void *)
1342 		    &dp->tx_ring[SFE_DESC_SIZE * n]))->d_cmdsts);
1343 
1344 		ASSERT(s & CMDSTS_MORE);
1345 		ASSERT((s & CMDSTS_OWN) == 0);
1346 	}
1347 #endif
1348 
1349 	/*
1350 	 *  collect statistics
1351 	 */
1352 	if ((status & CMDSTS_OK) == 0) {
1353 
1354 		/* failed to transmit the packet */
1355 
1356 		DPRINTF(0, (CE_CONT, CONS "%s: Transmit error, Tx status %b",
1357 		    dp->name, status, TXSTAT_BITS));
1358 
1359 		dp->stats.errxmt++;
1360 
1361 		if (status & CMDSTS_TFU) {
1362 			dp->stats.underflow++;
1363 		} else if (status & CMDSTS_CRS) {
1364 			dp->stats.nocarrier++;
1365 		} else if (status & CMDSTS_OWC) {
1366 			dp->stats.xmtlatecoll++;
1367 		} else if ((!dp->full_duplex) && (status & CMDSTS_EC)) {
1368 			dp->stats.excoll++;
1369 			dp->stats.collisions += 16;
1370 		} else {
1371 			dp->stats.xmit_internal_err++;
1372 		}
1373 	} else if (!dp->full_duplex) {
1374 		cols = (status >> CMDSTS_CCNT_SHIFT) & CCNT_MASK;
1375 
1376 		if (cols > 0) {
1377 			if (cols == 1) {
1378 				dp->stats.first_coll++;
1379 			} else /* (cols > 1) */ {
1380 				dp->stats.multi_coll++;
1381 			}
1382 			dp->stats.collisions += cols;
1383 		} else if (status & CMDSTS_TD) {
1384 			dp->stats.defer++;
1385 		}
1386 	}
1387 	return (GEM_TX_DONE);
1388 }
1389 
1390 static uint64_t
1391 sfe_rx_desc_stat(struct gem_dev *dp, int slot, int ndesc)
1392 {
1393 	struct sfe_desc		*rdp;
1394 	uint_t			len;
1395 	uint_t			flag;
1396 	uint32_t		status;
1397 
1398 	flag = GEM_RX_DONE;
1399 
1400 	/* Dont read ISR because we cannot ack only to rx interrupt. */
1401 
1402 	rdp = (void *)&dp->rx_ring[SFE_DESC_SIZE * slot];
1403 
1404 	/*
1405 	 * Don't use LE_32() directly to refer rdp->d_cmdsts.
1406 	 * It is not atomic for big endian cpus.
1407 	 */
1408 	status = rdp->d_cmdsts;
1409 	status = LE_32(status);
1410 
1411 	DPRINTF(2, (CE_CONT, CONS "%s: time:%ld %s: slot:%d, status:0x%b",
1412 	    dp->name, ddi_get_lbolt(), __func__,
1413 	    slot, status, RXSTAT_BITS));
1414 
1415 	if ((status & CMDSTS_OWN) == 0) {
1416 		/*
1417 		 * No more received packets because
1418 		 * this buffer is owned by NIC.
1419 		 */
1420 		return (0);
1421 	}
1422 
1423 #define	RX_ERR_BITS \
1424 	(CMDSTS_RXA | CMDSTS_RXO | CMDSTS_LONG | CMDSTS_RUNT | \
1425 		CMDSTS_ISE | CMDSTS_CRCE | CMDSTS_FAE | CMDSTS_MORE)
1426 
1427 	if (status & RX_ERR_BITS) {
1428 		/*
1429 		 * Packet with error received
1430 		 */
1431 		DPRINTF(0, (CE_CONT, CONS "%s: Corrupted packet "
1432 		    "received, buffer status: %b",
1433 		    dp->name, status, RXSTAT_BITS));
1434 
1435 		/* collect statistics information */
1436 		dp->stats.errrcv++;
1437 
1438 		if (status & CMDSTS_RXO) {
1439 			dp->stats.overflow++;
1440 		} else if (status & (CMDSTS_LONG | CMDSTS_MORE)) {
1441 			dp->stats.frame_too_long++;
1442 		} else if (status & CMDSTS_RUNT) {
1443 			dp->stats.runt++;
1444 		} else if (status & (CMDSTS_ISE | CMDSTS_FAE)) {
1445 			dp->stats.frame++;
1446 		} else if (status & CMDSTS_CRCE) {
1447 			dp->stats.crc++;
1448 		} else {
1449 			dp->stats.rcv_internal_err++;
1450 		}
1451 
1452 		return (flag | GEM_RX_ERR);
1453 	}
1454 
1455 	/*
1456 	 * this packet was received without errors
1457 	 */
1458 	if ((len = (status & CMDSTS_SIZE)) >= ETHERFCSL) {
1459 		len -= ETHERFCSL;
1460 	}
1461 
1462 #if DEBUG_LEVEL > 10
1463 {
1464 	int	i;
1465 	uint8_t	*bp = dp->rx_buf_head->rxb_buf;
1466 
1467 	cmn_err(CE_CONT, CONS "%s: len:%d", dp->name, len);
1468 
1469 	for (i = 0; i < 60; i += 10) {
1470 		cmn_err(CE_CONT, CONS
1471 		    "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
1472 		    bp[0], bp[1], bp[2], bp[3], bp[4],
1473 		    bp[5], bp[6], bp[7], bp[8], bp[9]);
1474 	}
1475 	bp += 10;
1476 }
1477 #endif
1478 	return (flag | (len & GEM_RX_LEN));
1479 }
1480 
1481 static void
1482 sfe_tx_desc_init(struct gem_dev *dp, int slot)
1483 {
1484 	uint_t			tx_ring_size = dp->gc.gc_tx_ring_size;
1485 	struct sfe_desc		*tdp;
1486 	uint32_t		here;
1487 
1488 	tdp = (void *)&dp->tx_ring[SFE_DESC_SIZE * slot];
1489 
1490 	/* don't clear d_link field, which have a valid pointer */
1491 	tdp->d_cmdsts = 0;
1492 
1493 	/* make a link to this from the previous descriptor */
1494 	here = ((uint32_t)dp->tx_ring_dma) + SFE_DESC_SIZE*slot;
1495 
1496 	tdp = (void *)
1497 	    &dp->tx_ring[SFE_DESC_SIZE * SLOT(slot - 1, tx_ring_size)];
1498 	tdp->d_link = LE_32(here);
1499 }
1500 
1501 static void
1502 sfe_rx_desc_init(struct gem_dev *dp, int slot)
1503 {
1504 	uint_t			rx_ring_size = dp->gc.gc_rx_ring_size;
1505 	struct sfe_desc		*rdp;
1506 	uint32_t		here;
1507 
1508 	rdp = (void *)&dp->rx_ring[SFE_DESC_SIZE * slot];
1509 
1510 	/* don't clear d_link field, which have a valid pointer */
1511 	rdp->d_cmdsts = LE_32(CMDSTS_OWN);
1512 
1513 	/* make a link to this from the previous descriptor */
1514 	here = ((uint32_t)dp->rx_ring_dma) + SFE_DESC_SIZE*slot;
1515 
1516 	rdp = (void *)
1517 	    &dp->rx_ring[SFE_DESC_SIZE * SLOT(slot - 1, rx_ring_size)];
1518 	rdp->d_link = LE_32(here);
1519 }
1520 
1521 static void
1522 sfe_tx_desc_clean(struct gem_dev *dp, int slot)
1523 {
1524 	struct sfe_desc		*tdp;
1525 
1526 	tdp = (void *)&dp->tx_ring[SFE_DESC_SIZE * slot];
1527 	tdp->d_cmdsts = 0;
1528 }
1529 
1530 static void
1531 sfe_rx_desc_clean(struct gem_dev *dp, int slot)
1532 {
1533 	struct sfe_desc		*rdp;
1534 
1535 	rdp = (void *)&dp->rx_ring[SFE_DESC_SIZE * slot];
1536 	rdp->d_cmdsts = LE_32(CMDSTS_OWN);
1537 }
1538 
1539 /*
1540  * Device depend interrupt handler
1541  */
1542 static uint_t
1543 sfe_interrupt(struct gem_dev *dp)
1544 {
1545 	uint_t		rx_ring_size = dp->gc.gc_rx_ring_size;
1546 	uint32_t	isr;
1547 	uint32_t	isr_bogus;
1548 	uint_t		flags = 0;
1549 	boolean_t	need_to_reset = B_FALSE;
1550 	struct sfe_dev	*lp = dp->private;
1551 
1552 	/* read reason and clear interrupt */
1553 	isr = INL(dp, ISR);
1554 
1555 	isr_bogus = lp->isr_pended;
1556 	lp->isr_pended = 0;
1557 
1558 	if (((isr | isr_bogus) & lp->our_intr_bits) == 0) {
1559 		/* we are not the interrupt source */
1560 		return (DDI_INTR_UNCLAIMED);
1561 	}
1562 
1563 	DPRINTF(3, (CE_CONT,
1564 	    CONS "%s: time:%ld %s:called: isr:0x%b rx_active_head: %d",
1565 	    dp->name, ddi_get_lbolt(), __func__,
1566 	    isr, INTR_BITS, dp->rx_active_head));
1567 
1568 	if (!dp->mac_active) {
1569 		/* the device is going to stop */
1570 		lp->our_intr_bits = 0;
1571 		return (DDI_INTR_CLAIMED);
1572 	}
1573 
1574 	isr &= lp->our_intr_bits;
1575 
1576 	if (isr & (ISR_RXSOVR | ISR_RXORN | ISR_RXIDLE | ISR_RXERR |
1577 	    ISR_RXDESC | ISR_RXOK)) {
1578 		(void) gem_receive(dp);
1579 
1580 		if (isr & (ISR_RXSOVR | ISR_RXORN)) {
1581 			DPRINTF(0, (CE_CONT,
1582 			    CONS "%s: rx fifo overrun: isr %b",
1583 			    dp->name, isr, INTR_BITS));
1584 			/* no need restart rx */
1585 			dp->stats.overflow++;
1586 		}
1587 
1588 		if (isr & ISR_RXIDLE) {
1589 			DPRINTF(0, (CE_CONT,
1590 			    CONS "%s: rx buffer ran out: isr %b",
1591 			    dp->name, isr, INTR_BITS));
1592 
1593 			dp->stats.norcvbuf++;
1594 
1595 			/*
1596 			 * Make RXDP points the head of receive
1597 			 * buffer list.
1598 			 */
1599 			OUTL(dp, RXDP, dp->rx_ring_dma +
1600 			    SFE_DESC_SIZE *
1601 			    SLOT(dp->rx_active_head, rx_ring_size));
1602 
1603 			/* Restart the receive engine */
1604 			OUTL(dp, CR, lp->cr | CR_RXE);
1605 		}
1606 	}
1607 
1608 	if (isr & (ISR_TXURN | ISR_TXERR | ISR_TXDESC |
1609 	    ISR_TXIDLE | ISR_TXOK)) {
1610 		/* need to reclaim tx buffers */
1611 		if (gem_tx_done(dp)) {
1612 			flags |= INTR_RESTART_TX;
1613 		}
1614 		/*
1615 		 * XXX - tx error statistics will be counted in
1616 		 * sfe_tx_desc_stat() and no need to restart tx on errors.
1617 		 */
1618 	}
1619 
1620 	if (isr & (ISR_DPERR | ISR_SSERR | ISR_RMABT | ISR_RTABT)) {
1621 		cmn_err(CE_WARN, "%s: ERROR interrupt: isr %b.",
1622 		    dp->name, isr, INTR_BITS);
1623 		need_to_reset = B_TRUE;
1624 	}
1625 reset:
1626 	if (need_to_reset) {
1627 		(void) gem_restart_nic(dp, GEM_RESTART_KEEP_BUF);
1628 		flags |= INTR_RESTART_TX;
1629 	}
1630 
1631 	DPRINTF(5, (CE_CONT, CONS "%s: %s: return: isr: %b",
1632 	    dp->name, __func__, isr, INTR_BITS));
1633 
1634 	return (DDI_INTR_CLAIMED | flags);
1635 }
1636 
1637 /* ======================================================== */
1638 /*
1639  * HW depend MII routine
1640  */
1641 /* ======================================================== */
1642 
1643 /*
1644  * MII routines for NS DP83815
1645  */
1646 static void
1647 sfe_mii_sync_dp83815(struct gem_dev *dp)
1648 {
1649 	/* do nothing */
1650 }
1651 
1652 static uint16_t
1653 sfe_mii_read_dp83815(struct gem_dev *dp, uint_t offset)
1654 {
1655 	DPRINTF(4, (CE_CONT, CONS"%s: %s: offset 0x%x",
1656 	    dp->name, __func__, offset));
1657 	return ((uint16_t)INL(dp, MII_REGS_BASE + offset*4));
1658 }
1659 
1660 static void
1661 sfe_mii_write_dp83815(struct gem_dev *dp, uint_t offset, uint16_t val)
1662 {
1663 	DPRINTF(4, (CE_CONT, CONS"%s: %s: offset 0x%x 0x%x",
1664 	    dp->name, __func__, offset, val));
1665 	OUTL(dp, MII_REGS_BASE + offset*4, val);
1666 }
1667 
1668 static int
1669 sfe_mii_config_dp83815(struct gem_dev *dp)
1670 {
1671 	uint32_t	srr;
1672 
1673 	srr = INL(dp, SRR) & SRR_REV;
1674 
1675 	DPRINTF(0, (CE_CONT, CONS "%s: srr:0x%04x %04x %04x %04x %04x %04x",
1676 	    dp->name, srr,
1677 	    INW(dp, 0x00cc),	/* PGSEL */
1678 	    INW(dp, 0x00e4),	/* PMDCSR */
1679 	    INW(dp, 0x00fc),	/* TSTDAT */
1680 	    INW(dp, 0x00f4),	/* DSPCFG */
1681 	    INW(dp, 0x00f8)));	/* SDCFG */
1682 
1683 	if (srr == SRR_REV_DP83815CVNG) {
1684 		/*
1685 		 * NS datasheet says that DP83815CVNG needs following
1686 		 * registers to be patched for optimizing its performance.
1687 		 * A report said that CRC errors on RX disappeared
1688 		 * with the patch.
1689 		 */
1690 		OUTW(dp, 0x00cc, 0x0001);	/* PGSEL */
1691 		OUTW(dp, 0x00e4, 0x189c);	/* PMDCSR */
1692 		OUTW(dp, 0x00fc, 0x0000);	/* TSTDAT */
1693 		OUTW(dp, 0x00f4, 0x5040);	/* DSPCFG */
1694 		OUTW(dp, 0x00f8, 0x008c);	/* SDCFG */
1695 		OUTW(dp, 0x00cc, 0x0000);	/* PGSEL */
1696 
1697 		DPRINTF(0, (CE_CONT,
1698 		    CONS "%s: PHY patched %04x %04x %04x %04x %04x",
1699 		    dp->name,
1700 		    INW(dp, 0x00cc),	/* PGSEL */
1701 		    INW(dp, 0x00e4),	/* PMDCSR */
1702 		    INW(dp, 0x00fc),	/* TSTDAT */
1703 		    INW(dp, 0x00f4),	/* DSPCFG */
1704 		    INW(dp, 0x00f8)));	/* SDCFG */
1705 	} else if (((srr ^ SRR_REV_DP83815DVNG) & 0xff00) == 0 ||
1706 	    ((srr ^ SRR_REV_DP83816AVNG) & 0xff00) == 0) {
1707 		/*
1708 		 * Additional packets for later chipset
1709 		 */
1710 		OUTW(dp, 0x00cc, 0x0001);	/* PGSEL */
1711 		OUTW(dp, 0x00e4, 0x189c);	/* PMDCSR */
1712 		OUTW(dp, 0x00cc, 0x0000);	/* PGSEL */
1713 
1714 		DPRINTF(0, (CE_CONT,
1715 		    CONS "%s: PHY patched %04x %04x",
1716 		    dp->name,
1717 		    INW(dp, 0x00cc),	/* PGSEL */
1718 		    INW(dp, 0x00e4)));	/* PMDCSR */
1719 	}
1720 
1721 	return (gem_mii_config_default(dp));
1722 }
1723 
1724 static int
1725 sfe_mii_probe_dp83815(struct gem_dev *dp)
1726 {
1727 	uint32_t	val;
1728 
1729 	/* try external phy first */
1730 	DPRINTF(0, (CE_CONT, CONS "%s: %s: trying external phy",
1731 	    dp->name, __func__));
1732 	dp->mii_phy_addr = 0;
1733 	dp->gc.gc_mii_sync = &sfe_mii_sync_sis900;
1734 	dp->gc.gc_mii_read = &sfe_mii_read_sis900;
1735 	dp->gc.gc_mii_write = &sfe_mii_write_sis900;
1736 
1737 	val = INL(dp, CFG) & (CFG_ANEG_SEL | CFG_PHY_CFG);
1738 	OUTL(dp, CFG, val | CFG_EXT_PHY | CFG_PHY_DIS);
1739 
1740 	if (gem_mii_probe_default(dp) == GEM_SUCCESS) {
1741 		return (GEM_SUCCESS);
1742 	}
1743 
1744 	/* switch to internal phy */
1745 	DPRINTF(0, (CE_CONT, CONS "%s: %s: switching to internal phy",
1746 	    dp->name, __func__));
1747 	dp->mii_phy_addr = -1;
1748 	dp->gc.gc_mii_sync = &sfe_mii_sync_dp83815;
1749 	dp->gc.gc_mii_read = &sfe_mii_read_dp83815;
1750 	dp->gc.gc_mii_write = &sfe_mii_write_dp83815;
1751 
1752 	val = INL(dp, CFG) & (CFG_ANEG_SEL | CFG_PHY_CFG);
1753 	OUTL(dp, CFG, val | CFG_PAUSE_ADV | CFG_PHY_RST);
1754 	drv_usecwait(100);	/* keep to assert RST bit for a while */
1755 	OUTL(dp, CFG, val | CFG_PAUSE_ADV);
1756 
1757 	/* wait for PHY reset */
1758 	delay(drv_usectohz(10000));
1759 
1760 	return (gem_mii_probe_default(dp));
1761 }
1762 
1763 static int
1764 sfe_mii_init_dp83815(struct gem_dev *dp)
1765 {
1766 	uint32_t	val;
1767 
1768 	val = INL(dp, CFG) & (CFG_ANEG_SEL | CFG_PHY_CFG);
1769 
1770 	if (dp->mii_phy_addr == -1) {
1771 		/* select internal phy */
1772 		OUTL(dp, CFG, val | CFG_PAUSE_ADV);
1773 	} else {
1774 		/* select external phy */
1775 		OUTL(dp, CFG, val | CFG_EXT_PHY | CFG_PHY_DIS);
1776 	}
1777 
1778 	return (GEM_SUCCESS);
1779 }
1780 
1781 /*
1782  * MII routines for SiS900
1783  */
1784 #define	MDIO_DELAY(dp)	{(void) INL(dp, MEAR); (void) INL(dp, MEAR); }
1785 static void
1786 sfe_mii_sync_sis900(struct gem_dev *dp)
1787 {
1788 	int	i;
1789 
1790 	/* send 32 ONE's to make MII line idle */
1791 	for (i = 0; i < 32; i++) {
1792 		OUTL(dp, MEAR, MEAR_MDDIR | MEAR_MDIO);
1793 		MDIO_DELAY(dp);
1794 		OUTL(dp, MEAR, MEAR_MDDIR | MEAR_MDIO | MEAR_MDC);
1795 		MDIO_DELAY(dp);
1796 	}
1797 }
1798 
1799 static int
1800 sfe_mii_config_sis900(struct gem_dev *dp)
1801 {
1802 	struct sfe_dev	*lp = dp->private;
1803 
1804 	/* Do chip depend setup */
1805 	if ((dp->mii_phy_id & PHY_MASK) == PHY_ICS1893) {
1806 		/* workaround for ICS1893 PHY */
1807 		gem_mii_write(dp, 0x0018, 0xD200);
1808 	}
1809 
1810 	if (lp->revid == SIS630E_900_REV) {
1811 		/*
1812 		 * SiS 630E has bugs on default values
1813 		 * of PHY registers
1814 		 */
1815 		gem_mii_write(dp, MII_AN_ADVERT, 0x05e1);
1816 		gem_mii_write(dp, MII_CONFIG1, 0x0022);
1817 		gem_mii_write(dp, MII_CONFIG2, 0xff00);
1818 		gem_mii_write(dp, MII_MASK,    0xffc0);
1819 	}
1820 	sfe_set_eq_sis630(dp);
1821 
1822 	return (gem_mii_config_default(dp));
1823 }
1824 
1825 static uint16_t
1826 sfe_mii_read_sis900(struct gem_dev *dp, uint_t reg)
1827 {
1828 	uint32_t	cmd;
1829 	uint16_t	ret;
1830 	int		i;
1831 	uint32_t	data;
1832 
1833 	cmd = MII_READ_CMD(dp->mii_phy_addr, reg);
1834 
1835 	for (i = 31; i >= 18; i--) {
1836 		data = ((cmd >> i) & 1) <<  MEAR_MDIO_SHIFT;
1837 		OUTL(dp, MEAR, data | MEAR_MDDIR);
1838 		MDIO_DELAY(dp);
1839 		OUTL(dp, MEAR, data | MEAR_MDDIR | MEAR_MDC);
1840 		MDIO_DELAY(dp);
1841 	}
1842 
1843 	/* turn around cycle */
1844 	OUTL(dp, MEAR, 0);
1845 	MDIO_DELAY(dp);
1846 
1847 	/* get response from PHY */
1848 	OUTL(dp, MEAR, MEAR_MDC);
1849 	MDIO_DELAY(dp);
1850 
1851 	OUTL(dp, MEAR, 0);
1852 #if DEBUG_LEBEL > 0
1853 	(void) INL(dp, MEAR);	/* delay */
1854 	if (INL(dp, MEAR) & MEAR_MDIO) {
1855 		cmn_err(CE_WARN, "%s: PHY@%d not responded",
1856 		    dp->name, dp->mii_phy_addr);
1857 	}
1858 #else
1859 	MDIO_DELAY(dp);
1860 #endif
1861 	/* terminate response cycle */
1862 	OUTL(dp, MEAR, MEAR_MDC);
1863 	MDIO_DELAY(dp);
1864 
1865 	ret = 0;	/* to avoid lint errors */
1866 	for (i = 16; i > 0; i--) {
1867 		OUTL(dp, MEAR, 0);
1868 		(void) INL(dp, MEAR);	/* delay */
1869 		ret = (ret << 1) | ((INL(dp, MEAR) >> MEAR_MDIO_SHIFT) & 1);
1870 		OUTL(dp, MEAR, MEAR_MDC);
1871 		MDIO_DELAY(dp);
1872 	}
1873 
1874 	/* send two idle(Z) bits to terminate the read cycle */
1875 	for (i = 0; i < 2; i++) {
1876 		OUTL(dp, MEAR, 0);
1877 		MDIO_DELAY(dp);
1878 		OUTL(dp, MEAR, MEAR_MDC);
1879 		MDIO_DELAY(dp);
1880 	}
1881 
1882 	return (ret);
1883 }
1884 
1885 static void
1886 sfe_mii_write_sis900(struct gem_dev *dp, uint_t reg, uint16_t val)
1887 {
1888 	uint32_t	cmd;
1889 	int		i;
1890 	uint32_t	data;
1891 
1892 	cmd = MII_WRITE_CMD(dp->mii_phy_addr, reg, val);
1893 
1894 	for (i = 31; i >= 0; i--) {
1895 		data = ((cmd >> i) & 1) << MEAR_MDIO_SHIFT;
1896 		OUTL(dp, MEAR, data | MEAR_MDDIR);
1897 		MDIO_DELAY(dp);
1898 		OUTL(dp, MEAR, data | MEAR_MDDIR | MEAR_MDC);
1899 		MDIO_DELAY(dp);
1900 	}
1901 
1902 	/* send two idle(Z) bits to terminate the write cycle. */
1903 	for (i = 0; i < 2; i++) {
1904 		OUTL(dp, MEAR, 0);
1905 		MDIO_DELAY(dp);
1906 		OUTL(dp, MEAR, MEAR_MDC);
1907 		MDIO_DELAY(dp);
1908 	}
1909 }
1910 #undef MDIO_DELAY
1911 
1912 static void
1913 sfe_set_eq_sis630(struct gem_dev *dp)
1914 {
1915 	uint16_t	reg14h;
1916 	uint16_t	eq_value;
1917 	uint16_t	max_value;
1918 	uint16_t	min_value;
1919 	int		i;
1920 	uint8_t		rev;
1921 	struct sfe_dev	*lp = dp->private;
1922 
1923 	rev = lp->revid;
1924 
1925 	if (!(rev == SIS630E_900_REV || rev == SIS630EA1_900_REV ||
1926 	    rev == SIS630A_900_REV || rev == SIS630ET_900_REV)) {
1927 		/* it doesn't have a internal PHY */
1928 		return;
1929 	}
1930 
1931 	if (dp->mii_state == MII_STATE_LINKUP) {
1932 		reg14h = gem_mii_read(dp, MII_RESV);
1933 		gem_mii_write(dp, MII_RESV, (0x2200 | reg14h) & 0xBFFF);
1934 
1935 		eq_value = (0x00f8 & gem_mii_read(dp, MII_RESV)) >> 3;
1936 		max_value = min_value = eq_value;
1937 		for (i = 1; i < 10; i++) {
1938 			eq_value = (0x00f8 & gem_mii_read(dp, MII_RESV)) >> 3;
1939 			max_value = max(eq_value, max_value);
1940 			min_value = min(eq_value, min_value);
1941 		}
1942 
1943 		/* for 630E, rule to determine the equalizer value */
1944 		if (rev == SIS630E_900_REV || rev == SIS630EA1_900_REV ||
1945 		    rev == SIS630ET_900_REV) {
1946 			if (max_value < 5) {
1947 				eq_value = max_value;
1948 			} else if (5 <= max_value && max_value < 15) {
1949 				eq_value =
1950 				    max(max_value + 1,
1951 				    min_value + 2);
1952 			} else if (15 <= max_value) {
1953 				eq_value =
1954 				    max(max_value + 5,
1955 				    min_value + 6);
1956 			}
1957 		}
1958 		/* for 630B0&B1, rule to determine the equalizer value */
1959 		else
1960 		if (rev == SIS630A_900_REV &&
1961 		    (lp->bridge_revid == SIS630B0 ||
1962 		    lp->bridge_revid == SIS630B1)) {
1963 
1964 			if (max_value == 0) {
1965 				eq_value = 3;
1966 			} else {
1967 				eq_value = (max_value + min_value + 1)/2;
1968 			}
1969 		}
1970 		/* write equalizer value and setting */
1971 		reg14h = gem_mii_read(dp, MII_RESV) & ~0x02f8;
1972 		reg14h |= 0x6000 | (eq_value << 3);
1973 		gem_mii_write(dp, MII_RESV, reg14h);
1974 	} else {
1975 		reg14h = (gem_mii_read(dp, MII_RESV) & ~0x4000) | 0x2000;
1976 		if (rev == SIS630A_900_REV &&
1977 		    (lp->bridge_revid == SIS630B0 ||
1978 		    lp->bridge_revid == SIS630B1)) {
1979 
1980 			reg14h |= 0x0200;
1981 		}
1982 		gem_mii_write(dp, MII_RESV, reg14h);
1983 	}
1984 }
1985 
1986 /* ======================================================== */
1987 /*
1988  * OS depend (device driver) routine
1989  */
1990 /* ======================================================== */
1991 static void
1992 sfe_chipinfo_init_sis900(struct gem_dev *dp)
1993 {
1994 	int		rev;
1995 	struct sfe_dev	*lp = (struct sfe_dev *)dp->private;
1996 
1997 	rev = lp->revid;
1998 
1999 	if (rev == SIS630E_900_REV /* 0x81 */) {
2000 		/* sis630E */
2001 		lp->get_mac_addr = &sfe_get_mac_addr_sis630e;
2002 	} else if (rev > 0x81 && rev <= 0x90) {
2003 		/* 630S, 630EA1, 630ET, 635A */
2004 		lp->get_mac_addr = &sfe_get_mac_addr_sis635;
2005 	} else if (rev == SIS962_900_REV /* 0x91 */) {
2006 		/* sis962 or later */
2007 		lp->get_mac_addr = &sfe_get_mac_addr_sis962;
2008 	} else {
2009 		/* sis900 */
2010 		lp->get_mac_addr = &sfe_get_mac_addr_sis900;
2011 	}
2012 
2013 	lp->bridge_revid = 0;
2014 
2015 	if (rev == SIS630E_900_REV || rev == SIS630EA1_900_REV ||
2016 	    rev == SIS630A_900_REV || rev ==  SIS630ET_900_REV) {
2017 		/*
2018 		 * read host bridge revision
2019 		 */
2020 		dev_info_t	*bridge;
2021 		ddi_acc_handle_t bridge_handle;
2022 
2023 		if ((bridge = sfe_search_pci_dev(0x1039, 0x630)) == NULL) {
2024 			cmn_err(CE_WARN,
2025 			    "%s: cannot find host bridge (pci1039,630)",
2026 			    dp->name);
2027 			return;
2028 		}
2029 
2030 		if (pci_config_setup(bridge, &bridge_handle) != DDI_SUCCESS) {
2031 			cmn_err(CE_WARN, "%s: pci_config_setup failed",
2032 			    dp->name);
2033 			return;
2034 		}
2035 
2036 		lp->bridge_revid =
2037 		    pci_config_get8(bridge_handle, PCI_CONF_REVID);
2038 		pci_config_teardown(&bridge_handle);
2039 	}
2040 }
2041 
2042 static int
2043 sfe_attach_chip(struct gem_dev *dp)
2044 {
2045 	struct sfe_dev		*lp = (struct sfe_dev *)dp->private;
2046 
2047 	DPRINTF(4, (CE_CONT, CONS "!%s: %s called", dp->name, __func__));
2048 
2049 	/* setup chip-depend get_mac_address function */
2050 	if (lp->chip->chip_type == CHIPTYPE_SIS900) {
2051 		sfe_chipinfo_init_sis900(dp);
2052 	} else {
2053 		lp->get_mac_addr = &sfe_get_mac_addr_dp83815;
2054 	}
2055 
2056 	/* read MAC address */
2057 	if (!(lp->get_mac_addr)(dp)) {
2058 		cmn_err(CE_WARN,
2059 		    "!%s: %s: failed to get factory mac address"
2060 		    " please specify a mac address in sfe.conf",
2061 		    dp->name, __func__);
2062 		return (GEM_FAILURE);
2063 	}
2064 
2065 	if (lp->chip->chip_type == CHIPTYPE_DP83815) {
2066 		dp->mii_phy_addr = -1;	/* no need to scan PHY */
2067 		dp->misc_flag |= GEM_VLAN_SOFT;
2068 		dp->txthr += 4; /* VTAG_SIZE */
2069 	}
2070 	dp->txthr = min(dp->txthr, TXFIFOSIZE - 2);
2071 
2072 	return (GEM_SUCCESS);
2073 }
2074 
2075 static int
2076 sfeattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
2077 {
2078 	int			unit;
2079 	const char		*drv_name;
2080 	int			i;
2081 	ddi_acc_handle_t	conf_handle;
2082 	uint16_t		vid;
2083 	uint16_t		did;
2084 	uint8_t			rev;
2085 #ifdef DEBUG_LEVEL
2086 	uint32_t		iline;
2087 	uint8_t			latim;
2088 #endif
2089 	struct chip_info	*p;
2090 	struct gem_dev		*dp;
2091 	struct sfe_dev		*lp;
2092 	caddr_t			base;
2093 	ddi_acc_handle_t	regs_ha;
2094 	struct gem_conf		*gcp;
2095 
2096 	unit = ddi_get_instance(dip);
2097 	drv_name = ddi_driver_name(dip);
2098 
2099 	DPRINTF(3, (CE_CONT, CONS "%s%d: sfeattach: called", drv_name, unit));
2100 
2101 	/*
2102 	 * Common codes after power-up
2103 	 */
2104 	if (pci_config_setup(dip, &conf_handle) != DDI_SUCCESS) {
2105 		cmn_err(CE_WARN, "%s%d: ddi_regs_map_setup failed",
2106 		    drv_name, unit);
2107 		goto err;
2108 	}
2109 
2110 	vid  = pci_config_get16(conf_handle, PCI_CONF_VENID);
2111 	did  = pci_config_get16(conf_handle, PCI_CONF_DEVID);
2112 	rev  = pci_config_get16(conf_handle, PCI_CONF_REVID);
2113 #ifdef DEBUG_LEVEL
2114 	iline = pci_config_get32(conf_handle, PCI_CONF_ILINE);
2115 	latim = pci_config_get8(conf_handle, PCI_CONF_LATENCY_TIMER);
2116 #endif
2117 #ifdef DEBUG_BUILT_IN_SIS900
2118 	rev  = SIS630E_900_REV;
2119 #endif
2120 	for (i = 0, p = sfe_chiptbl; i < CHIPTABLESIZE; i++, p++) {
2121 		if (p->venid == vid && p->devid == did) {
2122 			/* found */
2123 			goto chip_found;
2124 		}
2125 	}
2126 
2127 	/* Not found */
2128 	cmn_err(CE_WARN,
2129 	    "%s%d: sfe_attach: wrong PCI venid/devid (0x%x, 0x%x)",
2130 	    drv_name, unit, vid, did);
2131 	pci_config_teardown(&conf_handle);
2132 	goto err;
2133 
2134 chip_found:
2135 	pci_config_put16(conf_handle, PCI_CONF_COMM,
2136 	    PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME |
2137 	    pci_config_get16(conf_handle, PCI_CONF_COMM));
2138 
2139 	/* ensure D0 mode */
2140 	(void) gem_pci_set_power_state(dip, conf_handle, PCI_PMCSR_D0);
2141 
2142 	pci_config_teardown(&conf_handle);
2143 
2144 	switch (cmd) {
2145 	case DDI_RESUME:
2146 		return (gem_resume(dip));
2147 
2148 	case DDI_ATTACH:
2149 
2150 		DPRINTF(0, (CE_CONT,
2151 		    CONS "%s%d: ilr 0x%08x, latency_timer:0x%02x",
2152 		    drv_name, unit, iline, latim));
2153 
2154 		/*
2155 		 * Map in the device registers.
2156 		 */
2157 		if (gem_pci_regs_map_setup(dip,
2158 		    (sfe_use_pcimemspace && p->chip_type == CHIPTYPE_DP83815)
2159 		    ? PCI_ADDR_MEM32 : PCI_ADDR_IO, PCI_ADDR_MASK,
2160 		    &sfe_dev_attr, &base, &regs_ha) != DDI_SUCCESS) {
2161 			cmn_err(CE_WARN,
2162 			    "%s%d: ddi_regs_map_setup failed",
2163 			    drv_name, unit);
2164 			goto err;
2165 		}
2166 
2167 		/*
2168 		 * construct gem configuration
2169 		 */
2170 		gcp = kmem_zalloc(sizeof (*gcp), KM_SLEEP);
2171 
2172 		/* name */
2173 		(void) sprintf(gcp->gc_name, "%s%d", drv_name, unit);
2174 
2175 		/* consistency on tx and rx */
2176 		gcp->gc_tx_buf_align = sizeof (uint8_t) - 1;
2177 		gcp->gc_tx_max_frags = MAXTXFRAGS;
2178 		gcp->gc_tx_max_descs_per_pkt = gcp->gc_tx_max_frags;
2179 		gcp->gc_tx_desc_unit_shift = 4;	/* 16 byte */
2180 		gcp->gc_tx_buf_size  = TX_BUF_SIZE;
2181 		gcp->gc_tx_buf_limit = gcp->gc_tx_buf_size;
2182 		gcp->gc_tx_ring_size = TX_RING_SIZE;
2183 		gcp->gc_tx_ring_limit = gcp->gc_tx_ring_size;
2184 		gcp->gc_tx_auto_pad  = B_TRUE;
2185 		gcp->gc_tx_copy_thresh = sfe_tx_copy_thresh;
2186 		gcp->gc_tx_desc_write_oo = B_TRUE;
2187 
2188 		gcp->gc_rx_buf_align = sizeof (uint8_t) - 1;
2189 		gcp->gc_rx_max_frags = MAXRXFRAGS;
2190 		gcp->gc_rx_desc_unit_shift = 4;
2191 		gcp->gc_rx_ring_size = RX_RING_SIZE;
2192 		gcp->gc_rx_buf_max   = RX_BUF_SIZE;
2193 		gcp->gc_rx_copy_thresh = sfe_rx_copy_thresh;
2194 
2195 		/* map attributes */
2196 		gcp->gc_dev_attr = sfe_dev_attr;
2197 		gcp->gc_buf_attr = sfe_buf_attr;
2198 		gcp->gc_desc_attr = sfe_buf_attr;
2199 
2200 		/* dma attributes */
2201 		gcp->gc_dma_attr_desc = sfe_dma_attr_desc;
2202 
2203 		gcp->gc_dma_attr_txbuf = sfe_dma_attr_buf;
2204 		gcp->gc_dma_attr_txbuf.dma_attr_align = gcp->gc_tx_buf_align+1;
2205 		gcp->gc_dma_attr_txbuf.dma_attr_sgllen = gcp->gc_tx_max_frags;
2206 
2207 		gcp->gc_dma_attr_rxbuf = sfe_dma_attr_buf;
2208 		gcp->gc_dma_attr_rxbuf.dma_attr_align = gcp->gc_rx_buf_align+1;
2209 		gcp->gc_dma_attr_rxbuf.dma_attr_sgllen = gcp->gc_rx_max_frags;
2210 
2211 		/* time out parameters */
2212 		gcp->gc_tx_timeout = 3*ONESEC;
2213 		gcp->gc_tx_timeout_interval = ONESEC;
2214 		if (p->chip_type == CHIPTYPE_DP83815) {
2215 			/* workaround for tx hang */
2216 			gcp->gc_tx_timeout_interval = ONESEC/20; /* 50mS */
2217 		}
2218 
2219 		/* MII timeout parameters */
2220 		gcp->gc_mii_link_watch_interval = ONESEC;
2221 		gcp->gc_mii_an_watch_interval   = ONESEC/5;
2222 		gcp->gc_mii_reset_timeout = MII_RESET_TIMEOUT;	/* 1 sec */
2223 		gcp->gc_mii_an_timeout = MII_AN_TIMEOUT;	/* 5 sec */
2224 		gcp->gc_mii_an_wait = 0;
2225 		gcp->gc_mii_linkdown_timeout = MII_LINKDOWN_TIMEOUT;
2226 
2227 		/* setting for general PHY */
2228 		gcp->gc_mii_an_delay = 0;
2229 		gcp->gc_mii_linkdown_action = MII_ACTION_RSA;
2230 		gcp->gc_mii_linkdown_timeout_action = MII_ACTION_RESET;
2231 		gcp->gc_mii_dont_reset = B_FALSE;
2232 
2233 
2234 		/* I/O methods */
2235 
2236 		/* mac operation */
2237 		gcp->gc_attach_chip = &sfe_attach_chip;
2238 		if (p->chip_type == CHIPTYPE_DP83815) {
2239 			gcp->gc_reset_chip = &sfe_reset_chip_dp83815;
2240 		} else {
2241 			gcp->gc_reset_chip = &sfe_reset_chip_sis900;
2242 		}
2243 		gcp->gc_init_chip  = &sfe_init_chip;
2244 		gcp->gc_start_chip = &sfe_start_chip;
2245 		gcp->gc_stop_chip  = &sfe_stop_chip;
2246 #ifdef USE_MULTICAST_HASHTBL
2247 		gcp->gc_multicast_hash = &sfe_mcast_hash;
2248 #endif
2249 		if (p->chip_type == CHIPTYPE_DP83815) {
2250 			gcp->gc_set_rx_filter = &sfe_set_rx_filter_dp83815;
2251 		} else {
2252 			gcp->gc_set_rx_filter = &sfe_set_rx_filter_sis900;
2253 		}
2254 		gcp->gc_set_media = &sfe_set_media;
2255 		gcp->gc_get_stats = &sfe_get_stats;
2256 		gcp->gc_interrupt = &sfe_interrupt;
2257 
2258 		/* descriptor operation */
2259 		gcp->gc_tx_desc_write = &sfe_tx_desc_write;
2260 		gcp->gc_tx_start = &sfe_tx_start;
2261 		gcp->gc_rx_desc_write = &sfe_rx_desc_write;
2262 		gcp->gc_rx_start = NULL;
2263 
2264 		gcp->gc_tx_desc_stat = &sfe_tx_desc_stat;
2265 		gcp->gc_rx_desc_stat = &sfe_rx_desc_stat;
2266 		gcp->gc_tx_desc_init = &sfe_tx_desc_init;
2267 		gcp->gc_rx_desc_init = &sfe_rx_desc_init;
2268 		gcp->gc_tx_desc_clean = &sfe_tx_desc_clean;
2269 		gcp->gc_rx_desc_clean = &sfe_rx_desc_clean;
2270 
2271 		/* mii operations */
2272 		if (p->chip_type == CHIPTYPE_DP83815) {
2273 			gcp->gc_mii_probe = &sfe_mii_probe_dp83815;
2274 			gcp->gc_mii_init = &sfe_mii_init_dp83815;
2275 			gcp->gc_mii_config = &sfe_mii_config_dp83815;
2276 			gcp->gc_mii_sync = &sfe_mii_sync_dp83815;
2277 			gcp->gc_mii_read = &sfe_mii_read_dp83815;
2278 			gcp->gc_mii_write = &sfe_mii_write_dp83815;
2279 			gcp->gc_mii_tune_phy = NULL;
2280 			gcp->gc_flow_control = FLOW_CONTROL_NONE;
2281 		} else {
2282 			gcp->gc_mii_probe = &gem_mii_probe_default;
2283 			gcp->gc_mii_init = NULL;
2284 			gcp->gc_mii_config = &sfe_mii_config_sis900;
2285 			gcp->gc_mii_sync = &sfe_mii_sync_sis900;
2286 			gcp->gc_mii_read = &sfe_mii_read_sis900;
2287 			gcp->gc_mii_write = &sfe_mii_write_sis900;
2288 			gcp->gc_mii_tune_phy = &sfe_set_eq_sis630;
2289 			gcp->gc_flow_control = FLOW_CONTROL_RX_PAUSE;
2290 		}
2291 
2292 		lp = kmem_zalloc(sizeof (*lp), KM_SLEEP);
2293 		lp->chip = p;
2294 		lp->revid = rev;
2295 		lp->our_intr_bits = 0;
2296 		lp->isr_pended = 0;
2297 
2298 		cmn_err(CE_CONT, CONS "%s%d: chip:%s rev:0x%02x",
2299 		    drv_name, unit, p->chip_name, rev);
2300 
2301 		dp = gem_do_attach(dip, 0, gcp, base, &regs_ha,
2302 		    lp, sizeof (*lp));
2303 		kmem_free(gcp, sizeof (*gcp));
2304 
2305 		if (dp == NULL) {
2306 			goto err_freelp;
2307 		}
2308 
2309 		return (DDI_SUCCESS);
2310 
2311 err_freelp:
2312 		kmem_free(lp, sizeof (struct sfe_dev));
2313 err:
2314 		return (DDI_FAILURE);
2315 	}
2316 	return (DDI_FAILURE);
2317 }
2318 
2319 static int
2320 sfedetach(dev_info_t *dip, ddi_detach_cmd_t cmd)
2321 {
2322 	switch (cmd) {
2323 	case DDI_SUSPEND:
2324 		return (gem_suspend(dip));
2325 
2326 	case DDI_DETACH:
2327 		return (gem_do_detach(dip));
2328 	}
2329 	return (DDI_FAILURE);
2330 }
2331 
2332 /*
2333  * quiesce(9E) entry point.
2334  *
2335  * This function is called when the system is single-threaded at high
2336  * PIL with preemption disabled. Therefore, this function must not be
2337  * blocked.
2338  *
2339  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
2340  * DDI_FAILURE indicates an error condition and should almost never happen.
2341  */
2342 #ifdef	__sparc
2343 #define	sfe_quiesce	ddi_quiesce_not_supported
2344 #else
2345 static int
2346 sfe_quiesce(dev_info_t *dip)
2347 {
2348 	struct gem_dev	*dp;
2349 	int	ret = 0;
2350 
2351 	dp = GEM_GET_DEV(dip);
2352 
2353 	if (dp == NULL)
2354 		return (DDI_FAILURE);
2355 
2356 	ret = sfe_stop_chip_quiesce(dp);
2357 
2358 	return (ret);
2359 }
2360 #endif
2361 
2362 /* ======================================================== */
2363 /*
2364  * OS depend (loadable streams driver) routine
2365  */
2366 /* ======================================================== */
2367 DDI_DEFINE_STREAM_OPS(sfe_ops, nulldev, nulldev, sfeattach, sfedetach,
2368 	nodev, NULL, D_MP, NULL, sfe_quiesce);
2369 
2370 static struct modldrv modldrv = {
2371 	&mod_driverops,	/* Type of module.  This one is a driver */
2372 	ident,
2373 	&sfe_ops,	/* driver ops */
2374 };
2375 
2376 static struct modlinkage modlinkage = {
2377 	MODREV_1, &modldrv, NULL
2378 };
2379 
2380 /* ======================================================== */
2381 /*
2382  * Loadable module support
2383  */
2384 /* ======================================================== */
2385 int
2386 _init(void)
2387 {
2388 	int 	status;
2389 
2390 	DPRINTF(2, (CE_CONT, CONS "sfe: _init: called"));
2391 	gem_mod_init(&sfe_ops, "sfe");
2392 	status = mod_install(&modlinkage);
2393 	if (status != DDI_SUCCESS) {
2394 		gem_mod_fini(&sfe_ops);
2395 	}
2396 	return (status);
2397 }
2398 
2399 /*
2400  * _fini : done
2401  */
2402 int
2403 _fini(void)
2404 {
2405 	int	status;
2406 
2407 	DPRINTF(2, (CE_CONT, CONS "sfe: _fini: called"));
2408 	status = mod_remove(&modlinkage);
2409 	if (status == DDI_SUCCESS) {
2410 		gem_mod_fini(&sfe_ops);
2411 	}
2412 	return (status);
2413 }
2414 
2415 int
2416 _info(struct modinfo *modinfop)
2417 {
2418 	return (mod_info(&modlinkage, modinfop));
2419 }
2420