Home | History | Annotate | Download | only in bfe
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 #include <sys/stream.h>
     27 #include <sys/strsun.h>
     28 #include <sys/stat.h>
     29 #include <sys/pci.h>
     30 #include <sys/modctl.h>
     31 #include <sys/kstat.h>
     32 #include <sys/ethernet.h>
     33 #include <sys/devops.h>
     34 #include <sys/debug.h>
     35 #include <sys/conf.h>
     36 #include <sys/sysmacros.h>
     37 #include <sys/dditypes.h>
     38 #include <sys/ddi.h>
     39 #include <sys/sunddi.h>
     40 #include <sys/miiregs.h>
     41 #include <sys/byteorder.h>
     42 #include <sys/cyclic.h>
     43 #include <sys/note.h>
     44 #include <sys/crc32.h>
     45 #include <sys/mac_provider.h>
     46 #include <sys/mac_ether.h>
     47 #include <sys/vlan.h>
     48 #include <sys/errno.h>
     49 #include <sys/sdt.h>
     50 #include <sys/strsubr.h>
     51 
     52 #include "bfe.h"
     53 #include "bfe_hw.h"
     54 
     55 
     56 /*
     57  * Broadcom BCM4401 chipsets use two rings :
     58  *
     59  * - One TX : For sending packets down the wire.
     60  * - One RX : For receving packets.
     61  *
     62  * Each ring can have any number of descriptors (configured during attach).
     63  * As of now we configure only 128 descriptor per ring (TX/RX). Each descriptor
     64  * has address (desc_addr) and control (desc_ctl) which holds a DMA buffer for
     65  * the packet and control information (like start/end of frame or end of table).
     66  * The descriptor table is allocated first and then a DMA buffer (for a packet)
     67  * is allocated and linked to each descriptor.
     68  *
     69  * Each descriptor entry is bfe_desc_t structure in bfe. During TX/RX
     70  * interrupt, the stat register will point to current descriptor being
     71  * processed.
     72  *
     73  * Here's an example of TX and RX ring :
     74  *
     75  * TX:
     76  *
     77  *   Base of the descriptor table is programmed using BFE_DMATX_CTRL control
     78  *   register. Each 'addr' points to DMA buffer (or packet data buffer) to
     79  *   be transmitted and 'ctl' has the length of the packet (usually MTU).
     80  *
     81  *  ----------------------|
     82  *  | addr |Descriptor 0  |
     83  *  | ctl  |              |
     84  *  ----------------------|
     85  *  | addr |Descriptor 1  |    SOF (start of the frame)
     86  *  | ctl  |              |
     87  *  ----------------------|
     88  *  | ...  |Descriptor... |    EOF (end of the frame)
     89  *  | ...  |              |
     90  *  ----------------------|
     91  *  | addr |Descritor 127 |
     92  *  | ctl  | EOT          |    EOT (End of Table)
     93  *  ----------------------|
     94  *
     95  * 'r_curr_desc'  : pointer to current descriptor which can be used to transmit
     96  *                  a packet.
     97  * 'r_avail_desc' : decremented whenever a packet is being sent.
     98  * 'r_cons_desc'  : incremented whenever a packet is sent down the wire and
     99  *                  notified by an interrupt to bfe driver.
    100  *
    101  * RX:
    102  *
    103  *   Base of the descriptor table is programmed using BFE_DMARX_CTRL control
    104  *   register. Each 'addr' points to DMA buffer (or packet data buffer). 'ctl'
    105  *   contains the size of the DMA buffer and all the DMA buffers are
    106  *   pre-allocated during attach and hence the maxmium size of the packet is
    107  *   also known (r_buf_len from the bfe_rint_t structure). During RX interrupt
    108  *   the packet length is embedded in bfe_header_t which is added by the
    109  *   chip in the beginning of the packet.
    110  *
    111  *  ----------------------|
    112  *  | addr |Descriptor 0  |
    113  *  | ctl  |              |
    114  *  ----------------------|
    115  *  | addr |Descriptor 1  |
    116  *  | ctl  |              |
    117  *  ----------------------|
    118  *  | ...  |Descriptor... |
    119  *  | ...  |              |
    120  *  ----------------------|
    121  *  | addr |Descriptor 127|
    122  *  | ctl  | EOT          |    EOT (End of Table)
    123  *  ----------------------|
    124  *
    125  * 'r_curr_desc'  : pointer to current descriptor while receving a packet.
    126  *
    127  */
    128 
    129 #define	MODULE_NAME	"bfe"
    130 
    131 /*
    132  * Used for checking PHY (link state, speed)
    133  */
    134 #define	BFE_TIMEOUT_INTERVAL	(1000 * 1000 * 1000)
    135 
    136 
    137 /*
    138  * Chip restart action and reason for restart
    139  */
    140 #define	BFE_ACTION_RESTART		0x1	/* For restarting the chip */
    141 #define	BFE_ACTION_RESTART_SETPROP	0x2	/* restart due to setprop */
    142 #define	BFE_ACTION_RESTART_FAULT	0x4	/* restart due to fault */
    143 #define	BFE_ACTION_RESTART_PKT		0x8	/* restart due to pkt timeout */
    144 
    145 static	char	bfe_ident[] = "bfe driver for Broadcom BCM4401 chipsets";
    146 
    147 /*
    148  * Function Prototypes for bfe driver.
    149  */
    150 static	int	bfe_check_link(bfe_t *);
    151 static	void	bfe_report_link(bfe_t *);
    152 static	void	bfe_chip_halt(bfe_t *);
    153 static	void	bfe_chip_reset(bfe_t *);
    154 static	void	bfe_tx_desc_init(bfe_ring_t *);
    155 static	void	bfe_rx_desc_init(bfe_ring_t *);
    156 static	void	bfe_set_rx_mode(bfe_t *);
    157 static	void	bfe_enable_chip_intrs(bfe_t *);
    158 static	void	bfe_chip_restart(bfe_t *);
    159 static	void	bfe_init_vars(bfe_t *);
    160 static	void	bfe_clear_stats(bfe_t *);
    161 static	void	bfe_gather_stats(bfe_t *);
    162 static	void	bfe_error(dev_info_t *, char *, ...);
    163 static	int	bfe_mac_getprop(void *, const char *, mac_prop_id_t, uint_t,
    164     uint_t, void *, uint_t *);
    165 static	int	bfe_mac_setprop(void *, const char *, mac_prop_id_t, uint_t,
    166     const void *);
    167 static	int	bfe_tx_reclaim(bfe_ring_t *);
    168 int	bfe_mac_set_ether_addr(void *, const uint8_t *);
    169 
    170 
    171 /*
    172  * Macros for ddi_dma_sync().
    173  */
    174 #define	SYNC_DESC(r, s, l, d)	\
    175 	(void) ddi_dma_sync(r->r_desc_dma_handle, \
    176 	    (off_t)(s * sizeof (bfe_desc_t)), \
    177 	    (size_t)(l * sizeof (bfe_desc_t)), \
    178 	    d)
    179 
    180 #define	SYNC_BUF(r, s, b, l, d) \
    181 	(void) ddi_dma_sync(r->r_buf_dma[s].handle, \
    182 	    (off_t)(b), (size_t)(l), d)
    183 
    184 /*
    185  * Supported Broadcom BCM4401 Cards.
    186  */
    187 static bfe_cards_t bfe_cards[] = {
    188 	{ 0x14e4, 0x170c, "BCM4401 100Base-TX"},
    189 };
    190 
    191 
    192 /*
    193  * DMA attributes for device registers, packet data (buffer) and
    194  * descriptor table.
    195  */
    196 static struct ddi_device_acc_attr bfe_dev_attr = {
    197 	DDI_DEVICE_ATTR_V0,
    198 	DDI_STRUCTURE_LE_ACC,
    199 	DDI_STRICTORDER_ACC
    200 };
    201 
    202 static struct ddi_device_acc_attr bfe_buf_attr = {
    203 	DDI_DEVICE_ATTR_V0,
    204 	DDI_NEVERSWAP_ACC,	/* native endianness */
    205 	DDI_STRICTORDER_ACC
    206 };
    207 
    208 static ddi_dma_attr_t bfe_dma_attr_buf = {
    209 	DMA_ATTR_V0,		/* dma_attr_version */
    210 	0,			/* dma_attr_addr_lo */
    211 	BFE_PCI_DMA - 1,	/* dma_attr_addr_hi */
    212 	0x1fff,			/* dma_attr_count_max */
    213 	8,			/* dma_attr_align */
    214 	0,			/* dma_attr_burstsizes */
    215 	1,			/* dma_attr_minxfer */
    216 	0x1fff,			/* dma_attr_maxxfer */
    217 	BFE_PCI_DMA - 1,	/* dma_attr_seg */
    218 	1,			/* dma_attr_sgllen */
    219 	1,			/* dma_attr_granular */
    220 	0			/* dma_attr_flags */
    221 };
    222 
    223 static ddi_dma_attr_t bfe_dma_attr_desc = {
    224 	DMA_ATTR_V0,		/* dma_attr_version */
    225 	0,			/* dma_attr_addr_lo */
    226 	BFE_PCI_DMA - 1,	/* dma_attr_addr_hi */
    227 	BFE_PCI_DMA - 1,	/* dma_attr_count_max */
    228 	BFE_DESC_ALIGN,		/* dma_attr_align */
    229 	0,			/* dma_attr_burstsizes */
    230 	1,			/* dma_attr_minxfer */
    231 	BFE_PCI_DMA - 1,	/* dma_attr_maxxfer */
    232 	BFE_PCI_DMA - 1,	/* dma_attr_seg */
    233 	1,			/* dma_attr_sgllen */
    234 	1,			/* dma_attr_granular */
    235 	0			/* dma_attr_flags */
    236 };
    237 
    238 /*
    239  * Ethernet broadcast addresses.
    240  */
    241 static uchar_t bfe_broadcast[ETHERADDRL] = {
    242 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
    243 };
    244 
    245 #define	ASSERT_ALL_LOCKS(bfe) {	\
    246 	ASSERT(mutex_owned(&bfe->bfe_tx_ring.r_lock));	\
    247 	ASSERT(rw_write_held(&bfe->bfe_rwlock));	\
    248 }
    249 
    250 /*
    251  * Debugging and error reproting code.
    252  */
    253 static void
    254 bfe_error(dev_info_t *dip, char *fmt, ...)
    255 {
    256 	va_list ap;
    257 	char	buf[256];
    258 
    259 	va_start(ap, fmt);
    260 	(void) vsnprintf(buf, sizeof (buf), fmt, ap);
    261 	va_end(ap);
    262 
    263 	if (dip) {
    264 		cmn_err(CE_WARN, "%s%d: %s",
    265 		    ddi_driver_name(dip), ddi_get_instance(dip), buf);
    266 	} else {
    267 		cmn_err(CE_WARN, "bfe: %s", buf);
    268 	}
    269 }
    270 
    271 /*
    272  * Grabs all necessary locks to block any other operation on the chip.
    273  */
    274 static void
    275 bfe_grab_locks(bfe_t *bfe)
    276 {
    277 	bfe_ring_t *tx = &bfe->bfe_tx_ring;
    278 
    279 	/*
    280 	 * Grab all the locks.
    281 	 * - bfe_rwlock : locks down whole chip including RX.
    282 	 * - tx's r_lock : locks down only TX side.
    283 	 */
    284 	rw_enter(&bfe->bfe_rwlock, RW_WRITER);
    285 	mutex_enter(&tx->r_lock);
    286 
    287 	/*
    288 	 * Note that we don't use RX's r_lock.
    289 	 */
    290 }
    291 
    292 /*
    293  * Release lock on chip/drver.
    294  */
    295 static void
    296 bfe_release_locks(bfe_t *bfe)
    297 {
    298 	bfe_ring_t *tx = &bfe->bfe_tx_ring;
    299 
    300 	/*
    301 	 * Release all the locks in the order in which they were grabbed.
    302 	 */
    303 	mutex_exit(&tx->r_lock);
    304 	rw_exit(&bfe->bfe_rwlock);
    305 }
    306 
    307 
    308 /*
    309  * It's used to make sure that the write to device register was successful.
    310  */
    311 static int
    312 bfe_wait_bit(bfe_t *bfe, uint32_t reg, uint32_t bit,
    313     ulong_t t, const int clear)
    314 {
    315 	ulong_t i;
    316 	uint32_t v;
    317 
    318 	for (i = 0; i < t; i++) {
    319 		v = INL(bfe, reg);
    320 
    321 		if (clear && !(v & bit))
    322 			break;
    323 
    324 		if (!clear && (v & bit))
    325 			break;
    326 
    327 		drv_usecwait(10);
    328 	}
    329 
    330 	/* if device still didn't see the value */
    331 	if (i == t)
    332 		return (-1);
    333 
    334 	return (0);
    335 }
    336 
    337 /*
    338  * PHY functions (read, write, stop, reset and startup)
    339  */
    340 static int
    341 bfe_read_phy(bfe_t *bfe, uint32_t reg)
    342 {
    343 	OUTL(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII);
    344 	OUTL(bfe, BFE_MDIO_DATA, (BFE_MDIO_SB_START |
    345 	    (BFE_MDIO_OP_READ << BFE_MDIO_OP_SHIFT) |
    346 	    (bfe->bfe_phy_addr << BFE_MDIO_PMD_SHIFT) |
    347 	    (reg << BFE_MDIO_RA_SHIFT) |
    348 	    (BFE_MDIO_TA_VALID << BFE_MDIO_TA_SHIFT)));
    349 
    350 	(void) bfe_wait_bit(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 10, 0);
    351 
    352 	return ((INL(bfe, BFE_MDIO_DATA) & BFE_MDIO_DATA_DATA));
    353 }
    354 
    355 static void
    356 bfe_write_phy(bfe_t *bfe, uint32_t reg, uint32_t val)
    357 {
    358 	OUTL(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII);
    359 	OUTL(bfe,  BFE_MDIO_DATA, (BFE_MDIO_SB_START |
    360 	    (BFE_MDIO_OP_WRITE << BFE_MDIO_OP_SHIFT) |
    361 	    (bfe->bfe_phy_addr << BFE_MDIO_PMD_SHIFT) |
    362 	    (reg << BFE_MDIO_RA_SHIFT) |
    363 	    (BFE_MDIO_TA_VALID << BFE_MDIO_TA_SHIFT) |
    364 	    (val & BFE_MDIO_DATA_DATA)));
    365 
    366 	(void) bfe_wait_bit(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 10, 0);
    367 }
    368 
    369 /*
    370  * It resets the PHY layer.
    371  */
    372 static int
    373 bfe_reset_phy(bfe_t *bfe)
    374 {
    375 	uint32_t i;
    376 
    377 	bfe_write_phy(bfe, MII_CONTROL, MII_CONTROL_RESET);
    378 	drv_usecwait(100);
    379 	for (i = 0; i < 10; i++) {
    380 		if (bfe_read_phy(bfe, MII_CONTROL) &
    381 		    MII_CONTROL_RESET) {
    382 			drv_usecwait(500);
    383 			continue;
    384 		}
    385 
    386 		break;
    387 	}
    388 
    389 	if (i == 10) {
    390 		bfe_error(bfe->bfe_dip, "Timeout waiting for PHY to reset");
    391 		bfe->bfe_phy_state = BFE_PHY_RESET_TIMEOUT;
    392 		return (BFE_FAILURE);
    393 	}
    394 
    395 	bfe->bfe_phy_state = BFE_PHY_RESET_DONE;
    396 
    397 	return (BFE_SUCCESS);
    398 }
    399 
    400 /*
    401  * Make sure timer function is out of our way and especially during
    402  * detach.
    403  */
    404 static void
    405 bfe_stop_timer(bfe_t *bfe)
    406 {
    407 	if (bfe->bfe_periodic_id) {
    408 		ddi_periodic_delete(bfe->bfe_periodic_id);
    409 		bfe->bfe_periodic_id = NULL;
    410 	}
    411 }
    412 
    413 /*
    414  * Stops the PHY
    415  */
    416 static void
    417 bfe_stop_phy(bfe_t *bfe)
    418 {
    419 	bfe_write_phy(bfe, MII_CONTROL, MII_CONTROL_PWRDN |
    420 	    MII_CONTROL_ISOLATE);
    421 
    422 	bfe->bfe_chip.link = LINK_STATE_UNKNOWN;
    423 	bfe->bfe_chip.speed = 0;
    424 	bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN;
    425 
    426 	bfe->bfe_phy_state = BFE_PHY_STOPPED;
    427 
    428 	/*
    429 	 * Report the link status to MAC layer.
    430 	 */
    431 	if (bfe->bfe_machdl != NULL)
    432 		(void) bfe_report_link(bfe);
    433 }
    434 
    435 static int
    436 bfe_probe_phy(bfe_t *bfe)
    437 {
    438 	int phy;
    439 	uint32_t status;
    440 
    441 	if (bfe->bfe_phy_addr) {
    442 		status = bfe_read_phy(bfe, MII_STATUS);
    443 		if (status != 0xffff && status != 0) {
    444 			bfe_write_phy(bfe, MII_CONTROL, 0);
    445 			return (BFE_SUCCESS);
    446 		}
    447 	}
    448 
    449 	for (phy = 0; phy < 32; phy++) {
    450 		bfe->bfe_phy_addr = phy;
    451 		status = bfe_read_phy(bfe, MII_STATUS);
    452 		if (status != 0xffff && status != 0) {
    453 			bfe_write_phy(bfe, MII_CONTROL, 0);
    454 			return (BFE_SUCCESS);
    455 		}
    456 	}
    457 
    458 	return (BFE_FAILURE);
    459 }
    460 
    461 /*
    462  * This timeout function fires at BFE_TIMEOUT_INTERVAL to check the link
    463  * status.
    464  */
    465 static void
    466 bfe_timeout(void *arg)
    467 {
    468 	bfe_t *bfe = (bfe_t *)arg;
    469 	int resched = 0;
    470 
    471 	/*
    472 	 * We don't grab any lock because bfe can't go away.
    473 	 * untimeout() will wait for this timeout instance to complete.
    474 	 */
    475 	if (bfe->bfe_chip_action & BFE_ACTION_RESTART) {
    476 		/*
    477 		 * Restart the chip.
    478 		 */
    479 		bfe_grab_locks(bfe);
    480 		bfe_chip_restart(bfe);
    481 		bfe->bfe_chip_action &= ~BFE_ACTION_RESTART;
    482 		bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_FAULT;
    483 		bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_PKT;
    484 		bfe_release_locks(bfe);
    485 		mac_tx_update(bfe->bfe_machdl);
    486 		/* Restart will register a new timeout */
    487 		return;
    488 	}
    489 
    490 	rw_enter(&bfe->bfe_rwlock, RW_READER);
    491 
    492 	if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) {
    493 		hrtime_t hr;
    494 
    495 		hr = gethrtime();
    496 		if (bfe->bfe_tx_stall_time != 0 &&
    497 		    hr > bfe->bfe_tx_stall_time) {
    498 			DTRACE_PROBE2(chip__restart, int, bfe->bfe_unit,
    499 			    char *, "pkt timeout");
    500 			bfe->bfe_chip_action |=
    501 			    (BFE_ACTION_RESTART | BFE_ACTION_RESTART_PKT);
    502 			bfe->bfe_tx_stall_time = 0;
    503 		}
    504 	}
    505 
    506 	if (bfe->bfe_phy_state == BFE_PHY_STARTED) {
    507 		/*
    508 		 * Report the link status to MAC layer if link status changed.
    509 		 */
    510 		if (bfe_check_link(bfe)) {
    511 			bfe_report_link(bfe);
    512 			if (bfe->bfe_chip.link == LINK_STATE_UP) {
    513 				uint32_t val, flow;
    514 
    515 				val = INL(bfe, BFE_TX_CTRL);
    516 				val &= ~BFE_TX_DUPLEX;
    517 				if (bfe->bfe_chip.duplex == LINK_DUPLEX_FULL) {
    518 					val |= BFE_TX_DUPLEX;
    519 					flow = INL(bfe, BFE_RXCONF);
    520 					flow &= ~BFE_RXCONF_FLOW;
    521 					OUTL(bfe, BFE_RXCONF, flow);
    522 
    523 					flow = INL(bfe, BFE_MAC_FLOW);
    524 					flow &= ~(BFE_FLOW_RX_HIWAT);
    525 					OUTL(bfe, BFE_MAC_FLOW, flow);
    526 				}
    527 
    528 				resched = 1;
    529 
    530 				OUTL(bfe, BFE_TX_CTRL, val);
    531 				DTRACE_PROBE1(link__up,
    532 				    int, bfe->bfe_unit);
    533 			}
    534 		}
    535 	}
    536 
    537 	rw_exit(&bfe->bfe_rwlock);
    538 
    539 	if (resched)
    540 		mac_tx_update(bfe->bfe_machdl);
    541 }
    542 
    543 /*
    544  * Starts PHY layer.
    545  */
    546 static int
    547 bfe_startup_phy(bfe_t *bfe)
    548 {
    549 	uint16_t bmsr, bmcr, anar;
    550 	int	prog, s;
    551 	int phyid1, phyid2;
    552 
    553 	if (bfe_probe_phy(bfe) == BFE_FAILURE) {
    554 		bfe->bfe_phy_state = BFE_PHY_NOTFOUND;
    555 		return (BFE_FAILURE);
    556 	}
    557 
    558 	(void) bfe_reset_phy(bfe);
    559 
    560 	phyid1 = bfe_read_phy(bfe, MII_PHYIDH);
    561 	phyid2 = bfe_read_phy(bfe, MII_PHYIDL);
    562 	bfe->bfe_phy_id = (phyid1 << 16) | phyid2;
    563 
    564 	bmsr = bfe_read_phy(bfe, MII_STATUS);
    565 	anar = bfe_read_phy(bfe, MII_AN_ADVERT);
    566 
    567 again:
    568 	anar &= ~(MII_ABILITY_100BASE_T4 |
    569 	    MII_ABILITY_100BASE_TX_FD | MII_ABILITY_100BASE_TX |
    570 	    MII_ABILITY_10BASE_T_FD | MII_ABILITY_10BASE_T);
    571 
    572 	/*
    573 	 * Supported hardware modes are in bmsr.
    574 	 */
    575 	bfe->bfe_chip.bmsr = bmsr;
    576 
    577 	/*
    578 	 * Assume no capabilities are supported in the hardware.
    579 	 */
    580 	bfe->bfe_cap_aneg = bfe->bfe_cap_100T4 =
    581 	    bfe->bfe_cap_100fdx = bfe->bfe_cap_100hdx =
    582 	    bfe->bfe_cap_10fdx = bfe->bfe_cap_10hdx = 0;
    583 
    584 	/*
    585 	 * Assume property is set.
    586 	 */
    587 	s = 1;
    588 	if (!(bfe->bfe_chip_action & BFE_ACTION_RESTART_SETPROP)) {
    589 		/*
    590 		 * Property is not set which means bfe_mac_setprop()
    591 		 * is not called on us.
    592 		 */
    593 		s = 0;
    594 	}
    595 
    596 	bmcr = prog = 0;
    597 
    598 	if (bmsr & MII_STATUS_100_BASEX_FD) {
    599 		bfe->bfe_cap_100fdx = 1;
    600 		if (s == 0) {
    601 			anar |= MII_ABILITY_100BASE_TX_FD;
    602 			bfe->bfe_adv_100fdx = 1;
    603 			prog++;
    604 		} else if (bfe->bfe_adv_100fdx) {
    605 			anar |= MII_ABILITY_100BASE_TX_FD;
    606 			prog++;
    607 		}
    608 	}
    609 
    610 	if (bmsr & MII_STATUS_100_BASE_T4) {
    611 		bfe->bfe_cap_100T4 = 1;
    612 		if (s == 0) {
    613 			anar |= MII_ABILITY_100BASE_T4;
    614 			bfe->bfe_adv_100T4 = 1;
    615 			prog++;
    616 		} else if (bfe->bfe_adv_100T4) {
    617 			anar |= MII_ABILITY_100BASE_T4;
    618 			prog++;
    619 		}
    620 	}
    621 
    622 	if (bmsr & MII_STATUS_100_BASEX) {
    623 		bfe->bfe_cap_100hdx = 1;
    624 		if (s == 0) {
    625 			anar |= MII_ABILITY_100BASE_TX;
    626 			bfe->bfe_adv_100hdx = 1;
    627 			prog++;
    628 		} else if (bfe->bfe_adv_100hdx) {
    629 			anar |= MII_ABILITY_100BASE_TX;
    630 			prog++;
    631 		}
    632 	}
    633 
    634 	if (bmsr & MII_STATUS_10_FD) {
    635 		bfe->bfe_cap_10fdx = 1;
    636 		if (s == 0) {
    637 			anar |= MII_ABILITY_10BASE_T_FD;
    638 			bfe->bfe_adv_10fdx = 1;
    639 			prog++;
    640 		} else if (bfe->bfe_adv_10fdx) {
    641 			anar |= MII_ABILITY_10BASE_T_FD;
    642 			prog++;
    643 		}
    644 	}
    645 
    646 	if (bmsr & MII_STATUS_10) {
    647 		bfe->bfe_cap_10hdx = 1;
    648 		if (s == 0) {
    649 			anar |= MII_ABILITY_10BASE_T;
    650 			bfe->bfe_adv_10hdx = 1;
    651 			prog++;
    652 		} else if (bfe->bfe_adv_10hdx) {
    653 			anar |= MII_ABILITY_10BASE_T;
    654 			prog++;
    655 		}
    656 	}
    657 
    658 	if (bmsr & MII_STATUS_CANAUTONEG) {
    659 		bfe->bfe_cap_aneg = 1;
    660 		if (s == 0) {
    661 			bfe->bfe_adv_aneg = 1;
    662 		}
    663 	}
    664 
    665 	if (prog == 0) {
    666 		if (s == 0) {
    667 			bfe_error(bfe->bfe_dip,
    668 			    "No valid link mode selected. Powering down PHY");
    669 			bfe_stop_phy(bfe);
    670 			bfe_report_link(bfe);
    671 			return (BFE_FAILURE);
    672 		}
    673 
    674 		/*
    675 		 * If property is set then user would have goofed up. So we
    676 		 * go back to default properties.
    677 		 */
    678 		bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_SETPROP;
    679 		goto again;
    680 	}
    681 
    682 	if (bfe->bfe_adv_aneg && (bmsr & MII_STATUS_CANAUTONEG)) {
    683 		bmcr = (MII_CONTROL_ANE | MII_CONTROL_RSAN);
    684 	} else {
    685 		if (bfe->bfe_adv_100fdx)
    686 			bmcr = (MII_CONTROL_100MB | MII_CONTROL_FDUPLEX);
    687 		else if (bfe->bfe_adv_100hdx)
    688 			bmcr = MII_CONTROL_100MB;
    689 		else if (bfe->bfe_adv_10fdx)
    690 			bmcr = MII_CONTROL_FDUPLEX;
    691 		else
    692 			bmcr = 0;		/* 10HDX */
    693 	}
    694 
    695 	if (prog)
    696 		bfe_write_phy(bfe, MII_AN_ADVERT, anar);
    697 
    698 	if (bmcr)
    699 		bfe_write_phy(bfe, MII_CONTROL, bmcr);
    700 
    701 	bfe->bfe_mii_anar = anar;
    702 	bfe->bfe_mii_bmcr = bmcr;
    703 	bfe->bfe_phy_state = BFE_PHY_STARTED;
    704 
    705 	if (bfe->bfe_periodic_id == NULL) {
    706 		bfe->bfe_periodic_id = ddi_periodic_add(bfe_timeout,
    707 		    (void *)bfe, BFE_TIMEOUT_INTERVAL, DDI_IPL_0);
    708 
    709 		DTRACE_PROBE1(first__timeout, int, bfe->bfe_unit);
    710 	}
    711 
    712 	DTRACE_PROBE4(phy_started, int, bfe->bfe_unit,
    713 	    int, bmsr, int, bmcr, int, anar);
    714 
    715 	return (BFE_SUCCESS);
    716 }
    717 
    718 /*
    719  * Reports link status back to MAC Layer.
    720  */
    721 static void
    722 bfe_report_link(bfe_t *bfe)
    723 {
    724 	mac_link_update(bfe->bfe_machdl, bfe->bfe_chip.link);
    725 }
    726 
    727 /*
    728  * Reads PHY/MII registers and get the link status for us.
    729  */
    730 static int
    731 bfe_check_link(bfe_t *bfe)
    732 {
    733 	uint16_t bmsr, bmcr, anar, anlpar;
    734 	int speed, duplex, link;
    735 
    736 	speed = bfe->bfe_chip.speed;
    737 	duplex = bfe->bfe_chip.duplex;
    738 	link = bfe->bfe_chip.link;
    739 
    740 	bmsr = bfe_read_phy(bfe, MII_STATUS);
    741 	bfe->bfe_mii_bmsr = bmsr;
    742 
    743 	bmcr = bfe_read_phy(bfe, MII_CONTROL);
    744 
    745 	anar = bfe_read_phy(bfe, MII_AN_ADVERT);
    746 	bfe->bfe_mii_anar = anar;
    747 
    748 	anlpar = bfe_read_phy(bfe, MII_AN_LPABLE);
    749 	bfe->bfe_mii_anlpar = anlpar;
    750 
    751 	bfe->bfe_mii_exp = bfe_read_phy(bfe, MII_AN_EXPANSION);
    752 
    753 	/*
    754 	 * If exp register is not present in PHY.
    755 	 */
    756 	if (bfe->bfe_mii_exp == 0xffff) {
    757 		bfe->bfe_mii_exp = 0;
    758 	}
    759 
    760 	if ((bmsr & MII_STATUS_LINKUP) == 0) {
    761 		bfe->bfe_chip.link = LINK_STATE_DOWN;
    762 		bfe->bfe_chip.speed = 0;
    763 		bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN;
    764 		goto done;
    765 	}
    766 
    767 	bfe->bfe_chip.link = LINK_STATE_UP;
    768 
    769 	if (!(bmcr & MII_CONTROL_ANE)) {
    770 		/* Forced mode */
    771 		if (bmcr & MII_CONTROL_100MB)
    772 			bfe->bfe_chip.speed = 100000000;
    773 		else
    774 			bfe->bfe_chip.speed = 10000000;
    775 
    776 		if (bmcr & MII_CONTROL_FDUPLEX)
    777 			bfe->bfe_chip.duplex = LINK_DUPLEX_FULL;
    778 		else
    779 			bfe->bfe_chip.duplex = LINK_DUPLEX_HALF;
    780 
    781 	} else if ((!(bmsr & MII_STATUS_CANAUTONEG)) ||
    782 	    (!(bmsr & MII_STATUS_ANDONE))) {
    783 		bfe->bfe_chip.speed = 0;
    784 		bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN;
    785 	} else if (anar & anlpar & MII_ABILITY_100BASE_TX_FD) {
    786 		bfe->bfe_chip.speed = 100000000;
    787 		bfe->bfe_chip.duplex = LINK_DUPLEX_FULL;
    788 	} else if (anar & anlpar & MII_ABILITY_100BASE_T4) {
    789 		bfe->bfe_chip.speed = 100000000;
    790 		bfe->bfe_chip.duplex = LINK_DUPLEX_HALF;
    791 	} else if (anar & anlpar & MII_ABILITY_100BASE_TX) {
    792 		bfe->bfe_chip.speed = 100000000;
    793 		bfe->bfe_chip.duplex = LINK_DUPLEX_HALF;
    794 	} else if (anar & anlpar & MII_ABILITY_10BASE_T_FD) {
    795 		bfe->bfe_chip.speed = 10000000;
    796 		bfe->bfe_chip.duplex = LINK_DUPLEX_FULL;
    797 	} else if (anar & anlpar & MII_ABILITY_10BASE_T) {
    798 		bfe->bfe_chip.speed = 10000000;
    799 		bfe->bfe_chip.duplex = LINK_DUPLEX_HALF;
    800 	} else {
    801 		bfe->bfe_chip.speed = 0;
    802 		bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN;
    803 	}
    804 
    805 done:
    806 	/*
    807 	 * If speed or link status or duplex mode changed then report to
    808 	 * MAC layer which is done by the caller.
    809 	 */
    810 	if (speed != bfe->bfe_chip.speed ||
    811 	    duplex != bfe->bfe_chip.duplex ||
    812 	    link != bfe->bfe_chip.link) {
    813 		return (1);
    814 	}
    815 
    816 	return (0);
    817 }
    818 
    819 static void
    820 bfe_cam_write(bfe_t *bfe, uchar_t *d, int index)
    821 {
    822 	uint32_t v;
    823 
    824 	v = ((uint32_t)d[2] << 24);
    825 	v |= ((uint32_t)d[3] << 16);
    826 	v |= ((uint32_t)d[4] << 8);
    827 	v |= (uint32_t)d[5];
    828 
    829 	OUTL(bfe, BFE_CAM_DATA_LO, v);
    830 	v = (BFE_CAM_HI_VALID |
    831 	    (((uint32_t)d[0]) << 8) |
    832 	    (((uint32_t)d[1])));
    833 
    834 	OUTL(bfe, BFE_CAM_DATA_HI, v);
    835 	OUTL(bfe, BFE_CAM_CTRL, (BFE_CAM_WRITE |
    836 	    ((uint32_t)index << BFE_CAM_INDEX_SHIFT)));
    837 	(void) bfe_wait_bit(bfe, BFE_CAM_CTRL, BFE_CAM_BUSY, 10, 1);
    838 }
    839 
    840 /*
    841  * Chip related functions (halt, reset, start).
    842  */
    843 static void
    844 bfe_chip_halt(bfe_t *bfe)
    845 {
    846 	/*
    847 	 * Disables interrupts.
    848 	 */
    849 	OUTL(bfe, BFE_INTR_MASK, 0);
    850 	FLUSH(bfe, BFE_INTR_MASK);
    851 
    852 	OUTL(bfe,  BFE_ENET_CTRL, BFE_ENET_DISABLE);
    853 
    854 	/*
    855 	 * Wait until TX and RX finish their job.
    856 	 */
    857 	(void) bfe_wait_bit(bfe, BFE_ENET_CTRL, BFE_ENET_DISABLE, 20, 1);
    858 
    859 	/*
    860 	 * Disables DMA engine.
    861 	 */
    862 	OUTL(bfe, BFE_DMARX_CTRL, 0);
    863 	OUTL(bfe, BFE_DMATX_CTRL, 0);
    864 
    865 	drv_usecwait(10);
    866 
    867 	bfe->bfe_chip_state = BFE_CHIP_HALT;
    868 }
    869 
    870 static void
    871 bfe_chip_restart(bfe_t *bfe)
    872 {
    873 	DTRACE_PROBE2(chip__restart, int, bfe->bfe_unit,
    874 	    int, bfe->bfe_chip_action);
    875 
    876 	/*
    877 	 * Halt chip and PHY.
    878 	 */
    879 	bfe_chip_halt(bfe);
    880 	bfe_stop_phy(bfe);
    881 	bfe->bfe_chip_state = BFE_CHIP_STOPPED;
    882 
    883 	/*
    884 	 * Init variables.
    885 	 */
    886 	bfe_init_vars(bfe);
    887 
    888 	/*
    889 	 * Reset chip and start PHY.
    890 	 */
    891 	bfe_chip_reset(bfe);
    892 
    893 	/*
    894 	 * DMA descriptor rings.
    895 	 */
    896 	bfe_tx_desc_init(&bfe->bfe_tx_ring);
    897 	bfe_rx_desc_init(&bfe->bfe_rx_ring);
    898 
    899 	bfe->bfe_chip_state = BFE_CHIP_ACTIVE;
    900 	bfe_set_rx_mode(bfe);
    901 	bfe_enable_chip_intrs(bfe);
    902 }
    903 
    904 /*
    905  * Disables core by stopping the clock.
    906  */
    907 static void
    908 bfe_core_disable(bfe_t *bfe)
    909 {
    910 	if ((INL(bfe, BFE_SBTMSLOW) & BFE_RESET))
    911 		return;
    912 
    913 	OUTL(bfe, BFE_SBTMSLOW, (BFE_REJECT | BFE_CLOCK));
    914 	(void) bfe_wait_bit(bfe, BFE_SBTMSLOW, BFE_REJECT, 100, 0);
    915 	(void) bfe_wait_bit(bfe, BFE_SBTMSHIGH, BFE_BUSY, 100, 1);
    916 	OUTL(bfe, BFE_SBTMSLOW, (BFE_FGC | BFE_CLOCK | BFE_REJECT | BFE_RESET));
    917 	FLUSH(bfe, BFE_SBTMSLOW);
    918 	drv_usecwait(10);
    919 	OUTL(bfe, BFE_SBTMSLOW, (BFE_REJECT | BFE_RESET));
    920 	drv_usecwait(10);
    921 }
    922 
    923 /*
    924  * Resets core.
    925  */
    926 static void
    927 bfe_core_reset(bfe_t *bfe)
    928 {
    929 	uint32_t val;
    930 
    931 	/*
    932 	 * First disable the core.
    933 	 */
    934 	bfe_core_disable(bfe);
    935 
    936 	OUTL(bfe, BFE_SBTMSLOW, (BFE_RESET | BFE_CLOCK | BFE_FGC));
    937 	FLUSH(bfe, BFE_SBTMSLOW);
    938 	drv_usecwait(1);
    939 
    940 	if (INL(bfe, BFE_SBTMSHIGH) & BFE_SERR)
    941 		OUTL(bfe, BFE_SBTMSHIGH, 0);
    942 
    943 	val = INL(bfe, BFE_SBIMSTATE);
    944 	if (val & (BFE_IBE | BFE_TO))
    945 		OUTL(bfe, BFE_SBIMSTATE, val & ~(BFE_IBE | BFE_TO));
    946 
    947 	OUTL(bfe, BFE_SBTMSLOW, (BFE_CLOCK | BFE_FGC));
    948 	FLUSH(bfe, BFE_SBTMSLOW);
    949 	drv_usecwait(1);
    950 
    951 	OUTL(bfe, BFE_SBTMSLOW, BFE_CLOCK);
    952 	FLUSH(bfe, BFE_SBTMSLOW);
    953 	drv_usecwait(1);
    954 }
    955 
    956 static void
    957 bfe_setup_config(bfe_t *bfe, uint32_t cores)
    958 {
    959 	uint32_t bar_orig, val;
    960 
    961 	/*
    962 	 * Change bar0 window to map sbtopci registers.
    963 	 */
    964 	bar_orig = pci_config_get32(bfe->bfe_conf_handle, BFE_BAR0_WIN);
    965 	pci_config_put32(bfe->bfe_conf_handle, BFE_BAR0_WIN, BFE_REG_PCI);
    966 
    967 	/* Just read it and don't do anything */
    968 	val = INL(bfe, BFE_SBIDHIGH) & BFE_IDH_CORE;
    969 
    970 	val = INL(bfe, BFE_SBINTVEC);
    971 	val |= cores;
    972 	OUTL(bfe, BFE_SBINTVEC, val);
    973 
    974 	val = INL(bfe, BFE_SSB_PCI_TRANS_2);
    975 	val |= BFE_SSB_PCI_PREF | BFE_SSB_PCI_BURST;
    976 	OUTL(bfe, BFE_SSB_PCI_TRANS_2, val);
    977 
    978 	/*
    979 	 * Restore bar0 window mapping.
    980 	 */
    981 	pci_config_put32(bfe->bfe_conf_handle, BFE_BAR0_WIN, bar_orig);
    982 }
    983 
    984 /*
    985  * Resets chip and starts PHY.
    986  */
    987 static void
    988 bfe_chip_reset(bfe_t *bfe)
    989 {
    990 	uint32_t val;
    991 
    992 	/* Set the interrupt vector for the enet core */
    993 	bfe_setup_config(bfe, BFE_INTVEC_ENET0);
    994 
    995 	/* check if core is up */
    996 	val = INL(bfe, BFE_SBTMSLOW) &
    997 	    (BFE_RESET | BFE_REJECT | BFE_CLOCK);
    998 
    999 	if (val == BFE_CLOCK) {
   1000 		OUTL(bfe, BFE_RCV_LAZY, 0);
   1001 		OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_DISABLE);
   1002 		(void) bfe_wait_bit(bfe, BFE_ENET_CTRL,
   1003 		    BFE_ENET_DISABLE, 10, 1);
   1004 		OUTL(bfe, BFE_DMATX_CTRL, 0);
   1005 		FLUSH(bfe, BFE_DMARX_STAT);
   1006 		drv_usecwait(20000);	/* 20 milli seconds */
   1007 		if (INL(bfe, BFE_DMARX_STAT) & BFE_STAT_EMASK) {
   1008 			(void) bfe_wait_bit(bfe, BFE_DMARX_STAT, BFE_STAT_SIDLE,
   1009 			    10, 0);
   1010 		}
   1011 		OUTL(bfe, BFE_DMARX_CTRL, 0);
   1012 	}
   1013 
   1014 	bfe_core_reset(bfe);
   1015 	bfe_clear_stats(bfe);
   1016 
   1017 	OUTL(bfe, BFE_MDIO_CTRL, 0x8d);
   1018 	val = INL(bfe, BFE_DEVCTRL);
   1019 	if (!(val & BFE_IPP))
   1020 		OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_EPSEL);
   1021 	else if (INL(bfe, BFE_DEVCTRL & BFE_EPR)) {
   1022 		OUTL_AND(bfe, BFE_DEVCTRL, ~BFE_EPR);
   1023 		drv_usecwait(20000);    /* 20 milli seconds */
   1024 	}
   1025 
   1026 	OUTL_OR(bfe, BFE_MAC_CTRL, BFE_CTRL_CRC32_ENAB | BFE_CTRL_LED);
   1027 
   1028 	OUTL_AND(bfe, BFE_MAC_CTRL, ~BFE_CTRL_PDOWN);
   1029 
   1030 	OUTL(bfe, BFE_RCV_LAZY, ((1 << BFE_LAZY_FC_SHIFT) &
   1031 	    BFE_LAZY_FC_MASK));
   1032 
   1033 	OUTL_OR(bfe, BFE_RCV_LAZY, 0);
   1034 
   1035 	OUTL(bfe, BFE_RXMAXLEN, bfe->bfe_rx_ring.r_buf_len);
   1036 	OUTL(bfe, BFE_TXMAXLEN, bfe->bfe_tx_ring.r_buf_len);
   1037 
   1038 	OUTL(bfe, BFE_TX_WMARK, 56);
   1039 
   1040 	/* Program DMA channels */
   1041 	OUTL(bfe, BFE_DMATX_CTRL, BFE_TX_CTRL_ENABLE);
   1042 
   1043 	/*
   1044 	 * DMA addresses need to be added to BFE_PCI_DMA
   1045 	 */
   1046 	OUTL(bfe, BFE_DMATX_ADDR,
   1047 	    bfe->bfe_tx_ring.r_desc_cookie.dmac_laddress + BFE_PCI_DMA);
   1048 
   1049 	OUTL(bfe, BFE_DMARX_CTRL, (BFE_RX_OFFSET << BFE_RX_CTRL_ROSHIFT)
   1050 	    | BFE_RX_CTRL_ENABLE);
   1051 
   1052 	OUTL(bfe, BFE_DMARX_ADDR,
   1053 	    bfe->bfe_rx_ring.r_desc_cookie.dmac_laddress + BFE_PCI_DMA);
   1054 
   1055 	(void) bfe_startup_phy(bfe);
   1056 
   1057 	bfe->bfe_chip_state = BFE_CHIP_INITIALIZED;
   1058 }
   1059 
   1060 /*
   1061  * It enables interrupts. Should be the last step while starting chip.
   1062  */
   1063 static void
   1064 bfe_enable_chip_intrs(bfe_t *bfe)
   1065 {
   1066 	/* Enable the chip and core */
   1067 	OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_ENABLE);
   1068 
   1069 	/* Enable interrupts */
   1070 	OUTL(bfe, BFE_INTR_MASK, BFE_IMASK_DEF);
   1071 }
   1072 
   1073 /*
   1074  * Common code to take care of setting RX side mode (filter).
   1075  */
   1076 static void
   1077 bfe_set_rx_mode(bfe_t *bfe)
   1078 {
   1079 	uint32_t val;
   1080 	int i;
   1081 	ether_addr_t mac[ETHERADDRL] = {0, 0, 0, 0, 0, 0};
   1082 
   1083 	/*
   1084 	 * We don't touch RX filter if we were asked to suspend. It's fine
   1085 	 * if chip is not active (no interface is plumbed on us).
   1086 	 */
   1087 	if (bfe->bfe_chip_state == BFE_CHIP_SUSPENDED)
   1088 		return;
   1089 
   1090 	val = INL(bfe, BFE_RXCONF);
   1091 
   1092 	val &= ~BFE_RXCONF_PROMISC;
   1093 	val &= ~BFE_RXCONF_DBCAST;
   1094 
   1095 	if ((bfe->bfe_chip_mode & BFE_RX_MODE_ENABLE) == 0) {
   1096 		OUTL(bfe, BFE_CAM_CTRL, 0);
   1097 		FLUSH(bfe, BFE_CAM_CTRL);
   1098 	} else if (bfe->bfe_chip_mode & BFE_RX_MODE_PROMISC) {
   1099 		val |= BFE_RXCONF_PROMISC;
   1100 		val &= ~BFE_RXCONF_DBCAST;
   1101 	} else {
   1102 		if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) {
   1103 			/* Flush everything */
   1104 			OUTL(bfe, BFE_RXCONF, val |
   1105 			    BFE_RXCONF_PROMISC | BFE_RXCONF_ALLMULTI);
   1106 			FLUSH(bfe, BFE_RXCONF);
   1107 		}
   1108 
   1109 		/* Disable CAM */
   1110 		OUTL(bfe, BFE_CAM_CTRL, 0);
   1111 		FLUSH(bfe, BFE_CAM_CTRL);
   1112 
   1113 		/*
   1114 		 * We receive all multicast packets.
   1115 		 */
   1116 		val |= BFE_RXCONF_ALLMULTI;
   1117 
   1118 		for (i = 0; i < BFE_MAX_MULTICAST_TABLE - 1; i++) {
   1119 			bfe_cam_write(bfe, (uchar_t *)mac, i);
   1120 		}
   1121 
   1122 		bfe_cam_write(bfe, bfe->bfe_ether_addr, i);
   1123 
   1124 		/* Enable CAM */
   1125 		OUTL_OR(bfe, BFE_CAM_CTRL, BFE_CAM_ENABLE);
   1126 		FLUSH(bfe, BFE_CAM_CTRL);
   1127 	}
   1128 
   1129 	DTRACE_PROBE2(rx__mode__filter, int, bfe->bfe_unit,
   1130 	    int, val);
   1131 
   1132 	OUTL(bfe, BFE_RXCONF, val);
   1133 	FLUSH(bfe, BFE_RXCONF);
   1134 }
   1135 
   1136 /*
   1137  * Reset various variable values to initial state.
   1138  */
   1139 static void
   1140 bfe_init_vars(bfe_t *bfe)
   1141 {
   1142 	bfe->bfe_chip_mode = BFE_RX_MODE_ENABLE;
   1143 
   1144 	/* Initial assumption */
   1145 	bfe->bfe_chip.link = LINK_STATE_UNKNOWN;
   1146 	bfe->bfe_chip.speed = 0;
   1147 	bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN;
   1148 
   1149 	bfe->bfe_periodic_id = NULL;
   1150 	bfe->bfe_chip_state = BFE_CHIP_UNINITIALIZED;
   1151 
   1152 	bfe->bfe_tx_stall_time = 0;
   1153 }
   1154 
   1155 /*
   1156  * Initializes TX side descriptor entries (bfe_desc_t). Each descriptor entry
   1157  * has control (desc_ctl) and address (desc_addr) member.
   1158  */
   1159 static void
   1160 bfe_tx_desc_init(bfe_ring_t *r)
   1161 {
   1162 	int i;
   1163 	uint32_t v;
   1164 
   1165 	for (i = 0; i < r->r_ndesc; i++) {
   1166 		PUT_DESC(r, (uint32_t *)&(r->r_desc[i].desc_ctl),
   1167 		    (r->r_buf_dma[i].len & BFE_DESC_LEN));
   1168 
   1169 		/*
   1170 		 * DMA addresses need to be added to BFE_PCI_DMA
   1171 		 */
   1172 		PUT_DESC(r, (uint32_t *)&(r->r_desc[i].desc_addr),
   1173 		    (r->r_buf_dma[i].cookie.dmac_laddress + BFE_PCI_DMA));
   1174 	}
   1175 
   1176 	v = GET_DESC(r, (uint32_t *)&(r->r_desc[i - 1].desc_ctl));
   1177 	PUT_DESC(r, (uint32_t *)&(r->r_desc[i - 1].desc_ctl),
   1178 	    v | BFE_DESC_EOT);
   1179 
   1180 	(void) SYNC_DESC(r, 0, r->r_ndesc, DDI_DMA_SYNC_FORDEV);
   1181 
   1182 	r->r_curr_desc = 0;
   1183 	r->r_avail_desc = TX_NUM_DESC;
   1184 	r->r_cons_desc = 0;
   1185 }
   1186 
   1187 /*
   1188  * Initializes RX side descriptor entries (bfe_desc_t). Each descriptor entry
   1189  * has control (desc_ctl) and address (desc_addr) member.
   1190  */
   1191 static void
   1192 bfe_rx_desc_init(bfe_ring_t *r)
   1193 {
   1194 	int i;
   1195 	uint32_t v;
   1196 
   1197 	for (i = 0; i < r->r_ndesc; i++) {
   1198 		PUT_DESC(r, (uint32_t *)&(r->r_desc[i].desc_ctl),
   1199 		    (r->r_buf_dma[i].len& BFE_DESC_LEN));
   1200 
   1201 		PUT_DESC(r, (uint32_t *)&(r->r_desc[i].desc_addr),
   1202 		    (r->r_buf_dma[i].cookie.dmac_laddress + BFE_PCI_DMA));
   1203 
   1204 		/* Initialize rx header (len, flags) */
   1205 		bzero(r->r_buf_dma[i].addr, sizeof (bfe_rx_header_t));
   1206 
   1207 		(void) SYNC_BUF(r, i, 0, sizeof (bfe_rx_header_t),
   1208 		    DDI_DMA_SYNC_FORDEV);
   1209 	}
   1210 
   1211 	v = GET_DESC(r, (uint32_t *)&(r->r_desc[i - 1].desc_ctl));
   1212 	PUT_DESC(r, (uint32_t *)&(r->r_desc[i - 1].desc_ctl),
   1213 	    v | BFE_DESC_EOT);
   1214 
   1215 	(void) SYNC_DESC(r, 0, r->r_ndesc, DDI_DMA_SYNC_FORDEV);
   1216 
   1217 	/* TAIL of RX Descriptor */
   1218 	OUTL(r->r_bfe, BFE_DMARX_PTR, ((i) * sizeof (bfe_desc_t)));
   1219 
   1220 	r->r_curr_desc = 0;
   1221 	r->r_avail_desc = RX_NUM_DESC;
   1222 }
   1223 
   1224 static int
   1225 bfe_chip_start(bfe_t *bfe)
   1226 {
   1227 	ASSERT_ALL_LOCKS(bfe);
   1228 
   1229 	/*
   1230 	 * Stop the chip first & then Reset the chip. At last enable interrupts.
   1231 	 */
   1232 	bfe_chip_halt(bfe);
   1233 	bfe_stop_phy(bfe);
   1234 
   1235 	/*
   1236 	 * Reset chip and start PHY.
   1237 	 */
   1238 	bfe_chip_reset(bfe);
   1239 
   1240 	/*
   1241 	 * Initailize Descriptor Rings.
   1242 	 */
   1243 	bfe_tx_desc_init(&bfe->bfe_tx_ring);
   1244 	bfe_rx_desc_init(&bfe->bfe_rx_ring);
   1245 
   1246 	bfe->bfe_chip_state = BFE_CHIP_ACTIVE;
   1247 	bfe->bfe_chip_mode |= BFE_RX_MODE_ENABLE;
   1248 	bfe_set_rx_mode(bfe);
   1249 	bfe_enable_chip_intrs(bfe);
   1250 
   1251 	/* Check link, speed and duplex mode */
   1252 	(void) bfe_check_link(bfe);
   1253 
   1254 	return (DDI_SUCCESS);
   1255 }
   1256 
   1257 
   1258 /*
   1259  * Clear chip statistics.
   1260  */
   1261 static void
   1262 bfe_clear_stats(bfe_t *bfe)
   1263 {
   1264 	ulong_t r;
   1265 
   1266 	OUTL(bfe, BFE_MIB_CTRL, BFE_MIB_CLR_ON_READ);
   1267 
   1268 	/*
   1269 	 * Stat registers are cleared by reading.
   1270 	 */
   1271 	for (r = BFE_TX_GOOD_O; r <= BFE_TX_PAUSE; r += 4)
   1272 		(void) INL(bfe, r);
   1273 
   1274 	for (r = BFE_RX_GOOD_O; r <= BFE_RX_NPAUSE; r += 4)
   1275 		(void) INL(bfe, r);
   1276 }
   1277 
   1278 /*
   1279  * Collect chip statistics.
   1280  */
   1281 static void
   1282 bfe_gather_stats(bfe_t *bfe)
   1283 {
   1284 	ulong_t r;
   1285 	uint32_t *v;
   1286 	uint32_t txerr = 0, rxerr = 0, coll = 0;
   1287 
   1288 	v = &bfe->bfe_hw_stats.tx_good_octets;
   1289 	for (r = BFE_TX_GOOD_O; r <= BFE_TX_PAUSE; r += 4) {
   1290 		*v += INL(bfe, r);
   1291 		v++;
   1292 	}
   1293 
   1294 	v = &bfe->bfe_hw_stats.rx_good_octets;
   1295 	for (r = BFE_RX_GOOD_O; r <= BFE_RX_NPAUSE; r += 4) {
   1296 		*v += INL(bfe, r);
   1297 		v++;
   1298 	}
   1299 
   1300 	/*
   1301 	 * TX :
   1302 	 * -------
   1303 	 * tx_good_octets, tx_good_pkts, tx_octets
   1304 	 * tx_pkts, tx_broadcast_pkts, tx_multicast_pkts
   1305 	 * tx_len_64, tx_len_65_to_127, tx_len_128_to_255
   1306 	 * tx_len_256_to_511, tx_len_512_to_1023, tx_len_1024_to_max
   1307 	 * tx_jabber_pkts, tx_oversize_pkts, tx_fragment_pkts
   1308 	 * tx_underruns, tx_total_cols, tx_single_cols
   1309 	 * tx_multiple_cols, tx_excessive_cols, tx_late_cols
   1310 	 * tx_defered, tx_carrier_lost, tx_pause_pkts
   1311 	 *
   1312 	 * RX :
   1313 	 * -------
   1314 	 * rx_good_octets, rx_good_pkts, rx_octets
   1315 	 * rx_pkts, rx_broadcast_pkts, rx_multicast_pkts
   1316 	 * rx_len_64, rx_len_65_to_127, rx_len_128_to_255
   1317 	 * rx_len_256_to_511, rx_len_512_to_1023, rx_len_1024_to_max
   1318 	 * rx_jabber_pkts, rx_oversize_pkts, rx_fragment_pkts
   1319 	 * rx_missed_pkts, rx_crc_align_errs, rx_undersize
   1320 	 * rx_crc_errs, rx_align_errs, rx_symbol_errs
   1321 	 * rx_pause_pkts, rx_nonpause_pkts
   1322 	 */
   1323 
   1324 	bfe->bfe_stats.ether_stat_carrier_errors =
   1325 	    bfe->bfe_hw_stats.tx_carrier_lost;
   1326 
   1327 	/* txerr += bfe->bfe_hw_stats.tx_carrier_lost; */
   1328 
   1329 	bfe->bfe_stats.ether_stat_ex_collisions =
   1330 	    bfe->bfe_hw_stats.tx_excessive_cols;
   1331 	txerr += bfe->bfe_hw_stats.tx_excessive_cols;
   1332 	coll += bfe->bfe_hw_stats.tx_excessive_cols;
   1333 
   1334 	bfe->bfe_stats.ether_stat_fcs_errors =
   1335 	    bfe->bfe_hw_stats.rx_crc_errs;
   1336 	rxerr += bfe->bfe_hw_stats.rx_crc_errs;
   1337 
   1338 	bfe->bfe_stats.ether_stat_first_collisions =
   1339 	    bfe->bfe_hw_stats.tx_single_cols;
   1340 	coll += bfe->bfe_hw_stats.tx_single_cols;
   1341 	bfe->bfe_stats.ether_stat_multi_collisions =
   1342 	    bfe->bfe_hw_stats.tx_multiple_cols;
   1343 	coll += bfe->bfe_hw_stats.tx_multiple_cols;
   1344 
   1345 	bfe->bfe_stats.ether_stat_toolong_errors =
   1346 	    bfe->bfe_hw_stats.rx_oversize_pkts;
   1347 	rxerr += bfe->bfe_hw_stats.rx_oversize_pkts;
   1348 
   1349 	bfe->bfe_stats.ether_stat_tooshort_errors =
   1350 	    bfe->bfe_hw_stats.rx_undersize;
   1351 	rxerr += bfe->bfe_hw_stats.rx_undersize;
   1352 
   1353 	bfe->bfe_stats.ether_stat_tx_late_collisions +=
   1354 	    bfe->bfe_hw_stats.tx_late_cols;
   1355 
   1356 	bfe->bfe_stats.ether_stat_defer_xmts +=
   1357 	    bfe->bfe_hw_stats.tx_defered;
   1358 
   1359 	bfe->bfe_stats.ether_stat_macrcv_errors += rxerr;
   1360 	bfe->bfe_stats.ether_stat_macxmt_errors += txerr;
   1361 
   1362 	bfe->bfe_stats.collisions += coll;
   1363 }
   1364 
   1365 /*
   1366  * Gets the state for dladm command and all.
   1367  */
   1368 int
   1369 bfe_mac_getstat(void *arg, uint_t stat, uint64_t *val)
   1370 {
   1371 	bfe_t *bfe = (bfe_t *)arg;
   1372 	uint64_t	v;
   1373 	int err = 0;
   1374 
   1375 	rw_enter(&bfe->bfe_rwlock, RW_READER);
   1376 
   1377 
   1378 	switch (stat) {
   1379 	default:
   1380 		err = ENOTSUP;
   1381 		break;
   1382 
   1383 	case MAC_STAT_IFSPEED:
   1384 		/*
   1385 		 * MAC layer will ask for IFSPEED first and hence we
   1386 		 * collect it only once.
   1387 		 */
   1388 		if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) {
   1389 			/*
   1390 			 * Update stats from the hardware.
   1391 			 */
   1392 			bfe_gather_stats(bfe);
   1393 		}
   1394 		v = bfe->bfe_chip.speed;
   1395 		break;
   1396 
   1397 	case ETHER_STAT_ADV_CAP_100T4:
   1398 		v = bfe->bfe_adv_100T4;
   1399 		break;
   1400 
   1401 	case ETHER_STAT_ADV_CAP_100FDX:
   1402 		v = (bfe->bfe_mii_anar & MII_ABILITY_100BASE_TX_FD) != 0;
   1403 		break;
   1404 
   1405 	case ETHER_STAT_ADV_CAP_100HDX:
   1406 		v = (bfe->bfe_mii_anar & MII_ABILITY_100BASE_TX) != 0;
   1407 		break;
   1408 
   1409 	case ETHER_STAT_ADV_CAP_10FDX:
   1410 		v = (bfe->bfe_mii_anar & MII_ABILITY_10BASE_T_FD) != 0;
   1411 		break;
   1412 
   1413 	case ETHER_STAT_ADV_CAP_10HDX:
   1414 		v = (bfe->bfe_mii_anar & MII_ABILITY_10BASE_T) != 0;
   1415 		break;
   1416 
   1417 	case ETHER_STAT_ADV_CAP_ASMPAUSE:
   1418 		v = 0;
   1419 		break;
   1420 
   1421 	case ETHER_STAT_ADV_CAP_AUTONEG:
   1422 		v = bfe->bfe_adv_aneg;
   1423 		break;
   1424 
   1425 	case ETHER_STAT_ADV_CAP_PAUSE:
   1426 		v = (bfe->bfe_mii_anar & MII_ABILITY_PAUSE) != 0;
   1427 		break;
   1428 
   1429 	case ETHER_STAT_ADV_REMFAULT:
   1430 		v = (bfe->bfe_mii_anar & MII_AN_ADVERT_REMFAULT) != 0;
   1431 		break;
   1432 
   1433 	case ETHER_STAT_ALIGN_ERRORS:
   1434 		/* MIB */
   1435 		v = bfe->bfe_stats.ether_stat_align_errors;
   1436 		break;
   1437 
   1438 	case ETHER_STAT_CAP_100T4:
   1439 		v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASE_T4) != 0;
   1440 		break;
   1441 
   1442 	case ETHER_STAT_CAP_100FDX:
   1443 		v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASEX_FD) != 0;
   1444 		break;
   1445 
   1446 	case ETHER_STAT_CAP_100HDX:
   1447 		v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASEX) != 0;
   1448 		break;
   1449 
   1450 	case ETHER_STAT_CAP_10FDX:
   1451 		v = (bfe->bfe_mii_bmsr & MII_STATUS_10_FD) != 0;
   1452 		break;
   1453 
   1454 	case ETHER_STAT_CAP_10HDX:
   1455 		v = (bfe->bfe_mii_bmsr & MII_STATUS_10) != 0;
   1456 		break;
   1457 
   1458 	case ETHER_STAT_CAP_ASMPAUSE:
   1459 		v = 0;
   1460 		break;
   1461 
   1462 	case ETHER_STAT_CAP_AUTONEG:
   1463 		v = ((bfe->bfe_mii_bmsr & MII_STATUS_CANAUTONEG) != 0);
   1464 		break;
   1465 
   1466 	case ETHER_STAT_CAP_PAUSE:
   1467 		v = 1;
   1468 		break;
   1469 
   1470 	case ETHER_STAT_CAP_REMFAULT:
   1471 		v = (bfe->bfe_mii_bmsr & MII_STATUS_REMFAULT) != 0;
   1472 		break;
   1473 
   1474 	case ETHER_STAT_CARRIER_ERRORS:
   1475 		v = bfe->bfe_stats.ether_stat_carrier_errors;
   1476 		break;
   1477 
   1478 	case ETHER_STAT_JABBER_ERRORS:
   1479 		err = ENOTSUP;
   1480 		break;
   1481 
   1482 	case ETHER_STAT_DEFER_XMTS:
   1483 		v = bfe->bfe_stats.ether_stat_defer_xmts;
   1484 		break;
   1485 
   1486 	case ETHER_STAT_EX_COLLISIONS:
   1487 		/* MIB */
   1488 		v = bfe->bfe_stats.ether_stat_ex_collisions;
   1489 		break;
   1490 
   1491 	case ETHER_STAT_FCS_ERRORS:
   1492 		/* MIB */
   1493 		v = bfe->bfe_stats.ether_stat_fcs_errors;
   1494 		break;
   1495 
   1496 	case ETHER_STAT_FIRST_COLLISIONS:
   1497 		/* MIB */
   1498 		v = bfe->bfe_stats.ether_stat_first_collisions;
   1499 		break;
   1500 
   1501 	case ETHER_STAT_LINK_ASMPAUSE:
   1502 		v = 0;
   1503 		break;
   1504 
   1505 	case ETHER_STAT_LINK_AUTONEG:
   1506 		v = (bfe->bfe_mii_bmcr & MII_CONTROL_ANE) != 0 &&
   1507 		    (bfe->bfe_mii_bmsr & MII_STATUS_ANDONE) != 0;
   1508 		break;
   1509 
   1510 	case ETHER_STAT_LINK_DUPLEX:
   1511 		v = bfe->bfe_chip.duplex;
   1512 		break;
   1513 
   1514 	case ETHER_STAT_LP_CAP_100T4:
   1515 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_T4) != 0;
   1516 		break;
   1517 
   1518 	case ETHER_STAT_LP_CAP_100FDX:
   1519 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_TX_FD) != 0;
   1520 		break;
   1521 
   1522 	case ETHER_STAT_LP_CAP_100HDX:
   1523 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_TX) != 0;
   1524 		break;
   1525 
   1526 	case ETHER_STAT_LP_CAP_10FDX:
   1527 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_10BASE_T_FD) != 0;
   1528 		break;
   1529 
   1530 	case ETHER_STAT_LP_CAP_10HDX:
   1531 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_10BASE_T) != 0;
   1532 		break;
   1533 
   1534 	case ETHER_STAT_LP_CAP_ASMPAUSE:
   1535 		v = 0;
   1536 		break;
   1537 
   1538 	case ETHER_STAT_LP_CAP_AUTONEG:
   1539 		v = (bfe->bfe_mii_exp & MII_AN_EXP_LPCANAN) != 0;
   1540 		break;
   1541 
   1542 	case ETHER_STAT_LP_CAP_PAUSE:
   1543 		v = (bfe->bfe_mii_anlpar & MII_ABILITY_PAUSE) != 0;
   1544 		break;
   1545 
   1546 	case ETHER_STAT_LP_REMFAULT:
   1547 		v = (bfe->bfe_mii_anlpar & MII_STATUS_REMFAULT) != 0;
   1548 		break;
   1549 
   1550 	case ETHER_STAT_MACRCV_ERRORS:
   1551 		v = bfe->bfe_stats.ether_stat_macrcv_errors;
   1552 		break;
   1553 
   1554 	case ETHER_STAT_MACXMT_ERRORS:
   1555 		v = bfe->bfe_stats.ether_stat_macxmt_errors;
   1556 		break;
   1557 
   1558 	case ETHER_STAT_MULTI_COLLISIONS:
   1559 		v = bfe->bfe_stats.ether_stat_multi_collisions;
   1560 		break;
   1561 
   1562 	case ETHER_STAT_SQE_ERRORS:
   1563 		err = ENOTSUP;
   1564 		break;
   1565 
   1566 	case ETHER_STAT_TOOLONG_ERRORS:
   1567 		v = bfe->bfe_stats.ether_stat_toolong_errors;
   1568 		break;
   1569 
   1570 	case ETHER_STAT_TOOSHORT_ERRORS:
   1571 		v = bfe->bfe_stats.ether_stat_tooshort_errors;
   1572 		break;
   1573 
   1574 	case ETHER_STAT_TX_LATE_COLLISIONS:
   1575 		v = bfe->bfe_stats.ether_stat_tx_late_collisions;
   1576 		break;
   1577 
   1578 	case ETHER_STAT_XCVR_ADDR:
   1579 		v = bfe->bfe_phy_addr;
   1580 		break;
   1581 
   1582 	case ETHER_STAT_XCVR_ID:
   1583 		v = bfe->bfe_phy_id;
   1584 		break;
   1585 
   1586 	case MAC_STAT_BRDCSTRCV:
   1587 		v = bfe->bfe_stats.brdcstrcv;
   1588 		break;
   1589 
   1590 	case MAC_STAT_BRDCSTXMT:
   1591 		v = bfe->bfe_stats.brdcstxmt;
   1592 		break;
   1593 
   1594 	case MAC_STAT_MULTIXMT:
   1595 		v = bfe->bfe_stats.multixmt;
   1596 		break;
   1597 
   1598 	case MAC_STAT_COLLISIONS:
   1599 		v = bfe->bfe_stats.collisions;
   1600 		break;
   1601 
   1602 	case MAC_STAT_IERRORS:
   1603 		v = bfe->bfe_stats.ierrors;
   1604 		break;
   1605 
   1606 	case MAC_STAT_IPACKETS:
   1607 		v = bfe->bfe_stats.ipackets;
   1608 		break;
   1609 
   1610 	case MAC_STAT_MULTIRCV:
   1611 		v = bfe->bfe_stats.multircv;
   1612 		break;
   1613 
   1614 	case MAC_STAT_NORCVBUF:
   1615 		v = bfe->bfe_stats.norcvbuf;
   1616 		break;
   1617 
   1618 	case MAC_STAT_NOXMTBUF:
   1619 		v = bfe->bfe_stats.noxmtbuf;
   1620 		break;
   1621 
   1622 	case MAC_STAT_OBYTES:
   1623 		v = bfe->bfe_stats.obytes;
   1624 		break;
   1625 
   1626 	case MAC_STAT_OERRORS:
   1627 		/* MIB */
   1628 		v = bfe->bfe_stats.ether_stat_macxmt_errors;
   1629 		break;
   1630 
   1631 	case MAC_STAT_OPACKETS:
   1632 		v = bfe->bfe_stats.opackets;
   1633 		break;
   1634 
   1635 	case MAC_STAT_RBYTES:
   1636 		v = bfe->bfe_stats.rbytes;
   1637 		break;
   1638 
   1639 	case MAC_STAT_UNDERFLOWS:
   1640 		v = bfe->bfe_stats.underflows;
   1641 		break;
   1642 
   1643 	case MAC_STAT_OVERFLOWS:
   1644 		v = bfe->bfe_stats.overflows;
   1645 		break;
   1646 	}
   1647 
   1648 	rw_exit(&bfe->bfe_rwlock);
   1649 
   1650 	*val = v;
   1651 	return (err);
   1652 }
   1653 
   1654 /*ARGSUSED*/
   1655 int
   1656 bfe_mac_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t flags,
   1657     uint_t sz, void *val, uint_t *perm)
   1658 {
   1659 	bfe_t		*bfe = (bfe_t *)arg;
   1660 	int		err = 0;
   1661 	boolean_t	dfl = flags & MAC_PROP_DEFAULT;
   1662 
   1663 	if (sz == 0)
   1664 		return (EINVAL);
   1665 
   1666 	*perm = MAC_PROP_PERM_RW;
   1667 	switch (num) {
   1668 	case MAC_PROP_DUPLEX:
   1669 		*perm = MAC_PROP_PERM_READ;
   1670 		if (sz >= sizeof (link_duplex_t)) {
   1671 			bcopy(&bfe->bfe_chip.duplex, val,
   1672 			    sizeof (link_duplex_t));
   1673 		} else {
   1674 			err = EINVAL;
   1675 		}
   1676 		break;
   1677 
   1678 	case MAC_PROP_SPEED:
   1679 		*perm = MAC_PROP_PERM_READ;
   1680 		if (sz >= sizeof (uint64_t)) {
   1681 			bcopy(&bfe->bfe_chip.speed, val, sizeof (uint64_t));
   1682 		} else {
   1683 			err = EINVAL;
   1684 		}
   1685 		break;
   1686 
   1687 	case MAC_PROP_AUTONEG:
   1688 		*(uint8_t *)val =
   1689 		    dfl ? bfe->bfe_cap_aneg : bfe->bfe_adv_aneg;
   1690 		break;
   1691 
   1692 	case MAC_PROP_ADV_100FDX_CAP:
   1693 		*perm = MAC_PROP_PERM_READ;
   1694 		*(uint8_t *)val =
   1695 		    dfl ? bfe->bfe_cap_100fdx : bfe->bfe_adv_100fdx;
   1696 		break;
   1697 	case MAC_PROP_EN_100FDX_CAP:
   1698 		*(uint8_t *)val =
   1699 		    dfl ? bfe->bfe_cap_100fdx : bfe->bfe_adv_100fdx;
   1700 		break;
   1701 
   1702 	case MAC_PROP_ADV_100HDX_CAP:
   1703 		*perm = MAC_PROP_PERM_READ;
   1704 		*(uint8_t *)val =
   1705 		    dfl ? bfe->bfe_cap_100hdx : bfe->bfe_adv_100hdx;
   1706 		break;
   1707 	case MAC_PROP_EN_100HDX_CAP:
   1708 		*(uint8_t *)val =
   1709 		    dfl ? bfe->bfe_cap_100hdx : bfe->bfe_adv_100hdx;
   1710 		break;
   1711 
   1712 	case MAC_PROP_ADV_10FDX_CAP:
   1713 		*perm = MAC_PROP_PERM_READ;
   1714 		*(uint8_t *)val =
   1715 		    dfl ? bfe->bfe_cap_10fdx : bfe->bfe_adv_10fdx;
   1716 		break;
   1717 	case MAC_PROP_EN_10FDX_CAP:
   1718 		*(uint8_t *)val =
   1719 		    dfl ? bfe->bfe_cap_10fdx : bfe->bfe_adv_10fdx;
   1720 		break;
   1721 
   1722 	case MAC_PROP_ADV_10HDX_CAP:
   1723 		*perm = MAC_PROP_PERM_READ;
   1724 		*(uint8_t *)val =
   1725 		    dfl ? bfe->bfe_cap_10hdx : bfe->bfe_adv_10hdx;
   1726 		break;
   1727 	case MAC_PROP_EN_10HDX_CAP:
   1728 		*(uint8_t *)val =
   1729 		    dfl ? bfe->bfe_cap_10hdx : bfe->bfe_adv_10hdx;
   1730 		break;
   1731 
   1732 	case MAC_PROP_ADV_100T4_CAP:
   1733 		*perm = MAC_PROP_PERM_READ;
   1734 		*(uint8_t *)val =
   1735 		    dfl ? bfe->bfe_cap_100T4 : bfe->bfe_adv_100T4;
   1736 		break;
   1737 	case MAC_PROP_EN_100T4_CAP:
   1738 		*(uint8_t *)val =
   1739 		    dfl ? bfe->bfe_cap_100T4 : bfe->bfe_adv_100T4;
   1740 		break;
   1741 
   1742 	default:
   1743 		err = ENOTSUP;
   1744 	}
   1745 
   1746 	return (err);
   1747 }
   1748 
   1749 /*ARGSUSED*/
   1750 int
   1751 bfe_mac_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
   1752     const void *val)
   1753 {
   1754 	bfe_t		*bfe = (bfe_t *)arg;
   1755 	uint8_t		*advp;
   1756 	uint8_t		*capp;
   1757 	int 		r = 0;
   1758 
   1759 	switch (num) {
   1760 	case MAC_PROP_EN_100FDX_CAP:
   1761 		advp = &bfe->bfe_adv_100fdx;
   1762 		capp = &bfe->bfe_cap_100fdx;
   1763 		break;
   1764 
   1765 	case MAC_PROP_EN_100HDX_CAP:
   1766 		advp = &bfe->bfe_adv_100hdx;
   1767 		capp = &bfe->bfe_cap_100hdx;
   1768 		break;
   1769 
   1770 	case MAC_PROP_EN_10FDX_CAP:
   1771 		advp = &bfe->bfe_adv_10fdx;
   1772 		capp = &bfe->bfe_cap_10fdx;
   1773 		break;
   1774 
   1775 	case MAC_PROP_EN_10HDX_CAP:
   1776 		advp = &bfe->bfe_adv_10hdx;
   1777 		capp = &bfe->bfe_cap_10hdx;
   1778 		break;
   1779 
   1780 	case MAC_PROP_EN_100T4_CAP:
   1781 		advp = &bfe->bfe_adv_100T4;
   1782 		capp = &bfe->bfe_cap_100T4;
   1783 		break;
   1784 
   1785 	case MAC_PROP_AUTONEG:
   1786 		advp = &bfe->bfe_adv_aneg;
   1787 		capp = &bfe->bfe_cap_aneg;
   1788 		break;
   1789 
   1790 	default:
   1791 		return (ENOTSUP);
   1792 	}
   1793 
   1794 	if (*capp == 0)
   1795 		return (ENOTSUP);
   1796 
   1797 	bfe_grab_locks(bfe);
   1798 
   1799 	if (*advp != *(const uint8_t *)val) {
   1800 		*advp = *(const uint8_t *)val;
   1801 
   1802 		bfe->bfe_chip_action = BFE_ACTION_RESTART_SETPROP;
   1803 		if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) {
   1804 			/*
   1805 			 * We need to stop the timer before grabbing locks
   1806 			 * otherwise we can land-up in deadlock with untimeout.
   1807 			 */
   1808 			bfe_stop_timer(bfe);
   1809 
   1810 			bfe->bfe_chip_action |= BFE_ACTION_RESTART;
   1811 
   1812 			bfe_chip_restart(bfe);
   1813 
   1814 			/*
   1815 			 * We leave SETPROP because properties can be
   1816 			 * temporary.
   1817 			 */
   1818 			bfe->bfe_chip_action &= ~(BFE_ACTION_RESTART);
   1819 			r = 1;
   1820 		}
   1821 	}
   1822 
   1823 	bfe_release_locks(bfe);
   1824 
   1825 	/* kick-off a potential stopped downstream */
   1826 	if (r)
   1827 		mac_tx_update(bfe->bfe_machdl);
   1828 
   1829 	return (0);
   1830 }
   1831 
   1832 
   1833 int
   1834 bfe_mac_set_ether_addr(void *arg, const uint8_t *ea)
   1835 {
   1836 	bfe_t *bfe = (bfe_t *)arg;
   1837 
   1838 	bfe_grab_locks(bfe);
   1839 	bcopy(ea, bfe->bfe_ether_addr, ETHERADDRL);
   1840 	bfe_set_rx_mode(bfe);
   1841 	bfe_release_locks(bfe);
   1842 	return (0);
   1843 }
   1844 
   1845 int
   1846 bfe_mac_start(void *arg)
   1847 {
   1848 	bfe_t *bfe = (bfe_t *)arg;
   1849 
   1850 	bfe_grab_locks(bfe);
   1851 	if (bfe_chip_start(bfe) == DDI_FAILURE) {
   1852 		bfe_release_locks(bfe);
   1853 		return (EINVAL);
   1854 	}
   1855 
   1856 	bfe_release_locks(bfe);
   1857 
   1858 	mac_tx_update(bfe->bfe_machdl);
   1859 
   1860 	return (0);
   1861 }
   1862 
   1863 void
   1864 bfe_mac_stop(void *arg)
   1865 {
   1866 	bfe_t *bfe = (bfe_t *)arg;
   1867 
   1868 	/*
   1869 	 * We need to stop the timer before grabbing locks otherwise
   1870 	 * we can land-up in deadlock with untimeout.
   1871 	 */
   1872 	bfe_stop_timer(bfe);
   1873 
   1874 	bfe_grab_locks(bfe);
   1875 
   1876 	/*
   1877 	 * First halt the chip by disabling interrupts.
   1878 	 */
   1879 	bfe_chip_halt(bfe);
   1880 	bfe_stop_phy(bfe);
   1881 
   1882 	bfe->bfe_chip_state = BFE_CHIP_STOPPED;
   1883 
   1884 	/*
   1885 	 * This will leave the PHY running.
   1886 	 */
   1887 	bfe_chip_reset(bfe);
   1888 
   1889 	/*
   1890 	 * Disable RX register.
   1891 	 */
   1892 	bfe->bfe_chip_mode &= ~BFE_RX_MODE_ENABLE;
   1893 	bfe_set_rx_mode(bfe);
   1894 
   1895 	bfe_release_locks(bfe);
   1896 }
   1897 
   1898 /*
   1899  * Send a packet down the wire.
   1900  */
   1901 static int
   1902 bfe_send_a_packet(bfe_t *bfe, mblk_t *mp)
   1903 {
   1904 	bfe_ring_t *r = &bfe->bfe_tx_ring;
   1905 	uint32_t cur = r->r_curr_desc;
   1906 	uint32_t next;
   1907 	size_t	pktlen = msgsize(mp);
   1908 	uchar_t *buf;
   1909 	uint32_t v;
   1910 
   1911 	ASSERT(MUTEX_HELD(&r->r_lock));
   1912 	ASSERT(mp != NULL);
   1913 
   1914 	if (pktlen > r->r_buf_len) {
   1915 		freemsg(mp);
   1916 		return (BFE_SUCCESS);
   1917 	}
   1918 
   1919 	/*
   1920 	 * There is a big reason why we don't check for '0'. It becomes easy
   1921 	 * for us to not roll over the ring since we are based on producer (tx)
   1922 	 * and consumer (reclaim by an interrupt) model. Especially when we
   1923 	 * run out of TX descriptor, chip will send a single interrupt and
   1924 	 * both producer and consumer counter will be same. So we keep a
   1925 	 * difference of 1 always.
   1926 	 */
   1927 	if (r->r_avail_desc <= 1) {
   1928 		bfe->bfe_stats.noxmtbuf++;
   1929 		bfe->bfe_tx_resched = 1;
   1930 		return (BFE_FAILURE);
   1931 	}
   1932 
   1933 	/*
   1934 	 * Get the DMA buffer to hold packet.
   1935 	 */
   1936 	buf = (uchar_t *)r->r_buf_dma[cur].addr;
   1937 
   1938 	mcopymsg(mp, buf);	/* it also frees mp */
   1939 
   1940 	/*
   1941 	 * Gather statistics.
   1942 	 */
   1943 	if (buf[0] & 0x1) {
   1944 		if (bcmp(buf, bfe_broadcast, ETHERADDRL) != 0)
   1945 			bfe->bfe_stats.multixmt++;
   1946 		else
   1947 			bfe->bfe_stats.brdcstxmt++;
   1948 	}
   1949 	bfe->bfe_stats.opackets++;
   1950 	bfe->bfe_stats.obytes += pktlen;
   1951 
   1952 
   1953 	/*
   1954 	 * Program the DMA descriptor (start and end of frame are same).
   1955 	 */
   1956 	next = cur;
   1957 	v = (pktlen & BFE_DESC_LEN) | BFE_DESC_IOC | BFE_DESC_SOF |
   1958 	    BFE_DESC_EOF;
   1959 
   1960 	if (cur == (TX_NUM_DESC - 1))
   1961 		v |= BFE_DESC_EOT;
   1962 
   1963 	PUT_DESC(r, (uint32_t *)&(r->r_desc[cur].desc_ctl), v);
   1964 
   1965 	/*
   1966 	 * DMA addresses need to be added to BFE_PCI_DMA
   1967 	 */
   1968 	PUT_DESC(r, (uint32_t *)&(r->r_desc[cur].desc_addr),
   1969 	    (r->r_buf_dma[cur].cookie.dmac_laddress + BFE_PCI_DMA));
   1970 
   1971 	/*
   1972 	 * Sync the packet data for the device.
   1973 	 */
   1974 	(void) SYNC_BUF(r, cur, 0, pktlen, DDI_DMA_SYNC_FORDEV);
   1975 
   1976 	/* Move to next descriptor slot */
   1977 	BFE_INC_SLOT(next, TX_NUM_DESC);
   1978 
   1979 	(void) SYNC_DESC(r, 0, r->r_ndesc, DDI_DMA_SYNC_FORDEV);
   1980 
   1981 	r->r_curr_desc = next;
   1982 
   1983 	/*
   1984 	 * The order should be 1,2,3,... for BFE_DMATX_PTR if 0,1,2,3,...
   1985 	 * descriptor slot are being programmed.
   1986 	 */
   1987 	OUTL(bfe, BFE_DMATX_PTR, next * sizeof (bfe_desc_t));
   1988 	FLUSH(bfe, BFE_DMATX_PTR);
   1989 
   1990 	r->r_avail_desc--;
   1991 
   1992 	/*
   1993 	 * Let timeout know that it must reset the chip if a
   1994 	 * packet is not sent down the wire for more than 5 seconds.
   1995 	 */
   1996 	bfe->bfe_tx_stall_time = gethrtime() + (5 * 1000000000ULL);
   1997 
   1998 	return (BFE_SUCCESS);
   1999 }
   2000 
   2001 mblk_t *
   2002 bfe_mac_transmit_packet(void *arg, mblk_t *mp)
   2003 {
   2004 	bfe_t *bfe = (bfe_t *)arg;
   2005 	bfe_ring_t *r = &bfe->bfe_tx_ring;
   2006 	mblk_t	*nmp;
   2007 
   2008 	mutex_enter(&r->r_lock);
   2009 
   2010 	if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) {
   2011 		DTRACE_PROBE1(tx__chip__not__active, int, bfe->bfe_unit);
   2012 
   2013 		freemsgchain(mp);
   2014 		mutex_exit(&r->r_lock);
   2015 		return (NULL);
   2016 	}
   2017 
   2018 
   2019 	while (mp != NULL) {
   2020 		nmp = mp->b_next;
   2021 		mp->b_next = NULL;
   2022 
   2023 		if (bfe_send_a_packet(bfe, mp) == BFE_FAILURE) {
   2024 			mp->b_next = nmp;
   2025 			break;
   2026 		}
   2027 		mp = nmp;
   2028 	}
   2029 
   2030 	mutex_exit(&r->r_lock);
   2031 
   2032 	return (mp);
   2033 }
   2034 
   2035 int
   2036 bfe_mac_set_promisc(void *arg, boolean_t promiscflag)
   2037 {
   2038 	bfe_t *bfe = (bfe_t *)arg;
   2039 
   2040 	bfe_grab_locks(bfe);
   2041 	if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) {
   2042 		bfe_release_locks(bfe);
   2043 		return (EIO);
   2044 	}
   2045 
   2046 	if (promiscflag) {
   2047 		/* Set Promiscous on */
   2048 		bfe->bfe_chip_mode |= BFE_RX_MODE_PROMISC;
   2049 	} else {
   2050 		bfe->bfe_chip_mode &= ~BFE_RX_MODE_PROMISC;
   2051 	}
   2052 
   2053 	bfe_set_rx_mode(bfe);
   2054 	bfe_release_locks(bfe);
   2055 
   2056 	return (0);
   2057 }
   2058 
   2059 int
   2060 bfe_mac_set_multicast(void *arg, boolean_t add, const uint8_t *macaddr)
   2061 {
   2062 	/*
   2063 	 * It was too much of pain to implement multicast in CAM. Instead
   2064 	 * we never disable multicast filter.
   2065 	 */
   2066 	return (0);
   2067 }
   2068 
   2069 static mac_callbacks_t bfe_mac_callbacks = {
   2070 	MC_SETPROP | MC_GETPROP,
   2071 	bfe_mac_getstat,	/* gets stats */
   2072 	bfe_mac_start,		/* starts mac */
   2073 	bfe_mac_stop,		/* stops mac */
   2074 	bfe_mac_set_promisc,	/* sets promisc mode for snoop */
   2075 	bfe_mac_set_multicast,	/* multicast implementation */
   2076 	bfe_mac_set_ether_addr,	/* sets ethernet address (unicast) */
   2077 	bfe_mac_transmit_packet, /* transmits packet */
   2078 	NULL,			/* ioctl */
   2079 	NULL,			/* getcap */
   2080 	NULL,			/* open */
   2081 	NULL,			/* close */
   2082 	bfe_mac_setprop,
   2083 	bfe_mac_getprop,
   2084 };
   2085 
   2086 static void
   2087 bfe_error_handler(bfe_t *bfe, int intr_mask)
   2088 {
   2089 	uint32_t v;
   2090 
   2091 	if (intr_mask & BFE_ISTAT_RFO) {
   2092 		bfe->bfe_stats.overflows++;
   2093 		bfe->bfe_chip_action |=
   2094 		    (BFE_ACTION_RESTART | BFE_ACTION_RESTART_FAULT);
   2095 		goto action;
   2096 	}
   2097 
   2098 	if (intr_mask & BFE_ISTAT_TFU) {
   2099 		bfe->bfe_stats.underflows++;
   2100 		return;
   2101 	}
   2102 
   2103 	/* Descriptor Protocol Error */
   2104 	if (intr_mask & BFE_ISTAT_DPE) {
   2105 		bfe_error(bfe->bfe_dip,
   2106 		    "Descriptor Protocol Error. Halting Chip");
   2107 		bfe->bfe_chip_action |=
   2108 		    (BFE_ACTION_RESTART | BFE_ACTION_RESTART_FAULT);
   2109 		goto action;
   2110 	}
   2111 
   2112 	/* Descriptor Error */
   2113 	if (intr_mask & BFE_ISTAT_DSCE && halt == 0) {
   2114 		bfe_error(bfe->bfe_dip, "Descriptor Error. Restarting Chip");
   2115 		goto action;
   2116 	}
   2117 
   2118 	/* Receive Descr. Underflow */
   2119 	if (intr_mask & BFE_ISTAT_RDU) {
   2120 		bfe_error(bfe->bfe_dip,
   2121 		    "Receive Descriptor Underflow. Restarting Chip");
   2122 		bfe->bfe_stats.ether_stat_macrcv_errors++;
   2123 		bfe->bfe_chip_action |=
   2124 		    (BFE_ACTION_RESTART | BFE_ACTION_RESTART_FAULT);
   2125 		goto action;
   2126 	}
   2127 
   2128 	v = INL(bfe, BFE_DMATX_STAT);
   2129 
   2130 	/* Error while sending a packet */
   2131 	if (v & BFE_STAT_EMASK) {
   2132 		bfe->bfe_stats.ether_stat_macxmt_errors++;
   2133 		bfe_error(bfe->bfe_dip,
   2134 		    "Error while sending a packet. Restarting Chip");
   2135 	}
   2136 
   2137 	/* Error while receiving a packet */
   2138 	v = INL(bfe, BFE_DMARX_STAT);
   2139 	if (v & BFE_RX_FLAG_ERRORS) {
   2140 		bfe->bfe_stats.ierrors++;
   2141 		bfe_error(bfe->bfe_dip,
   2142 		    "Error while receiving a packet. Restarting Chip");
   2143 	}
   2144 
   2145 
   2146 	bfe->bfe_chip_action |=
   2147 	    (BFE_ACTION_RESTART | BFE_ACTION_RESTART_FAULT);
   2148 
   2149 action:
   2150 	bfe_chip_halt(bfe);
   2151 }
   2152 
   2153 /*
   2154  * It will recycle a RX descriptor slot.
   2155  */
   2156 static void
   2157 bfe_rx_desc_buf_reinit(bfe_t *bfe, uint_t slot)
   2158 {
   2159 	bfe_ring_t *r = &bfe->bfe_rx_ring;
   2160 	uint32_t v;
   2161 
   2162 	slot %= RX_NUM_DESC;
   2163 
   2164 	bzero(r->r_buf_dma[slot].addr, sizeof (bfe_rx_header_t));
   2165 
   2166 	(void) SYNC_BUF(r, slot, 0, BFE_RX_OFFSET, DDI_DMA_SYNC_FORDEV);
   2167 
   2168 	v = r->r_buf_dma[slot].len  & BFE_DESC_LEN;
   2169 	if (slot == (RX_NUM_DESC - 1))
   2170 		v |= BFE_DESC_EOT;
   2171 
   2172 	PUT_DESC(r, (uint32_t *)&(r->r_desc[slot].desc_ctl), v);
   2173 
   2174 	/*
   2175 	 * DMA addresses need to be added to BFE_PCI_DMA
   2176 	 */
   2177 	PUT_DESC(r, (uint32_t *)&(r->r_desc[slot].desc_addr),
   2178 	    (r->r_buf_dma[slot].cookie.dmac_laddress + BFE_PCI_DMA));
   2179 }
   2180 
   2181 /*
   2182  * Gets called from interrupt context to handle RX interrupt.
   2183  */
   2184 static mblk_t *
   2185 bfe_receive(bfe_t *bfe, int intr_mask)
   2186 {
   2187 	int rxstat, current;
   2188 	mblk_t	*mp = NULL, *rx_head, *rx_tail;
   2189 	uchar_t	*rx_header;
   2190 	uint16_t len;
   2191 	uchar_t	*bp;
   2192 	bfe_ring_t *r = &bfe->bfe_rx_ring;
   2193 	int i;
   2194 
   2195 	rxstat = INL(bfe, BFE_DMARX_STAT);
   2196 	current = (rxstat & BFE_STAT_CDMASK) / sizeof (bfe_desc_t);
   2197 	i = r->r_curr_desc;
   2198 
   2199 	rx_head = rx_tail = NULL;
   2200 
   2201 	DTRACE_PROBE3(receive, int, bfe->bfe_unit,
   2202 	    int, r->r_curr_desc,
   2203 	    int, current);
   2204 
   2205 	for (i = r->r_curr_desc; i != current;
   2206 	    BFE_INC_SLOT(i, RX_NUM_DESC)) {
   2207 
   2208 		/*
   2209 		 * Sync the buffer associated with the descriptor table entry.
   2210 		 */
   2211 		(void) SYNC_BUF(r, i, 0, r->r_buf_dma[i].len,
   2212 		    DDI_DMA_SYNC_FORKERNEL);
   2213 
   2214 		rx_header = (void *)r->r_buf_dma[i].addr;
   2215 
   2216 		/*
   2217 		 * We do this to make sure we are endian neutral. Chip is
   2218 		 * big endian.
   2219 		 *
   2220 		 * The header looks like :-
   2221 		 *
   2222 		 *  Offset 0  -> uint16_t len
   2223 		 *  Offset 2  -> uint16_t flags
   2224 		 *  Offset 4  -> uint16_t pad[12]
   2225 		 */
   2226 		len = (rx_header[1] << 8) | rx_header[0];
   2227 		len -= 4;	/* CRC bytes need to be removed */
   2228 
   2229 		/*
   2230 		 * Don't receive this packet if pkt length is greater than
   2231 		 * MTU + VLAN_TAGSZ.
   2232 		 */
   2233 		if (len > r->r_buf_len) {
   2234 			/* Recycle slot for later use */
   2235 			bfe_rx_desc_buf_reinit(bfe, i);
   2236 			continue;
   2237 		}
   2238 
   2239 		if ((mp = allocb(len + VLAN_TAGSZ, BPRI_MED)) != NULL) {
   2240 			mp->b_rptr += VLAN_TAGSZ;
   2241 			bp = mp->b_rptr;
   2242 			mp->b_wptr = bp + len;
   2243 
   2244 			/* sizeof (bfe_rx_header_t) + 2 */
   2245 			bcopy(r->r_buf_dma[i].addr +
   2246 			    BFE_RX_OFFSET, bp, len);
   2247 
   2248 			mp->b_next = NULL;
   2249 			if (rx_tail == NULL)
   2250 				rx_head = rx_tail = mp;
   2251 			else {
   2252 				rx_tail->b_next = mp;
   2253 				rx_tail = mp;
   2254 			}
   2255 
   2256 			/* Number of packets received so far */
   2257 			bfe->bfe_stats.ipackets++;
   2258 
   2259 			/* Total bytes of packets received so far */
   2260 			bfe->bfe_stats.rbytes += len;
   2261 
   2262 			if (bcmp(mp->b_rptr, bfe_broadcast, ETHERADDRL) == 0)
   2263 				bfe->bfe_stats.brdcstrcv++;
   2264 			else
   2265 				bfe->bfe_stats.multircv++;
   2266 		} else {
   2267 			bfe->bfe_stats.norcvbuf++;
   2268 			/* Recycle the slot for later use */
   2269 			bfe_rx_desc_buf_reinit(bfe, i);
   2270 			break;
   2271 		}
   2272 
   2273 		/*
   2274 		 * Reinitialize the current descriptor slot's buffer so that
   2275 		 * it can be reused.
   2276 		 */
   2277 		bfe_rx_desc_buf_reinit(bfe, i);
   2278 	}
   2279 
   2280 	r->r_curr_desc = i;
   2281 
   2282 	(void) SYNC_DESC(r, 0, r->r_ndesc, DDI_DMA_SYNC_FORDEV);
   2283 
   2284 	return (rx_head);
   2285 }
   2286 
   2287 static int
   2288 bfe_tx_reclaim(bfe_ring_t *r)
   2289 {
   2290 	uint32_t cur, start;
   2291 	uint32_t v;
   2292 
   2293 	cur = INL(r->r_bfe, BFE_DMATX_STAT) & BFE_STAT_CDMASK;
   2294 	cur = cur / sizeof (bfe_desc_t);
   2295 
   2296 	/*
   2297 	 * Start with the last descriptor consumed by the chip.
   2298 	 */
   2299 	start = r->r_cons_desc;
   2300 
   2301 	DTRACE_PROBE3(tx__reclaim, int, r->r_bfe->bfe_unit,
   2302 	    int, start,
   2303 	    int, cur);
   2304 
   2305 	/*
   2306 	 * There will be at least one descriptor to process.
   2307 	 */
   2308 	while (start != cur) {
   2309 		r->r_avail_desc++;
   2310 		v = r->r_buf_dma[start].len  & BFE_DESC_LEN;
   2311 		if (start == (TX_NUM_DESC - 1))
   2312 			v |= BFE_DESC_EOT;
   2313 
   2314 		PUT_DESC(r, (uint32_t *)&(r->r_desc[start].desc_ctl), v);
   2315 		PUT_DESC(r, (uint32_t *)&(r->r_desc[start].desc_addr),
   2316 		    (r->r_buf_dma[start].cookie.dmac_laddress + BFE_PCI_DMA));
   2317 
   2318 		/* Move to next descriptor in TX ring */
   2319 		BFE_INC_SLOT(start, TX_NUM_DESC);
   2320 	}
   2321 
   2322 	(void) ddi_dma_sync(r->r_desc_dma_handle,
   2323 	    0, (r->r_ndesc * sizeof (bfe_desc_t)),
   2324 	    DDI_DMA_SYNC_FORDEV);
   2325 
   2326 	r->r_cons_desc = start; 	/* consumed pointer */
   2327 	r->r_bfe->bfe_tx_stall_time = 0;
   2328 
   2329 	return (cur);
   2330 }
   2331 
   2332 static int
   2333 bfe_tx_done(bfe_t *bfe, int intr_mask)
   2334 {
   2335 	bfe_ring_t *r = &bfe->bfe_tx_ring;
   2336 	int resched = 0;
   2337 
   2338 	mutex_enter(&r->r_lock);
   2339 	(void) bfe_tx_reclaim(r);
   2340 
   2341 	if (bfe->bfe_tx_resched) {
   2342 		resched = 1;
   2343 		bfe->bfe_tx_resched = 0;
   2344 	}
   2345 	mutex_exit(&r->r_lock);
   2346 
   2347 	return (resched);
   2348 }
   2349 
   2350 /*
   2351  * ISR for interrupt handling
   2352  */
   2353 static uint_t
   2354 bfe_interrupt(caddr_t arg1, caddr_t arg2)
   2355 {
   2356 	bfe_t *bfe =  (void *)arg1;
   2357 	uint32_t	intr_stat;
   2358 	mblk_t *rx_head = NULL;
   2359 	int resched = 0;
   2360 
   2361 	/*
   2362 	 * Grab the lock to avoid stopping the chip while this interrupt
   2363 	 * is handled.
   2364 	 */
   2365 	rw_enter(&bfe->bfe_rwlock, RW_READER);
   2366 
   2367 	/*
   2368 	 * It's necessary to read intr stat again because masking interrupt
   2369 	 * register does not really mask interrupts coming from the chip.
   2370 	 */
   2371 	intr_stat = INL(bfe, BFE_INTR_STAT);
   2372 	intr_stat &= BFE_IMASK_DEF;
   2373 	OUTL(bfe, BFE_INTR_STAT, intr_stat);
   2374 	(void) INL(bfe, BFE_INTR_STAT);
   2375 
   2376 	if (intr_stat == 0) {
   2377 		rw_exit(&bfe->bfe_rwlock);
   2378 		return (DDI_INTR_UNCLAIMED);
   2379 	}
   2380 
   2381 	DTRACE_PROBE2(bfe__interrupt, int, bfe->bfe_unit,
   2382 	    int, intr_stat);
   2383 
   2384 	if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) {
   2385 		/*
   2386 		 * If chip is suspended then we just return.
   2387 		 */
   2388 		if (bfe->bfe_chip_state == BFE_CHIP_SUSPENDED) {
   2389 			rw_exit(&bfe->bfe_rwlock);
   2390 			DTRACE_PROBE1(interrupt__chip__is__suspend, int,
   2391 			    bfe->bfe_unit);
   2392 			return (DDI_INTR_CLAIMED);
   2393 		}
   2394 
   2395 		/*
   2396 		 * Halt the chip again i.e basically disable interrupts.
   2397 		 */
   2398 		bfe_chip_halt(bfe);
   2399 		rw_exit(&bfe->bfe_rwlock);
   2400 		DTRACE_PROBE1(interrupt__chip__not__active, int,
   2401 		    bfe->bfe_unit);
   2402 		return (DDI_INTR_CLAIMED);
   2403 	}
   2404 
   2405 	/* A packet was received */
   2406 	if (intr_stat & BFE_ISTAT_RX) {
   2407 		rx_head = bfe_receive(bfe, intr_stat);
   2408 	}
   2409 
   2410 	/* A packet was sent down the wire */
   2411 	if (intr_stat & BFE_ISTAT_TX) {
   2412 		resched = bfe_tx_done(bfe, intr_stat);
   2413 	}
   2414 
   2415 	/* There was an error */
   2416 	if (intr_stat & BFE_ISTAT_ERRORS) {
   2417 		bfe_error_handler(bfe, intr_stat);
   2418 	}
   2419 
   2420 	rw_exit(&bfe->bfe_rwlock);
   2421 
   2422 	/*
   2423 	 * Pass the list of packets received from chip to MAC layer.
   2424 	 */
   2425 	if (rx_head) {
   2426 		mac_rx(bfe->bfe_machdl, 0, rx_head);
   2427 	}
   2428 
   2429 	/*
   2430 	 * Let the MAC start sending pkts to a potential stopped stream.
   2431 	 */
   2432 	if (resched)
   2433 		mac_tx_update(bfe->bfe_machdl);
   2434 
   2435 	return (DDI_INTR_CLAIMED);
   2436 }
   2437 
   2438 /*
   2439  * Removes registered interrupt handler.
   2440  */
   2441 static void
   2442 bfe_remove_intr(bfe_t *bfe)
   2443 {
   2444 	(void) ddi_intr_remove_handler(bfe->bfe_intrhdl);
   2445 	(void) ddi_intr_free(bfe->bfe_intrhdl);
   2446 }
   2447 
   2448 /*
   2449  * Add an interrupt for the driver.
   2450  */
   2451 static int
   2452 bfe_add_intr(bfe_t *bfe)
   2453 {
   2454 	int	nintrs = 1;
   2455 	int ret;
   2456 
   2457 	ret = ddi_intr_alloc(bfe->bfe_dip, &bfe->bfe_intrhdl,
   2458 	    DDI_INTR_TYPE_FIXED,	/* type */
   2459 	    0,	/* inumber */
   2460 	    1,	/* count */
   2461 	    &nintrs,	/* actual nintrs */
   2462 	    DDI_INTR_ALLOC_STRICT);
   2463 
   2464 	if (ret != DDI_SUCCESS) {
   2465 		bfe_error(bfe->bfe_dip, "ddi_intr_alloc() failed"
   2466 		    " : ret : %d", ret);
   2467 		return (DDI_FAILURE);
   2468 	}
   2469 
   2470 	ret = ddi_intr_add_handler(bfe->bfe_intrhdl, bfe_interrupt, bfe, NULL);
   2471 	if (ret != DDI_SUCCESS) {
   2472 		bfe_error(bfe->bfe_dip, "ddi_intr_add_handler() failed");
   2473 		(void) ddi_intr_free(bfe->bfe_intrhdl);
   2474 		return (DDI_FAILURE);
   2475 	}
   2476 
   2477 	ret = ddi_intr_get_pri(bfe->bfe_intrhdl, &bfe->bfe_intrpri);
   2478 	if (ret != DDI_SUCCESS) {
   2479 		bfe_error(bfe->bfe_dip, "ddi_intr_get_pri() failed");
   2480 		bfe_remove_intr(bfe);
   2481 		return (DDI_FAILURE);
   2482 	}
   2483 
   2484 	return (DDI_SUCCESS);
   2485 }
   2486 
   2487 
   2488 /*
   2489  * Identify chipset family.
   2490  */
   2491 static int
   2492 bfe_identify_hardware(bfe_t *bfe)
   2493 {
   2494 	uint16_t	vid, did;
   2495 	int i;
   2496 
   2497 	vid = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_VENID);
   2498 	did = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_DEVID);
   2499 
   2500 	for (i = 0; i < (sizeof (bfe_cards) / sizeof (bfe_cards_t)); i++) {
   2501 		if (bfe_cards[i].vendor_id == vid &&
   2502 		    bfe_cards[i].device_id == did) {
   2503 			return (BFE_SUCCESS);
   2504 		}
   2505 	}
   2506 
   2507 	bfe_error(bfe->bfe_dip, "bfe driver is attaching to unknown pci%d,%d"
   2508 	    " vendor/device-id card", vid, did);
   2509 
   2510 	return (BFE_SUCCESS);
   2511 }
   2512 
   2513 /*
   2514  * Maps device registers.
   2515  */
   2516 static int
   2517 bfe_regs_map(bfe_t *bfe)
   2518 {
   2519 	dev_info_t *dip = bfe->bfe_dip;
   2520 	int ret;
   2521 
   2522 	ret = ddi_regs_map_setup(dip, 1, &bfe->bfe_mem_regset.addr, 0, 0,
   2523 	    &bfe_dev_attr, &bfe->bfe_mem_regset.hdl);
   2524 
   2525 	if (ret != DDI_SUCCESS) {
   2526 		bfe_error(bfe->bfe_dip, "ddi_regs_map_setup failed");
   2527 		return (DDI_FAILURE);
   2528 	}
   2529 
   2530 	return (DDI_SUCCESS);
   2531 }
   2532 
   2533 static void
   2534 bfe_unmap_regs(bfe_t *bfe)
   2535 {
   2536 	ddi_regs_map_free(&bfe->bfe_mem_regset.hdl);
   2537 }
   2538 
   2539 static int
   2540 bfe_get_chip_config(bfe_t *bfe)
   2541 {
   2542 	uint32_t	prom[BFE_EEPROM_SIZE];
   2543 	int i;
   2544 
   2545 	/*
   2546 	 * Read EEPROM in prom[]
   2547 	 */
   2548 	for (i = 0; i < BFE_EEPROM_SIZE; i++) {
   2549 		prom[i] = INL(bfe, BFE_EEPROM_BASE + i * sizeof (uint32_t));
   2550 	}
   2551 
   2552 	bfe->bfe_dev_addr[0] = bfe->bfe_ether_addr[0] =
   2553 	    INB(bfe, BFE_EEPROM_BASE + 79);
   2554 
   2555 	bfe->bfe_dev_addr[1] = bfe->bfe_ether_addr[1] =
   2556 	    INB(bfe, BFE_EEPROM_BASE + 78);
   2557 
   2558 	bfe->bfe_dev_addr[2] = bfe->bfe_ether_addr[2] =
   2559 	    INB(bfe, BFE_EEPROM_BASE + 81);
   2560 
   2561 	bfe->bfe_dev_addr[3] = bfe->bfe_ether_addr[3] =
   2562 	    INB(bfe, BFE_EEPROM_BASE + 80);
   2563 
   2564 	bfe->bfe_dev_addr[4] = bfe->bfe_ether_addr[4] =
   2565 	    INB(bfe, BFE_EEPROM_BASE + 83);
   2566 
   2567 	bfe->bfe_dev_addr[5] = bfe->bfe_ether_addr[5] =
   2568 	    INB(bfe, BFE_EEPROM_BASE + 82);
   2569 
   2570 	bfe->bfe_phy_addr = -1;
   2571 
   2572 	return (DDI_SUCCESS);
   2573 }
   2574 
   2575 /*
   2576  * Ring Management routines
   2577  */
   2578 static int
   2579 bfe_ring_buf_alloc(bfe_t *bfe, bfe_ring_t *r, int slot, int d)
   2580 {
   2581 	int err;
   2582 	uint_t count = 0;
   2583 
   2584 	err = ddi_dma_alloc_handle(bfe->bfe_dip,
   2585 	    &bfe_dma_attr_buf, DDI_DMA_SLEEP, NULL,
   2586 	    &r->r_buf_dma[slot].handle);
   2587 
   2588 	if (err != DDI_SUCCESS) {
   2589 		bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :"
   2590 		    " alloc_handle failed");
   2591 		goto fail0;
   2592 	}
   2593 
   2594 	err = ddi_dma_mem_alloc(r->r_buf_dma[slot].handle,
   2595 	    r->r_buf_len, &bfe_buf_attr, DDI_DMA_STREAMING,
   2596 	    DDI_DMA_SLEEP, NULL, &r->r_buf_dma[slot].addr,
   2597 	    &r->r_buf_dma[slot].len,
   2598 	    &r->r_buf_dma[slot].acchdl);
   2599 
   2600 	if (err != DDI_SUCCESS) {
   2601 		bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :"
   2602 		    " mem_alloc failed :%d", err);
   2603 		goto fail1;
   2604 	}
   2605 
   2606 	err = ddi_dma_addr_bind_handle(r->r_buf_dma[slot].handle,
   2607 	    NULL, r->r_buf_dma[slot].addr,
   2608 	    r->r_buf_dma[slot].len,
   2609 	    (DDI_DMA_RDWR | DDI_DMA_STREAMING),
   2610 	    DDI_DMA_SLEEP, NULL,
   2611 	    &r->r_buf_dma[slot].cookie,
   2612 	    &count);
   2613 
   2614 	if (err != DDI_DMA_MAPPED) {
   2615 		bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :"
   2616 		    " bind_handle failed");
   2617 		goto fail2;
   2618 	}
   2619 
   2620 	if (count > 1) {
   2621 		bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :"
   2622 		    " more than one DMA cookie");
   2623 		(void) ddi_dma_unbind_handle(r->r_buf_dma[slot].handle);
   2624 		goto fail2;
   2625 	}
   2626 
   2627 	return (DDI_SUCCESS);
   2628 fail2:
   2629 	ddi_dma_mem_free(&r->r_buf_dma[slot].acchdl);
   2630 fail1:
   2631 	ddi_dma_free_handle(&r->r_buf_dma[slot].handle);
   2632 fail0:
   2633 	return (DDI_FAILURE);
   2634 }
   2635 
   2636 static void
   2637 bfe_ring_buf_free(bfe_ring_t *r, int slot)
   2638 {
   2639 	if (r->r_buf_dma == NULL)
   2640 		return;
   2641 
   2642 	(void) ddi_dma_unbind_handle(r->r_buf_dma[slot].handle);
   2643 	ddi_dma_mem_free(&r->r_buf_dma[slot].acchdl);
   2644 	ddi_dma_free_handle(&r->r_buf_dma[slot].handle);
   2645 }
   2646 
   2647 static void
   2648 bfe_buffer_free(bfe_ring_t *r)
   2649 {
   2650 	int i;
   2651 
   2652 	for (i = 0; i < r->r_ndesc; i++) {
   2653 		bfe_ring_buf_free(r, i);
   2654 	}
   2655 }
   2656 
   2657 static void
   2658 bfe_ring_desc_free(bfe_ring_t *r)
   2659 {
   2660 	(void) ddi_dma_unbind_handle(r->r_desc_dma_handle);
   2661 	ddi_dma_mem_free(&r->r_desc_acc_handle);
   2662 	ddi_dma_free_handle(&r->r_desc_dma_handle);
   2663 	kmem_free(r->r_buf_dma, r->r_ndesc * sizeof (bfe_dma_t));
   2664 
   2665 	r->r_buf_dma = NULL;
   2666 	r->r_desc = NULL;
   2667 }
   2668 
   2669 
   2670 static int
   2671 bfe_ring_desc_alloc(bfe_t *bfe, bfe_ring_t *r, int d)
   2672 {
   2673 	int err, i, fail = 0;
   2674 	caddr_t	ring;
   2675 	size_t	size_krnl = 0, size_dma = 0, ring_len = 0;
   2676 	ddi_dma_cookie_t cookie;
   2677 	uint_t	count = 0;
   2678 
   2679 	ASSERT(bfe != NULL);
   2680 
   2681 	size_krnl = r->r_ndesc * sizeof (bfe_dma_t);
   2682 	size_dma = r->r_ndesc * sizeof (bfe_desc_t);
   2683 	r->r_buf_dma = kmem_zalloc(size_krnl, KM_SLEEP);
   2684 
   2685 
   2686 	err = ddi_dma_alloc_handle(bfe->bfe_dip, &bfe_dma_attr_desc,
   2687 	    DDI_DMA_SLEEP, NULL, &r->r_desc_dma_handle);
   2688 
   2689 	if (err != DDI_SUCCESS) {
   2690 		bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on"
   2691 		    " ddi_dma_alloc_handle()");
   2692 		kmem_free(r->r_buf_dma, size_krnl);
   2693 		return (DDI_FAILURE);
   2694 	}
   2695 
   2696 
   2697 	err = ddi_dma_mem_alloc(r->r_desc_dma_handle,
   2698 	    size_dma, &bfe_buf_attr,
   2699 	    DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
   2700 	    &ring, &ring_len, &r->r_desc_acc_handle);
   2701 
   2702 	if (err != DDI_SUCCESS) {
   2703 		bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on"
   2704 		    " ddi_dma_mem_alloc()");
   2705 		ddi_dma_free_handle(&r->r_desc_dma_handle);
   2706 		kmem_free(r->r_buf_dma, size_krnl);
   2707 		return (DDI_FAILURE);
   2708 	}
   2709 
   2710 	err = ddi_dma_addr_bind_handle(r->r_desc_dma_handle,
   2711 	    NULL, ring, ring_len,
   2712 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
   2713 	    DDI_DMA_SLEEP, NULL,
   2714 	    &cookie, &count);
   2715 
   2716 	if (err != DDI_SUCCESS) {
   2717 		bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on"
   2718 		    " ddi_dma_addr_bind_handle()");
   2719 		ddi_dma_mem_free(&r->r_desc_acc_handle);
   2720 		ddi_dma_free_handle(&r->r_desc_dma_handle);
   2721 		kmem_free(r->r_buf_dma, size_krnl);
   2722 		return (DDI_FAILURE);
   2723 	}
   2724 
   2725 	/*
   2726 	 * We don't want to have multiple cookies. Descriptor should be
   2727 	 * aligned to PAGESIZE boundary.
   2728 	 */
   2729 	ASSERT(count == 1);
   2730 
   2731 	/* The actual descriptor for the ring */
   2732 	r->r_desc_len = ring_len;
   2733 	r->r_desc_cookie = cookie;
   2734 
   2735 	r->r_desc = (void *)ring;
   2736 
   2737 	bzero(r->r_desc, size_dma);
   2738 	bzero(r->r_desc, ring_len);
   2739 
   2740 	/* For each descriptor, allocate a DMA buffer */
   2741 	fail = 0;
   2742 	for (i = 0; i < r->r_ndesc; i++) {
   2743 		if (bfe_ring_buf_alloc(bfe, r, i, d) != DDI_SUCCESS) {
   2744 			i--;
   2745 			fail = 1;
   2746 			break;
   2747 		}
   2748 	}
   2749 
   2750 	if (fail) {
   2751 		while (i-- >= 0) {
   2752 			bfe_ring_buf_free(r, i);
   2753 		}
   2754 
   2755 		/* We don't need the descriptor anymore */
   2756 		bfe_ring_desc_free(r);
   2757 		return (DDI_FAILURE);
   2758 	}
   2759 
   2760 	return (DDI_SUCCESS);
   2761 }
   2762 
   2763 static int
   2764 bfe_rings_alloc(bfe_t *bfe)
   2765 {
   2766 	/* TX */
   2767 	mutex_init(&bfe->bfe_tx_ring.r_lock, NULL, MUTEX_DRIVER, NULL);
   2768 	bfe->bfe_tx_ring.r_lockp = &bfe->bfe_tx_ring.r_lock;
   2769 	bfe->bfe_tx_ring.r_buf_len = BFE_MTU + sizeof (struct ether_header) +
   2770 	    VLAN_TAGSZ + ETHERFCSL;
   2771 	bfe->bfe_tx_ring.r_ndesc = TX_NUM_DESC;
   2772 	bfe->bfe_tx_ring.r_bfe = bfe;
   2773 	bfe->bfe_tx_ring.r_avail_desc = TX_NUM_DESC;
   2774 
   2775 	/* RX */
   2776 	mutex_init(&bfe->bfe_rx_ring.r_lock, NULL, MUTEX_DRIVER, NULL);
   2777 	bfe->bfe_rx_ring.r_lockp = &bfe->bfe_rx_ring.r_lock;
   2778 	bfe->bfe_rx_ring.r_buf_len = BFE_MTU + sizeof (struct ether_header) +
   2779 	    VLAN_TAGSZ + ETHERFCSL + RX_HEAD_ROOM;
   2780 	bfe->bfe_rx_ring.r_ndesc = RX_NUM_DESC;
   2781 	bfe->bfe_rx_ring.r_bfe = bfe;
   2782 	bfe->bfe_rx_ring.r_avail_desc = RX_NUM_DESC;
   2783 
   2784 	/* Allocate TX Ring */
   2785 	if (bfe_ring_desc_alloc(bfe, &bfe->bfe_tx_ring,
   2786 	    DDI_DMA_WRITE) != DDI_SUCCESS)
   2787 		return (DDI_FAILURE);
   2788 
   2789 	/* Allocate RX Ring */
   2790 	if (bfe_ring_desc_alloc(bfe, &bfe->bfe_rx_ring,
   2791 	    DDI_DMA_READ) != DDI_SUCCESS) {
   2792 		cmn_err(CE_NOTE, "RX ring allocation failed");
   2793 		bfe_ring_desc_free(&bfe->bfe_tx_ring);
   2794 		return (DDI_FAILURE);
   2795 	}
   2796 
   2797 	bfe->bfe_tx_ring.r_flags = BFE_RING_ALLOCATED;
   2798 	bfe->bfe_rx_ring.r_flags = BFE_RING_ALLOCATED;
   2799 
   2800 	return (DDI_SUCCESS);
   2801 }
   2802 
   2803 static int
   2804 bfe_resume(dev_info_t *dip)
   2805 {
   2806 	bfe_t *bfe;
   2807 	int err = DDI_SUCCESS;
   2808 
   2809 	if ((bfe = ddi_get_driver_private(dip)) == NULL) {
   2810 		bfe_error(dip, "Unexpected error (no driver private data)"
   2811 		    " while resume");
   2812 		return (DDI_FAILURE);
   2813 	}
   2814 
   2815 	/*
   2816 	 * Grab all the locks first.
   2817 	 */
   2818 	bfe_grab_locks(bfe);
   2819 	bfe->bfe_chip_state = BFE_CHIP_RESUME;
   2820 
   2821 	bfe_init_vars(bfe);
   2822 	/* PHY will also start running */
   2823 	bfe_chip_reset(bfe);
   2824 	if (bfe_chip_start(bfe) == DDI_FAILURE) {
   2825 		bfe_error(dip, "Could not resume chip");
   2826 		err = DDI_FAILURE;
   2827 	}
   2828 
   2829 	bfe_release_locks(bfe);
   2830 
   2831 	if (err == DDI_SUCCESS)
   2832 		mac_tx_update(bfe->bfe_machdl);
   2833 
   2834 	return (err);
   2835 }
   2836 
   2837 static int
   2838 bfe_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
   2839 {
   2840 	int	unit;
   2841 	bfe_t	*bfe;
   2842 	mac_register_t	*macreg;
   2843 	int	ret;
   2844 
   2845 	switch (cmd) {
   2846 	case DDI_RESUME:
   2847 		return (bfe_resume(dip));
   2848 
   2849 	case DDI_ATTACH:
   2850 		break;
   2851 
   2852 	default:
   2853 		return (DDI_FAILURE);
   2854 	}
   2855 
   2856 
   2857 	unit = ddi_get_instance(dip);
   2858 
   2859 	bfe = kmem_zalloc(sizeof (bfe_t), KM_SLEEP);
   2860 	bfe->bfe_dip = dip;
   2861 	bfe->bfe_unit = unit;
   2862 
   2863 	if (pci_config_setup(dip, &bfe->bfe_conf_handle) != DDI_SUCCESS) {
   2864 		bfe_error(dip, "pci_config_setup failed");
   2865 		goto fail0;
   2866 	}
   2867 
   2868 	/*
   2869 	 * Enable IO space, Bus Master and Memory Space accessess.
   2870 	 */
   2871 	ret = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_COMM);
   2872 	pci_config_put16(bfe->bfe_conf_handle, PCI_CONF_COMM,
   2873 	    PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME | ret);
   2874 
   2875 	ddi_set_driver_private(dip, bfe);
   2876 
   2877 	/* Identify hardware */
   2878 	if (bfe_identify_hardware(bfe) == BFE_FAILURE) {
   2879 		bfe_error(dip, "Could not identify device");
   2880 		goto fail1;
   2881 	}
   2882 
   2883 	if (bfe_regs_map(bfe) != DDI_SUCCESS) {
   2884 		bfe_error(dip, "Could not map device registers");
   2885 		goto fail1;
   2886 	}
   2887 
   2888 	(void) bfe_get_chip_config(bfe);
   2889 
   2890 	/*
   2891 	 * Register with MAC layer
   2892 	 */
   2893 	if ((macreg = mac_alloc(MAC_VERSION)) == NULL) {
   2894 		bfe_error(dip, "mac_alloc() failed");
   2895 		goto fail2;
   2896 	}
   2897 
   2898 	macreg->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
   2899 	macreg->m_driver = bfe;
   2900 	macreg->m_dip = dip;
   2901 	macreg->m_instance = unit;
   2902 	macreg->m_src_addr = bfe->bfe_ether_addr;
   2903 	macreg->m_callbacks = &bfe_mac_callbacks;
   2904 	macreg->m_min_sdu = 0;
   2905 	macreg->m_max_sdu = ETHERMTU;
   2906 	macreg->m_margin = VLAN_TAGSZ;
   2907 
   2908 	if ((ret = mac_register(macreg, &bfe->bfe_machdl)) != 0) {
   2909 		bfe_error(dip, "mac_register() failed with %d error", ret);
   2910 		mac_free(macreg);
   2911 		goto fail2;
   2912 	}
   2913 
   2914 	mac_free(macreg);
   2915 
   2916 	rw_init(&bfe->bfe_rwlock, NULL, RW_DRIVER,
   2917 	    DDI_INTR_PRI(bfe->bfe_intrpri));
   2918 
   2919 	if (bfe_add_intr(bfe) != DDI_SUCCESS) {
   2920 		bfe_error(dip, "Could not add interrupt");
   2921 		goto fail3;
   2922 	}
   2923 
   2924 	if (bfe_rings_alloc(bfe) != DDI_SUCCESS) {
   2925 		bfe_error(dip, "Could not allocate TX/RX Ring");
   2926 		goto fail4;
   2927 	}
   2928 
   2929 	/* Init and then reset the chip */
   2930 	bfe->bfe_chip_action = 0;
   2931 	bfe_init_vars(bfe);
   2932 
   2933 	/* PHY will also start running */
   2934 	bfe_chip_reset(bfe);
   2935 
   2936 	/*
   2937 	 * Even though we enable the interrupts here but chip's interrupt
   2938 	 * is not enabled yet. It will be enabled once we plumb the interface.
   2939 	 */
   2940 	if (ddi_intr_enable(bfe->bfe_intrhdl) != DDI_SUCCESS) {
   2941 		bfe_error(dip, "Could not enable interrupt");
   2942 		goto fail4;
   2943 	}
   2944 
   2945 	return (DDI_SUCCESS);
   2946 
   2947 fail4:
   2948 	bfe_remove_intr(bfe);
   2949 fail3:
   2950 	(void) mac_unregister(bfe->bfe_machdl);
   2951 fail2:
   2952 	bfe_unmap_regs(bfe);
   2953 fail1:
   2954 	pci_config_teardown(&bfe->bfe_conf_handle);
   2955 fail0:
   2956 	kmem_free(bfe, sizeof (bfe_t));
   2957 	return (DDI_FAILURE);
   2958 }
   2959 
   2960 static int
   2961 bfe_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
   2962 {
   2963 	bfe_t *bfe;
   2964 
   2965 	bfe = ddi_get_driver_private(devinfo);
   2966 
   2967 	switch (cmd) {
   2968 	case DDI_DETACH:
   2969 		/*
   2970 		 * We need to stop the timer before grabbing locks otherwise
   2971 		 * we can land-up in deadlock with untimeout.
   2972 		 */
   2973 		bfe_stop_timer(bfe);
   2974 
   2975 		/*
   2976 		 * First unregister with MAC layer before stopping DMA
   2977 		 * engine.
   2978 		 */
   2979 		if (mac_unregister(bfe->bfe_machdl) != DDI_SUCCESS)
   2980 			return (DDI_FAILURE);
   2981 
   2982 		bfe->bfe_machdl = NULL;
   2983 
   2984 		/*
   2985 		 * Quiesce the chip first.
   2986 		 */
   2987 		bfe_grab_locks(bfe);
   2988 		bfe_chip_halt(bfe);
   2989 		bfe_stop_phy(bfe);
   2990 		bfe_release_locks(bfe);
   2991 
   2992 		(void) ddi_intr_disable(bfe->bfe_intrhdl);
   2993 
   2994 		/* Make sure timer is gone. */
   2995 		bfe_stop_timer(bfe);
   2996 
   2997 		/*
   2998 		 * Free the DMA resources for buffer and then descriptors
   2999 		 */
   3000 		if (bfe->bfe_tx_ring.r_flags == BFE_RING_ALLOCATED) {
   3001 			/* TX */
   3002 			bfe_buffer_free(&bfe->bfe_tx_ring);
   3003 			bfe_ring_desc_free(&bfe->bfe_tx_ring);
   3004 		}
   3005 
   3006 		if (bfe->bfe_rx_ring.r_flags == BFE_RING_ALLOCATED) {
   3007 			/* RX */
   3008 			bfe_buffer_free(&bfe->bfe_rx_ring);
   3009 			bfe_ring_desc_free(&bfe->bfe_rx_ring);
   3010 		}
   3011 
   3012 		bfe_remove_intr(bfe);
   3013 		bfe_unmap_regs(bfe);
   3014 		pci_config_teardown(&bfe->bfe_conf_handle);
   3015 
   3016 		mutex_destroy(&bfe->bfe_tx_ring.r_lock);
   3017 		mutex_destroy(&bfe->bfe_rx_ring.r_lock);
   3018 		rw_destroy(&bfe->bfe_rwlock);
   3019 
   3020 		kmem_free(bfe, sizeof (bfe_t));
   3021 
   3022 		ddi_set_driver_private(devinfo, NULL);
   3023 		return (DDI_SUCCESS);
   3024 
   3025 	case DDI_SUSPEND:
   3026 		/*
   3027 		 * We need to stop the timer before grabbing locks otherwise
   3028 		 * we can land-up in deadlock with untimeout.
   3029 		 */
   3030 		bfe_stop_timer(bfe);
   3031 
   3032 		/*
   3033 		 * Grab all the locks first.
   3034 		 */
   3035 		bfe_grab_locks(bfe);
   3036 		bfe_chip_halt(bfe);
   3037 		bfe_stop_phy(bfe);
   3038 		bfe->bfe_chip_state = BFE_CHIP_SUSPENDED;
   3039 		bfe_release_locks(bfe);
   3040 
   3041 		return (DDI_SUCCESS);
   3042 
   3043 	default:
   3044 		return (DDI_FAILURE);
   3045 	}
   3046 }
   3047 
   3048 /*
   3049  * Quiesce the card for fast reboot
   3050  */
   3051 int
   3052 bfe_quiesce(dev_info_t *dev_info)
   3053 {
   3054 	bfe_t *bfe;
   3055 
   3056 	bfe = ddi_get_driver_private(dev_info);
   3057 
   3058 	bfe_chip_halt(bfe);
   3059 	bfe_stop_phy(bfe);
   3060 	bfe->bfe_chip_state = BFE_CHIP_QUIESCED;
   3061 
   3062 	return (DDI_SUCCESS);
   3063 }
   3064 
   3065 static struct cb_ops bfe_cb_ops = {
   3066 	nulldev,		/* cb_open */
   3067 	nulldev,		/* cb_close */
   3068 	nodev,			/* cb_strategy */
   3069 	nodev,			/* cb_print */
   3070 	nodev,			/* cb_dump */
   3071 	nodev,			/* cb_read */
   3072 	nodev,			/* cb_write */
   3073 	nodev,			/* cb_ioctl */
   3074 	nodev,			/* cb_devmap */
   3075 	nodev,			/* cb_mmap */
   3076 	nodev,			/* cb_segmap */
   3077 	nochpoll,		/* cb_chpoll */
   3078 	ddi_prop_op,		/* cb_prop_op */
   3079 	NULL,			/* cb_stream */
   3080 	D_MP | D_HOTPLUG,	/* cb_flag */
   3081 	CB_REV,			/* cb_rev */
   3082 	nodev,			/* cb_aread */
   3083 	nodev			/* cb_awrite */
   3084 };
   3085 
   3086 static struct dev_ops bfe_dev_ops = {
   3087 	DEVO_REV,	/* devo_rev */
   3088 	0,		/* devo_refcnt */
   3089 	NULL,		/* devo_getinfo */
   3090 	nulldev,	/* devo_identify */
   3091 	nulldev,	/* devo_probe */
   3092 	bfe_attach,	/* devo_attach */
   3093 	bfe_detach,	/* devo_detach */
   3094 	nodev,		/* devo_reset */
   3095 	&bfe_cb_ops,	/* devo_cb_ops */
   3096 	NULL,		/* devo_bus_ops */
   3097 	ddi_power,	/* devo_power */
   3098 	bfe_quiesce	/* devo_quiesce */
   3099 };
   3100 
   3101 static struct modldrv bfe_modldrv = {
   3102 	&mod_driverops,
   3103 	bfe_ident,
   3104 	&bfe_dev_ops
   3105 };
   3106 
   3107 static struct modlinkage modlinkage = {
   3108 	MODREV_1, (void *)&bfe_modldrv, NULL
   3109 };
   3110 
   3111 int
   3112 _info(struct modinfo *modinfop)
   3113 {
   3114 	return (mod_info(&modlinkage, modinfop));
   3115 }
   3116 
   3117 int
   3118 _init(void)
   3119 {
   3120 	int	status;
   3121 
   3122 	mac_init_ops(&bfe_dev_ops, MODULE_NAME);
   3123 	status = mod_install(&modlinkage);
   3124 	if (status == DDI_FAILURE)
   3125 		mac_fini_ops(&bfe_dev_ops);
   3126 	return (status);
   3127 }
   3128 
   3129 int
   3130 _fini(void)
   3131 {
   3132 	int status;
   3133 
   3134 	status = mod_remove(&modlinkage);
   3135 	if (status == 0) {
   3136 		mac_fini_ops(&bfe_dev_ops);
   3137 	}
   3138 	return (status);
   3139 }
   3140