Home | History | Annotate | Download | only in dmfe
      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  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 
     27 #include <sys/types.h>
     28 #include <sys/sunddi.h>
     29 #include <sys/policy.h>
     30 #include <sys/sdt.h>
     31 #include "dmfe_impl.h"
     32 
     33 /*
     34  * This is the string displayed by modinfo, etc.
     35  */
     36 static char dmfe_ident[] = "Davicom DM9102 Ethernet";
     37 
     38 
     39 /*
     40  * NOTES:
     41  *
     42  * #defines:
     43  *
     44  *	DMFE_PCI_RNUMBER is the register-set number to use for the operating
     45  *	registers.  On an OBP-based machine, regset 0 refers to CONFIG space,
     46  *	regset 1 will be the operating registers in I/O space, and regset 2
     47  *	will be the operating registers in MEMORY space (preferred).  If an
     48  *	expansion ROM is fitted, it may appear as a further register set.
     49  *
     50  *	DMFE_SLOP defines the amount by which the chip may read beyond
     51  *	the end of a buffer or descriptor, apparently 6-8 dwords :(
     52  *	We have to make sure this doesn't cause it to access unallocated
     53  *	or unmapped memory.
     54  *
     55  *	DMFE_BUF_SIZE must be at least (ETHERMAX + ETHERFCSL + DMFE_SLOP)
     56  *	rounded up to a multiple of 4.  Here we choose a power of two for
     57  *	speed & simplicity at the cost of a bit more memory.
     58  *
     59  *	However, the buffer length field in the TX/RX descriptors is only
     60  *	eleven bits, so even though we allocate DMFE_BUF_SIZE (2048) bytes
     61  *	per buffer, we tell the chip that they're only DMFE_BUF_SIZE_1
     62  *	(2000) bytes each.
     63  *
     64  *	DMFE_DMA_MODE defines the mode (STREAMING/CONSISTENT) used for
     65  *	the data buffers.  The descriptors are always set up in CONSISTENT
     66  *	mode.
     67  *
     68  *	DMFE_HEADROOM defines how much space we'll leave in allocated
     69  *	mblks before the first valid data byte.  This should be chosen
     70  *	to be 2 modulo 4, so that once the ethernet header (14 bytes)
     71  *	has been stripped off, the packet data will be 4-byte aligned.
     72  *	The remaining space can be used by upstream modules to prepend
     73  *	any headers required.
     74  *
     75  * Patchable globals:
     76  *
     77  *	dmfe_bus_modes: the bus mode bits to be put into CSR0.
     78  *		Setting READ_MULTIPLE in this register seems to cause
     79  *		the chip to generate a READ LINE command with a parity
     80  *		error!  Don't do it!
     81  *
     82  *	dmfe_setup_desc1: the value to be put into descriptor word 1
     83  *		when sending a SETUP packet.
     84  *
     85  *		Setting TX_LAST_DESC in desc1 in a setup packet seems
     86  *		to make the chip spontaneously reset internally - it
     87  *		attempts to give back the setup packet descriptor by
     88  *		writing to PCI address 00000000 - which may or may not
     89  *		get a MASTER ABORT - after which most of its registers
     90  *		seem to have either default values or garbage!
     91  *
     92  *		TX_FIRST_DESC doesn't seem to have the same effect but
     93  *		it isn't needed on a setup packet so we'll leave it out
     94  *		too, just in case it has some other wierd side-effect.
     95  *
     96  *		The default hardware packet filtering mode is now
     97  *		HASH_AND_PERFECT (imperfect filtering of multicast
     98  *		packets and perfect filtering of unicast packets).
     99  *		If this is found not to work reliably, setting the
    100  *		TX_FILTER_TYPE1 bit will cause a switchover to using
    101  *		HASH_ONLY mode (imperfect filtering of *all* packets).
    102  *		Software will then perform the additional filtering
    103  *		as required.
    104  */
    105 
    106 #define	DMFE_PCI_RNUMBER	2
    107 #define	DMFE_SLOP		(8*sizeof (uint32_t))
    108 #define	DMFE_BUF_SIZE		2048
    109 #define	DMFE_BUF_SIZE_1		2000
    110 #define	DMFE_DMA_MODE		DDI_DMA_STREAMING
    111 #define	DMFE_HEADROOM		34
    112 
    113 static uint32_t dmfe_bus_modes = TX_POLL_INTVL | CACHE_ALIGN;
    114 static uint32_t dmfe_setup_desc1 = TX_SETUP_PACKET | SETUPBUF_SIZE |
    115 					TX_FILTER_TYPE0;
    116 
    117 /*
    118  * Some tunable parameters ...
    119  *	Number of RX/TX ring entries (128/128)
    120  *	Minimum number of TX ring slots to keep free (1)
    121  *	Low-water mark at which to try to reclaim TX ring slots (1)
    122  *	How often to take a TX-done interrupt (twice per ring cycle)
    123  *	Whether to reclaim TX ring entries on a TX-done interrupt (no)
    124  */
    125 
    126 #define	DMFE_TX_DESC		128	/* Should be a multiple of 4 <= 256 */
    127 #define	DMFE_RX_DESC		128	/* Should be a multiple of 4 <= 256 */
    128 
    129 static uint32_t dmfe_rx_desc = DMFE_RX_DESC;
    130 static uint32_t dmfe_tx_desc = DMFE_TX_DESC;
    131 static uint32_t dmfe_tx_min_free = 1;
    132 static uint32_t dmfe_tx_reclaim_level = 1;
    133 static uint32_t dmfe_tx_int_factor = (DMFE_TX_DESC / 2) - 1;
    134 static boolean_t dmfe_reclaim_on_done = B_FALSE;
    135 
    136 /*
    137  * Time-related parameters:
    138  *
    139  *	We use a cyclic to provide a periodic callback; this is then used
    140  * 	to check for TX-stall and poll the link status register.
    141  *
    142  *	DMFE_TICK is the interval between cyclic callbacks, in microseconds.
    143  *
    144  *	TX_STALL_TIME_100 is the timeout in microseconds between passing
    145  *	a packet to the chip for transmission and seeing that it's gone,
    146  *	when running at 100Mb/s.  If we haven't reclaimed at least one
    147  *	descriptor in this time we assume the transmitter has stalled
    148  *	and reset the chip.
    149  *
    150  *	TX_STALL_TIME_10 is the equivalent timeout when running at 10Mb/s.
    151  *
    152  * Patchable globals:
    153  *
    154  *	dmfe_tick_us:		DMFE_TICK
    155  *	dmfe_tx100_stall_us:	TX_STALL_TIME_100
    156  *	dmfe_tx10_stall_us:	TX_STALL_TIME_10
    157  *
    158  * These are then used in _init() to calculate:
    159  *
    160  *	stall_100_tix[]: number of consecutive cyclic callbacks without a
    161  *			 reclaim before the TX process is considered stalled,
    162  *			 when running at 100Mb/s.  The elements are indexed
    163  *			 by transmit-engine-state.
    164  *	stall_10_tix[]:	 number of consecutive cyclic callbacks without a
    165  *			 reclaim before the TX process is considered stalled,
    166  *			 when running at 10Mb/s.  The elements are indexed
    167  *			 by transmit-engine-state.
    168  */
    169 
    170 #define	DMFE_TICK		25000		/* microseconds		*/
    171 #define	TX_STALL_TIME_100	50000		/* microseconds		*/
    172 #define	TX_STALL_TIME_10	200000		/* microseconds		*/
    173 
    174 static uint32_t dmfe_tick_us = DMFE_TICK;
    175 static uint32_t dmfe_tx100_stall_us = TX_STALL_TIME_100;
    176 static uint32_t dmfe_tx10_stall_us = TX_STALL_TIME_10;
    177 
    178 /*
    179  * Calculated from above in _init()
    180  */
    181 
    182 static uint32_t stall_100_tix[TX_PROCESS_MAX_STATE+1];
    183 static uint32_t stall_10_tix[TX_PROCESS_MAX_STATE+1];
    184 
    185 /*
    186  * Property names
    187  */
    188 static char localmac_propname[] = "local-mac-address";
    189 static char opmode_propname[] = "opmode-reg-value";
    190 
    191 static int		dmfe_m_start(void *);
    192 static void		dmfe_m_stop(void *);
    193 static int		dmfe_m_promisc(void *, boolean_t);
    194 static int		dmfe_m_multicst(void *, boolean_t, const uint8_t *);
    195 static int		dmfe_m_unicst(void *, const uint8_t *);
    196 static void		dmfe_m_ioctl(void *, queue_t *, mblk_t *);
    197 static mblk_t		*dmfe_m_tx(void *, mblk_t *);
    198 static int 		dmfe_m_stat(void *, uint_t, uint64_t *);
    199 static int		dmfe_m_getprop(void *, const char *, mac_prop_id_t,
    200     uint_t, uint_t, void *, uint_t *);
    201 static int		dmfe_m_setprop(void *, const char *, mac_prop_id_t,
    202     uint_t,  const void *);
    203 
    204 static mac_callbacks_t dmfe_m_callbacks = {
    205 	(MC_IOCTL | MC_SETPROP | MC_GETPROP),
    206 	dmfe_m_stat,
    207 	dmfe_m_start,
    208 	dmfe_m_stop,
    209 	dmfe_m_promisc,
    210 	dmfe_m_multicst,
    211 	dmfe_m_unicst,
    212 	dmfe_m_tx,
    213 	dmfe_m_ioctl,
    214 	NULL,	/* getcapab */
    215 	NULL,	/* open */
    216 	NULL,	/* close */
    217 	dmfe_m_setprop,
    218 	dmfe_m_getprop
    219 };
    220 
    221 
    222 /*
    223  * Describes the chip's DMA engine
    224  */
    225 static ddi_dma_attr_t dma_attr = {
    226 	DMA_ATTR_V0,		/* dma_attr version */
    227 	0,			/* dma_attr_addr_lo */
    228 	(uint32_t)0xFFFFFFFF,	/* dma_attr_addr_hi */
    229 	0x0FFFFFF,		/* dma_attr_count_max */
    230 	0x20,			/* dma_attr_align */
    231 	0x7F,			/* dma_attr_burstsizes */
    232 	1,			/* dma_attr_minxfer */
    233 	(uint32_t)0xFFFFFFFF,	/* dma_attr_maxxfer */
    234 	(uint32_t)0xFFFFFFFF,	/* dma_attr_seg */
    235 	1,			/* dma_attr_sgllen */
    236 	1,			/* dma_attr_granular */
    237 	0			/* dma_attr_flags */
    238 };
    239 
    240 /*
    241  * DMA access attributes for registers and descriptors
    242  */
    243 static ddi_device_acc_attr_t dmfe_reg_accattr = {
    244 	DDI_DEVICE_ATTR_V0,
    245 	DDI_STRUCTURE_LE_ACC,
    246 	DDI_STRICTORDER_ACC
    247 };
    248 
    249 /*
    250  * DMA access attributes for data: NOT to be byte swapped.
    251  */
    252 static ddi_device_acc_attr_t dmfe_data_accattr = {
    253 	DDI_DEVICE_ATTR_V0,
    254 	DDI_NEVERSWAP_ACC,
    255 	DDI_STRICTORDER_ACC
    256 };
    257 
    258 static uchar_t dmfe_broadcast_addr[ETHERADDRL] = {
    259 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
    260 };
    261 
    262 
    263 /*
    264  * ========== Lowest-level chip register & ring access routines ==========
    265  */
    266 
    267 /*
    268  * I/O register get/put routines
    269  */
    270 uint32_t
    271 dmfe_chip_get32(dmfe_t *dmfep, off_t offset)
    272 {
    273 	uint32_t *addr;
    274 
    275 	addr = (void *)(dmfep->io_reg + offset);
    276 	return (ddi_get32(dmfep->io_handle, addr));
    277 }
    278 
    279 void
    280 dmfe_chip_put32(dmfe_t *dmfep, off_t offset, uint32_t value)
    281 {
    282 	uint32_t *addr;
    283 
    284 	addr = (void *)(dmfep->io_reg + offset);
    285 	ddi_put32(dmfep->io_handle, addr, value);
    286 }
    287 
    288 /*
    289  * TX/RX ring get/put routines
    290  */
    291 static uint32_t
    292 dmfe_ring_get32(dma_area_t *dma_p, uint_t index, uint_t offset)
    293 {
    294 	uint32_t *addr;
    295 
    296 	addr = (void *)dma_p->mem_va;
    297 	return (ddi_get32(dma_p->acc_hdl, addr + index*DESC_SIZE + offset));
    298 }
    299 
    300 static void
    301 dmfe_ring_put32(dma_area_t *dma_p, uint_t index, uint_t offset, uint32_t value)
    302 {
    303 	uint32_t *addr;
    304 
    305 	addr = (void *)dma_p->mem_va;
    306 	ddi_put32(dma_p->acc_hdl, addr + index*DESC_SIZE + offset, value);
    307 }
    308 
    309 /*
    310  * Setup buffer get/put routines
    311  */
    312 static uint32_t
    313 dmfe_setup_get32(dma_area_t *dma_p, uint_t index)
    314 {
    315 	uint32_t *addr;
    316 
    317 	addr = (void *)dma_p->setup_va;
    318 	return (ddi_get32(dma_p->acc_hdl, addr + index));
    319 }
    320 
    321 static void
    322 dmfe_setup_put32(dma_area_t *dma_p, uint_t index, uint32_t value)
    323 {
    324 	uint32_t *addr;
    325 
    326 	addr = (void *)dma_p->setup_va;
    327 	ddi_put32(dma_p->acc_hdl, addr + index, value);
    328 }
    329 
    330 
    331 /*
    332  * ========== Low-level chip & ring buffer manipulation ==========
    333  */
    334 
    335 /*
    336  * dmfe_set_opmode() -- function to set operating mode
    337  */
    338 static void
    339 dmfe_set_opmode(dmfe_t *dmfep)
    340 {
    341 	ASSERT(mutex_owned(dmfep->oplock));
    342 
    343 	dmfe_chip_put32(dmfep, OPN_MODE_REG, dmfep->opmode);
    344 	drv_usecwait(10);
    345 }
    346 
    347 /*
    348  * dmfe_stop_chip() -- stop all chip processing & optionally reset the h/w
    349  */
    350 static void
    351 dmfe_stop_chip(dmfe_t *dmfep, enum chip_state newstate)
    352 {
    353 	ASSERT(mutex_owned(dmfep->oplock));
    354 
    355 	/*
    356 	 * Stop the chip:
    357 	 *	disable all interrupts
    358 	 *	stop TX/RX processes
    359 	 *	clear the status bits for TX/RX stopped
    360 	 * If required, reset the chip
    361 	 * Record the new state
    362 	 */
    363 	dmfe_chip_put32(dmfep, INT_MASK_REG, 0);
    364 	dmfep->opmode &= ~(START_TRANSMIT | START_RECEIVE);
    365 	dmfe_set_opmode(dmfep);
    366 	dmfe_chip_put32(dmfep, STATUS_REG, TX_STOPPED_INT | RX_STOPPED_INT);
    367 
    368 	switch (newstate) {
    369 	default:
    370 		ASSERT(!"can't get here");
    371 		return;
    372 
    373 	case CHIP_STOPPED:
    374 	case CHIP_ERROR:
    375 		break;
    376 
    377 	case CHIP_RESET:
    378 		dmfe_chip_put32(dmfep, BUS_MODE_REG, SW_RESET);
    379 		drv_usecwait(10);
    380 		dmfe_chip_put32(dmfep, BUS_MODE_REG, 0);
    381 		drv_usecwait(10);
    382 		dmfe_chip_put32(dmfep, BUS_MODE_REG, dmfe_bus_modes);
    383 		break;
    384 	}
    385 
    386 	dmfep->chip_state = newstate;
    387 }
    388 
    389 /*
    390  * Initialize transmit and receive descriptor rings, and
    391  * set the chip to point to the first entry in each ring
    392  */
    393 static void
    394 dmfe_init_rings(dmfe_t *dmfep)
    395 {
    396 	dma_area_t *descp;
    397 	uint32_t pstart;
    398 	uint32_t pnext;
    399 	uint32_t pbuff;
    400 	uint32_t desc1;
    401 	int i;
    402 
    403 	/*
    404 	 * You need all the locks in order to rewrite the descriptor rings
    405 	 */
    406 	ASSERT(mutex_owned(dmfep->oplock));
    407 	ASSERT(mutex_owned(dmfep->rxlock));
    408 	ASSERT(mutex_owned(dmfep->txlock));
    409 
    410 	/*
    411 	 * Program the RX ring entries
    412 	 */
    413 	descp = &dmfep->rx_desc;
    414 	pstart = descp->mem_dvma;
    415 	pnext = pstart + sizeof (struct rx_desc_type);
    416 	pbuff = dmfep->rx_buff.mem_dvma;
    417 	desc1 = RX_CHAINING | DMFE_BUF_SIZE_1;
    418 
    419 	for (i = 0; i < dmfep->rx.n_desc; ++i) {
    420 		dmfe_ring_put32(descp, i, RD_NEXT, pnext);
    421 		dmfe_ring_put32(descp, i, BUFFER1, pbuff);
    422 		dmfe_ring_put32(descp, i, DESC1, desc1);
    423 		dmfe_ring_put32(descp, i, DESC0, RX_OWN);
    424 
    425 		pnext += sizeof (struct rx_desc_type);
    426 		pbuff += DMFE_BUF_SIZE;
    427 	}
    428 
    429 	/*
    430 	 * Fix up last entry & sync
    431 	 */
    432 	dmfe_ring_put32(descp, --i, RD_NEXT, pstart);
    433 	DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV);
    434 	dmfep->rx.next_free = 0;
    435 
    436 	/*
    437 	 * Set the base address of the RX descriptor list in CSR3
    438 	 */
    439 	dmfe_chip_put32(dmfep, RX_BASE_ADDR_REG, descp->mem_dvma);
    440 
    441 	/*
    442 	 * Program the TX ring entries
    443 	 */
    444 	descp = &dmfep->tx_desc;
    445 	pstart = descp->mem_dvma;
    446 	pnext = pstart + sizeof (struct tx_desc_type);
    447 	pbuff = dmfep->tx_buff.mem_dvma;
    448 	desc1 = TX_CHAINING;
    449 
    450 	for (i = 0; i < dmfep->tx.n_desc; ++i) {
    451 		dmfe_ring_put32(descp, i, TD_NEXT, pnext);
    452 		dmfe_ring_put32(descp, i, BUFFER1, pbuff);
    453 		dmfe_ring_put32(descp, i, DESC1, desc1);
    454 		dmfe_ring_put32(descp, i, DESC0, 0);
    455 
    456 		pnext += sizeof (struct tx_desc_type);
    457 		pbuff += DMFE_BUF_SIZE;
    458 	}
    459 
    460 	/*
    461 	 * Fix up last entry & sync
    462 	 */
    463 	dmfe_ring_put32(descp, --i, TD_NEXT, pstart);
    464 	DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV);
    465 	dmfep->tx.n_free = dmfep->tx.n_desc;
    466 	dmfep->tx.next_free = dmfep->tx.next_busy = 0;
    467 
    468 	/*
    469 	 * Set the base address of the TX descrptor list in CSR4
    470 	 */
    471 	dmfe_chip_put32(dmfep, TX_BASE_ADDR_REG, descp->mem_dvma);
    472 }
    473 
    474 /*
    475  * dmfe_start_chip() -- start the chip transmitting and/or receiving
    476  */
    477 static void
    478 dmfe_start_chip(dmfe_t *dmfep, int mode)
    479 {
    480 	ASSERT(mutex_owned(dmfep->oplock));
    481 
    482 	dmfep->opmode |= mode;
    483 	dmfe_set_opmode(dmfep);
    484 
    485 	dmfe_chip_put32(dmfep, W_J_TIMER_REG, 0);
    486 	/*
    487 	 * Enable VLAN length mode (allows packets to be 4 bytes Longer).
    488 	 */
    489 	dmfe_chip_put32(dmfep, W_J_TIMER_REG, VLAN_ENABLE);
    490 
    491 	/*
    492 	 * Clear any pending process-stopped interrupts
    493 	 */
    494 	dmfe_chip_put32(dmfep, STATUS_REG, TX_STOPPED_INT | RX_STOPPED_INT);
    495 	dmfep->chip_state = mode & START_RECEIVE ? CHIP_TX_RX :
    496 	    mode & START_TRANSMIT ? CHIP_TX_ONLY : CHIP_STOPPED;
    497 }
    498 
    499 /*
    500  * dmfe_enable_interrupts() -- enable our favourite set of interrupts.
    501  *
    502  * Normal interrupts:
    503  *	We always enable:
    504  *		RX_PKTDONE_INT		(packet received)
    505  *		TX_PKTDONE_INT		(TX complete)
    506  *	We never enable:
    507  *		TX_ALLDONE_INT		(next TX buffer not ready)
    508  *
    509  * Abnormal interrupts:
    510  *	We always enable:
    511  *		RX_STOPPED_INT
    512  *		TX_STOPPED_INT
    513  *		SYSTEM_ERR_INT
    514  *		RX_UNAVAIL_INT
    515  *	We never enable:
    516  *		RX_EARLY_INT
    517  *		RX_WATCHDOG_INT
    518  *		TX_JABBER_INT
    519  *		TX_EARLY_INT
    520  *		TX_UNDERFLOW_INT
    521  *		GP_TIMER_INT		(not valid in -9 chips)
    522  *		LINK_STATUS_INT		(not valid in -9 chips)
    523  */
    524 static void
    525 dmfe_enable_interrupts(dmfe_t *dmfep)
    526 {
    527 	ASSERT(mutex_owned(dmfep->oplock));
    528 
    529 	/*
    530 	 * Put 'the standard set of interrupts' in the interrupt mask register
    531 	 */
    532 	dmfep->imask =	RX_PKTDONE_INT | TX_PKTDONE_INT |
    533 	    RX_STOPPED_INT | TX_STOPPED_INT | RX_UNAVAIL_INT | SYSTEM_ERR_INT;
    534 
    535 	dmfe_chip_put32(dmfep, INT_MASK_REG,
    536 	    NORMAL_SUMMARY_INT | ABNORMAL_SUMMARY_INT | dmfep->imask);
    537 	dmfep->chip_state = CHIP_RUNNING;
    538 }
    539 
    540 /*
    541  * ========== RX side routines ==========
    542  */
    543 
    544 /*
    545  * Function to update receive statistics on various errors
    546  */
    547 static void
    548 dmfe_update_rx_stats(dmfe_t *dmfep, uint32_t desc0)
    549 {
    550 	ASSERT(mutex_owned(dmfep->rxlock));
    551 
    552 	/*
    553 	 * The error summary bit and the error bits that it summarises
    554 	 * are only valid if this is the last fragment.  Therefore, a
    555 	 * fragment only contributes to the error statistics if both
    556 	 * the last-fragment and error summary bits are set.
    557 	 */
    558 	if (((RX_LAST_DESC | RX_ERR_SUMMARY) & ~desc0) == 0) {
    559 		dmfep->rx_stats_ierrors += 1;
    560 
    561 		/*
    562 		 * There are some other error bits in the descriptor for
    563 		 * which there don't seem to be appropriate MAC statistics,
    564 		 * notably RX_COLLISION and perhaps RX_DESC_ERR.  The
    565 		 * latter may not be possible if it is supposed to indicate
    566 		 * that one buffer has been filled with a partial packet
    567 		 * and the next buffer required for the rest of the packet
    568 		 * was not available, as all our buffers are more than large
    569 		 * enough for a whole packet without fragmenting.
    570 		 */
    571 
    572 		if (desc0 & RX_OVERFLOW) {
    573 			dmfep->rx_stats_overflow += 1;
    574 
    575 		} else if (desc0 & RX_RUNT_FRAME)
    576 			dmfep->rx_stats_short += 1;
    577 
    578 		if (desc0 & RX_CRC)
    579 			dmfep->rx_stats_fcs += 1;
    580 
    581 		if (desc0 & RX_FRAME2LONG)
    582 			dmfep->rx_stats_toolong += 1;
    583 	}
    584 
    585 	/*
    586 	 * A receive watchdog timeout is counted as a MAC-level receive
    587 	 * error.  Strangely, it doesn't set the packet error summary bit,
    588 	 * according to the chip data sheet :-?
    589 	 */
    590 	if (desc0 & RX_RCV_WD_TO)
    591 		dmfep->rx_stats_macrcv_errors += 1;
    592 
    593 	if (desc0 & RX_DRIBBLING)
    594 		dmfep->rx_stats_align += 1;
    595 
    596 	if (desc0 & RX_MII_ERR)
    597 		dmfep->rx_stats_macrcv_errors += 1;
    598 }
    599 
    600 /*
    601  * Receive incoming packet(s) and pass them up ...
    602  */
    603 static mblk_t *
    604 dmfe_getp(dmfe_t *dmfep)
    605 {
    606 	dma_area_t *descp;
    607 	mblk_t **tail;
    608 	mblk_t *head;
    609 	mblk_t *mp;
    610 	char *rxb;
    611 	uchar_t *dp;
    612 	uint32_t desc0;
    613 	uint32_t misses;
    614 	int packet_length;
    615 	int index;
    616 
    617 	mutex_enter(dmfep->rxlock);
    618 
    619 	/*
    620 	 * Update the missed frame statistic from the on-chip counter.
    621 	 */
    622 	misses = dmfe_chip_get32(dmfep, MISSED_FRAME_REG);
    623 	dmfep->rx_stats_norcvbuf += (misses & MISSED_FRAME_MASK);
    624 
    625 	/*
    626 	 * sync (all) receive descriptors before inspecting them
    627 	 */
    628 	descp = &dmfep->rx_desc;
    629 	DMA_SYNC(descp, DDI_DMA_SYNC_FORKERNEL);
    630 
    631 	/*
    632 	 * We should own at least one RX entry, since we've had a
    633 	 * receive interrupt, but let's not be dogmatic about it.
    634 	 */
    635 	index = dmfep->rx.next_free;
    636 	desc0 = dmfe_ring_get32(descp, index, DESC0);
    637 
    638 	DTRACE_PROBE1(rx__start, uint32_t, desc0);
    639 	for (head = NULL, tail = &head; (desc0 & RX_OWN) == 0; ) {
    640 		/*
    641 		 * Maintain statistics for every descriptor returned
    642 		 * to us by the chip ...
    643 		 */
    644 		dmfe_update_rx_stats(dmfep, desc0);
    645 
    646 		/*
    647 		 * Check that the entry has both "packet start" and
    648 		 * "packet end" flags.  We really shouldn't get packet
    649 		 * fragments, 'cos all the RX buffers are bigger than
    650 		 * the largest valid packet.  So we'll just drop any
    651 		 * fragments we find & skip on to the next entry.
    652 		 */
    653 		if (((RX_FIRST_DESC | RX_LAST_DESC) & ~desc0) != 0) {
    654 			DTRACE_PROBE1(rx__frag, uint32_t, desc0);
    655 			goto skip;
    656 		}
    657 
    658 		/*
    659 		 * A whole packet in one buffer.  We have to check error
    660 		 * status and packet length before forwarding it upstream.
    661 		 */
    662 		if (desc0 & RX_ERR_SUMMARY) {
    663 			DTRACE_PROBE1(rx__err, uint32_t, desc0);
    664 			goto skip;
    665 		}
    666 
    667 		packet_length = (desc0 >> 16) & 0x3fff;
    668 		if (packet_length > DMFE_MAX_PKT_SIZE) {
    669 			DTRACE_PROBE1(rx__toobig, int, packet_length);
    670 			goto skip;
    671 		} else if (packet_length < ETHERMIN) {
    672 			/*
    673 			 * Note that VLAN packet would be even larger,
    674 			 * but we don't worry about dropping runt VLAN
    675 			 * frames.
    676 			 *
    677 			 * This check is probably redundant, as well,
    678 			 * since the hardware should drop RUNT frames.
    679 			 */
    680 			DTRACE_PROBE1(rx__runt, int, packet_length);
    681 			goto skip;
    682 		}
    683 
    684 		/*
    685 		 * Sync the data, so we can examine it; then check that
    686 		 * the packet is really intended for us (remember that
    687 		 * if we're using Imperfect Filtering, then the chip will
    688 		 * receive unicast packets sent to stations whose addresses
    689 		 * just happen to hash to the same value as our own; we
    690 		 * discard these here so they don't get sent upstream ...)
    691 		 */
    692 		(void) ddi_dma_sync(dmfep->rx_buff.dma_hdl,
    693 		    index * DMFE_BUF_SIZE, DMFE_BUF_SIZE,
    694 		    DDI_DMA_SYNC_FORKERNEL);
    695 		rxb = &dmfep->rx_buff.mem_va[index*DMFE_BUF_SIZE];
    696 
    697 
    698 		/*
    699 		 * We do not bother to check that the packet is really for
    700 		 * us, we let the MAC framework make that check instead.
    701 		 * This is especially important if we ever want to support
    702 		 * multiple MAC addresses.
    703 		 */
    704 
    705 		/*
    706 		 * Packet looks good; get a buffer to copy it into.  We
    707 		 * allow some space at the front of the allocated buffer
    708 		 * (HEADROOM) in case any upstream modules want to prepend
    709 		 * some sort of header.  The value has been carefully chosen
    710 		 * So that it also has the side-effect of making the packet
    711 		 * *contents* 4-byte aligned, as required by NCA!
    712 		 */
    713 		mp = allocb(DMFE_HEADROOM + packet_length, 0);
    714 		if (mp == NULL) {
    715 			DTRACE_PROBE(rx__no__buf);
    716 			dmfep->rx_stats_norcvbuf += 1;
    717 			goto skip;
    718 		}
    719 
    720 		/*
    721 		 * Account for statistics of good packets.
    722 		 */
    723 		dmfep->rx_stats_ipackets += 1;
    724 		dmfep->rx_stats_rbytes += packet_length;
    725 		if (desc0 & RX_MULTI_FRAME) {
    726 			if (bcmp(rxb, dmfe_broadcast_addr, ETHERADDRL)) {
    727 				dmfep->rx_stats_multi += 1;
    728 			} else {
    729 				dmfep->rx_stats_bcast += 1;
    730 			}
    731 		}
    732 
    733 		/*
    734 		 * Copy the packet into the STREAMS buffer
    735 		 */
    736 		dp = mp->b_rptr += DMFE_HEADROOM;
    737 		mp->b_cont = mp->b_next = NULL;
    738 
    739 		/*
    740 		 * Don't worry about stripping the vlan tag, the MAC
    741 		 * layer will take care of that for us.
    742 		 */
    743 		bcopy(rxb, dp, packet_length);
    744 
    745 		/*
    746 		 * Fix up the packet length, and link it to the chain
    747 		 */
    748 		mp->b_wptr = mp->b_rptr + packet_length - ETHERFCSL;
    749 		*tail = mp;
    750 		tail = &mp->b_next;
    751 
    752 	skip:
    753 		/*
    754 		 * Return ownership of ring entry & advance to next
    755 		 */
    756 		dmfe_ring_put32(descp, index, DESC0, RX_OWN);
    757 		index = NEXT(index, dmfep->rx.n_desc);
    758 		desc0 = dmfe_ring_get32(descp, index, DESC0);
    759 	}
    760 
    761 	/*
    762 	 * Remember where to start looking next time ...
    763 	 */
    764 	dmfep->rx.next_free = index;
    765 
    766 	/*
    767 	 * sync the receive descriptors that we've given back
    768 	 * (actually, we sync all of them for simplicity), and
    769 	 * wake the chip in case it had suspended receive
    770 	 */
    771 	DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV);
    772 	dmfe_chip_put32(dmfep, RX_POLL_REG, 0);
    773 
    774 	mutex_exit(dmfep->rxlock);
    775 	return (head);
    776 }
    777 
    778 /*
    779  * ========== Primary TX side routines ==========
    780  */
    781 
    782 /*
    783  *	TX ring management:
    784  *
    785  *	There are <tx.n_desc> entries in the ring, of which those from
    786  *	<tx.next_free> round to but not including <tx.next_busy> must
    787  *	be owned by the CPU.  The number of such entries should equal
    788  *	<tx.n_free>; but there may also be some more entries which the
    789  *	chip has given back but which we haven't yet accounted for.
    790  *	The routine dmfe_reclaim_tx_desc() adjusts the indexes & counts
    791  *	as it discovers such entries.
    792  *
    793  *	Initially, or when the ring is entirely free:
    794  *		C = Owned by CPU
    795  *		D = Owned by Davicom (DMFE) chip
    796  *
    797  *	tx.next_free					tx.n_desc = 16
    798  *	  |
    799  *	  v
    800  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    801  *	| C | C | C | C | C | C | C | C | C | C | C | C | C | C | C | C |
    802  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    803  *	  ^
    804  *	  |
    805  *	tx.next_busy					tx.n_free = 16
    806  *
    807  *	On entry to reclaim() during normal use:
    808  *
    809  *					tx.next_free	tx.n_desc = 16
    810  *					      |
    811  *					      v
    812  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    813  *	| C | C | C | C | C | C | D | D | D | C | C | C | C | C | C | C |
    814  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    815  *		  ^
    816  *		  |
    817  *		tx.next_busy				tx.n_free = 9
    818  *
    819  *	On exit from reclaim():
    820  *
    821  *					tx.next_free	tx.n_desc = 16
    822  *					      |
    823  *					      v
    824  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    825  *	| C | C | C | C | C | C | D | D | D | C | C | C | C | C | C | C |
    826  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    827  *				  ^
    828  *				  |
    829  *			     tx.next_busy		tx.n_free = 13
    830  *
    831  *	The ring is considered "full" when only one entry is owned by
    832  *	the CPU; thus <tx.n_free> should always be >= 1.
    833  *
    834  *			tx.next_free			tx.n_desc = 16
    835  *			      |
    836  *			      v
    837  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    838  *	| D | D | D | D | D | C | D | D | D | D | D | D | D | D | D | D |
    839  *	+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    840  *				  ^
    841  *				  |
    842  *			     tx.next_busy		tx.n_free = 1
    843  */
    844 
    845 /*
    846  * Function to update transmit statistics on various errors
    847  */
    848 static void
    849 dmfe_update_tx_stats(dmfe_t *dmfep, int index, uint32_t desc0, uint32_t desc1)
    850 {
    851 	uint32_t collisions;
    852 	uint32_t errbits;
    853 	uint32_t errsum;
    854 
    855 	ASSERT(mutex_owned(dmfep->txlock));
    856 
    857 	collisions = ((desc0 >> 3) & 0x0f);
    858 	errsum = desc0 & TX_ERR_SUMMARY;
    859 	errbits = desc0 & (TX_UNDERFLOW | TX_LATE_COLL | TX_CARRIER_LOSS |
    860 	    TX_NO_CARRIER | TX_EXCESS_COLL | TX_JABBER_TO);
    861 	if ((errsum == 0) != (errbits == 0)) {
    862 		dmfe_log(dmfep, "dubious TX error status 0x%x", desc0);
    863 		desc0 |= TX_ERR_SUMMARY;
    864 	}
    865 
    866 	if (desc0 & TX_ERR_SUMMARY) {
    867 		dmfep->tx_stats_oerrors += 1;
    868 
    869 		/*
    870 		 * If we ever see a transmit jabber timeout, we count it
    871 		 * as a MAC-level transmit error; but we probably won't
    872 		 * see it as it causes an Abnormal interrupt and we reset
    873 		 * the chip in order to recover
    874 		 */
    875 		if (desc0 & TX_JABBER_TO) {
    876 			dmfep->tx_stats_macxmt_errors += 1;
    877 			dmfep->tx_stats_jabber += 1;
    878 		}
    879 
    880 		if (desc0 & TX_UNDERFLOW)
    881 			dmfep->tx_stats_underflow += 1;
    882 		else if (desc0 & TX_LATE_COLL)
    883 			dmfep->tx_stats_xmtlatecoll += 1;
    884 
    885 		if (desc0 & (TX_CARRIER_LOSS | TX_NO_CARRIER))
    886 			dmfep->tx_stats_nocarrier += 1;
    887 
    888 		if (desc0 & TX_EXCESS_COLL) {
    889 			dmfep->tx_stats_excoll += 1;
    890 			collisions = 16;
    891 		}
    892 	} else {
    893 		int	bit = index % NBBY;
    894 		int	byt = index / NBBY;
    895 
    896 		if (dmfep->tx_mcast[byt] & bit) {
    897 			dmfep->tx_mcast[byt] &= ~bit;
    898 			dmfep->tx_stats_multi += 1;
    899 
    900 		} else if (dmfep->tx_bcast[byt] & bit) {
    901 			dmfep->tx_bcast[byt] &= ~bit;
    902 			dmfep->tx_stats_bcast += 1;
    903 		}
    904 
    905 		dmfep->tx_stats_opackets += 1;
    906 		dmfep->tx_stats_obytes += desc1 & TX_BUFFER_SIZE1;
    907 	}
    908 
    909 	if (collisions == 1)
    910 		dmfep->tx_stats_first_coll += 1;
    911 	else if (collisions != 0)
    912 		dmfep->tx_stats_multi_coll += 1;
    913 	dmfep->tx_stats_collisions += collisions;
    914 
    915 	if (desc0 & TX_DEFERRED)
    916 		dmfep->tx_stats_defer += 1;
    917 }
    918 
    919 /*
    920  * Reclaim all the ring entries that the chip has returned to us ...
    921  *
    922  * Returns B_FALSE if no entries could be reclaimed.  Otherwise, reclaims
    923  * as many as possible, restarts the TX stall timeout, and returns B_TRUE.
    924  */
    925 static boolean_t
    926 dmfe_reclaim_tx_desc(dmfe_t *dmfep)
    927 {
    928 	dma_area_t *descp;
    929 	uint32_t desc0;
    930 	uint32_t desc1;
    931 	int i;
    932 
    933 	ASSERT(mutex_owned(dmfep->txlock));
    934 
    935 	/*
    936 	 * sync transmit descriptor ring before looking at it
    937 	 */
    938 	descp = &dmfep->tx_desc;
    939 	DMA_SYNC(descp, DDI_DMA_SYNC_FORKERNEL);
    940 
    941 	/*
    942 	 * Early exit if there are no descriptors to reclaim, either
    943 	 * because they're all reclaimed already, or because the next
    944 	 * one is still owned by the chip ...
    945 	 */
    946 	i = dmfep->tx.next_busy;
    947 	if (i == dmfep->tx.next_free)
    948 		return (B_FALSE);
    949 	desc0 = dmfe_ring_get32(descp, i, DESC0);
    950 	if (desc0 & TX_OWN)
    951 		return (B_FALSE);
    952 
    953 	/*
    954 	 * Reclaim as many descriptors as possible ...
    955 	 */
    956 	for (;;) {
    957 		desc1 = dmfe_ring_get32(descp, i, DESC1);
    958 		ASSERT((desc1 & (TX_SETUP_PACKET | TX_LAST_DESC)) != 0);
    959 
    960 		if ((desc1 & TX_SETUP_PACKET) == 0) {
    961 			/*
    962 			 * Regular packet - just update stats
    963 			 */
    964 			dmfe_update_tx_stats(dmfep, i, desc0, desc1);
    965 		}
    966 
    967 		/*
    968 		 * Update count & index; we're all done if the ring is
    969 		 * now fully reclaimed, or the next entry if still owned
    970 		 * by the chip ...
    971 		 */
    972 		dmfep->tx.n_free += 1;
    973 		i = NEXT(i, dmfep->tx.n_desc);
    974 		if (i == dmfep->tx.next_free)
    975 			break;
    976 		desc0 = dmfe_ring_get32(descp, i, DESC0);
    977 		if (desc0 & TX_OWN)
    978 			break;
    979 	}
    980 
    981 	dmfep->tx.next_busy = i;
    982 	dmfep->tx_pending_tix = 0;
    983 	return (B_TRUE);
    984 }
    985 
    986 /*
    987  * Send the message in the message block chain <mp>.
    988  *
    989  * The message is freed if and only if its contents are successfully copied
    990  * and queued for transmission (so that the return value is B_TRUE).
    991  * If we can't queue the message, the return value is B_FALSE and
    992  * the message is *not* freed.
    993  *
    994  * This routine handles the special case of <mp> == NULL, which indicates
    995  * that we want to "send" the special "setup packet" allocated during
    996  * startup.  We have to use some different flags in the packet descriptor
    997  * to say its a setup packet (from the global <dmfe_setup_desc1>), and the
    998  * setup packet *isn't* freed after use.
    999  */
   1000 static boolean_t
   1001 dmfe_send_msg(dmfe_t *dmfep, mblk_t *mp)
   1002 {
   1003 	dma_area_t *descp;
   1004 	mblk_t *bp;
   1005 	char *txb;
   1006 	uint32_t desc1;
   1007 	uint32_t index;
   1008 	size_t totlen;
   1009 	size_t mblen;
   1010 	uint32_t paddr;
   1011 
   1012 	/*
   1013 	 * If the number of free slots is below the reclaim threshold
   1014 	 * (soft limit), we'll try to reclaim some.  If we fail, and
   1015 	 * the number of free slots is also below the minimum required
   1016 	 * (the hard limit, usually 1), then we can't send the packet.
   1017 	 */
   1018 	mutex_enter(dmfep->txlock);
   1019 	if (dmfep->suspended)
   1020 		return (B_FALSE);
   1021 
   1022 	if (dmfep->tx.n_free <= dmfe_tx_reclaim_level &&
   1023 	    dmfe_reclaim_tx_desc(dmfep) == B_FALSE &&
   1024 	    dmfep->tx.n_free <= dmfe_tx_min_free) {
   1025 		/*
   1026 		 * Resource shortage - return B_FALSE so the packet
   1027 		 * will be queued for retry after the next TX-done
   1028 		 * interrupt.
   1029 		 */
   1030 		mutex_exit(dmfep->txlock);
   1031 		DTRACE_PROBE(tx__no__desc);
   1032 		return (B_FALSE);
   1033 	}
   1034 
   1035 	/*
   1036 	 * There's a slot available, so claim it by incrementing
   1037 	 * the next-free index and decrementing the free count.
   1038 	 * If the ring is currently empty, we also restart the
   1039 	 * stall-detect timer.  The ASSERTions check that our
   1040 	 * invariants still hold:
   1041 	 *	the next-free index must not match the next-busy index
   1042 	 *	there must still be at least one free entry
   1043 	 * After this, we now have exclusive ownership of the ring
   1044 	 * entry (and matching buffer) indicated by <index>, so we
   1045 	 * don't need to hold the TX lock any longer
   1046 	 */
   1047 	index = dmfep->tx.next_free;
   1048 	dmfep->tx.next_free = NEXT(index, dmfep->tx.n_desc);
   1049 	ASSERT(dmfep->tx.next_free != dmfep->tx.next_busy);
   1050 	if (dmfep->tx.n_free-- == dmfep->tx.n_desc)
   1051 		dmfep->tx_pending_tix = 0;
   1052 	ASSERT(dmfep->tx.n_free >= 1);
   1053 	mutex_exit(dmfep->txlock);
   1054 
   1055 	/*
   1056 	 * Check the ownership of the ring entry ...
   1057 	 */
   1058 	descp = &dmfep->tx_desc;
   1059 	ASSERT((dmfe_ring_get32(descp, index, DESC0) & TX_OWN) == 0);
   1060 
   1061 	if (mp == NULL) {
   1062 		/*
   1063 		 * Indicates we should send a SETUP packet, which we do by
   1064 		 * temporarily switching the BUFFER1 pointer in the ring
   1065 		 * entry.  The reclaim routine will restore BUFFER1 to its
   1066 		 * usual value.
   1067 		 *
   1068 		 * Note that as the setup packet is tagged on the end of
   1069 		 * the TX ring, when we sync the descriptor we're also
   1070 		 * implicitly syncing the setup packet - hence, we don't
   1071 		 * need a separate ddi_dma_sync() call here.
   1072 		 */
   1073 		desc1 = dmfe_setup_desc1;
   1074 		paddr = descp->setup_dvma;
   1075 	} else {
   1076 		/*
   1077 		 * A regular packet; we copy the data into a pre-mapped
   1078 		 * buffer, which avoids the overhead (and complication)
   1079 		 * of mapping/unmapping STREAMS buffers and keeping hold
   1080 		 * of them until the DMA has completed.
   1081 		 *
   1082 		 * Because all buffers are the same size, and larger
   1083 		 * than the longest single valid message, we don't have
   1084 		 * to bother about splitting the message across multiple
   1085 		 * buffers.
   1086 		 */
   1087 		txb = &dmfep->tx_buff.mem_va[index*DMFE_BUF_SIZE];
   1088 		totlen = 0;
   1089 		bp = mp;
   1090 
   1091 		/*
   1092 		 * Copy all (remaining) mblks in the message ...
   1093 		 */
   1094 		for (; bp != NULL; bp = bp->b_cont) {
   1095 			mblen = MBLKL(bp);
   1096 			if ((totlen += mblen) <= DMFE_MAX_PKT_SIZE) {
   1097 				bcopy(bp->b_rptr, txb, mblen);
   1098 				txb += mblen;
   1099 			}
   1100 		}
   1101 
   1102 		/*
   1103 		 * Is this a multicast or broadcast packet?  We do
   1104 		 * this so that we can track statistics accurately
   1105 		 * when we reclaim it.
   1106 		 */
   1107 		txb = &dmfep->tx_buff.mem_va[index*DMFE_BUF_SIZE];
   1108 		if (txb[0] & 0x1) {
   1109 			if (bcmp(txb, dmfe_broadcast_addr, ETHERADDRL) == 0) {
   1110 				dmfep->tx_bcast[index / NBBY] |=
   1111 				    (1 << (index % NBBY));
   1112 			} else {
   1113 				dmfep->tx_mcast[index / NBBY] |=
   1114 				    (1 << (index % NBBY));
   1115 			}
   1116 		}
   1117 
   1118 		/*
   1119 		 * We'e reached the end of the chain; and we should have
   1120 		 * collected no more than DMFE_MAX_PKT_SIZE bytes into our
   1121 		 * buffer.  Note that the <size> field in the descriptor is
   1122 		 * only 11 bits, so bigger packets would be a problem!
   1123 		 */
   1124 		ASSERT(bp == NULL);
   1125 		ASSERT(totlen <= DMFE_MAX_PKT_SIZE);
   1126 		totlen &= TX_BUFFER_SIZE1;
   1127 		desc1 = TX_FIRST_DESC | TX_LAST_DESC | totlen;
   1128 		paddr = dmfep->tx_buff.mem_dvma + index*DMFE_BUF_SIZE;
   1129 
   1130 		(void) ddi_dma_sync(dmfep->tx_buff.dma_hdl,
   1131 		    index * DMFE_BUF_SIZE, DMFE_BUF_SIZE, DDI_DMA_SYNC_FORDEV);
   1132 	}
   1133 
   1134 	/*
   1135 	 * Update ring descriptor entries, sync them, and wake up the
   1136 	 * transmit process
   1137 	 */
   1138 	if ((index & dmfe_tx_int_factor) == 0)
   1139 		desc1 |= TX_INT_ON_COMP;
   1140 	desc1 |= TX_CHAINING;
   1141 	dmfe_ring_put32(descp, index, BUFFER1, paddr);
   1142 	dmfe_ring_put32(descp, index, DESC1, desc1);
   1143 	dmfe_ring_put32(descp, index, DESC0, TX_OWN);
   1144 	DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV);
   1145 	dmfe_chip_put32(dmfep, TX_POLL_REG, 0);
   1146 
   1147 	/*
   1148 	 * Finally, free the message & return success
   1149 	 */
   1150 	if (mp)
   1151 		freemsg(mp);
   1152 	return (B_TRUE);
   1153 }
   1154 
   1155 /*
   1156  *	dmfe_m_tx() -- send a chain of packets
   1157  *
   1158  *	Called when packet(s) are ready to be transmitted. A pointer to an
   1159  *	M_DATA message that contains the packet is passed to this routine.
   1160  *	The complete LLC header is contained in the message's first message
   1161  *	block, and the remainder of the packet is contained within
   1162  *	additional M_DATA message blocks linked to the first message block.
   1163  *
   1164  *	Additional messages may be passed by linking with b_next.
   1165  */
   1166 static mblk_t *
   1167 dmfe_m_tx(void *arg, mblk_t *mp)
   1168 {
   1169 	dmfe_t *dmfep = arg;			/* private device info	*/
   1170 	mblk_t *next;
   1171 
   1172 	ASSERT(mp != NULL);
   1173 	ASSERT(dmfep->mac_state == DMFE_MAC_STARTED);
   1174 
   1175 	if (dmfep->chip_state != CHIP_RUNNING)
   1176 		return (mp);
   1177 
   1178 	while (mp != NULL) {
   1179 		next = mp->b_next;
   1180 		mp->b_next = NULL;
   1181 		if (!dmfe_send_msg(dmfep, mp)) {
   1182 			mp->b_next = next;
   1183 			break;
   1184 		}
   1185 		mp = next;
   1186 	}
   1187 
   1188 	return (mp);
   1189 }
   1190 
   1191 /*
   1192  * ========== Address-setting routines (TX-side) ==========
   1193  */
   1194 
   1195 /*
   1196  * Find the index of the relevant bit in the setup packet.
   1197  * This must mirror the way the hardware will actually calculate it!
   1198  */
   1199 static uint32_t
   1200 dmfe_hash_index(const uint8_t *address)
   1201 {
   1202 	uint32_t const POLY = HASH_POLY;
   1203 	uint32_t crc = HASH_CRC;
   1204 	uint32_t index;
   1205 	uint32_t msb;
   1206 	uchar_t currentbyte;
   1207 	int byteslength;
   1208 	int shift;
   1209 	int bit;
   1210 
   1211 	for (byteslength = 0; byteslength < ETHERADDRL; ++byteslength) {
   1212 		currentbyte = address[byteslength];
   1213 		for (bit = 0; bit < 8; ++bit) {
   1214 			msb = crc >> 31;
   1215 			crc <<= 1;
   1216 			if (msb ^ (currentbyte & 1)) {
   1217 				crc ^= POLY;
   1218 				crc |= 0x00000001;
   1219 			}
   1220 			currentbyte >>= 1;
   1221 		}
   1222 	}
   1223 
   1224 	for (index = 0, bit = 23, shift = 8; shift >= 0; ++bit, --shift)
   1225 		index |= (((crc >> bit) & 1) << shift);
   1226 
   1227 	return (index);
   1228 }
   1229 
   1230 /*
   1231  * Find and set/clear the relevant bit in the setup packet hash table
   1232  * This must mirror the way the hardware will actually interpret it!
   1233  */
   1234 static void
   1235 dmfe_update_hash(dmfe_t *dmfep, uint32_t index, boolean_t val)
   1236 {
   1237 	dma_area_t *descp;
   1238 	uint32_t tmp;
   1239 
   1240 	ASSERT(mutex_owned(dmfep->oplock));
   1241 
   1242 	descp = &dmfep->tx_desc;
   1243 	tmp = dmfe_setup_get32(descp, index/16);
   1244 	if (val)
   1245 		tmp |= 1 << (index%16);
   1246 	else
   1247 		tmp &= ~(1 << (index%16));
   1248 	dmfe_setup_put32(descp, index/16, tmp);
   1249 }
   1250 
   1251 /*
   1252  * Update the refcount for the bit in the setup packet corresponding
   1253  * to the specified address; if it changes between zero & nonzero,
   1254  * also update the bitmap itself & return B_TRUE, so that the caller
   1255  * knows to re-send the setup packet.  Otherwise (only the refcount
   1256  * changed), return B_FALSE
   1257  */
   1258 static boolean_t
   1259 dmfe_update_mcast(dmfe_t *dmfep, const uint8_t *mca, boolean_t val)
   1260 {
   1261 	uint32_t index;
   1262 	uint8_t *refp;
   1263 	boolean_t change;
   1264 
   1265 	index = dmfe_hash_index(mca);
   1266 	refp = &dmfep->mcast_refs[index];
   1267 	change = (val ? (*refp)++ : --(*refp)) == 0;
   1268 
   1269 	if (change)
   1270 		dmfe_update_hash(dmfep, index, val);
   1271 
   1272 	return (change);
   1273 }
   1274 
   1275 /*
   1276  * "Transmit" the (possibly updated) magic setup packet
   1277  */
   1278 static int
   1279 dmfe_send_setup(dmfe_t *dmfep)
   1280 {
   1281 	int status;
   1282 
   1283 	ASSERT(mutex_owned(dmfep->oplock));
   1284 
   1285 	if (dmfep->suspended)
   1286 		return (0);
   1287 
   1288 	/*
   1289 	 * If the chip isn't running, we can't really send the setup frame
   1290 	 * now but it doesn't matter, 'cos it will be sent when the transmit
   1291 	 * process is restarted (see dmfe_start()).
   1292 	 */
   1293 	if ((dmfep->opmode & START_TRANSMIT) == 0)
   1294 		return (0);
   1295 
   1296 	/*
   1297 	 * "Send" the setup frame.  If it fails (e.g. no resources),
   1298 	 * set a flag; then the factotum will retry the "send".  Once
   1299 	 * it works, we can clear the flag no matter how many attempts
   1300 	 * had previously failed.  We tell the caller that it worked
   1301 	 * whether it did or not; after all, it *will* work eventually.
   1302 	 */
   1303 	status = dmfe_send_msg(dmfep, NULL);
   1304 	dmfep->need_setup = status ? B_FALSE : B_TRUE;
   1305 	return (0);
   1306 }
   1307 
   1308 /*
   1309  *	dmfe_m_unicst() -- set the physical network address
   1310  */
   1311 static int
   1312 dmfe_m_unicst(void *arg, const uint8_t *macaddr)
   1313 {
   1314 	dmfe_t *dmfep = arg;
   1315 	int status;
   1316 	int index;
   1317 
   1318 	/*
   1319 	 * Update our current address and send out a new setup packet
   1320 	 *
   1321 	 * Here we accommodate the use of HASH_ONLY or HASH_AND_PERFECT
   1322 	 * filtering modes (we don't support PERFECT_ONLY or INVERSE modes).
   1323 	 *
   1324 	 * It is said that there is a bug in the 21140 where it fails to
   1325 	 * receive packes addresses to the specified perfect filter address.
   1326 	 * If the same bug is present in the DM9102A, the TX_FILTER_TYPE1
   1327 	 * bit should be set in the module variable dmfe_setup_desc1.
   1328 	 *
   1329 	 * If TX_FILTER_TYPE1 is set, we will use HASH_ONLY filtering.
   1330 	 * In this mode, *all* incoming addresses are hashed and looked
   1331 	 * up in the bitmap described by the setup packet.  Therefore,
   1332 	 * the bit representing the station address has to be added to
   1333 	 * the table before sending it out.  If the address is changed,
   1334 	 * the old entry should be removed before the new entry is made.
   1335 	 *
   1336 	 * NOTE: in this mode, unicast packets that are not intended for
   1337 	 * this station may be received; it is up to software to filter
   1338 	 * them out afterwards!
   1339 	 *
   1340 	 * If TX_FILTER_TYPE1 is *not* set, we will use HASH_AND_PERFECT
   1341 	 * filtering.  In this mode, multicast addresses are hashed and
   1342 	 * checked against the bitmap, while unicast addresses are simply
   1343 	 * matched against the one physical address specified in the setup
   1344 	 * packet.  This means that we shouldn't receive unicast packets
   1345 	 * that aren't intended for us (but software still has to filter
   1346 	 * multicast packets just the same).
   1347 	 *
   1348 	 * Whichever mode we're using, we have to enter the broadcast
   1349 	 * address into the multicast filter map too, so we do this on
   1350 	 * the first time through after attach or reset.
   1351 	 */
   1352 	mutex_enter(dmfep->oplock);
   1353 
   1354 	if (dmfep->addr_set && dmfe_setup_desc1 & TX_FILTER_TYPE1)
   1355 		(void) dmfe_update_mcast(dmfep, dmfep->curr_addr, B_FALSE);
   1356 	if (dmfe_setup_desc1 & TX_FILTER_TYPE1)
   1357 		(void) dmfe_update_mcast(dmfep, macaddr, B_TRUE);
   1358 	if (!dmfep->addr_set)
   1359 		(void) dmfe_update_mcast(dmfep, dmfe_broadcast_addr, B_TRUE);
   1360 
   1361 	/*
   1362 	 * Remember the new current address
   1363 	 */
   1364 	ethaddr_copy(macaddr, dmfep->curr_addr);
   1365 	dmfep->addr_set = B_TRUE;
   1366 
   1367 	/*
   1368 	 * Install the new physical address into the proper position in
   1369 	 * the setup frame; this is only used if we select hash+perfect
   1370 	 * filtering, but we'll put it in anyway.  The ugliness here is
   1371 	 * down to the usual war of the egg :(
   1372 	 */
   1373 	for (index = 0; index < ETHERADDRL; index += 2)
   1374 		dmfe_setup_put32(&dmfep->tx_desc, SETUPBUF_PHYS+index/2,
   1375 		    (macaddr[index+1] << 8) | macaddr[index]);
   1376 
   1377 	/*
   1378 	 * Finally, we're ready to "transmit" the setup frame
   1379 	 */
   1380 	status = dmfe_send_setup(dmfep);
   1381 	mutex_exit(dmfep->oplock);
   1382 
   1383 	return (status);
   1384 }
   1385 
   1386 /*
   1387  *	dmfe_m_multicst() -- enable or disable a multicast address
   1388  *
   1389  *	Program the hardware to enable/disable the multicast address
   1390  *	in "mca" (enable if add is true, otherwise disable it.)
   1391  *	We keep a refcount for each bit in the map, so that it still
   1392  *	works out properly if multiple addresses hash to the same bit.
   1393  *	dmfe_update_mcast() tells us whether the map actually changed;
   1394  *	if so, we have to re-"transmit" the magic setup packet.
   1395  */
   1396 static int
   1397 dmfe_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
   1398 {
   1399 	dmfe_t *dmfep = arg;			/* private device info	*/
   1400 	int status = 0;
   1401 
   1402 	mutex_enter(dmfep->oplock);
   1403 	if (dmfe_update_mcast(dmfep, mca, add))
   1404 		status = dmfe_send_setup(dmfep);
   1405 	mutex_exit(dmfep->oplock);
   1406 
   1407 	return (status);
   1408 }
   1409 
   1410 
   1411 /*
   1412  * ========== Internal state management entry points ==========
   1413  */
   1414 
   1415 /*
   1416  * These routines provide all the functionality required by the
   1417  * corresponding MAC layer entry points, but don't update the MAC layer state
   1418  * so they can be called internally without disturbing our record
   1419  * of what MAC layer thinks we should be doing ...
   1420  */
   1421 
   1422 /*
   1423  *	dmfe_stop() -- stop processing, don't reset h/w or rings
   1424  */
   1425 static void
   1426 dmfe_stop(dmfe_t *dmfep)
   1427 {
   1428 	ASSERT(mutex_owned(dmfep->oplock));
   1429 
   1430 	dmfe_stop_chip(dmfep, CHIP_STOPPED);
   1431 }
   1432 
   1433 /*
   1434  *	dmfe_reset() -- stop processing, reset h/w & rings to initial state
   1435  */
   1436 static void
   1437 dmfe_reset(dmfe_t *dmfep)
   1438 {
   1439 	ASSERT(mutex_owned(dmfep->oplock));
   1440 	ASSERT(mutex_owned(dmfep->rxlock));
   1441 	ASSERT(mutex_owned(dmfep->txlock));
   1442 
   1443 	dmfe_stop_chip(dmfep, CHIP_RESET);
   1444 	dmfe_init_rings(dmfep);
   1445 }
   1446 
   1447 /*
   1448  *	dmfe_start() -- start transmitting/receiving
   1449  */
   1450 static void
   1451 dmfe_start(dmfe_t *dmfep)
   1452 {
   1453 	uint32_t gpsr;
   1454 
   1455 	ASSERT(mutex_owned(dmfep->oplock));
   1456 
   1457 	ASSERT(dmfep->chip_state == CHIP_RESET ||
   1458 	    dmfep->chip_state == CHIP_STOPPED);
   1459 
   1460 	/*
   1461 	 * Make opmode consistent with PHY duplex setting
   1462 	 */
   1463 	gpsr = dmfe_chip_get32(dmfep, PHY_STATUS_REG);
   1464 	if (gpsr & GPS_FULL_DUPLEX)
   1465 		dmfep->opmode |= FULL_DUPLEX;
   1466 	else
   1467 		dmfep->opmode &= ~FULL_DUPLEX;
   1468 
   1469 	/*
   1470 	 * Start transmit processing
   1471 	 * Set up the address filters
   1472 	 * Start receive processing
   1473 	 * Enable interrupts
   1474 	 */
   1475 	dmfe_start_chip(dmfep, START_TRANSMIT);
   1476 	(void) dmfe_send_setup(dmfep);
   1477 	drv_usecwait(10);
   1478 	dmfe_start_chip(dmfep, START_RECEIVE);
   1479 	dmfe_enable_interrupts(dmfep);
   1480 }
   1481 
   1482 /*
   1483  * dmfe_restart - restart transmitting/receiving after error or suspend
   1484  */
   1485 static void
   1486 dmfe_restart(dmfe_t *dmfep)
   1487 {
   1488 	ASSERT(mutex_owned(dmfep->oplock));
   1489 
   1490 	/*
   1491 	 * You need not only <oplock>, but also <rxlock> AND <txlock>
   1492 	 * in order to reset the rings, but then <txlock> *mustn't*
   1493 	 * be held across the call to dmfe_start()
   1494 	 */
   1495 	mutex_enter(dmfep->rxlock);
   1496 	mutex_enter(dmfep->txlock);
   1497 	dmfe_reset(dmfep);
   1498 	mutex_exit(dmfep->txlock);
   1499 	mutex_exit(dmfep->rxlock);
   1500 	if (dmfep->mac_state == DMFE_MAC_STARTED) {
   1501 		dmfe_start(dmfep);
   1502 	}
   1503 }
   1504 
   1505 
   1506 /*
   1507  * ========== MAC-required management entry points ==========
   1508  */
   1509 
   1510 /*
   1511  *	dmfe_m_stop() -- stop transmitting/receiving
   1512  */
   1513 static void
   1514 dmfe_m_stop(void *arg)
   1515 {
   1516 	dmfe_t *dmfep = arg;			/* private device info	*/
   1517 
   1518 	/*
   1519 	 * Just stop processing, then record new MAC state
   1520 	 */
   1521 	mii_stop(dmfep->mii);
   1522 
   1523 	mutex_enter(dmfep->oplock);
   1524 	if (!dmfep->suspended)
   1525 		dmfe_stop(dmfep);
   1526 	dmfep->mac_state = DMFE_MAC_STOPPED;
   1527 	mutex_exit(dmfep->oplock);
   1528 }
   1529 
   1530 /*
   1531  *	dmfe_m_start() -- start transmitting/receiving
   1532  */
   1533 static int
   1534 dmfe_m_start(void *arg)
   1535 {
   1536 	dmfe_t *dmfep = arg;			/* private device info	*/
   1537 
   1538 	/*
   1539 	 * Start processing and record new MAC state
   1540 	 */
   1541 	mutex_enter(dmfep->oplock);
   1542 	if (!dmfep->suspended)
   1543 		dmfe_start(dmfep);
   1544 	dmfep->mac_state = DMFE_MAC_STARTED;
   1545 	mutex_exit(dmfep->oplock);
   1546 
   1547 	mii_start(dmfep->mii);
   1548 
   1549 	return (0);
   1550 }
   1551 
   1552 /*
   1553  * dmfe_m_promisc() -- set or reset promiscuous mode on the board
   1554  *
   1555  *	Program the hardware to enable/disable promiscuous and/or
   1556  *	receive-all-multicast modes.  Davicom don't document this
   1557  *	clearly, but it looks like we can do this on-the-fly (i.e.
   1558  *	without stopping & restarting the TX/RX processes).
   1559  */
   1560 static int
   1561 dmfe_m_promisc(void *arg, boolean_t on)
   1562 {
   1563 	dmfe_t *dmfep = arg;
   1564 
   1565 	mutex_enter(dmfep->oplock);
   1566 	dmfep->opmode &= ~(PROMISC_MODE | PASS_MULTICAST);
   1567 	if (on)
   1568 		dmfep->opmode |= PROMISC_MODE;
   1569 	if (!dmfep->suspended)
   1570 		dmfe_set_opmode(dmfep);
   1571 	mutex_exit(dmfep->oplock);
   1572 
   1573 	return (0);
   1574 }
   1575 
   1576 /*
   1577  * ========== Factotum, implemented as a softint handler ==========
   1578  */
   1579 
   1580 /*
   1581  * The factotum is woken up when there's something to do that we'd rather
   1582  * not do from inside a (high-level?) hardware interrupt handler.  Its
   1583  * two main tasks are:
   1584  *	reset & restart the chip after an error
   1585  *	update & restart the chip after a link status change
   1586  */
   1587 static uint_t
   1588 dmfe_factotum(caddr_t arg)
   1589 {
   1590 	dmfe_t *dmfep;
   1591 
   1592 	dmfep = (void *)arg;
   1593 	ASSERT(dmfep->dmfe_guard == DMFE_GUARD);
   1594 
   1595 	mutex_enter(dmfep->oplock);
   1596 	if (dmfep->suspended) {
   1597 		mutex_exit(dmfep->oplock);
   1598 		return (DDI_INTR_CLAIMED);
   1599 	}
   1600 
   1601 	dmfep->factotum_flag = 0;
   1602 	DRV_KS_INC(dmfep, KS_FACTOTUM_RUN);
   1603 
   1604 	/*
   1605 	 * Check for chip error ...
   1606 	 */
   1607 	if (dmfep->chip_state == CHIP_ERROR) {
   1608 		/*
   1609 		 * Error recovery required: reset the chip and the rings,
   1610 		 * then, if it's supposed to be running, kick it off again.
   1611 		 */
   1612 		DRV_KS_INC(dmfep, KS_RECOVERY);
   1613 		dmfe_restart(dmfep);
   1614 		mutex_exit(dmfep->oplock);
   1615 
   1616 		mii_reset(dmfep->mii);
   1617 
   1618 	} else if (dmfep->need_setup) {
   1619 		(void) dmfe_send_setup(dmfep);
   1620 		mutex_exit(dmfep->oplock);
   1621 	}
   1622 
   1623 	return (DDI_INTR_CLAIMED);
   1624 }
   1625 
   1626 static void
   1627 dmfe_wake_factotum(dmfe_t *dmfep, int ks_id, const char *why)
   1628 {
   1629 	_NOTE(ARGUNUSED(why));
   1630 	ASSERT(mutex_owned(dmfep->oplock));
   1631 	DRV_KS_INC(dmfep, ks_id);
   1632 
   1633 	if (dmfep->factotum_flag++ == 0)
   1634 		ddi_trigger_softintr(dmfep->factotum_id);
   1635 }
   1636 
   1637 
   1638 /*
   1639  * ========== Periodic Tasks (Cyclic handler & friends) ==========
   1640  */
   1641 
   1642 /*
   1643  * Periodic tick tasks, run from the cyclic handler
   1644  *
   1645  * Check for TX stall; flag an error and wake the factotum if so.
   1646  */
   1647 static void
   1648 dmfe_tick_stall_check(dmfe_t *dmfep, uint32_t gpsr, uint32_t istat)
   1649 {
   1650 	boolean_t tx_stall;
   1651 	uint32_t tx_state;
   1652 	uint32_t limit;
   1653 
   1654 	ASSERT(mutex_owned(dmfep->oplock));
   1655 
   1656 	/*
   1657 	 * Check for transmit stall ...
   1658 	 *
   1659 	 * IF there's at least one packet in the ring, AND the timeout
   1660 	 * has elapsed, AND we can't reclaim any descriptors, THEN we've
   1661 	 * stalled; we return B_TRUE to trigger a reset-and-recover cycle.
   1662 	 *
   1663 	 * Note that the timeout limit is based on the transmit engine
   1664 	 * state; we allow the transmitter longer to make progress in
   1665 	 * some states than in others, based on observations of this
   1666 	 * chip's actual behaviour in the lab.
   1667 	 *
   1668 	 * By observation, we find that on about 1 in 10000 passes through
   1669 	 * here, the TX lock is already held.  In that case, we'll skip
   1670 	 * the check on this pass rather than wait.  Most likely, the send
   1671 	 * routine was holding the lock when the interrupt happened, and
   1672 	 * we'll succeed next time through.  In the event of a real stall,
   1673 	 * the TX ring will fill up, after which the send routine won't be
   1674 	 * called any more and then we're sure to get in.
   1675 	 */
   1676 	tx_stall = B_FALSE;
   1677 	if (mutex_tryenter(dmfep->txlock)) {
   1678 		if (dmfep->tx.n_free < dmfep->tx.n_desc) {
   1679 			tx_state = TX_PROCESS_STATE(istat);
   1680 			if (gpsr & GPS_LINK_100)
   1681 				limit = stall_100_tix[tx_state];
   1682 			else
   1683 				limit = stall_10_tix[tx_state];
   1684 			if (++dmfep->tx_pending_tix >= limit &&
   1685 			    dmfe_reclaim_tx_desc(dmfep) == B_FALSE) {
   1686 				dmfe_log(dmfep, "TX stall detected "
   1687 				    "after %d ticks in state %d; "
   1688 				    "automatic recovery initiated",
   1689 				    dmfep->tx_pending_tix, tx_state);
   1690 				tx_stall = B_TRUE;
   1691 			}
   1692 		}
   1693 		mutex_exit(dmfep->txlock);
   1694 	}
   1695 
   1696 	if (tx_stall) {
   1697 		dmfe_stop_chip(dmfep, CHIP_ERROR);
   1698 		dmfe_wake_factotum(dmfep, KS_TX_STALL, "tick (TX stall)");
   1699 	}
   1700 }
   1701 
   1702 /*
   1703  * Cyclic callback handler
   1704  */
   1705 static void
   1706 dmfe_cyclic(void *arg)
   1707 {
   1708 	dmfe_t *dmfep = arg;			/* private device info */
   1709 	uint32_t istat;
   1710 	uint32_t gpsr;
   1711 
   1712 	/*
   1713 	 * If the chip's not RUNNING, there's nothing to do.
   1714 	 * If we can't get the mutex straight away, we'll just
   1715 	 * skip this pass; we'll back back soon enough anyway.
   1716 	 */
   1717 	if (mutex_tryenter(dmfep->oplock) == 0)
   1718 		return;
   1719 	if ((dmfep->suspended) || (dmfep->chip_state != CHIP_RUNNING)) {
   1720 		mutex_exit(dmfep->oplock);
   1721 		return;
   1722 	}
   1723 
   1724 	/*
   1725 	 * Recheck chip state (it might have been stopped since we
   1726 	 * checked above).  If still running, call each of the *tick*
   1727 	 * tasks.  They will check for link change, TX stall, etc ...
   1728 	 */
   1729 	if (dmfep->chip_state == CHIP_RUNNING) {
   1730 		istat = dmfe_chip_get32(dmfep, STATUS_REG);
   1731 		gpsr = dmfe_chip_get32(dmfep, PHY_STATUS_REG);
   1732 		dmfe_tick_stall_check(dmfep, gpsr, istat);
   1733 	}
   1734 
   1735 	DRV_KS_INC(dmfep, KS_CYCLIC_RUN);
   1736 	mutex_exit(dmfep->oplock);
   1737 }
   1738 
   1739 /*
   1740  * ========== Hardware interrupt handler ==========
   1741  */
   1742 
   1743 /*
   1744  *	dmfe_interrupt() -- handle chip interrupts
   1745  */
   1746 static uint_t
   1747 dmfe_interrupt(caddr_t arg)
   1748 {
   1749 	dmfe_t *dmfep;			/* private device info */
   1750 	uint32_t interrupts;
   1751 	uint32_t istat;
   1752 	const char *msg;
   1753 	mblk_t *mp;
   1754 	boolean_t warning_msg = B_TRUE;
   1755 
   1756 	dmfep = (void *)arg;
   1757 
   1758 	mutex_enter(dmfep->oplock);
   1759 	if (dmfep->suspended) {
   1760 		mutex_exit(dmfep->oplock);
   1761 		return (DDI_INTR_UNCLAIMED);
   1762 	}
   1763 
   1764 	/*
   1765 	 * A quick check as to whether the interrupt was from this
   1766 	 * device, before we even finish setting up all our local
   1767 	 * variables.  Note that reading the interrupt status register
   1768 	 * doesn't have any unpleasant side effects such as clearing
   1769 	 * the bits read, so it's quite OK to re-read it once we have
   1770 	 * determined that we are going to service this interrupt and
   1771 	 * grabbed the mutexen.
   1772 	 */
   1773 	istat = dmfe_chip_get32(dmfep, STATUS_REG);
   1774 	if ((istat & (NORMAL_SUMMARY_INT | ABNORMAL_SUMMARY_INT)) == 0) {
   1775 
   1776 		mutex_exit(dmfep->oplock);
   1777 		return (DDI_INTR_UNCLAIMED);
   1778 	}
   1779 
   1780 	DRV_KS_INC(dmfep, KS_INTERRUPT);
   1781 
   1782 	/*
   1783 	 * Identify bits that represent enabled interrupts ...
   1784 	 */
   1785 	istat |= dmfe_chip_get32(dmfep, STATUS_REG);
   1786 	interrupts = istat & dmfep->imask;
   1787 	ASSERT(interrupts != 0);
   1788 
   1789 	DTRACE_PROBE1(intr, uint32_t, istat);
   1790 
   1791 	/*
   1792 	 * Check for any interrupts other than TX/RX done.
   1793 	 * If there are any, they are considered Abnormal
   1794 	 * and will cause the chip to be reset.
   1795 	 */
   1796 	if (interrupts & ~(RX_PKTDONE_INT | TX_PKTDONE_INT)) {
   1797 		if (istat & ABNORMAL_SUMMARY_INT) {
   1798 			/*
   1799 			 * Any Abnormal interrupts will lead to us
   1800 			 * resetting the chip, so we don't bother
   1801 			 * to clear each interrupt individually.
   1802 			 *
   1803 			 * Our main task here is to identify the problem,
   1804 			 * by pointing out the most significant unexpected
   1805 			 * bit.  Additional bits may well be consequences
   1806 			 * of the first problem, so we consider the possible
   1807 			 * causes in order of severity.
   1808 			 */
   1809 			if (interrupts & SYSTEM_ERR_INT) {
   1810 				switch (istat & SYSTEM_ERR_BITS) {
   1811 				case SYSTEM_ERR_M_ABORT:
   1812 					msg = "Bus Master Abort";
   1813 					break;
   1814 
   1815 				case SYSTEM_ERR_T_ABORT:
   1816 					msg = "Bus Target Abort";
   1817 					break;
   1818 
   1819 				case SYSTEM_ERR_PARITY:
   1820 					msg = "Parity Error";
   1821 					break;
   1822 
   1823 				default:
   1824 					msg = "Unknown System Bus Error";
   1825 					break;
   1826 				}
   1827 			} else if (interrupts & RX_STOPPED_INT) {
   1828 				msg = "RX process stopped";
   1829 			} else if (interrupts & RX_UNAVAIL_INT) {
   1830 				msg = "RX buffer unavailable";
   1831 				warning_msg = B_FALSE;
   1832 			} else if (interrupts & RX_WATCHDOG_INT) {
   1833 				msg = "RX watchdog timeout?";
   1834 			} else if (interrupts & RX_EARLY_INT) {
   1835 				msg = "RX early interrupt?";
   1836 			} else if (interrupts & TX_STOPPED_INT) {
   1837 				msg = "TX process stopped";
   1838 			} else if (interrupts & TX_JABBER_INT) {
   1839 				msg = "TX jabber timeout";
   1840 			} else if (interrupts & TX_UNDERFLOW_INT) {
   1841 				msg = "TX underflow?";
   1842 			} else if (interrupts & TX_EARLY_INT) {
   1843 				msg = "TX early interrupt?";
   1844 
   1845 			} else if (interrupts & LINK_STATUS_INT) {
   1846 				msg = "Link status change?";
   1847 			} else if (interrupts & GP_TIMER_INT) {
   1848 				msg = "Timer expired?";
   1849 			}
   1850 
   1851 			if (warning_msg)
   1852 				dmfe_warning(dmfep, "abnormal interrupt, "
   1853 				    "status 0x%x: %s", istat, msg);
   1854 
   1855 			/*
   1856 			 * We don't want to run the entire reinitialisation
   1857 			 * code out of this (high-level?) interrupt, so we
   1858 			 * simply STOP the chip, and wake up the factotum
   1859 			 * to reinitalise it ...
   1860 			 */
   1861 			dmfe_stop_chip(dmfep, CHIP_ERROR);
   1862 			dmfe_wake_factotum(dmfep, KS_CHIP_ERROR,
   1863 			    "interrupt (error)");
   1864 		} else {
   1865 			/*
   1866 			 * We shouldn't really get here (it would mean
   1867 			 * there were some unprocessed enabled bits but
   1868 			 * they weren't Abnormal?), but we'll check just
   1869 			 * in case ...
   1870 			 */
   1871 			DTRACE_PROBE1(intr__unexpected, uint32_t, istat);
   1872 		}
   1873 	}
   1874 
   1875 	/*
   1876 	 * Acknowledge all the original bits - except in the case of an
   1877 	 * error, when we leave them unacknowledged so that the recovery
   1878 	 * code can see what was going on when the problem occurred ...
   1879 	 */
   1880 	if (dmfep->chip_state != CHIP_ERROR) {
   1881 		(void) dmfe_chip_put32(dmfep, STATUS_REG, istat);
   1882 		/*
   1883 		 * Read-after-write forces completion on PCI bus.
   1884 		 *
   1885 		 */
   1886 		(void) dmfe_chip_get32(dmfep, STATUS_REG);
   1887 	}
   1888 
   1889 
   1890 	/*
   1891 	 * We've finished talking to the chip, so we can drop <oplock>
   1892 	 * before handling the normal interrupts, which only involve
   1893 	 * manipulation of descriptors ...
   1894 	 */
   1895 	mutex_exit(dmfep->oplock);
   1896 
   1897 	if (interrupts & RX_PKTDONE_INT)
   1898 		if ((mp = dmfe_getp(dmfep)) != NULL)
   1899 			mac_rx(dmfep->mh, NULL, mp);
   1900 
   1901 	if (interrupts & TX_PKTDONE_INT) {
   1902 		/*
   1903 		 * The only reason for taking this interrupt is to give
   1904 		 * MAC a chance to schedule queued packets after a
   1905 		 * ring-full condition.  To minimise the number of
   1906 		 * redundant TX-Done interrupts, we only mark two of the
   1907 		 * ring descriptors as 'interrupt-on-complete' - all the
   1908 		 * others are simply handed back without an interrupt.
   1909 		 */
   1910 		if (dmfe_reclaim_on_done && mutex_tryenter(dmfep->txlock)) {
   1911 			(void) dmfe_reclaim_tx_desc(dmfep);
   1912 			mutex_exit(dmfep->txlock);
   1913 		}
   1914 		mac_tx_update(dmfep->mh);
   1915 	}
   1916 
   1917 	return (DDI_INTR_CLAIMED);
   1918 }
   1919 
   1920 /*
   1921  * ========== Statistics update handler ==========
   1922  */
   1923 
   1924 static int
   1925 dmfe_m_stat(void *arg, uint_t stat, uint64_t *val)
   1926 {
   1927 	dmfe_t *dmfep = arg;
   1928 	int rv = 0;
   1929 
   1930 	/* Let MII handle its own stats. */
   1931 	if (mii_m_getstat(dmfep->mii, stat, val) == 0) {
   1932 		return (0);
   1933 	}
   1934 
   1935 	mutex_enter(dmfep->oplock);
   1936 	mutex_enter(dmfep->rxlock);
   1937 	mutex_enter(dmfep->txlock);
   1938 
   1939 	/* make sure we have all the stats collected */
   1940 	(void) dmfe_reclaim_tx_desc(dmfep);
   1941 
   1942 	switch (stat) {
   1943 
   1944 	case MAC_STAT_IPACKETS:
   1945 		*val = dmfep->rx_stats_ipackets;
   1946 		break;
   1947 
   1948 	case MAC_STAT_MULTIRCV:
   1949 		*val = dmfep->rx_stats_multi;
   1950 		break;
   1951 
   1952 	case MAC_STAT_BRDCSTRCV:
   1953 		*val = dmfep->rx_stats_bcast;
   1954 		break;
   1955 
   1956 	case MAC_STAT_RBYTES:
   1957 		*val = dmfep->rx_stats_rbytes;
   1958 		break;
   1959 
   1960 	case MAC_STAT_IERRORS:
   1961 		*val = dmfep->rx_stats_ierrors;
   1962 		break;
   1963 
   1964 	case MAC_STAT_NORCVBUF:
   1965 		*val = dmfep->rx_stats_norcvbuf;
   1966 		break;
   1967 
   1968 	case MAC_STAT_COLLISIONS:
   1969 		*val = dmfep->tx_stats_collisions;
   1970 		break;
   1971 
   1972 	case MAC_STAT_OERRORS:
   1973 		*val = dmfep->tx_stats_oerrors;
   1974 		break;
   1975 
   1976 	case MAC_STAT_OPACKETS:
   1977 		*val = dmfep->tx_stats_opackets;
   1978 		break;
   1979 
   1980 	case MAC_STAT_MULTIXMT:
   1981 		*val = dmfep->tx_stats_multi;
   1982 		break;
   1983 
   1984 	case MAC_STAT_BRDCSTXMT:
   1985 		*val = dmfep->tx_stats_bcast;
   1986 		break;
   1987 
   1988 	case MAC_STAT_OBYTES:
   1989 		*val = dmfep->tx_stats_obytes;
   1990 		break;
   1991 
   1992 	case MAC_STAT_OVERFLOWS:
   1993 		*val = dmfep->rx_stats_overflow;
   1994 		break;
   1995 
   1996 	case MAC_STAT_UNDERFLOWS:
   1997 		*val = dmfep->tx_stats_underflow;
   1998 		break;
   1999 
   2000 	case ETHER_STAT_ALIGN_ERRORS:
   2001 		*val = dmfep->rx_stats_align;
   2002 		break;
   2003 
   2004 	case ETHER_STAT_FCS_ERRORS:
   2005 		*val = dmfep->rx_stats_fcs;
   2006 		break;
   2007 
   2008 	case ETHER_STAT_TOOLONG_ERRORS:
   2009 		*val = dmfep->rx_stats_toolong;
   2010 		break;
   2011 
   2012 	case ETHER_STAT_TOOSHORT_ERRORS:
   2013 		*val = dmfep->rx_stats_short;
   2014 		break;
   2015 
   2016 	case ETHER_STAT_MACRCV_ERRORS:
   2017 		*val = dmfep->rx_stats_macrcv_errors;
   2018 		break;
   2019 
   2020 	case ETHER_STAT_MACXMT_ERRORS:
   2021 		*val = dmfep->tx_stats_macxmt_errors;
   2022 		break;
   2023 
   2024 	case ETHER_STAT_JABBER_ERRORS:
   2025 		*val = dmfep->tx_stats_jabber;
   2026 		break;
   2027 
   2028 	case ETHER_STAT_CARRIER_ERRORS:
   2029 		*val = dmfep->tx_stats_nocarrier;
   2030 		break;
   2031 
   2032 	case ETHER_STAT_TX_LATE_COLLISIONS:
   2033 		*val = dmfep->tx_stats_xmtlatecoll;
   2034 		break;
   2035 
   2036 	case ETHER_STAT_EX_COLLISIONS:
   2037 		*val = dmfep->tx_stats_excoll;
   2038 		break;
   2039 
   2040 	case ETHER_STAT_DEFER_XMTS:
   2041 		*val = dmfep->tx_stats_defer;
   2042 		break;
   2043 
   2044 	case ETHER_STAT_FIRST_COLLISIONS:
   2045 		*val = dmfep->tx_stats_first_coll;
   2046 		break;
   2047 
   2048 	case ETHER_STAT_MULTI_COLLISIONS:
   2049 		*val = dmfep->tx_stats_multi_coll;
   2050 		break;
   2051 
   2052 	default:
   2053 		rv = ENOTSUP;
   2054 	}
   2055 
   2056 	mutex_exit(dmfep->txlock);
   2057 	mutex_exit(dmfep->rxlock);
   2058 	mutex_exit(dmfep->oplock);
   2059 
   2060 	return (rv);
   2061 }
   2062 
   2063 /*
   2064  * ========== Ioctl handler & subfunctions ==========
   2065  */
   2066 
   2067 static lb_property_t dmfe_loopmodes[] = {
   2068 	{ normal,	"normal",	0 },
   2069 	{ internal,	"Internal",	1 },
   2070 	{ external,	"External",	2 },
   2071 };
   2072 
   2073 /*
   2074  * Specific dmfe IOCTLs, the mac module handles the generic ones.
   2075  * Unfortunately, the DM9102 doesn't seem to work well with MII based
   2076  * loopback, so we have to do something special for it.
   2077  */
   2078 
   2079 static void
   2080 dmfe_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
   2081 {
   2082 	dmfe_t		*dmfep = arg;
   2083 	struct iocblk	*iocp;
   2084 	int		rv = 0;
   2085 	lb_info_sz_t	sz;
   2086 	int		cmd;
   2087 	uint32_t	mode;
   2088 
   2089 	iocp = (void *)mp->b_rptr;
   2090 	cmd = iocp->ioc_cmd;
   2091 
   2092 	if (mp->b_cont == NULL) {
   2093 		/*
   2094 		 * All of these ioctls need data!
   2095 		 */
   2096 		miocnak(wq, mp, 0, EINVAL);
   2097 		return;
   2098 	}
   2099 
   2100 	switch (cmd) {
   2101 	case LB_GET_INFO_SIZE:
   2102 		if (iocp->ioc_count != sizeof (sz)) {
   2103 			rv = EINVAL;
   2104 		} else {
   2105 			sz = sizeof (dmfe_loopmodes);
   2106 			bcopy(&sz, mp->b_cont->b_rptr, sizeof (sz));
   2107 		}
   2108 		break;
   2109 
   2110 	case LB_GET_INFO:
   2111 		if (iocp->ioc_count != sizeof (dmfe_loopmodes)) {
   2112 			rv = EINVAL;
   2113 		} else {
   2114 			bcopy(dmfe_loopmodes, mp->b_cont->b_rptr,
   2115 			    iocp->ioc_count);
   2116 		}
   2117 		break;
   2118 
   2119 	case LB_GET_MODE:
   2120 		if (iocp->ioc_count != sizeof (mode)) {
   2121 			rv = EINVAL;
   2122 		} else {
   2123 			mutex_enter(dmfep->oplock);
   2124 			switch (dmfep->opmode & LOOPBACK_MODE_MASK) {
   2125 			case LOOPBACK_OFF:
   2126 				mode = 0;
   2127 				break;
   2128 			case LOOPBACK_INTERNAL:
   2129 				mode = 1;
   2130 				break;
   2131 			default:
   2132 				mode = 2;
   2133 				break;
   2134 			}
   2135 			mutex_exit(dmfep->oplock);
   2136 			bcopy(&mode, mp->b_cont->b_rptr, sizeof (mode));
   2137 		}
   2138 		break;
   2139 
   2140 	case LB_SET_MODE:
   2141 		rv = secpolicy_net_config(iocp->ioc_cr, B_FALSE);
   2142 		if (rv != 0)
   2143 			break;
   2144 		if (iocp->ioc_count != sizeof (mode)) {
   2145 			rv = EINVAL;
   2146 			break;
   2147 		}
   2148 		bcopy(mp->b_cont->b_rptr, &mode, sizeof (mode));
   2149 
   2150 		mutex_enter(dmfep->oplock);
   2151 		dmfep->opmode &= ~LOOPBACK_MODE_MASK;
   2152 		switch (mode) {
   2153 		case 2:
   2154 			dmfep->opmode |= LOOPBACK_PHY_D;
   2155 			break;
   2156 		case 1:
   2157 			dmfep->opmode |= LOOPBACK_INTERNAL;
   2158 			break;
   2159 		default:
   2160 			break;
   2161 		}
   2162 		if (!dmfep->suspended) {
   2163 			dmfe_restart(dmfep);
   2164 		}
   2165 		mutex_exit(dmfep->oplock);
   2166 		break;
   2167 
   2168 	default:
   2169 		rv = EINVAL;
   2170 		break;
   2171 	}
   2172 
   2173 	if (rv == 0) {
   2174 		miocack(wq, mp, iocp->ioc_count, 0);
   2175 	} else {
   2176 		miocnak(wq, mp, 0, rv);
   2177 	}
   2178 }
   2179 
   2180 int
   2181 dmfe_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t flags,
   2182     uint_t sz, void *val, uint_t *perm)
   2183 {
   2184 	dmfe_t		*dmfep = arg;
   2185 
   2186 	return (mii_m_getprop(dmfep->mii, name, num, flags, sz, val, perm));
   2187 }
   2188 
   2189 int
   2190 dmfe_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
   2191     const void *val)
   2192 {
   2193 	dmfe_t		*dmfep = arg;
   2194 
   2195 	return (mii_m_setprop(dmfep->mii, name, num, sz, val));
   2196 }
   2197 
   2198 
   2199 /*
   2200  * ========== Per-instance setup/teardown code ==========
   2201  */
   2202 
   2203 /*
   2204  * Determine local MAC address & broadcast address for this interface
   2205  */
   2206 static void
   2207 dmfe_find_mac_address(dmfe_t *dmfep)
   2208 {
   2209 	uchar_t *prop;
   2210 	uint_t propsize;
   2211 	int err;
   2212 
   2213 	/*
   2214 	 * We have to find the "vendor's factory-set address".  This is
   2215 	 * the value of the property "local-mac-address", as set by OBP
   2216 	 * (or a .conf file!)
   2217 	 *
   2218 	 * If the property is not there, then we try to find the factory
   2219 	 * mac address from the devices serial EEPROM.
   2220 	 */
   2221 	bzero(dmfep->curr_addr, sizeof (dmfep->curr_addr));
   2222 	err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, dmfep->devinfo,
   2223 	    DDI_PROP_DONTPASS, localmac_propname, &prop, &propsize);
   2224 	if (err == DDI_PROP_SUCCESS) {
   2225 		if (propsize == ETHERADDRL)
   2226 			ethaddr_copy(prop, dmfep->curr_addr);
   2227 		ddi_prop_free(prop);
   2228 	} else {
   2229 		/* no property set... check eeprom */
   2230 		dmfe_read_eeprom(dmfep, EEPROM_EN_ADDR, dmfep->curr_addr,
   2231 		    ETHERADDRL);
   2232 	}
   2233 }
   2234 
   2235 static int
   2236 dmfe_alloc_dma_mem(dmfe_t *dmfep, size_t memsize,
   2237 	size_t setup, size_t slop, ddi_device_acc_attr_t *attr_p,
   2238 	uint_t dma_flags, dma_area_t *dma_p)
   2239 {
   2240 	ddi_dma_cookie_t dma_cookie;
   2241 	uint_t ncookies;
   2242 	int err;
   2243 
   2244 	/*
   2245 	 * Allocate handle
   2246 	 */
   2247 	err = ddi_dma_alloc_handle(dmfep->devinfo, &dma_attr,
   2248 	    DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
   2249 	if (err != DDI_SUCCESS) {
   2250 		dmfe_error(dmfep, "DMA handle allocation failed");
   2251 		return (DDI_FAILURE);
   2252 	}
   2253 
   2254 	/*
   2255 	 * Allocate memory
   2256 	 */
   2257 	err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize + setup + slop,
   2258 	    attr_p, dma_flags & (DDI_DMA_CONSISTENT | DDI_DMA_STREAMING),
   2259 	    DDI_DMA_SLEEP, NULL,
   2260 	    &dma_p->mem_va, &dma_p->alength, &dma_p->acc_hdl);
   2261 	if (err != DDI_SUCCESS) {
   2262 		dmfe_error(dmfep, "DMA memory allocation failed: %d", err);
   2263 		return (DDI_FAILURE);
   2264 	}
   2265 
   2266 	/*
   2267 	 * Bind the two together
   2268 	 */
   2269 	err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
   2270 	    dma_p->mem_va, dma_p->alength, dma_flags,
   2271 	    DDI_DMA_SLEEP, NULL, &dma_cookie, &ncookies);
   2272 	if (err != DDI_DMA_MAPPED) {
   2273 		dmfe_error(dmfep, "DMA mapping failed: %d", err);
   2274 		return (DDI_FAILURE);
   2275 	}
   2276 	if ((dma_p->ncookies = ncookies) != 1) {
   2277 		dmfe_error(dmfep, "Too many DMA cookeis: %d", ncookies);
   2278 		return (DDI_FAILURE);
   2279 	}
   2280 
   2281 	dma_p->mem_dvma = dma_cookie.dmac_address;
   2282 	if (setup > 0) {
   2283 		dma_p->setup_dvma = dma_p->mem_dvma + memsize;
   2284 		dma_p->setup_va = dma_p->mem_va + memsize;
   2285 	} else {
   2286 		dma_p->setup_dvma = 0;
   2287 		dma_p->setup_va = NULL;
   2288 	}
   2289 
   2290 	return (DDI_SUCCESS);
   2291 }
   2292 
   2293 /*
   2294  * This function allocates the transmit and receive buffers and descriptors.
   2295  */
   2296 static int
   2297 dmfe_alloc_bufs(dmfe_t *dmfep)
   2298 {
   2299 	size_t memsize;
   2300 	int err;
   2301 
   2302 	/*
   2303 	 * Allocate memory & handles for TX descriptor ring
   2304 	 */
   2305 	memsize = dmfep->tx.n_desc * sizeof (struct tx_desc_type);
   2306 	err = dmfe_alloc_dma_mem(dmfep, memsize, SETUPBUF_SIZE, DMFE_SLOP,
   2307 	    &dmfe_reg_accattr, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
   2308 	    &dmfep->tx_desc);
   2309 	if (err != DDI_SUCCESS) {
   2310 		dmfe_error(dmfep, "TX descriptor allocation failed");
   2311 		return (DDI_FAILURE);
   2312 	}
   2313 
   2314 	/*
   2315 	 * Allocate memory & handles for TX buffers
   2316 	 */
   2317 	memsize = dmfep->tx.n_desc * DMFE_BUF_SIZE;
   2318 	err = dmfe_alloc_dma_mem(dmfep, memsize, 0, 0,
   2319 	    &dmfe_data_accattr, DDI_DMA_WRITE | DMFE_DMA_MODE,
   2320 	    &dmfep->tx_buff);
   2321 	if (err != DDI_SUCCESS) {
   2322 		dmfe_error(dmfep, "TX buffer allocation failed");
   2323 		return (DDI_FAILURE);
   2324 	}
   2325 
   2326 	/*
   2327 	 * Allocate memory & handles for RX descriptor ring
   2328 	 */
   2329 	memsize = dmfep->rx.n_desc * sizeof (struct rx_desc_type);
   2330 	err = dmfe_alloc_dma_mem(dmfep, memsize, 0, DMFE_SLOP,
   2331 	    &dmfe_reg_accattr, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
   2332 	    &dmfep->rx_desc);
   2333 	if (err != DDI_SUCCESS) {
   2334 		dmfe_error(dmfep, "RX descriptor allocation failed");
   2335 		return (DDI_FAILURE);
   2336 	}
   2337 
   2338 	/*
   2339 	 * Allocate memory & handles for RX buffers
   2340 	 */
   2341 	memsize = dmfep->rx.n_desc * DMFE_BUF_SIZE;
   2342 	err = dmfe_alloc_dma_mem(dmfep, memsize, 0, 0,
   2343 	    &dmfe_data_accattr, DDI_DMA_READ | DMFE_DMA_MODE, &dmfep->rx_buff);
   2344 	if (err != DDI_SUCCESS) {
   2345 		dmfe_error(dmfep, "RX buffer allocation failed");
   2346 		return (DDI_FAILURE);
   2347 	}
   2348 
   2349 	/*
   2350 	 * Allocate bitmasks for tx packet type tracking
   2351 	 */
   2352 	dmfep->tx_mcast = kmem_zalloc(dmfep->tx.n_desc / NBBY, KM_SLEEP);
   2353 	dmfep->tx_bcast = kmem_zalloc(dmfep->tx.n_desc / NBBY, KM_SLEEP);
   2354 
   2355 	return (DDI_SUCCESS);
   2356 }
   2357 
   2358 static void
   2359 dmfe_free_dma_mem(dma_area_t *dma_p)
   2360 {
   2361 	if (dma_p->dma_hdl != NULL) {
   2362 		if (dma_p->ncookies) {
   2363 			(void) ddi_dma_unbind_handle(dma_p->dma_hdl);
   2364 			dma_p->ncookies = 0;
   2365 		}
   2366 		ddi_dma_free_handle(&dma_p->dma_hdl);
   2367 		dma_p->dma_hdl = NULL;
   2368 		dma_p->mem_dvma = 0;
   2369 		dma_p->setup_dvma = 0;
   2370 	}
   2371 
   2372 	if (dma_p->acc_hdl != NULL) {
   2373 		ddi_dma_mem_free(&dma_p->acc_hdl);
   2374 		dma_p->acc_hdl = NULL;
   2375 		dma_p->mem_va = NULL;
   2376 		dma_p->setup_va = NULL;
   2377 	}
   2378 }
   2379 
   2380 /*
   2381  * This routine frees the transmit and receive buffers and descriptors.
   2382  * Make sure the chip is stopped before calling it!
   2383  */
   2384 static void
   2385 dmfe_free_bufs(dmfe_t *dmfep)
   2386 {
   2387 	dmfe_free_dma_mem(&dmfep->rx_buff);
   2388 	dmfe_free_dma_mem(&dmfep->rx_desc);
   2389 	dmfe_free_dma_mem(&dmfep->tx_buff);
   2390 	dmfe_free_dma_mem(&dmfep->tx_desc);
   2391 	if (dmfep->tx_mcast)
   2392 		kmem_free(dmfep->tx_mcast, dmfep->tx.n_desc / NBBY);
   2393 	if (dmfep->tx_bcast)
   2394 		kmem_free(dmfep->tx_bcast, dmfep->tx.n_desc / NBBY);
   2395 }
   2396 
   2397 static void
   2398 dmfe_unattach(dmfe_t *dmfep)
   2399 {
   2400 	/*
   2401 	 * Clean up and free all DMFE data structures
   2402 	 */
   2403 	if (dmfep->cycid != NULL) {
   2404 		ddi_periodic_delete(dmfep->cycid);
   2405 		dmfep->cycid = NULL;
   2406 	}
   2407 
   2408 	if (dmfep->ksp_drv != NULL)
   2409 		kstat_delete(dmfep->ksp_drv);
   2410 	if (dmfep->progress & PROGRESS_HWINT) {
   2411 		ddi_remove_intr(dmfep->devinfo, 0, dmfep->iblk);
   2412 	}
   2413 	if (dmfep->progress & PROGRESS_SOFTINT)
   2414 		ddi_remove_softintr(dmfep->factotum_id);
   2415 	if (dmfep->mii != NULL)
   2416 		mii_free(dmfep->mii);
   2417 	if (dmfep->progress & PROGRESS_MUTEX) {
   2418 		mutex_destroy(dmfep->txlock);
   2419 		mutex_destroy(dmfep->rxlock);
   2420 		mutex_destroy(dmfep->oplock);
   2421 	}
   2422 	dmfe_free_bufs(dmfep);
   2423 	if (dmfep->io_handle != NULL)
   2424 		ddi_regs_map_free(&dmfep->io_handle);
   2425 
   2426 	kmem_free(dmfep, sizeof (*dmfep));
   2427 }
   2428 
   2429 static int
   2430 dmfe_config_init(dmfe_t *dmfep, chip_id_t *idp)
   2431 {
   2432 	ddi_acc_handle_t handle;
   2433 	uint32_t regval;
   2434 
   2435 	if (pci_config_setup(dmfep->devinfo, &handle) != DDI_SUCCESS)
   2436 		return (DDI_FAILURE);
   2437 
   2438 	/*
   2439 	 * Get vendor/device/revision.  We expect (but don't check) that
   2440 	 * (vendorid == DAVICOM_VENDOR_ID) && (deviceid == DEVICE_ID_9102)
   2441 	 */
   2442 	idp->vendor = pci_config_get16(handle, PCI_CONF_VENID);
   2443 	idp->device = pci_config_get16(handle, PCI_CONF_DEVID);
   2444 	idp->revision = pci_config_get8(handle, PCI_CONF_REVID);
   2445 
   2446 	/*
   2447 	 * Turn on Bus Master Enable bit and ensure the device is not asleep
   2448 	 */
   2449 	regval = pci_config_get32(handle, PCI_CONF_COMM);
   2450 	pci_config_put32(handle, PCI_CONF_COMM, (regval | PCI_COMM_ME));
   2451 
   2452 	regval = pci_config_get32(handle, PCI_DMFE_CONF_CFDD);
   2453 	pci_config_put32(handle, PCI_DMFE_CONF_CFDD,
   2454 	    regval & ~(CFDD_SLEEP | CFDD_SNOOZE));
   2455 
   2456 	pci_config_teardown(&handle);
   2457 	return (DDI_SUCCESS);
   2458 }
   2459 
   2460 struct ks_index {
   2461 	int index;
   2462 	char *name;
   2463 };
   2464 
   2465 static const struct ks_index ks_drv_names[] = {
   2466 	{	KS_INTERRUPT,			"intr"			},
   2467 	{	KS_CYCLIC_RUN,			"cyclic_run"		},
   2468 
   2469 	{	KS_TX_STALL,			"tx_stall_detect"	},
   2470 	{	KS_CHIP_ERROR,			"chip_error_interrupt"	},
   2471 
   2472 	{	KS_FACTOTUM_RUN,		"factotum_run"		},
   2473 	{	KS_RECOVERY,			"factotum_recover"	},
   2474 
   2475 	{	-1,				NULL			}
   2476 };
   2477 
   2478 static void
   2479 dmfe_init_kstats(dmfe_t *dmfep, int instance)
   2480 {
   2481 	kstat_t *ksp;
   2482 	kstat_named_t *knp;
   2483 	const struct ks_index *ksip;
   2484 
   2485 	/* no need to create MII stats, the mac module already does it */
   2486 
   2487 	/* Create and initialise driver-defined kstats */
   2488 	ksp = kstat_create(DRIVER_NAME, instance, "dmfe_events", "net",
   2489 	    KSTAT_TYPE_NAMED, KS_DRV_COUNT, KSTAT_FLAG_PERSISTENT);
   2490 	if (ksp != NULL) {
   2491 		for (knp = ksp->ks_data, ksip = ks_drv_names;
   2492 		    ksip->name != NULL; ++ksip) {
   2493 			kstat_named_init(&knp[ksip->index], ksip->name,
   2494 			    KSTAT_DATA_UINT64);
   2495 		}
   2496 		dmfep->ksp_drv = ksp;
   2497 		dmfep->knp_drv = knp;
   2498 		kstat_install(ksp);
   2499 	} else {
   2500 		dmfe_error(dmfep, "kstat_create() for dmfe_events failed");
   2501 	}
   2502 }
   2503 
   2504 static int
   2505 dmfe_resume(dev_info_t *devinfo)
   2506 {
   2507 	dmfe_t *dmfep;				/* Our private data	*/
   2508 	chip_id_t chipid;
   2509 	boolean_t restart = B_FALSE;
   2510 
   2511 	dmfep = ddi_get_driver_private(devinfo);
   2512 	if (dmfep == NULL)
   2513 		return (DDI_FAILURE);
   2514 
   2515 	/*
   2516 	 * Refuse to resume if the data structures aren't consistent
   2517 	 */
   2518 	if (dmfep->devinfo != devinfo)
   2519 		return (DDI_FAILURE);
   2520 
   2521 	/*
   2522 	 * Refuse to resume if the chip's changed its identity (*boggle*)
   2523 	 */
   2524 	if (dmfe_config_init(dmfep, &chipid) != DDI_SUCCESS)
   2525 		return (DDI_FAILURE);
   2526 	if (chipid.vendor != dmfep->chipid.vendor)
   2527 		return (DDI_FAILURE);
   2528 	if (chipid.device != dmfep->chipid.device)
   2529 		return (DDI_FAILURE);
   2530 	if (chipid.revision != dmfep->chipid.revision)
   2531 		return (DDI_FAILURE);
   2532 
   2533 	mutex_enter(dmfep->oplock);
   2534 	mutex_enter(dmfep->txlock);
   2535 	dmfep->suspended = B_FALSE;
   2536 	mutex_exit(dmfep->txlock);
   2537 
   2538 	/*
   2539 	 * All OK, reinitialise h/w & kick off MAC scheduling
   2540 	 */
   2541 	if (dmfep->mac_state == DMFE_MAC_STARTED) {
   2542 		dmfe_restart(dmfep);
   2543 		restart = B_TRUE;
   2544 	}
   2545 	mutex_exit(dmfep->oplock);
   2546 
   2547 	if (restart) {
   2548 		mii_resume(dmfep->mii);
   2549 		mac_tx_update(dmfep->mh);
   2550 	}
   2551 	return (DDI_SUCCESS);
   2552 }
   2553 
   2554 /*
   2555  * attach(9E) -- Attach a device to the system
   2556  *
   2557  * Called once for each board successfully probed.
   2558  */
   2559 static int
   2560 dmfe_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
   2561 {
   2562 	mac_register_t *macp;
   2563 	dmfe_t *dmfep;				/* Our private data	*/
   2564 	uint32_t csr6;
   2565 	int instance;
   2566 	int err;
   2567 
   2568 	instance = ddi_get_instance(devinfo);
   2569 
   2570 	switch (cmd) {
   2571 	default:
   2572 		return (DDI_FAILURE);
   2573 
   2574 	case DDI_RESUME:
   2575 		return (dmfe_resume(devinfo));
   2576 
   2577 	case DDI_ATTACH:
   2578 		break;
   2579 	}
   2580 
   2581 	dmfep = kmem_zalloc(sizeof (*dmfep), KM_SLEEP);
   2582 	ddi_set_driver_private(devinfo, dmfep);
   2583 	dmfep->devinfo = devinfo;
   2584 	dmfep->dmfe_guard = DMFE_GUARD;
   2585 
   2586 	/*
   2587 	 * Initialize more fields in DMFE private data
   2588 	 * Determine the local MAC address
   2589 	 */
   2590 #if	DMFEDEBUG
   2591 	dmfep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 0,
   2592 	    debug_propname, dmfe_debug);
   2593 #endif	/* DMFEDEBUG */
   2594 	dmfep->cycid = NULL;
   2595 	(void) snprintf(dmfep->ifname, sizeof (dmfep->ifname), "dmfe%d",
   2596 	    instance);
   2597 
   2598 	/*
   2599 	 * Check for custom "opmode-reg-value" property;
   2600 	 * if none, use the defaults below for CSR6 ...
   2601 	 */
   2602 	csr6 = TX_THRESHOLD_HI | STORE_AND_FORWARD | EXT_MII_IF | OPN_25_MB1;
   2603 	dmfep->opmode = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
   2604 	    DDI_PROP_DONTPASS, opmode_propname, csr6);
   2605 
   2606 	/*
   2607 	 * Read chip ID & set up config space command register(s)
   2608 	 */
   2609 	if (dmfe_config_init(dmfep, &dmfep->chipid) != DDI_SUCCESS) {
   2610 		dmfe_error(dmfep, "dmfe_config_init() failed");
   2611 		goto attach_fail;
   2612 	}
   2613 
   2614 	/*
   2615 	 * Map operating registers
   2616 	 */
   2617 	err = ddi_regs_map_setup(devinfo, DMFE_PCI_RNUMBER,
   2618 	    &dmfep->io_reg, 0, 0, &dmfe_reg_accattr, &dmfep->io_handle);
   2619 	if (err != DDI_SUCCESS) {
   2620 		dmfe_error(dmfep, "ddi_regs_map_setup() failed");
   2621 		goto attach_fail;
   2622 	}
   2623 
   2624 	/*
   2625 	 * Get our MAC address.
   2626 	 */
   2627 	dmfe_find_mac_address(dmfep);
   2628 
   2629 	/*
   2630 	 * Allocate the TX and RX descriptors/buffers.
   2631 	 */
   2632 	dmfep->tx.n_desc = dmfe_tx_desc;
   2633 	dmfep->rx.n_desc = dmfe_rx_desc;
   2634 	err = dmfe_alloc_bufs(dmfep);
   2635 	if (err != DDI_SUCCESS) {
   2636 		goto attach_fail;
   2637 	}
   2638 
   2639 	/*
   2640 	 * Add the softint handler
   2641 	 */
   2642 	if (ddi_add_softintr(devinfo, DDI_SOFTINT_LOW, &dmfep->factotum_id,
   2643 	    NULL, NULL, dmfe_factotum, (caddr_t)dmfep) != DDI_SUCCESS) {
   2644 		dmfe_error(dmfep, "ddi_add_softintr() failed");
   2645 		goto attach_fail;
   2646 	}
   2647 	dmfep->progress |= PROGRESS_SOFTINT;
   2648 
   2649 	/*
   2650 	 * Add the h/w interrupt handler & initialise mutexen
   2651 	 */
   2652 	if (ddi_get_iblock_cookie(devinfo, 0, &dmfep->iblk) != DDI_SUCCESS) {
   2653 		dmfe_error(dmfep, "ddi_get_iblock_cookie() failed");
   2654 		goto attach_fail;
   2655 	}
   2656 
   2657 	mutex_init(dmfep->milock, NULL, MUTEX_DRIVER, NULL);
   2658 	mutex_init(dmfep->oplock, NULL, MUTEX_DRIVER, dmfep->iblk);
   2659 	mutex_init(dmfep->rxlock, NULL, MUTEX_DRIVER, dmfep->iblk);
   2660 	mutex_init(dmfep->txlock, NULL, MUTEX_DRIVER, dmfep->iblk);
   2661 	dmfep->progress |= PROGRESS_MUTEX;
   2662 
   2663 	if (ddi_add_intr(devinfo, 0, NULL, NULL,
   2664 	    dmfe_interrupt, (caddr_t)dmfep) != DDI_SUCCESS) {
   2665 		dmfe_error(dmfep, "ddi_add_intr() failed");
   2666 		goto attach_fail;
   2667 	}
   2668 	dmfep->progress |= PROGRESS_HWINT;
   2669 
   2670 	/*
   2671 	 * Create & initialise named kstats
   2672 	 */
   2673 	dmfe_init_kstats(dmfep, instance);
   2674 
   2675 	/*
   2676 	 * Reset & initialise the chip and the ring buffers
   2677 	 * Initialise the (internal) PHY
   2678 	 */
   2679 	mutex_enter(dmfep->oplock);
   2680 	mutex_enter(dmfep->rxlock);
   2681 	mutex_enter(dmfep->txlock);
   2682 
   2683 	dmfe_reset(dmfep);
   2684 
   2685 	/*
   2686 	 * Prepare the setup packet
   2687 	 */
   2688 	bzero(dmfep->tx_desc.setup_va, SETUPBUF_SIZE);
   2689 	bzero(dmfep->mcast_refs, MCASTBUF_SIZE);
   2690 	dmfep->addr_set = B_FALSE;
   2691 	dmfep->opmode &= ~(PROMISC_MODE | PASS_MULTICAST);
   2692 	dmfep->mac_state = DMFE_MAC_RESET;
   2693 
   2694 	mutex_exit(dmfep->txlock);
   2695 	mutex_exit(dmfep->rxlock);
   2696 	mutex_exit(dmfep->oplock);
   2697 
   2698 	if (dmfe_init_phy(dmfep) != B_TRUE)
   2699 		goto attach_fail;
   2700 
   2701 	/*
   2702 	 * Send a reasonable setup frame.  This configures our starting
   2703 	 * address and the broadcast address.
   2704 	 */
   2705 	(void) dmfe_m_unicst(dmfep, dmfep->curr_addr);
   2706 
   2707 	/*
   2708 	 * Initialize pointers to device specific functions which
   2709 	 * will be used by the generic layer.
   2710 	 */
   2711 	if ((macp = mac_alloc(MAC_VERSION)) == NULL)
   2712 		goto attach_fail;
   2713 	macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
   2714 	macp->m_driver = dmfep;
   2715 	macp->m_dip = devinfo;
   2716 	macp->m_src_addr = dmfep->curr_addr;
   2717 	macp->m_callbacks = &dmfe_m_callbacks;
   2718 	macp->m_min_sdu = 0;
   2719 	macp->m_max_sdu = ETHERMTU;
   2720 	macp->m_margin = VLAN_TAGSZ;
   2721 
   2722 	/*
   2723 	 * Finally, we're ready to register ourselves with the MAC layer
   2724 	 * interface; if this succeeds, we're all ready to start()
   2725 	 */
   2726 	err = mac_register(macp, &dmfep->mh);
   2727 	mac_free(macp);
   2728 	if (err != 0)
   2729 		goto attach_fail;
   2730 	ASSERT(dmfep->dmfe_guard == DMFE_GUARD);
   2731 
   2732 	/*
   2733 	 * Install the cyclic callback that we use to check for link
   2734 	 * status, transmit stall, etc. The cyclic callback (dmfe_cyclic())
   2735 	 * is invoked in kernel context then.
   2736 	 */
   2737 	ASSERT(dmfep->cycid == NULL);
   2738 	dmfep->cycid = ddi_periodic_add(dmfe_cyclic, dmfep,
   2739 	    dmfe_tick_us * 1000, DDI_IPL_0);
   2740 	return (DDI_SUCCESS);
   2741 
   2742 attach_fail:
   2743 	dmfe_unattach(dmfep);
   2744 	return (DDI_FAILURE);
   2745 }
   2746 
   2747 /*
   2748  *	dmfe_suspend() -- suspend transmit/receive for powerdown
   2749  */
   2750 static int
   2751 dmfe_suspend(dmfe_t *dmfep)
   2752 {
   2753 	/*
   2754 	 * Just stop processing ...
   2755 	 */
   2756 	mii_suspend(dmfep->mii);
   2757 	mutex_enter(dmfep->oplock);
   2758 	dmfe_stop(dmfep);
   2759 
   2760 	mutex_enter(dmfep->txlock);
   2761 	dmfep->suspended = B_TRUE;
   2762 	mutex_exit(dmfep->txlock);
   2763 	mutex_exit(dmfep->oplock);
   2764 
   2765 	return (DDI_SUCCESS);
   2766 }
   2767 
   2768 /*
   2769  * detach(9E) -- Detach a device from the system
   2770  */
   2771 static int
   2772 dmfe_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
   2773 {
   2774 	dmfe_t *dmfep;
   2775 
   2776 	dmfep = ddi_get_driver_private(devinfo);
   2777 
   2778 	switch (cmd) {
   2779 	default:
   2780 		return (DDI_FAILURE);
   2781 
   2782 	case DDI_SUSPEND:
   2783 		return (dmfe_suspend(dmfep));
   2784 
   2785 	case DDI_DETACH:
   2786 		break;
   2787 	}
   2788 
   2789 	/*
   2790 	 * Unregister from the MAC subsystem.  This can fail, in
   2791 	 * particular if there are DLPI style-2 streams still open -
   2792 	 * in which case we just return failure without shutting
   2793 	 * down chip operations.
   2794 	 */
   2795 	if (mac_unregister(dmfep->mh) != DDI_SUCCESS)
   2796 		return (DDI_FAILURE);
   2797 
   2798 	/*
   2799 	 * All activity stopped, so we can clean up & exit
   2800 	 */
   2801 	dmfe_unattach(dmfep);
   2802 	return (DDI_SUCCESS);
   2803 }
   2804 
   2805 
   2806 /*
   2807  * ========== Module Loading Data & Entry Points ==========
   2808  */
   2809 
   2810 DDI_DEFINE_STREAM_OPS(dmfe_dev_ops, nulldev, nulldev, dmfe_attach, dmfe_detach,
   2811 	nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported);
   2812 
   2813 static struct modldrv dmfe_modldrv = {
   2814 	&mod_driverops,		/* Type of module.  This one is a driver */
   2815 	dmfe_ident,		/* short description */
   2816 	&dmfe_dev_ops		/* driver specific ops */
   2817 };
   2818 
   2819 static struct modlinkage modlinkage = {
   2820 	MODREV_1, (void *)&dmfe_modldrv, NULL
   2821 };
   2822 
   2823 int
   2824 _info(struct modinfo *modinfop)
   2825 {
   2826 	return (mod_info(&modlinkage, modinfop));
   2827 }
   2828 
   2829 int
   2830 _init(void)
   2831 {
   2832 	uint32_t tmp100;
   2833 	uint32_t tmp10;
   2834 	int i;
   2835 	int status;
   2836 
   2837 	/* Calculate global timing parameters */
   2838 	tmp100 = (dmfe_tx100_stall_us+dmfe_tick_us-1)/dmfe_tick_us;
   2839 	tmp10 = (dmfe_tx10_stall_us+dmfe_tick_us-1)/dmfe_tick_us;
   2840 
   2841 	for (i = 0; i <= TX_PROCESS_MAX_STATE; ++i) {
   2842 		switch (i) {
   2843 		case TX_PROCESS_STATE(TX_PROCESS_FETCH_DATA):
   2844 		case TX_PROCESS_STATE(TX_PROCESS_WAIT_END):
   2845 			/*
   2846 			 * The chip doesn't spontaneously recover from
   2847 			 * a stall in these states, so we reset early
   2848 			 */
   2849 			stall_100_tix[i] = tmp100;
   2850 			stall_10_tix[i] = tmp10;
   2851 			break;
   2852 
   2853 		case TX_PROCESS_STATE(TX_PROCESS_SUSPEND):
   2854 		default:
   2855 			/*
   2856 			 * The chip has been seen to spontaneously recover
   2857 			 * after an apparent stall in the SUSPEND state,
   2858 			 * so we'll allow it rather longer to do so.  As
   2859 			 * stalls in other states have not been observed,
   2860 			 * we'll use long timeouts for them too ...
   2861 			 */
   2862 			stall_100_tix[i] = tmp100 * 20;
   2863 			stall_10_tix[i] = tmp10 * 20;
   2864 			break;
   2865 		}
   2866 	}
   2867 
   2868 	mac_init_ops(&dmfe_dev_ops, "dmfe");
   2869 	status = mod_install(&modlinkage);
   2870 	if (status == DDI_SUCCESS)
   2871 		dmfe_log_init();
   2872 
   2873 	return (status);
   2874 }
   2875 
   2876 int
   2877 _fini(void)
   2878 {
   2879 	int status;
   2880 
   2881 	status = mod_remove(&modlinkage);
   2882 	if (status == DDI_SUCCESS) {
   2883 		mac_fini_ops(&dmfe_dev_ops);
   2884 		dmfe_log_fini();
   2885 	}
   2886 
   2887 	return (status);
   2888 }
   2889