OpenGrok

Cross Reference: sfe.c
xref: /onnv/onnv-gate/usr/src/uts/common/io/sfe/sfe.c
Home | History | Annotate | Line # | Download | only in sfe
      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