Home | History | Annotate | Line # | Download | only in ic
i82586.c revision 1.70
      1 /*	$NetBSD: i82586.c,v 1.70 2011/07/02 13:13:22 mrg Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Paul Kranenburg and Charles M. Hannum.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*-
     33  * Copyright (c) 1997 Paul Kranenburg.
     34  * Copyright (c) 1992, 1993, University of Vermont and State
     35  *  Agricultural College.
     36  * Copyright (c) 1992, 1993, Garrett A. Wollman.
     37  *
     38  * Portions:
     39  * Copyright (c) 1994, 1995, Rafal K. Boni
     40  * Copyright (c) 1990, 1991, William F. Jolitz
     41  * Copyright (c) 1990, The Regents of the University of California
     42  *
     43  * All rights reserved.
     44  *
     45  * Redistribution and use in source and binary forms, with or without
     46  * modification, are permitted provided that the following conditions
     47  * are met:
     48  * 1. Redistributions of source code must retain the above copyright
     49  *    notice, this list of conditions and the following disclaimer.
     50  * 2. Redistributions in binary form must reproduce the above copyright
     51  *    notice, this list of conditions and the following disclaimer in the
     52  *    documentation and/or other materials provided with the distribution.
     53  * 3. All advertising materials mentioning features or use of this software
     54  *    must display the following acknowledgement:
     55  *	This product includes software developed by the University of Vermont
     56  *	and State Agricultural College and Garrett A. Wollman, by William F.
     57  *	Jolitz, and by the University of California, Berkeley, Lawrence
     58  *	Berkeley Laboratory, and its contributors.
     59  * 4. Neither the names of the Universities nor the names of the authors
     60  *    may be used to endorse or promote products derived from this software
     61  *    without specific prior written permission.
     62  *
     63  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     64  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     65  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     66  * ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR AUTHORS BE LIABLE
     67  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     68  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     69  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     70  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     71  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     72  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     73  * SUCH DAMAGE.
     74  */
     75 
     76 /*
     77  * Intel 82586 Ethernet chip
     78  * Register, bit, and structure definitions.
     79  *
     80  * Original StarLAN driver written by Garrett Wollman with reference to the
     81  * Clarkson Packet Driver code for this chip written by Russ Nelson and others.
     82  *
     83  * BPF support code taken from hpdev/if_le.c, supplied with tcpdump.
     84  *
     85  * 3C507 support is loosely based on code donated to NetBSD by Rafal Boni.
     86  *
     87  * Majorly cleaned up and 3C507 code merged by Charles Hannum.
     88  *
     89  * Converted to SUN ie driver by Charles D. Cranor,
     90  *		October 1994, January 1995.
     91  * This sun version based on i386 version 1.30.
     92  */
     93 
     94 /*
     95  * The i82586 is a very painful chip, found in sun3's, sun-4/100's
     96  * sun-4/200's, and VME based suns.  The byte order is all wrong for a
     97  * SUN, making life difficult.  Programming this chip is mostly the same,
     98  * but certain details differ from system to system.  This driver is
     99  * written so that different "ie" interfaces can be controled by the same
    100  * driver.
    101  */
    102 
    103 /*
    104 Mode of operation:
    105 
    106    We run the 82586 in a standard Ethernet mode.  We keep NFRAMES
    107    received frame descriptors around for the receiver to use, and
    108    NRXBUF associated receive buffer descriptors, both in a circular
    109    list.  Whenever a frame is received, we rotate both lists as
    110    necessary.  (The 586 treats both lists as a simple queue.)  We also
    111    keep a transmit command around so that packets can be sent off
    112    quickly.
    113 
    114    We configure the adapter in AL-LOC = 1 mode, which means that the
    115    Ethernet/802.3 MAC header is placed at the beginning of the receive
    116    buffer rather than being split off into various fields in the RFD.
    117    This also means that we must include this header in the transmit
    118    buffer as well.
    119 
    120    By convention, all transmit commands, and only transmit commands,
    121    shall have the I (IE_CMD_INTR) bit set in the command.  This way,
    122    when an interrupt arrives at i82586_intr(), it is immediately possible
    123    to tell what precisely caused it.  ANY OTHER command-sending
    124    routines should run at splnet(), and should post an acknowledgement
    125    to every interrupt they generate.
    126 
    127    To save the expense of shipping a command to 82586 every time we
    128    want to send a frame, we use a linked list of commands consisting
    129    of alternate XMIT and NOP commands. The links of these elements
    130    are manipulated (in iexmit()) such that the NOP command loops back
    131    to itself whenever the following XMIT command is not yet ready to
    132    go. Whenever an XMIT is ready, the preceding NOP link is pointed
    133    at it, while its own link field points to the following NOP command.
    134    Thus, a single transmit command sets off an interlocked traversal
    135    of the xmit command chain, with the host processor in control of
    136    the synchronization.
    137 */
    138 
    139 #include <sys/cdefs.h>
    140 __KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.70 2011/07/02 13:13:22 mrg Exp $");
    141 
    142 
    143 #include <sys/param.h>
    144 #include <sys/systm.h>
    145 #include <sys/mbuf.h>
    146 #include <sys/socket.h>
    147 #include <sys/ioctl.h>
    148 #include <sys/errno.h>
    149 #include <sys/syslog.h>
    150 #include <sys/device.h>
    151 
    152 #include <net/if.h>
    153 #include <net/if_dl.h>
    154 #include <net/if_types.h>
    155 #include <net/if_media.h>
    156 #include <net/if_ether.h>
    157 
    158 #include <net/bpf.h>
    159 #include <net/bpfdesc.h>
    160 
    161 #include <sys/bus.h>
    162 
    163 #include <dev/ic/i82586reg.h>
    164 #include <dev/ic/i82586var.h>
    165 
    166 void	 	i82586_reset(struct ie_softc *, int);
    167 void 		i82586_watchdog(struct ifnet *);
    168 int 		i82586_init(struct ifnet *);
    169 int 		i82586_ioctl(struct ifnet *, u_long, void *);
    170 void 		i82586_start(struct ifnet *);
    171 void 		i82586_stop(struct ifnet *, int);
    172 
    173 
    174 int 		i82586_rint(struct ie_softc *, int);
    175 int 		i82586_tint(struct ie_softc *, int);
    176 
    177 int     	i82586_mediachange(struct ifnet *);
    178 void    	i82586_mediastatus(struct ifnet *, struct ifmediareq *);
    179 
    180 static int 	ie_readframe(struct ie_softc *, int);
    181 static struct mbuf *ieget(struct ie_softc *, int, int);
    182 static int	i82586_get_rbd_list(struct ie_softc *,
    183 					     u_int16_t *, u_int16_t *, int *);
    184 static void	i82586_release_rbd_list(struct ie_softc *,
    185 					     u_int16_t, u_int16_t);
    186 static int	i82586_drop_frames(struct ie_softc *);
    187 static int	i82586_chk_rx_ring(struct ie_softc *);
    188 
    189 static inline void 	ie_ack(struct ie_softc *, u_int);
    190 static inline void 	iexmit(struct ie_softc *);
    191 static void 		i82586_start_transceiver(struct ie_softc *);
    192 
    193 static void	i82586_count_errors(struct ie_softc *);
    194 static void	i82586_rx_errors(struct ie_softc *, int, int);
    195 static void 	i82586_setup_bufs(struct ie_softc *);
    196 static void	setup_simple_command(struct ie_softc *, int, int);
    197 static int 	ie_cfg_setup(struct ie_softc *, int, int, int);
    198 static int	ie_ia_setup(struct ie_softc *, int);
    199 static void 	ie_run_tdr(struct ie_softc *, int);
    200 static int 	ie_mc_setup(struct ie_softc *, int);
    201 static void 	ie_mc_reset(struct ie_softc *);
    202 static int 	i82586_start_cmd(struct ie_softc *, int, int, int, int);
    203 static int	i82586_cmd_wait(struct ie_softc *);
    204 
    205 #if I82586_DEBUG
    206 void 		print_rbd(struct ie_softc *, int);
    207 #endif
    208 
    209 static char* padbuf = NULL;
    210 
    211 /*
    212  * Front-ends call this function to attach to the MI driver.
    213  *
    214  * The front-end has responsibility for managing the ICP and ISCP
    215  * structures. Both of these are opaque to us.  Also, the front-end
    216  * chooses a location for the SCB which is expected to be addressable
    217  * (through `sc->scb') as an offset against the shared-memory bus handle.
    218  *
    219  * The following MD interface function must be setup by the front-end
    220  * before calling here:
    221  *
    222  *	hwreset			- board dependent reset
    223  *	hwinit			- board dependent initialization
    224  *	chan_attn		- channel attention
    225  *	intrhook		- board dependent interrupt processing
    226  *	memcopyin		- shared memory copy: board to KVA
    227  *	memcopyout		- shared memory copy: KVA to board
    228  *	ie_bus_read16		- read a sixteen-bit i82586 pointer
    229  *	ie_bus_write16		- write a sixteen-bit i82586 pointer
    230  *	ie_bus_write24		- write a twenty-four-bit i82586 pointer
    231  *
    232  */
    233 void
    234 i82586_attach(struct ie_softc *sc, const char *name, u_int8_t *etheraddr, int *media, int nmedia, int defmedia)
    235 {
    236 	int i;
    237 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    238 
    239 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    240 	ifp->if_softc = sc;
    241 	ifp->if_start = i82586_start;
    242 	ifp->if_ioctl = i82586_ioctl;
    243 	ifp->if_init = i82586_init;
    244 	ifp->if_stop = i82586_stop;
    245 	ifp->if_watchdog = i82586_watchdog;
    246 	ifp->if_flags =
    247 		IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
    248 	IFQ_SET_READY(&ifp->if_snd);
    249 
    250         /* Initialize media goo. */
    251         ifmedia_init(&sc->sc_media, 0, i82586_mediachange, i82586_mediastatus);
    252         if (media != NULL) {
    253                 for (i = 0; i < nmedia; i++)
    254                         ifmedia_add(&sc->sc_media, media[i], 0, NULL);
    255                 ifmedia_set(&sc->sc_media, defmedia);
    256         } else {
    257                 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
    258                 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
    259         }
    260 
    261 	if (padbuf == NULL) {
    262 		padbuf = malloc(ETHER_MIN_LEN - ETHER_CRC_LEN, M_DEVBUF,
    263 		    M_ZERO | M_NOWAIT);
    264 		if (padbuf == NULL) {
    265 			 aprint_error_dev(sc->sc_dev, "can't allocate pad buffer\n");
    266 			 return;
    267 		}
    268 	}
    269 
    270 	/* Attach the interface. */
    271 	if_attach(ifp);
    272 	ether_ifattach(ifp, etheraddr);
    273 
    274 	printf(" address %s, type %s\n", ether_sprintf(etheraddr), name);
    275 }
    276 
    277 
    278 /*
    279  * Device timeout/watchdog routine.
    280  * Entered if the device neglects to generate an interrupt after a
    281  * transmit has been started on it.
    282  */
    283 void
    284 i82586_watchdog(struct ifnet *ifp)
    285 {
    286 	struct ie_softc *sc = ifp->if_softc;
    287 
    288 	log(LOG_ERR, "%s: device timeout\n", device_xname(sc->sc_dev));
    289 	++ifp->if_oerrors;
    290 
    291 	i82586_reset(sc, 1);
    292 }
    293 
    294 static int
    295 i82586_cmd_wait(struct ie_softc *sc)
    296 {
    297 	/* spin on i82586 command acknowledge; wait at most 0.9 (!) seconds */
    298 	int i, off;
    299 	u_int16_t cmd;
    300 
    301 	for (i = 0; i < 900000; i++) {
    302 		/* Read the command word */
    303 		off = IE_SCB_CMD(sc->scb);
    304 
    305 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    306 		if ((cmd = sc->ie_bus_read16(sc, off)) == 0)
    307 			return (0);
    308 		delay(1);
    309 	}
    310 
    311 	off = IE_SCB_STATUS(sc->scb);
    312 	printf("i82586_cmd_wait: timo(%ssync): scb status: 0x%x, cmd: 0x%x\n",
    313 		sc->async_cmd_inprogress?"a":"",
    314 		sc->ie_bus_read16(sc, off), cmd);
    315 
    316 	return (1);	/* Timeout */
    317 }
    318 
    319 /*
    320  * Send a command to the controller and wait for it to either complete
    321  * or be accepted, depending on the command.  If the command pointer
    322  * is null, then pretend that the command is not an action command.
    323  * If the command pointer is not null, and the command is an action
    324  * command, wait for one of the MASK bits to turn on in the command's
    325  * status field.
    326  * If ASYNC is set, we just call the chip's attention and return.
    327  * We may have to wait for the command's acceptance later though.
    328  */
    329 static int
    330 i82586_start_cmd(struct ie_softc *sc, int cmd, int iecmdbuf, int mask, int async)
    331 {
    332 	int i;
    333 	int off;
    334 
    335 	if (sc->async_cmd_inprogress != 0) {
    336 		/*
    337 		 * If previous command was issued asynchronously, wait
    338 		 * for it now.
    339 		 */
    340 		if (i82586_cmd_wait(sc) != 0)
    341 			return (1);
    342 		sc->async_cmd_inprogress = 0;
    343 	}
    344 
    345 	off = IE_SCB_CMD(sc->scb);
    346 	sc->ie_bus_write16(sc, off, cmd);
    347 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
    348 	(sc->chan_attn)(sc, CARD_RESET);
    349 
    350 	if (async != 0) {
    351 		sc->async_cmd_inprogress = 1;
    352 		return (0);
    353 	}
    354 
    355 	if (IE_ACTION_COMMAND(cmd) && iecmdbuf) {
    356 		int status;
    357 		/*
    358 		 * Now spin-lock waiting for status.  This is not a very nice
    359 		 * thing to do, and can kill performance pretty well...
    360 		 * According to the packet driver, the minimum timeout
    361 		 * should be .369 seconds.
    362 		 */
    363 		for (i = 0; i < 369000; i++) {
    364 			/* Read the command status */
    365 			off = IE_CMD_COMMON_STATUS(iecmdbuf);
    366 			IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    367 			status = sc->ie_bus_read16(sc, off);
    368 			if (status & mask)
    369 				return (0);
    370 			delay(1);
    371 		}
    372 
    373 	} else {
    374 		/*
    375 		 * Otherwise, just wait for the command to be accepted.
    376 		 */
    377 		return (i82586_cmd_wait(sc));
    378 	}
    379 
    380 	/* Timeout */
    381 	return (1);
    382 }
    383 
    384 /*
    385  * Interrupt Acknowledge.
    386  */
    387 static inline void
    388 ie_ack(struct ie_softc *sc, u_int mask)
    389 	/* mask:	 in native byte-order */
    390 {
    391 	u_int status;
    392 
    393 	IE_BUS_BARRIER(sc, 0, 0, BUS_SPACE_BARRIER_READ);
    394 	status = sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb));
    395 	i82586_start_cmd(sc, status & mask, 0, 0, 0);
    396 	if (sc->intrhook)
    397 		sc->intrhook(sc, INTR_ACK);
    398 }
    399 
    400 /*
    401  * Transfer accumulated chip error counters to IF.
    402  */
    403 static inline void
    404 i82586_count_errors(struct ie_softc *sc)
    405 {
    406 	int scb = sc->scb;
    407 
    408 	sc->sc_ethercom.ec_if.if_ierrors +=
    409 	    sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) +
    410 	    sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) +
    411 	    sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) +
    412 	    sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb));
    413 
    414 	/* Clear error counters */
    415 	sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0);
    416 	sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0);
    417 	sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0);
    418 	sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0);
    419 }
    420 
    421 static void
    422 i82586_rx_errors(struct ie_softc *sc, int fn, int status)
    423 {
    424 	char bits[128];
    425 	snprintb(bits, sizeof(bits), IE_FD_STATUSBITS, status);
    426 	log(LOG_ERR, "%s: rx error (frame# %d): %s\n",
    427 	    device_xname(sc->sc_dev), fn, bits);
    428 
    429 }
    430 
    431 /*
    432  * i82586 interrupt entry point.
    433  */
    434 int
    435 i82586_intr(void *v)
    436 {
    437 	struct ie_softc *sc = v;
    438 	u_int status;
    439 	int off;
    440 
    441         /*
    442          * Implementation dependent interrupt handling.
    443          */
    444 	if (sc->intrhook)
    445 		(sc->intrhook)(sc, INTR_ENTER);
    446 
    447 	off = IE_SCB_STATUS(sc->scb);
    448 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    449 	status = sc->ie_bus_read16(sc, off) & IE_ST_WHENCE;
    450 
    451 	if ((status & IE_ST_WHENCE) == 0) {
    452 		if (sc->intrhook)
    453 			(sc->intrhook)(sc, INTR_EXIT);
    454 
    455 		return (0);
    456 	}
    457 
    458 loop:
    459 	/* Ack interrupts FIRST in case we receive more during the ISR. */
    460 #if 0
    461 	ie_ack(sc, status & IE_ST_WHENCE);
    462 #endif
    463 	i82586_start_cmd(sc, status & IE_ST_WHENCE, 0, 0, 1);
    464 
    465 	if (status & (IE_ST_FR | IE_ST_RNR))
    466 		if (i82586_rint(sc, status) != 0)
    467 			goto reset;
    468 
    469 	if (status & IE_ST_CX)
    470 		if (i82586_tint(sc, status) != 0)
    471 			goto reset;
    472 
    473 #if I82586_DEBUG
    474 	if ((status & IE_ST_CNA) && (sc->sc_debug & IED_CNA))
    475 		printf("%s: cna; status=0x%x\n", device_xname(sc->sc_dev), status);
    476 #endif
    477 	if (sc->intrhook)
    478 		(sc->intrhook)(sc, INTR_LOOP);
    479 
    480 	/*
    481 	 * Interrupt ACK was posted asynchronously; wait for
    482 	 * completion here before reading SCB status again.
    483 	 *
    484 	 * If ACK fails, try to reset the chip, in hopes that
    485 	 * it helps.
    486 	 */
    487 	if (i82586_cmd_wait(sc) != 0)
    488 		goto reset;
    489 
    490 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    491 	status = sc->ie_bus_read16(sc, off);
    492 	if ((status & IE_ST_WHENCE) != 0)
    493 		goto loop;
    494 
    495 out:
    496 	if (sc->intrhook)
    497 		(sc->intrhook)(sc, INTR_EXIT);
    498 	return (1);
    499 
    500 reset:
    501 	i82586_cmd_wait(sc);
    502 	i82586_reset(sc, 1);
    503 	goto out;
    504 
    505 }
    506 
    507 /*
    508  * Process a received-frame interrupt.
    509  */
    510 int
    511 i82586_rint(struct ie_softc *sc, int scbstatus)
    512 {
    513 static	int timesthru = 1024;
    514 	int i, status, off;
    515 
    516 #if I82586_DEBUG
    517 	if (sc->sc_debug & IED_RINT)
    518 		printf("%s: rint: status 0x%x\n",
    519 			device_xname(sc->sc_dev), scbstatus);
    520 #endif
    521 
    522 	for (;;) {
    523 		int drop = 0;
    524 
    525 		i = sc->rfhead;
    526 		off = IE_RFRAME_STATUS(sc->rframes, i);
    527 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    528 		status = sc->ie_bus_read16(sc, off);
    529 
    530 #if I82586_DEBUG
    531 		if (sc->sc_debug & IED_RINT)
    532 			printf("%s: rint: frame(%d) status 0x%x\n",
    533 				device_xname(sc->sc_dev), i, status);
    534 #endif
    535 		if ((status & IE_FD_COMPLETE) == 0) {
    536 			if ((status & IE_FD_OK) != 0) {
    537 				printf("%s: rint: weird: ",
    538 					device_xname(sc->sc_dev));
    539 				i82586_rx_errors(sc, i, status);
    540 				break;
    541 			}
    542 			if (--timesthru == 0) {
    543 				/* Account the accumulated errors */
    544 				i82586_count_errors(sc);
    545 				timesthru = 1024;
    546 			}
    547 			break;
    548 		} else if ((status & IE_FD_OK) == 0) {
    549 			/*
    550 			 * If the chip is configured to automatically
    551 			 * discard bad frames, the only reason we can
    552 			 * get here is an "out-of-resource" condition.
    553 			 */
    554 			i82586_rx_errors(sc, i, status);
    555 			drop = 1;
    556 		}
    557 
    558 #if I82586_DEBUG
    559 		if ((status & IE_FD_BUSY) != 0)
    560 			printf("%s: rint: frame(%d) busy; status=0x%x\n",
    561 				device_xname(sc->sc_dev), i, status);
    562 #endif
    563 
    564 
    565 		/*
    566 		 * Advance the RFD list, since we're done with
    567 		 * this descriptor.
    568 		 */
    569 
    570 		/* Clear frame status */
    571 		sc->ie_bus_write16(sc, off, 0);
    572 
    573 		/* Put fence at this frame (the head) */
    574 		off = IE_RFRAME_LAST(sc->rframes, i);
    575 		sc->ie_bus_write16(sc, off, IE_FD_EOL|IE_FD_SUSP);
    576 
    577 		/* and clear RBD field */
    578 		off = IE_RFRAME_BUFDESC(sc->rframes, i);
    579 		sc->ie_bus_write16(sc, off, 0xffff);
    580 
    581 		/* Remove fence from current tail */
    582 		off = IE_RFRAME_LAST(sc->rframes, sc->rftail);
    583 		sc->ie_bus_write16(sc, off, 0);
    584 
    585 		if (++sc->rftail == sc->nframes)
    586 			sc->rftail = 0;
    587 		if (++sc->rfhead == sc->nframes)
    588 			sc->rfhead = 0;
    589 
    590 		/* Pull the frame off the board */
    591 		if (drop) {
    592 			i82586_drop_frames(sc);
    593 			if ((status & IE_FD_RNR) != 0)
    594 				sc->rnr_expect = 1;
    595 			sc->sc_ethercom.ec_if.if_ierrors++;
    596 		} else if (ie_readframe(sc, i) != 0)
    597 			return (1);
    598 	}
    599 
    600 	if ((scbstatus & IE_ST_RNR) != 0) {
    601 
    602 		/*
    603 		 * Receiver went "Not Ready". We try to figure out
    604 		 * whether this was an expected event based on past
    605 		 * frame status values.
    606 		 */
    607 
    608 		if ((scbstatus & IE_RUS_SUSPEND) != 0) {
    609 			/*
    610 			 * We use the "suspend on last frame" flag.
    611 			 * Send a RU RESUME command in response, since
    612 			 * we should have dealt with all completed frames
    613 			 * by now.
    614 			 */
    615 			printf("RINT: SUSPENDED; scbstatus=0x%x\n",
    616 				scbstatus);
    617 			if (i82586_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0)
    618 				return (0);
    619 			aprint_error_dev(sc->sc_dev, "RU RESUME command timed out\n");
    620 			return (1);	/* Ask for a reset */
    621 		}
    622 
    623 		if (sc->rnr_expect != 0) {
    624 			/*
    625 			 * The RNR condition was announced in the previously
    626 			 * completed frame.  Assume the receive ring is Ok,
    627 			 * so restart the receiver without further delay.
    628 			 */
    629 			i82586_start_transceiver(sc);
    630 			sc->rnr_expect = 0;
    631 			return (0);
    632 
    633 		} else if ((scbstatus & IE_RUS_NOSPACE) != 0) {
    634 			/*
    635 			 * We saw no previous IF_FD_RNR flag.
    636 			 * We check our ring invariants and, if ok,
    637 			 * just restart the receiver at the current
    638 			 * point in the ring.
    639 			 */
    640 			if (i82586_chk_rx_ring(sc) != 0)
    641 				return (1);
    642 
    643 			i82586_start_transceiver(sc);
    644 			sc->sc_ethercom.ec_if.if_ierrors++;
    645 			return (0);
    646 		} else
    647 			printf("%s: receiver not ready; scbstatus=0x%x\n",
    648 				device_xname(sc->sc_dev), scbstatus);
    649 
    650 		sc->sc_ethercom.ec_if.if_ierrors++;
    651 		return (1);	/* Ask for a reset */
    652 	}
    653 
    654 	return (0);
    655 }
    656 
    657 /*
    658  * Process a command-complete interrupt.  These are only generated by the
    659  * transmission of frames.  This routine is deceptively simple, since most
    660  * of the real work is done by i82586_start().
    661  */
    662 int
    663 i82586_tint(struct ie_softc *sc, int scbstatus)
    664 {
    665 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    666 	int status;
    667 
    668 	ifp->if_timer = 0;
    669 	ifp->if_flags &= ~IFF_OACTIVE;
    670 
    671 #if I82586_DEBUG
    672 	if (sc->xmit_busy <= 0) {
    673 	    printf("i82586_tint: WEIRD: xmit_busy=%d, xctail=%d, xchead=%d\n",
    674 		   sc->xmit_busy, sc->xctail, sc->xchead);
    675 		return (0);
    676 	}
    677 #endif
    678 
    679 	status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds,
    680 							  sc->xctail));
    681 
    682 #if I82586_DEBUG
    683 	if (sc->sc_debug & IED_TINT)
    684 		printf("%s: tint: SCB status 0x%x; xmit status 0x%x\n",
    685 			device_xname(sc->sc_dev), scbstatus, status);
    686 #endif
    687 
    688 	if ((status & IE_STAT_COMPL) == 0 || (status & IE_STAT_BUSY)) {
    689 	    printf("i82586_tint: command still busy; status=0x%x; tail=%d\n",
    690 		   status, sc->xctail);
    691 	    printf("iestatus = 0x%x\n", scbstatus);
    692 	}
    693 
    694 	if (status & IE_STAT_OK) {
    695 		ifp->if_opackets++;
    696 		ifp->if_collisions += (status & IE_XS_MAXCOLL);
    697 	} else {
    698 		ifp->if_oerrors++;
    699 		/*
    700 		 * Check SQE and DEFERRED?
    701 		 * What if more than one bit is set?
    702 		 */
    703 		if (status & IE_STAT_ABORT)
    704 			aprint_error_dev(sc->sc_dev, "send aborted\n");
    705 		else if (status & IE_XS_NOCARRIER)
    706 			aprint_error_dev(sc->sc_dev, "no carrier\n");
    707 		else if (status & IE_XS_LOSTCTS)
    708 			aprint_error_dev(sc->sc_dev, "lost CTS\n");
    709 		else if (status & IE_XS_UNDERRUN)
    710 			aprint_error_dev(sc->sc_dev, "DMA underrun\n");
    711 		else if (status & IE_XS_EXCMAX) {
    712 			aprint_error_dev(sc->sc_dev, "too many collisions\n");
    713 			sc->sc_ethercom.ec_if.if_collisions += 16;
    714 		}
    715 	}
    716 
    717 	/*
    718 	 * If multicast addresses were added or deleted while transmitting,
    719 	 * ie_mc_reset() set the want_mcsetup flag indicating that we
    720 	 * should do it.
    721 	 */
    722 	if (sc->want_mcsetup) {
    723 		ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
    724 		sc->want_mcsetup = 0;
    725 	}
    726 
    727 	/* Done with the buffer. */
    728 	sc->xmit_busy--;
    729 	sc->xctail = (sc->xctail + 1) % NTXBUF;
    730 
    731 	/* Start the next packet, if any, transmitting. */
    732 	if (sc->xmit_busy > 0)
    733 		iexmit(sc);
    734 
    735 	i82586_start(ifp);
    736 	return (0);
    737 }
    738 
    739 /*
    740  * Get a range of receive buffer descriptors that represent one packet.
    741  */
    742 static int
    743 i82586_get_rbd_list(struct ie_softc *sc, u_int16_t *start, u_int16_t *end, int *pktlen)
    744 {
    745 	int	off, rbbase = sc->rbds;
    746 	int	rbindex, count = 0;
    747 	int	plen = 0;
    748 	int	rbdstatus;
    749 
    750 	*start = rbindex = sc->rbhead;
    751 
    752 	do {
    753 		off = IE_RBD_STATUS(rbbase, rbindex);
    754 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    755 		rbdstatus = sc->ie_bus_read16(sc, off);
    756 		if ((rbdstatus & IE_RBD_USED) == 0) {
    757 			/*
    758 			 * This means we are somehow out of sync.  So, we
    759 			 * reset the adapter.
    760 			 */
    761 #if I82586_DEBUG
    762 			print_rbd(sc, rbindex);
    763 #endif
    764 			log(LOG_ERR,
    765 			    "%s: receive descriptors out of sync at %d\n",
    766 			    device_xname(sc->sc_dev), rbindex);
    767 			return (0);
    768 		}
    769 		plen += (rbdstatus & IE_RBD_CNTMASK);
    770 
    771 		if (++rbindex == sc->nrxbuf)
    772 			rbindex = 0;
    773 
    774 		++count;
    775 	} while ((rbdstatus & IE_RBD_LAST) == 0);
    776 	*end = rbindex;
    777 	*pktlen = plen;
    778 	return (count);
    779 }
    780 
    781 
    782 /*
    783  * Release a range of receive buffer descriptors after we've copied the packet.
    784  */
    785 static void
    786 i82586_release_rbd_list(struct ie_softc *sc, u_int16_t start, u_int16_t end)
    787 {
    788 	int	off, rbbase = sc->rbds;
    789 	int	rbindex = start;
    790 
    791 	do {
    792 		/* Clear buffer status */
    793 		off = IE_RBD_STATUS(rbbase, rbindex);
    794 		sc->ie_bus_write16(sc, off, 0);
    795 		if (++rbindex == sc->nrxbuf)
    796 			rbindex = 0;
    797 	} while (rbindex != end);
    798 
    799 	/* Mark EOL at new tail */
    800 	rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
    801 	off = IE_RBD_BUFLEN(rbbase, rbindex);
    802 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE|IE_RBD_EOL);
    803 
    804 	/* Remove EOL from current tail */
    805 	off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
    806 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
    807 
    808 	/* New head & tail pointer */
    809 /* hmm, why have both? head is always (tail + 1) % NRXBUF */
    810 	sc->rbhead = end;
    811 	sc->rbtail = rbindex;
    812 }
    813 
    814 /*
    815  * Drop the packet at the head of the RX buffer ring.
    816  * Called if the frame descriptor reports an error on this packet.
    817  * Returns 1 if the buffer descriptor ring appears to be corrupt;
    818  * and 0 otherwise.
    819  */
    820 static int
    821 i82586_drop_frames(struct ie_softc *sc)
    822 {
    823 	u_int16_t bstart, bend;
    824 	int pktlen;
    825 
    826 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0)
    827 		return (1);
    828 	i82586_release_rbd_list(sc, bstart, bend);
    829 	return (0);
    830 }
    831 
    832 /*
    833  * Check the RX frame & buffer descriptor lists for our invariants,
    834  * i.e.: EOL bit set iff. it is pointed at by the r*tail pointer.
    835  *
    836  * Called when the receive unit has stopped unexpectedly.
    837  * Returns 1 if an inconsistency is detected; 0 otherwise.
    838  *
    839  * The Receive Unit is expected to be NOT RUNNING.
    840  */
    841 static int
    842 i82586_chk_rx_ring(struct ie_softc *sc)
    843 {
    844 	int n, off, val;
    845 
    846 	for (n = 0; n < sc->nrxbuf; n++) {
    847 		off = IE_RBD_BUFLEN(sc->rbds, n);
    848 		val = sc->ie_bus_read16(sc, off);
    849 		if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
    850 			/* `rbtail' and EOL flag out of sync */
    851 			log(LOG_ERR,
    852 			    "%s: rx buffer descriptors out of sync at %d\n",
    853 			    device_xname(sc->sc_dev), n);
    854 			return (1);
    855 		}
    856 
    857 		/* Take the opportunity to clear the status fields here ? */
    858 	}
    859 
    860 	for (n = 0; n < sc->nframes; n++) {
    861 		off = IE_RFRAME_LAST(sc->rframes, n);
    862 		val = sc->ie_bus_read16(sc, off);
    863 		if ((n == sc->rftail) ^ ((val & (IE_FD_EOL|IE_FD_SUSP)) != 0)) {
    864 			/* `rftail' and EOL flag out of sync */
    865 			log(LOG_ERR,
    866 			    "%s: rx frame list out of sync at %d\n",
    867 			    device_xname(sc->sc_dev), n);
    868 			return (1);
    869 		}
    870 	}
    871 
    872 	return (0);
    873 }
    874 
    875 /*
    876  * Read data off the interface, and turn it into an mbuf chain.
    877  *
    878  * This code is DRAMATICALLY different from the previous version; this
    879  * version tries to allocate the entire mbuf chain up front, given the
    880  * length of the data available.  This enables us to allocate mbuf
    881  * clusters in many situations where before we would have had a long
    882  * chain of partially-full mbufs.  This should help to speed up the
    883  * operation considerably.  (Provided that it works, of course.)
    884  */
    885 static inline struct mbuf *
    886 ieget(struct ie_softc *sc, int head, int totlen)
    887 {
    888 	struct mbuf *m, *m0, *newm;
    889 	int len, resid;
    890 	int thisrboff, thismboff;
    891 	struct ether_header eh;
    892 
    893 	/*
    894 	 * Snarf the Ethernet header.
    895 	 */
    896 	(sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
    897 	    sizeof(struct ether_header));
    898 
    899 	resid = totlen;
    900 
    901 	MGETHDR(m0, M_DONTWAIT, MT_DATA);
    902 	if (m0 == 0)
    903 		return (0);
    904 	m0->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
    905 	m0->m_pkthdr.len = totlen;
    906 	len = MHLEN;
    907 	m = m0;
    908 
    909 	/*
    910 	 * This loop goes through and allocates mbufs for all the data we will
    911 	 * be copying in.  It does not actually do the copying yet.
    912 	 */
    913 	while (totlen > 0) {
    914 		if (totlen >= MINCLSIZE) {
    915 			MCLGET(m, M_DONTWAIT);
    916 			if ((m->m_flags & M_EXT) == 0)
    917 				goto bad;
    918 			len = MCLBYTES;
    919 		}
    920 
    921 		if (m == m0) {
    922 			char *newdata = (char *)
    923 			    ALIGN(m->m_data + sizeof(struct ether_header)) -
    924 			    sizeof(struct ether_header);
    925 			len -= newdata - m->m_data;
    926 			m->m_data = newdata;
    927 		}
    928 
    929 		m->m_len = len = min(totlen, len);
    930 
    931 		totlen -= len;
    932 		if (totlen > 0) {
    933 			MGET(newm, M_DONTWAIT, MT_DATA);
    934 			if (newm == 0)
    935 				goto bad;
    936 			len = MLEN;
    937 			m = m->m_next = newm;
    938 		}
    939 	}
    940 
    941 	m = m0;
    942 	thismboff = 0;
    943 
    944 	/*
    945 	 * Copy the Ethernet header into the mbuf chain.
    946 	 */
    947 	memcpy(mtod(m, void *), &eh, sizeof(struct ether_header));
    948 	thismboff = sizeof(struct ether_header);
    949 	thisrboff = sizeof(struct ether_header);
    950 	resid -= sizeof(struct ether_header);
    951 
    952 	/*
    953 	 * Now we take the mbuf chain (hopefully only one mbuf most of the
    954 	 * time) and stuff the data into it.  There are no possible failures
    955 	 * at or after this point.
    956 	 */
    957 	while (resid > 0) {
    958 		int thisrblen = IE_RBUF_SIZE - thisrboff,
    959 		    thismblen = m->m_len - thismboff;
    960 		len = min(thisrblen, thismblen);
    961 
    962 		(sc->memcopyin)(sc, mtod(m, char *) + thismboff,
    963 				IE_RBUF_ADDR(sc,head) + thisrboff,
    964 				(u_int)len);
    965 		resid -= len;
    966 
    967 		if (len == thismblen) {
    968 			m = m->m_next;
    969 			thismboff = 0;
    970 		} else
    971 			thismboff += len;
    972 
    973 		if (len == thisrblen) {
    974 			if (++head == sc->nrxbuf)
    975 				head = 0;
    976 			thisrboff = 0;
    977 		} else
    978 			thisrboff += len;
    979 	}
    980 
    981 	/*
    982 	 * Unless something changed strangely while we were doing the copy,
    983 	 * we have now copied everything in from the shared memory.
    984 	 * This means that we are done.
    985 	 */
    986 	return (m0);
    987 
    988 bad:
    989 	m_freem(m0);
    990 	return (0);
    991 }
    992 
    993 /*
    994  * Read frame NUM from unit UNIT (pre-cached as IE).
    995  *
    996  * This routine reads the RFD at NUM, and copies in the buffers from the list
    997  * of RBD, then rotates the RBD list so that the receiver doesn't start
    998  * complaining.  Trailers are DROPPED---there's no point in wasting time
    999  * on confusing code to deal with them.  Hopefully, this machine will
   1000  * never ARP for trailers anyway.
   1001  */
   1002 static int
   1003 ie_readframe(
   1004     struct ie_softc *sc,
   1005     int num)		/* frame number to read */
   1006 {
   1007 	struct mbuf *m;
   1008 	u_int16_t bstart, bend;
   1009 	int pktlen;
   1010 
   1011 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
   1012 		sc->sc_ethercom.ec_if.if_ierrors++;
   1013 		return (1);
   1014 	}
   1015 
   1016 	m = ieget(sc, bstart, pktlen);
   1017 	i82586_release_rbd_list(sc, bstart, bend);
   1018 
   1019 	if (m == 0) {
   1020 		sc->sc_ethercom.ec_if.if_ierrors++;
   1021 		return (0);
   1022 	}
   1023 
   1024 #if I82586_DEBUG
   1025 	if (sc->sc_debug & IED_READFRAME) {
   1026 		struct ether_header *eh = mtod(m, struct ether_header *);
   1027 
   1028 		printf("%s: frame from ether %s type 0x%x len %d\n",
   1029 			device_xname(sc->sc_dev),
   1030 			ether_sprintf(eh->ether_shost),
   1031 			(u_int)ntohs(eh->ether_type),
   1032 			pktlen);
   1033 	}
   1034 #endif
   1035 
   1036 	/* Pass it up. */
   1037 	bpf_mtap(&sc->sc_ethercom.ec_if, m);
   1038 
   1039 	/*
   1040 	 * Finally pass this packet up to higher layers.
   1041 	 */
   1042 	(*sc->sc_ethercom.ec_if.if_input)(&sc->sc_ethercom.ec_if, m);
   1043 	sc->sc_ethercom.ec_if.if_ipackets++;
   1044 	return (0);
   1045 }
   1046 
   1047 
   1048 /*
   1049  * Setup all necessary artifacts for an XMIT command, and then pass the XMIT
   1050  * command to the chip to be executed.
   1051  */
   1052 static inline void
   1053 iexmit(struct ie_softc *sc)
   1054 {
   1055 	int off;
   1056 	int cur, prev;
   1057 
   1058 	cur = sc->xctail;
   1059 
   1060 #if I82586_DEBUG
   1061 	if (sc->sc_debug & IED_XMIT)
   1062 		printf("%s: xmit buffer %d\n", device_xname(sc->sc_dev), cur);
   1063 #endif
   1064 
   1065 	/*
   1066 	 * Setup the transmit command.
   1067 	 */
   1068 	sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur),
   1069 			       IE_XBD_ADDR(sc->xbds, cur));
   1070 
   1071 	sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0);
   1072 
   1073 	if (sc->do_xmitnopchain) {
   1074 		/*
   1075 		 * Gate this XMIT command to the following NOP
   1076 		 */
   1077 		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
   1078 				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
   1079 		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
   1080 				       IE_CMD_XMIT | IE_CMD_INTR);
   1081 
   1082 		/*
   1083 		 * Loopback at following NOP
   1084 		 */
   1085 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0);
   1086 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur),
   1087 				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
   1088 
   1089 		/*
   1090 		 * Gate preceding NOP to this XMIT command
   1091 		 */
   1092 		prev = (cur + NTXBUF - 1) % NTXBUF;
   1093 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev), 0);
   1094 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
   1095 				       IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
   1096 
   1097 		off = IE_SCB_STATUS(sc->scb);
   1098 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1099 		if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
   1100 			printf("iexmit: CU not active\n");
   1101 			i82586_start_transceiver(sc);
   1102 		}
   1103 	} else {
   1104 		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds,cur),
   1105 				       0xffff);
   1106 
   1107 		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
   1108 				       IE_CMD_XMIT | IE_CMD_INTR | IE_CMD_LAST);
   1109 
   1110 		off = IE_SCB_CMDLST(sc->scb);
   1111 		sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
   1112 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1113 
   1114 		if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1))
   1115 			aprint_error_dev(sc->sc_dev, "iexmit: start xmit command timed out\n");
   1116 	}
   1117 
   1118 	sc->sc_ethercom.ec_if.if_timer = 5;
   1119 }
   1120 
   1121 
   1122 /*
   1123  * Start transmission on an interface.
   1124  */
   1125 void
   1126 i82586_start(struct ifnet *ifp)
   1127 {
   1128 	struct ie_softc *sc = ifp->if_softc;
   1129 	struct mbuf *m0, *m;
   1130 	int	buffer, head, xbase;
   1131 	u_short	len;
   1132 	int	s;
   1133 
   1134 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   1135 		return;
   1136 
   1137 	for (;;) {
   1138 		if (sc->xmit_busy == NTXBUF) {
   1139 			ifp->if_flags |= IFF_OACTIVE;
   1140 			break;
   1141 		}
   1142 
   1143 		head = sc->xchead;
   1144 		xbase = sc->xbds;
   1145 
   1146 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1147 		if (m0 == 0)
   1148 			break;
   1149 
   1150 		/* We need to use m->m_pkthdr.len, so require the header */
   1151 		if ((m0->m_flags & M_PKTHDR) == 0)
   1152 			panic("i82586_start: no header mbuf");
   1153 
   1154 		/* Tap off here if there is a BPF listener. */
   1155 		bpf_mtap(ifp, m0);
   1156 
   1157 #if I82586_DEBUG
   1158 		if (sc->sc_debug & IED_ENQ)
   1159 			printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
   1160 				sc->xchead);
   1161 #endif
   1162 
   1163 		if (m0->m_pkthdr.len > IE_TBUF_SIZE)
   1164 			printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
   1165 
   1166 		buffer = IE_XBUF_ADDR(sc, head);
   1167 		for (m = m0; m != 0; m = m->m_next) {
   1168 			(sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
   1169 			buffer += m->m_len;
   1170 		}
   1171 		len = m0->m_pkthdr.len;
   1172 		if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) {
   1173 			(sc->memcopyout)(sc, padbuf, buffer,
   1174 			    ETHER_MIN_LEN - ETHER_CRC_LEN - len);
   1175 			buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len;
   1176 			len = ETHER_MIN_LEN - ETHER_CRC_LEN;
   1177 		}
   1178 		m_freem(m0);
   1179 
   1180 		/*
   1181 		 * Setup the transmit buffer descriptor here, while we
   1182 		 * know the packet's length.
   1183 		 */
   1184 		sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
   1185 				       len | IE_TBD_EOL);
   1186 		sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
   1187 		sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
   1188 				       IE_XBUF_ADDR(sc, head));
   1189 
   1190 		if (++head == NTXBUF)
   1191 			head = 0;
   1192 		sc->xchead = head;
   1193 
   1194 		s = splnet();
   1195 		/* Start the first packet transmitting. */
   1196 		if (sc->xmit_busy == 0)
   1197 			iexmit(sc);
   1198 
   1199 		sc->xmit_busy++;
   1200 		splx(s);
   1201 	}
   1202 }
   1203 
   1204 /*
   1205  * Probe IE's ram setup   [ Move all this into MD front-end!? ]
   1206  * Use only if SCP and ISCP represent offsets into shared ram space.
   1207  */
   1208 int
   1209 i82586_proberam(struct ie_softc *sc)
   1210 {
   1211 	int result, off;
   1212 
   1213 	/* Put in 16-bit mode */
   1214 	off = IE_SCP_BUS_USE(sc->scp);
   1215 	sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
   1216 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1217 
   1218 	/* Set the ISCP `busy' bit */
   1219 	off = IE_ISCP_BUSY(sc->iscp);
   1220 	sc->ie_bus_write16(sc, off, 1);
   1221 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1222 
   1223 	if (sc->hwreset)
   1224 		(sc->hwreset)(sc, CHIP_PROBE);
   1225 
   1226 	(sc->chan_attn) (sc, CHIP_PROBE);
   1227 
   1228 	delay(100);		/* wait a while... */
   1229 
   1230 	/* Read back the ISCP `busy' bit; it should be clear by now */
   1231 	off = IE_ISCP_BUSY(sc->iscp);
   1232 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1233 	result = sc->ie_bus_read16(sc, off) == 0;
   1234 
   1235 	/* Acknowledge any interrupts we may have caused. */
   1236 	ie_ack(sc, IE_ST_WHENCE);
   1237 
   1238 	return (result);
   1239 }
   1240 
   1241 void
   1242 i82586_reset(struct ie_softc *sc, int hard)
   1243 {
   1244 	int s = splnet();
   1245 
   1246 	if (hard)
   1247 		printf("%s: reset\n", device_xname(sc->sc_dev));
   1248 
   1249 	/* Clear OACTIVE in case we're called from watchdog (frozen xmit). */
   1250 	sc->sc_ethercom.ec_if.if_timer = 0;
   1251 	sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
   1252 
   1253 	/*
   1254 	 * Stop i82586 dead in its tracks.
   1255 	 */
   1256 	if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
   1257 		aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
   1258 
   1259 	/*
   1260 	 * This can really slow down the i82586_reset() on some cards, but it's
   1261 	 * necessary to unwedge other ones (eg, the Sun VME ones) from certain
   1262 	 * lockups.
   1263 	 */
   1264 	if (hard && sc->hwreset)
   1265 		(sc->hwreset)(sc, CARD_RESET);
   1266 
   1267 	delay(100);
   1268 	ie_ack(sc, IE_ST_WHENCE);
   1269 
   1270 	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
   1271 		int retries=0;	/* XXX - find out why init sometimes fails */
   1272 		while (retries++ < 2)
   1273 			if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
   1274 				break;
   1275 	}
   1276 
   1277 	splx(s);
   1278 }
   1279 
   1280 
   1281 static void
   1282 setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
   1283 {
   1284 	/* Setup a simple command */
   1285 	sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
   1286 	sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
   1287 	sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
   1288 
   1289 	/* Assign the command buffer to the SCB command list */
   1290 	sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
   1291 }
   1292 
   1293 /*
   1294  * Run the time-domain reflectometer.
   1295  */
   1296 static void
   1297 ie_run_tdr(struct ie_softc *sc, int cmd)
   1298 {
   1299 	int result;
   1300 
   1301 	setup_simple_command(sc, IE_CMD_TDR, cmd);
   1302 	sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
   1303 
   1304 	if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
   1305 	    (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
   1306 		result = 0x10000; /* XXX */
   1307 	else
   1308 		result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
   1309 
   1310 	/* Squash any pending interrupts */
   1311 	ie_ack(sc, IE_ST_WHENCE);
   1312 
   1313 	if (result & IE_TDR_SUCCESS)
   1314 		return;
   1315 
   1316 	if (result & 0x10000)
   1317 		aprint_error_dev(sc->sc_dev, "TDR command failed\n");
   1318 	else if (result & IE_TDR_XCVR)
   1319 		aprint_error_dev(sc->sc_dev, "transceiver problem\n");
   1320 	else if (result & IE_TDR_OPEN)
   1321 		aprint_error_dev(sc->sc_dev, "TDR detected incorrect termination %d clocks away\n",
   1322 			result & IE_TDR_TIME);
   1323 	else if (result & IE_TDR_SHORT)
   1324 		aprint_error_dev(sc->sc_dev, "TDR detected a short circuit %d clocks away\n",
   1325 			result & IE_TDR_TIME);
   1326 	else
   1327 		aprint_error_dev(sc->sc_dev, "TDR returned unknown status 0x%x\n",
   1328 			result);
   1329 }
   1330 
   1331 
   1332 /*
   1333  * i82586_setup_bufs: set up the buffers
   1334  *
   1335  * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
   1336  * this is to be used for the buffers.  The chip indexs its control data
   1337  * structures with 16 bit offsets, and it indexes actual buffers with
   1338  * 24 bit addresses.   So we should allocate control buffers first so that
   1339  * we don't overflow the 16 bit offset field.   The number of transmit
   1340  * buffers is fixed at compile time.
   1341  *
   1342  */
   1343 static void
   1344 i82586_setup_bufs(struct ie_softc *sc)
   1345 {
   1346 	int	ptr = sc->buf_area;	/* memory pool */
   1347 	int     n, r;
   1348 
   1349 	/*
   1350 	 * step 0: zero memory and figure out how many recv buffers and
   1351 	 * frames we can have.
   1352 	 */
   1353 	ptr = (ptr + 3) & ~3;	/* set alignment and stick with it */
   1354 
   1355 
   1356 	/*
   1357 	 *  step 1: lay out data structures in the shared-memory area
   1358 	 */
   1359 
   1360 	/* The no-op commands; used if "nop-chaining" is in effect */
   1361 	sc->nop_cmds = ptr;
   1362 	ptr += NTXBUF * IE_CMD_NOP_SZ;
   1363 
   1364 	/* The transmit commands */
   1365 	sc->xmit_cmds = ptr;
   1366 	ptr += NTXBUF * IE_CMD_XMIT_SZ;
   1367 
   1368 	/* The transmit buffers descriptors */
   1369 	sc->xbds = ptr;
   1370 	ptr += NTXBUF * IE_XBD_SZ;
   1371 
   1372 	/* The transmit buffers */
   1373 	sc->xbufs = ptr;
   1374 	ptr += NTXBUF * IE_TBUF_SIZE;
   1375 
   1376 	ptr = (ptr + 3) & ~3;		/* re-align.. just in case */
   1377 
   1378 	/* Compute free space for RECV stuff */
   1379 	n = sc->buf_area_sz - (ptr - sc->buf_area);
   1380 
   1381 	/* Compute size of one RECV frame */
   1382 	r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F);
   1383 
   1384 	sc->nframes = n / r;
   1385 
   1386 	if (sc->nframes <= 0)
   1387 		panic("ie: bogus buffer calc");
   1388 
   1389 	sc->nrxbuf = sc->nframes * B_PER_F;
   1390 
   1391 	/* The receive frame descriptors */
   1392 	sc->rframes = ptr;
   1393 	ptr += sc->nframes * IE_RFRAME_SZ;
   1394 
   1395 	/* The receive buffer descriptors */
   1396 	sc->rbds = ptr;
   1397 	ptr += sc->nrxbuf * IE_RBD_SZ;
   1398 
   1399 	/* The receive buffers */
   1400 	sc->rbufs = ptr;
   1401 	ptr += sc->nrxbuf * IE_RBUF_SIZE;
   1402 
   1403 #if I82586_DEBUG
   1404 	printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev), sc->nframes,
   1405 		sc->nrxbuf);
   1406 #endif
   1407 
   1408 	/*
   1409 	 * step 2: link together the recv frames and set EOL on last one
   1410 	 */
   1411 	for (n = 0; n < sc->nframes; n++) {
   1412 		int m = (n == sc->nframes - 1) ? 0 : n + 1;
   1413 
   1414 		/* Clear status */
   1415 		sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes,n), 0);
   1416 
   1417 		/* RBD link = NULL */
   1418 		sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,n),
   1419 				       0xffff);
   1420 
   1421 		/* Make a circular list */
   1422 		sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes,n),
   1423 				       IE_RFRAME_ADDR(sc->rframes,m));
   1424 
   1425 		/* Mark last as EOL */
   1426 		sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes,n),
   1427 				       ((m==0)? (IE_FD_EOL|IE_FD_SUSP) : 0));
   1428 	}
   1429 
   1430 	/*
   1431 	 * step 3: link the RBDs and set EOL on last one
   1432 	 */
   1433 	for (n = 0; n < sc->nrxbuf; n++) {
   1434 		int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
   1435 
   1436 		/* Clear status */
   1437 		sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds,n), 0);
   1438 
   1439 		/* Make a circular list */
   1440 		sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds,n),
   1441 				       IE_RBD_ADDR(sc->rbds,m));
   1442 
   1443 		/* Link to data buffers */
   1444 		sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
   1445 				       IE_RBUF_ADDR(sc, n));
   1446 		sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds,n),
   1447 				       IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0));
   1448 	}
   1449 
   1450 	/*
   1451 	 * step 4: all xmit no-op commands loopback onto themselves
   1452 	 */
   1453 	for (n = 0; n < NTXBUF; n++) {
   1454 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
   1455 
   1456 		sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
   1457 					 IE_CMD_NOP);
   1458 
   1459 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
   1460 					 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
   1461 	}
   1462 
   1463 
   1464 	/*
   1465 	 * step 6: set the head and tail pointers on receive to keep track of
   1466 	 * the order in which RFDs and RBDs are used.
   1467 	 */
   1468 
   1469 	/* Pointers to last packet sent and next available transmit buffer. */
   1470 	sc->xchead = sc->xctail = 0;
   1471 
   1472 	/* Clear transmit-busy flag and set number of free transmit buffers. */
   1473 	sc->xmit_busy = 0;
   1474 
   1475 	/*
   1476 	 * Pointers to first and last receive frame.
   1477 	 * The RFD pointed to by rftail is the only one that has EOL set.
   1478 	 */
   1479 	sc->rfhead = 0;
   1480 	sc->rftail = sc->nframes - 1;
   1481 
   1482 	/*
   1483 	 * Pointers to first and last receive descriptor buffer.
   1484 	 * The RBD pointed to by rbtail is the only one that has EOL set.
   1485 	 */
   1486 	sc->rbhead = 0;
   1487 	sc->rbtail = sc->nrxbuf - 1;
   1488 
   1489 /* link in recv frames * and buffer into the scb. */
   1490 #if I82586_DEBUG
   1491 	printf("%s: reserved %d bytes\n",
   1492 		device_xname(sc->sc_dev), ptr - sc->buf_area);
   1493 #endif
   1494 }
   1495 
   1496 static int
   1497 ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
   1498 {
   1499 	int cmdresult, status;
   1500 	u_int8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */
   1501 
   1502 	*IE_CMD_CFG_CNT(buf)       = 0x0c;
   1503 	*IE_CMD_CFG_FIFO(buf)      = 8;
   1504         *IE_CMD_CFG_SAVEBAD(buf)   = 0x40;
   1505 	*IE_CMD_CFG_ADDRLEN(buf)   = 0x2e;
   1506 	*IE_CMD_CFG_PRIORITY(buf)  = 0;
   1507 	*IE_CMD_CFG_IFS(buf)       = 0x60;
   1508 	*IE_CMD_CFG_SLOT_LOW(buf)  = 0;
   1509 	*IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2;
   1510 	*IE_CMD_CFG_PROMISC(buf)   = (!!promiscuous) | manchester << 2;
   1511 	*IE_CMD_CFG_CRSCDT(buf)    = 0;
   1512 	*IE_CMD_CFG_MINLEN(buf)    = 64;
   1513 	*IE_CMD_CFG_JUNK(buf)      = 0xff;
   1514 	sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
   1515 	setup_simple_command(sc, IE_CMD_CONFIG, cmd);
   1516 	IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
   1517 
   1518 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
   1519 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
   1520 	if (cmdresult != 0) {
   1521 		aprint_error_dev(sc->sc_dev, "configure command timed out; status %x\n", status);
   1522 		return (0);
   1523 	}
   1524 	if ((status & IE_STAT_OK) == 0) {
   1525 		aprint_error_dev(sc->sc_dev, "configure command failed; status %x\n", status);
   1526 		return (0);
   1527 	}
   1528 
   1529 	/* Squash any pending interrupts */
   1530 	ie_ack(sc, IE_ST_WHENCE);
   1531 	return (1);
   1532 }
   1533 
   1534 static int
   1535 ie_ia_setup(struct ie_softc *sc, int cmdbuf)
   1536 {
   1537 	int cmdresult, status;
   1538 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1539 
   1540 	setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
   1541 
   1542 	(sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
   1543 			 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN);
   1544 
   1545 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
   1546 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1547 	if (cmdresult != 0) {
   1548 		aprint_error_dev(sc->sc_dev, "individual address command timed out; status %x\n", status);
   1549 		return (0);
   1550 	}
   1551 	if ((status & IE_STAT_OK) == 0) {
   1552 		aprint_error_dev(sc->sc_dev, "individual address command failed; status %x\n", status);
   1553 		return (0);
   1554 	}
   1555 
   1556 	/* Squash any pending interrupts */
   1557 	ie_ack(sc, IE_ST_WHENCE);
   1558 	return (1);
   1559 }
   1560 
   1561 /*
   1562  * Run the multicast setup command.
   1563  * Called at splnet().
   1564  */
   1565 static int
   1566 ie_mc_setup(struct ie_softc *sc, int cmdbuf)
   1567 {
   1568 	int cmdresult, status;
   1569 
   1570 	if (sc->mcast_count == 0)
   1571 		return (1);
   1572 
   1573 	setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
   1574 
   1575 	(sc->memcopyout)(sc, (void *)sc->mcast_addrs,
   1576 			 IE_CMD_MCAST_MADDR(cmdbuf),
   1577 			 sc->mcast_count * ETHER_ADDR_LEN);
   1578 
   1579 	sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
   1580 			       sc->mcast_count * ETHER_ADDR_LEN);
   1581 
   1582 	/* Start the command */
   1583 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
   1584 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1585 	if (cmdresult != 0) {
   1586 		aprint_error_dev(sc->sc_dev, "multicast setup command timed out; status %x\n", status);
   1587 		return (0);
   1588 	}
   1589 	if ((status & IE_STAT_OK) == 0) {
   1590 		aprint_error_dev(sc->sc_dev, "multicast setup command failed; status %x\n",
   1591 			status);
   1592 		return (0);
   1593 	}
   1594 
   1595 	/* Squash any pending interrupts */
   1596 	ie_ack(sc, IE_ST_WHENCE);
   1597 	return (1);
   1598 }
   1599 
   1600 /*
   1601  * This routine takes the environment generated by check_ie_present() and adds
   1602  * to it all the other structures we need to operate the adapter.  This
   1603  * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting
   1604  * the receiver unit, and clearing interrupts.
   1605  *
   1606  * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER.
   1607  */
   1608 int
   1609 i82586_init(struct ifnet *ifp)
   1610 {
   1611 	struct ie_softc *sc = ifp->if_softc;
   1612 	int cmd;
   1613 
   1614 	sc->async_cmd_inprogress = 0;
   1615 
   1616 	cmd = sc->buf_area;
   1617 
   1618 	/*
   1619 	 * Send the configure command first.
   1620 	 */
   1621 	if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
   1622 		return EIO;
   1623 
   1624 	/*
   1625 	 * Send the Individual Address Setup command.
   1626 	 */
   1627 	if (ie_ia_setup(sc, cmd) == 0)
   1628 		return EIO;
   1629 
   1630 	/*
   1631 	 * Run the time-domain reflectometer.
   1632 	 */
   1633 	ie_run_tdr(sc, cmd);
   1634 
   1635 	/*
   1636 	 * Set the multi-cast filter, if any
   1637 	 */
   1638 	if (ie_mc_setup(sc, cmd) == 0)
   1639 		return EIO;
   1640 
   1641 	/*
   1642 	 * Acknowledge any interrupts we have generated thus far.
   1643 	 */
   1644 	ie_ack(sc, IE_ST_WHENCE);
   1645 
   1646 	/*
   1647 	 * Set up the transmit and recv buffers.
   1648 	 */
   1649 	i82586_setup_bufs(sc);
   1650 
   1651 	if (sc->hwinit)
   1652 		(sc->hwinit)(sc);
   1653 
   1654 	ifp->if_flags |= IFF_RUNNING;
   1655 	ifp->if_flags &= ~IFF_OACTIVE;
   1656 
   1657 	if (NTXBUF < 2)
   1658 		sc->do_xmitnopchain = 0;
   1659 
   1660 	i82586_start_transceiver(sc);
   1661 	return (0);
   1662 }
   1663 
   1664 /*
   1665  * Start the RU and possibly the CU unit
   1666  */
   1667 static void
   1668 i82586_start_transceiver(struct ie_softc *sc)
   1669 {
   1670 
   1671 	/*
   1672 	 * Start RU at current position in frame & RBD lists.
   1673 	 */
   1674 	sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,sc->rfhead),
   1675 			       IE_RBD_ADDR(sc->rbds, sc->rbhead));
   1676 
   1677 	sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
   1678 			       IE_RFRAME_ADDR(sc->rframes,sc->rfhead));
   1679 
   1680 	if (sc->do_xmitnopchain) {
   1681 		/* Stop transmit command chain */
   1682 		if (i82586_start_cmd(sc, IE_CUC_SUSPEND|IE_RUC_SUSPEND, 0, 0, 0))
   1683 			aprint_error_dev(sc->sc_dev, "CU/RU stop command timed out\n");
   1684 
   1685 		/* Start the receiver & transmitter chain */
   1686 		/* sc->scb->ie_command_list =
   1687 			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
   1688 		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
   1689 				   IE_CMD_NOP_ADDR(
   1690 					sc->nop_cmds,
   1691 					(sc->xctail + NTXBUF - 1) % NTXBUF));
   1692 
   1693 		if (i82586_start_cmd(sc, IE_CUC_START|IE_RUC_START, 0, 0, 0))
   1694 			aprint_error_dev(sc->sc_dev, "CU/RU command timed out\n");
   1695 	} else {
   1696 		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
   1697 			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
   1698 	}
   1699 }
   1700 
   1701 void
   1702 i82586_stop(
   1703     struct ifnet *ifp,
   1704     int disable)
   1705 {
   1706 	struct ie_softc *sc = ifp->if_softc;
   1707 
   1708 	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
   1709 		aprint_error_dev(sc->sc_dev, "iestop: disable commands timed out\n");
   1710 }
   1711 
   1712 int
   1713 i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
   1714 {
   1715 	struct ie_softc *sc = ifp->if_softc;
   1716 	struct ifreq *ifr = (struct ifreq *)data;
   1717 	int s, error = 0;
   1718 
   1719 	s = splnet();
   1720 	switch(cmd) {
   1721         case SIOCGIFMEDIA:
   1722         case SIOCSIFMEDIA:
   1723                 error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
   1724                 break;
   1725 	default:
   1726 		error = ether_ioctl(ifp, cmd, data);
   1727 		if (error == ENETRESET) {
   1728 			/*
   1729 			 * Multicast list has changed; set the hardware filter
   1730 			 * accordingly.
   1731 			 */
   1732 			if (ifp->if_flags & IFF_RUNNING)
   1733 				ie_mc_reset(sc);
   1734 			error = 0;
   1735 		}
   1736 		break;
   1737 	}
   1738 #if I82586_DEBUG
   1739 	if (cmd == SIOCSIFFLAGS)
   1740 		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
   1741 #endif
   1742 	splx(s);
   1743 	return (error);
   1744 }
   1745 
   1746 static void
   1747 ie_mc_reset(struct ie_softc *sc)
   1748 {
   1749 	struct ether_multi *enm;
   1750 	struct ether_multistep step;
   1751 	int size;
   1752 
   1753 	/*
   1754 	 * Step through the list of addresses.
   1755 	 */
   1756 again:
   1757 	size = 0;
   1758 	sc->mcast_count = 0;
   1759 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
   1760 	while (enm) {
   1761 		size += 6;
   1762 		if (sc->mcast_count >= IE_MAXMCAST ||
   1763 		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
   1764 			sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
   1765 			i82586_ioctl(&sc->sc_ethercom.ec_if,
   1766 				     SIOCSIFFLAGS, NULL);
   1767 			return;
   1768 		}
   1769 		ETHER_NEXT_MULTI(step, enm);
   1770 	}
   1771 
   1772 	if (size > sc->mcast_addrs_size) {
   1773 		/* Need to allocate more space */
   1774 		if (sc->mcast_addrs_size)
   1775 			free(sc->mcast_addrs, M_IFMADDR);
   1776 		sc->mcast_addrs = (char *)
   1777 			malloc(size, M_IFMADDR, M_WAITOK);
   1778 		sc->mcast_addrs_size = size;
   1779 	}
   1780 
   1781 	/*
   1782 	 * We've got the space; now copy the addresses
   1783 	 */
   1784 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
   1785 	while (enm) {
   1786 		if (sc->mcast_count >= IE_MAXMCAST)
   1787 			goto again; /* Just in case */
   1788 
   1789 		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
   1790 		sc->mcast_count++;
   1791 		ETHER_NEXT_MULTI(step, enm);
   1792 	}
   1793 	sc->want_mcsetup = 1;
   1794 }
   1795 
   1796 /*
   1797  * Media change callback.
   1798  */
   1799 int
   1800 i82586_mediachange(struct ifnet *ifp)
   1801 {
   1802         struct ie_softc *sc = ifp->if_softc;
   1803 
   1804         if (sc->sc_mediachange)
   1805                 return ((*sc->sc_mediachange)(sc));
   1806         return (0);
   1807 }
   1808 
   1809 /*
   1810  * Media status callback.
   1811  */
   1812 void
   1813 i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   1814 {
   1815         struct ie_softc *sc = ifp->if_softc;
   1816 
   1817         if (sc->sc_mediastatus)
   1818                 (*sc->sc_mediastatus)(sc, ifmr);
   1819 }
   1820 
   1821 #if I82586_DEBUG
   1822 void
   1823 print_rbd(struct ie_softc *sc, int n)
   1824 {
   1825 
   1826 	printf("RBD at %08x:\n  status %04x, next %04x, buffer %lx\n"
   1827 		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds,n),
   1828 		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds,n)),
   1829 		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds,n)),
   1830 		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
   1831 		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds,n)));
   1832 }
   1833 #endif
   1834