Home | History | Annotate | Line # | Download | only in ic
i82586.c revision 1.80
      1 /*	$NetBSD: i82586.c,v 1.80 2019/02/05 06:17:02 msaitoh 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.80 2019/02/05 06:17:02 msaitoh 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 #include <net/bpf.h>
    158 
    159 #include <sys/bus.h>
    160 
    161 #include <dev/ic/i82586reg.h>
    162 #include <dev/ic/i82586var.h>
    163 
    164 void	 	i82586_reset(struct ie_softc *, int);
    165 void 		i82586_watchdog(struct ifnet *);
    166 int 		i82586_init(struct ifnet *);
    167 int 		i82586_ioctl(struct ifnet *, u_long, void *);
    168 void 		i82586_start(struct ifnet *);
    169 void 		i82586_stop(struct ifnet *, int);
    170 
    171 
    172 int 		i82586_rint(struct ie_softc *, int);
    173 int 		i82586_tint(struct ie_softc *, int);
    174 
    175 int     	i82586_mediachange(struct ifnet *);
    176 void    	i82586_mediastatus(struct ifnet *, struct ifmediareq *);
    177 
    178 static int 	ie_readframe(struct ie_softc *, int);
    179 static struct mbuf *ieget(struct ie_softc *, int, int);
    180 static int	i82586_get_rbd_list(struct ie_softc *,
    181 					     u_int16_t *, u_int16_t *, int *);
    182 static void	i82586_release_rbd_list(struct ie_softc *,
    183 					     u_int16_t, u_int16_t);
    184 static int	i82586_drop_frames(struct ie_softc *);
    185 static int	i82586_chk_rx_ring(struct ie_softc *);
    186 
    187 static inline void 	ie_ack(struct ie_softc *, u_int);
    188 static inline void 	iexmit(struct ie_softc *);
    189 static void 		i82586_start_transceiver(struct ie_softc *);
    190 
    191 static void	i82586_count_errors(struct ie_softc *);
    192 static void	i82586_rx_errors(struct ie_softc *, int, int);
    193 static void 	i82586_setup_bufs(struct ie_softc *);
    194 static void	setup_simple_command(struct ie_softc *, int, int);
    195 static int 	ie_cfg_setup(struct ie_softc *, int, int, int);
    196 static int	ie_ia_setup(struct ie_softc *, int);
    197 static void 	ie_run_tdr(struct ie_softc *, int);
    198 static int 	ie_mc_setup(struct ie_softc *, int);
    199 static void 	ie_mc_reset(struct ie_softc *);
    200 static int 	i82586_start_cmd(struct ie_softc *, int, int, int, int);
    201 static int	i82586_cmd_wait(struct ie_softc *);
    202 
    203 #if I82586_DEBUG
    204 void 		print_rbd(struct ie_softc *, int);
    205 #endif
    206 
    207 static char* padbuf = NULL;
    208 
    209 /*
    210  * Front-ends call this function to attach to the MI driver.
    211  *
    212  * The front-end has responsibility for managing the ICP and ISCP
    213  * structures. Both of these are opaque to us.  Also, the front-end
    214  * chooses a location for the SCB which is expected to be addressable
    215  * (through `sc->scb') as an offset against the shared-memory bus handle.
    216  *
    217  * The following MD interface function must be setup by the front-end
    218  * before calling here:
    219  *
    220  *	hwreset			- board dependent reset
    221  *	hwinit			- board dependent initialization
    222  *	chan_attn		- channel attention
    223  *	intrhook		- board dependent interrupt processing
    224  *	memcopyin		- shared memory copy: board to KVA
    225  *	memcopyout		- shared memory copy: KVA to board
    226  *	ie_bus_read16		- read a sixteen-bit i82586 pointer
    227  *	ie_bus_write16		- write a sixteen-bit i82586 pointer
    228  *	ie_bus_write24		- write a twenty-four-bit i82586 pointer
    229  *
    230  */
    231 void
    232 i82586_attach(struct ie_softc *sc, const char *name, u_int8_t *etheraddr,
    233     int *media, int nmedia, int defmedia)
    234 {
    235 	int i;
    236 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    237 
    238 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    239 	ifp->if_softc = sc;
    240 	ifp->if_start = i82586_start;
    241 	ifp->if_ioctl = i82586_ioctl;
    242 	ifp->if_init = i82586_init;
    243 	ifp->if_stop = i82586_stop;
    244 	ifp->if_watchdog = i82586_watchdog;
    245 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    246 	IFQ_SET_READY(&ifp->if_snd);
    247 
    248         /* Initialize media goo. */
    249         ifmedia_init(&sc->sc_media, 0, i82586_mediachange, i82586_mediastatus);
    250         if (media != NULL) {
    251                 for (i = 0; i < nmedia; i++)
    252                         ifmedia_add(&sc->sc_media, media[i], 0, NULL);
    253                 ifmedia_set(&sc->sc_media, defmedia);
    254         } else {
    255                 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
    256                 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
    257         }
    258 
    259 	if (padbuf == NULL) {
    260 		padbuf = malloc(ETHER_MIN_LEN - ETHER_CRC_LEN, M_DEVBUF,
    261 		    M_ZERO | M_NOWAIT);
    262 		if (padbuf == NULL) {
    263 			 aprint_error_dev(sc->sc_dev,
    264 			     "can't allocate pad buffer\n");
    265 			 return;
    266 		}
    267 	}
    268 
    269 	/* Attach the interface. */
    270 	if_attach(ifp);
    271 	if_deferred_start_init(ifp, NULL);
    272 	ether_ifattach(ifp, etheraddr);
    273 
    274 	aprint_normal(" 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,
    331     int async)
    332 {
    333 	int i;
    334 	int off;
    335 
    336 	if (sc->async_cmd_inprogress != 0) {
    337 		/*
    338 		 * If previous command was issued asynchronously, wait
    339 		 * for it now.
    340 		 */
    341 		if (i82586_cmd_wait(sc) != 0)
    342 			return (1);
    343 		sc->async_cmd_inprogress = 0;
    344 	}
    345 
    346 	off = IE_SCB_CMD(sc->scb);
    347 	sc->ie_bus_write16(sc, off, cmd);
    348 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
    349 	(sc->chan_attn)(sc, CARD_RESET);
    350 
    351 	if (async != 0) {
    352 		sc->async_cmd_inprogress = 1;
    353 		return (0);
    354 	}
    355 
    356 	if (IE_ACTION_COMMAND(cmd) && iecmdbuf) {
    357 		int status;
    358 		/*
    359 		 * Now spin-lock waiting for status.  This is not a very nice
    360 		 * thing to do, and can kill performance pretty well...
    361 		 * According to the packet driver, the minimum timeout
    362 		 * should be .369 seconds.
    363 		 */
    364 		for (i = 0; i < 369000; i++) {
    365 			/* Read the command status */
    366 			off = IE_CMD_COMMON_STATUS(iecmdbuf);
    367 			IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    368 			status = sc->ie_bus_read16(sc, off);
    369 			if (status & mask)
    370 				return (0);
    371 			delay(1);
    372 		}
    373 
    374 	} else {
    375 		/*
    376 		 * Otherwise, just wait for the command to be accepted.
    377 		 */
    378 		return (i82586_cmd_wait(sc));
    379 	}
    380 
    381 	/* Timeout */
    382 	return (1);
    383 }
    384 
    385 /*
    386  * Interrupt Acknowledge.
    387  */
    388 static inline void
    389 ie_ack(struct ie_softc *sc, u_int mask)
    390 	/* mask:	 in native byte-order */
    391 {
    392 	u_int status;
    393 
    394 	IE_BUS_BARRIER(sc, 0, 0, BUS_SPACE_BARRIER_READ);
    395 	status = sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb));
    396 	i82586_start_cmd(sc, status & mask, 0, 0, 0);
    397 	if (sc->intrhook)
    398 		sc->intrhook(sc, INTR_ACK);
    399 }
    400 
    401 /*
    402  * Transfer accumulated chip error counters to IF.
    403  */
    404 static inline void
    405 i82586_count_errors(struct ie_softc *sc)
    406 {
    407 	int scb = sc->scb;
    408 
    409 	sc->sc_ethercom.ec_if.if_ierrors +=
    410 	    sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) +
    411 	    sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) +
    412 	    sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) +
    413 	    sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb));
    414 
    415 	/* Clear error counters */
    416 	sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0);
    417 	sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0);
    418 	sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0);
    419 	sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0);
    420 }
    421 
    422 static void
    423 i82586_rx_errors(struct ie_softc *sc, int fn, int status)
    424 {
    425 	char bits[128];
    426 	snprintb(bits, sizeof(bits), IE_FD_STATUSBITS, status);
    427 	log(LOG_ERR, "%s: rx error (frame# %d): %s\n",
    428 	    device_xname(sc->sc_dev), fn, bits);
    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),
    476 		    status);
    477 #endif
    478 	if (sc->intrhook)
    479 		(sc->intrhook)(sc, INTR_LOOP);
    480 
    481 	/*
    482 	 * Interrupt ACK was posted asynchronously; wait for
    483 	 * completion here before reading SCB status again.
    484 	 *
    485 	 * If ACK fails, try to reset the chip, in hopes that
    486 	 * it helps.
    487 	 */
    488 	if (i82586_cmd_wait(sc) != 0)
    489 		goto reset;
    490 
    491 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    492 	status = sc->ie_bus_read16(sc, off);
    493 	if ((status & IE_ST_WHENCE) != 0)
    494 		goto loop;
    495 
    496 out:
    497 	if (sc->intrhook)
    498 		(sc->intrhook)(sc, INTR_EXIT);
    499 	return (1);
    500 
    501 reset:
    502 	i82586_cmd_wait(sc);
    503 	i82586_reset(sc, 1);
    504 	goto out;
    505 
    506 }
    507 
    508 /*
    509  * Process a received-frame interrupt.
    510  */
    511 int
    512 i82586_rint(struct ie_softc *sc, int scbstatus)
    513 {
    514 static	int timesthru = 1024;
    515 	int i, status, off;
    516 
    517 #if I82586_DEBUG
    518 	if (sc->sc_debug & IED_RINT)
    519 		printf("%s: rint: status 0x%x\n",
    520 			device_xname(sc->sc_dev), scbstatus);
    521 #endif
    522 
    523 	for (;;) {
    524 		int drop = 0;
    525 
    526 		i = sc->rfhead;
    527 		off = IE_RFRAME_STATUS(sc->rframes, i);
    528 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    529 		status = sc->ie_bus_read16(sc, off);
    530 
    531 #if I82586_DEBUG
    532 		if (sc->sc_debug & IED_RINT)
    533 			printf("%s: rint: frame(%d) status 0x%x\n",
    534 				device_xname(sc->sc_dev), i, status);
    535 #endif
    536 		if ((status & IE_FD_COMPLETE) == 0) {
    537 			if ((status & IE_FD_OK) != 0) {
    538 				printf("%s: rint: weird: ",
    539 					device_xname(sc->sc_dev));
    540 				i82586_rx_errors(sc, i, status);
    541 				break;
    542 			}
    543 			if (--timesthru == 0) {
    544 				/* Account the accumulated errors */
    545 				i82586_count_errors(sc);
    546 				timesthru = 1024;
    547 			}
    548 			break;
    549 		} else if ((status & IE_FD_OK) == 0) {
    550 			/*
    551 			 * If the chip is configured to automatically
    552 			 * discard bad frames, the only reason we can
    553 			 * get here is an "out-of-resource" condition.
    554 			 */
    555 			i82586_rx_errors(sc, i, status);
    556 			drop = 1;
    557 		}
    558 
    559 #if I82586_DEBUG
    560 		if ((status & IE_FD_BUSY) != 0)
    561 			printf("%s: rint: frame(%d) busy; status=0x%x\n",
    562 				device_xname(sc->sc_dev), i, status);
    563 #endif
    564 
    565 
    566 		/*
    567 		 * Advance the RFD list, since we're done with
    568 		 * this descriptor.
    569 		 */
    570 
    571 		/* Clear frame status */
    572 		sc->ie_bus_write16(sc, off, 0);
    573 
    574 		/* Put fence at this frame (the head) */
    575 		off = IE_RFRAME_LAST(sc->rframes, i);
    576 		sc->ie_bus_write16(sc, off, IE_FD_EOL|IE_FD_SUSP);
    577 
    578 		/* and clear RBD field */
    579 		off = IE_RFRAME_BUFDESC(sc->rframes, i);
    580 		sc->ie_bus_write16(sc, off, 0xffff);
    581 
    582 		/* Remove fence from current tail */
    583 		off = IE_RFRAME_LAST(sc->rframes, sc->rftail);
    584 		sc->ie_bus_write16(sc, off, 0);
    585 
    586 		if (++sc->rftail == sc->nframes)
    587 			sc->rftail = 0;
    588 		if (++sc->rfhead == sc->nframes)
    589 			sc->rfhead = 0;
    590 
    591 		/* Pull the frame off the board */
    592 		if (drop) {
    593 			i82586_drop_frames(sc);
    594 			if ((status & IE_FD_RNR) != 0)
    595 				sc->rnr_expect = 1;
    596 			sc->sc_ethercom.ec_if.if_ierrors++;
    597 		} else if (ie_readframe(sc, i) != 0)
    598 			return (1);
    599 	}
    600 
    601 	if ((scbstatus & IE_ST_RNR) != 0) {
    602 
    603 		/*
    604 		 * Receiver went "Not Ready". We try to figure out
    605 		 * whether this was an expected event based on past
    606 		 * frame status values.
    607 		 */
    608 
    609 		if ((scbstatus & IE_RUS_SUSPEND) != 0) {
    610 			/*
    611 			 * We use the "suspend on last frame" flag.
    612 			 * Send a RU RESUME command in response, since
    613 			 * we should have dealt with all completed frames
    614 			 * by now.
    615 			 */
    616 			printf("RINT: SUSPENDED; scbstatus=0x%x\n",
    617 				scbstatus);
    618 			if (i82586_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0)
    619 				return (0);
    620 			aprint_error_dev(sc->sc_dev,
    621 			    "RU RESUME command timed out\n");
    622 			return (1);	/* Ask for a reset */
    623 		}
    624 
    625 		if (sc->rnr_expect != 0) {
    626 			/*
    627 			 * The RNR condition was announced in the previously
    628 			 * completed frame.  Assume the receive ring is Ok,
    629 			 * so restart the receiver without further delay.
    630 			 */
    631 			i82586_start_transceiver(sc);
    632 			sc->rnr_expect = 0;
    633 			return (0);
    634 
    635 		} else if ((scbstatus & IE_RUS_NOSPACE) != 0) {
    636 			/*
    637 			 * We saw no previous IF_FD_RNR flag.
    638 			 * We check our ring invariants and, if ok,
    639 			 * just restart the receiver at the current
    640 			 * point in the ring.
    641 			 */
    642 			if (i82586_chk_rx_ring(sc) != 0)
    643 				return (1);
    644 
    645 			i82586_start_transceiver(sc);
    646 			sc->sc_ethercom.ec_if.if_ierrors++;
    647 			return (0);
    648 		} else
    649 			printf("%s: receiver not ready; scbstatus=0x%x\n",
    650 				device_xname(sc->sc_dev), scbstatus);
    651 
    652 		sc->sc_ethercom.ec_if.if_ierrors++;
    653 		return (1);	/* Ask for a reset */
    654 	}
    655 
    656 	return (0);
    657 }
    658 
    659 /*
    660  * Process a command-complete interrupt.  These are only generated by the
    661  * transmission of frames.  This routine is deceptively simple, since most
    662  * of the real work is done by i82586_start().
    663  */
    664 int
    665 i82586_tint(struct ie_softc *sc, int scbstatus)
    666 {
    667 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    668 	int status;
    669 
    670 	ifp->if_timer = 0;
    671 	ifp->if_flags &= ~IFF_OACTIVE;
    672 
    673 #if I82586_DEBUG
    674 	if (sc->xmit_busy <= 0) {
    675 	    printf("i82586_tint: WEIRD: xmit_busy=%d, xctail=%d, xchead=%d\n",
    676 		   sc->xmit_busy, sc->xctail, sc->xchead);
    677 		return (0);
    678 	}
    679 #endif
    680 
    681 	status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds,
    682 							  sc->xctail));
    683 
    684 #if I82586_DEBUG
    685 	if (sc->sc_debug & IED_TINT)
    686 		printf("%s: tint: SCB status 0x%x; xmit status 0x%x\n",
    687 			device_xname(sc->sc_dev), scbstatus, status);
    688 #endif
    689 
    690 	if ((status & IE_STAT_COMPL) == 0 || (status & IE_STAT_BUSY)) {
    691 	    printf("i82586_tint: command still busy; status=0x%x; tail=%d\n",
    692 		   status, sc->xctail);
    693 	    printf("iestatus = 0x%x\n", scbstatus);
    694 	}
    695 
    696 	if (status & IE_STAT_OK) {
    697 		ifp->if_opackets++;
    698 		ifp->if_collisions += (status & IE_XS_MAXCOLL);
    699 	} else {
    700 		ifp->if_oerrors++;
    701 		/*
    702 		 * Check SQE and DEFERRED?
    703 		 * What if more than one bit is set?
    704 		 */
    705 		if (status & IE_STAT_ABORT)
    706 			aprint_error_dev(sc->sc_dev, "send aborted\n");
    707 		else if (status & IE_XS_NOCARRIER)
    708 			aprint_error_dev(sc->sc_dev, "no carrier\n");
    709 		else if (status & IE_XS_LOSTCTS)
    710 			aprint_error_dev(sc->sc_dev, "lost CTS\n");
    711 		else if (status & IE_XS_UNDERRUN)
    712 			aprint_error_dev(sc->sc_dev, "DMA underrun\n");
    713 		else if (status & IE_XS_EXCMAX) {
    714 			aprint_error_dev(sc->sc_dev, "too many collisions\n");
    715 			sc->sc_ethercom.ec_if.if_collisions += 16;
    716 		}
    717 	}
    718 
    719 	/*
    720 	 * If multicast addresses were added or deleted while transmitting,
    721 	 * ie_mc_reset() set the want_mcsetup flag indicating that we
    722 	 * should do it.
    723 	 */
    724 	if (sc->want_mcsetup) {
    725 		ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
    726 		sc->want_mcsetup = 0;
    727 	}
    728 
    729 	/* Done with the buffer. */
    730 	sc->xmit_busy--;
    731 	sc->xctail = (sc->xctail + 1) % NTXBUF;
    732 
    733 	/* Start the next packet, if any, transmitting. */
    734 	if (sc->xmit_busy > 0)
    735 		iexmit(sc);
    736 
    737 	if_schedule_deferred_start(ifp);
    738 	return (0);
    739 }
    740 
    741 /*
    742  * Get a range of receive buffer descriptors that represent one packet.
    743  */
    744 static int
    745 i82586_get_rbd_list(struct ie_softc *sc, u_int16_t *start, u_int16_t *end,
    746     int *pktlen)
    747 {
    748 	int	off, rbbase = sc->rbds;
    749 	int	rbindex, count = 0;
    750 	int	plen = 0;
    751 	int	rbdstatus;
    752 
    753 	*start = rbindex = sc->rbhead;
    754 
    755 	do {
    756 		off = IE_RBD_STATUS(rbbase, rbindex);
    757 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    758 		rbdstatus = sc->ie_bus_read16(sc, off);
    759 		if ((rbdstatus & IE_RBD_USED) == 0) {
    760 			/*
    761 			 * This means we are somehow out of sync.  So, we
    762 			 * reset the adapter.
    763 			 */
    764 #if I82586_DEBUG
    765 			print_rbd(sc, rbindex);
    766 #endif
    767 			log(LOG_ERR,
    768 			    "%s: receive descriptors out of sync at %d\n",
    769 			    device_xname(sc->sc_dev), rbindex);
    770 			return (0);
    771 		}
    772 		plen += (rbdstatus & IE_RBD_CNTMASK);
    773 
    774 		if (++rbindex == sc->nrxbuf)
    775 			rbindex = 0;
    776 
    777 		++count;
    778 	} while ((rbdstatus & IE_RBD_LAST) == 0);
    779 	*end = rbindex;
    780 	*pktlen = plen;
    781 	return (count);
    782 }
    783 
    784 
    785 /*
    786  * Release a range of receive buffer descriptors after we've copied the packet.
    787  */
    788 static void
    789 i82586_release_rbd_list(struct ie_softc *sc, u_int16_t start, u_int16_t end)
    790 {
    791 	int	off, rbbase = sc->rbds;
    792 	int	rbindex = start;
    793 
    794 	do {
    795 		/* Clear buffer status */
    796 		off = IE_RBD_STATUS(rbbase, rbindex);
    797 		sc->ie_bus_write16(sc, off, 0);
    798 		if (++rbindex == sc->nrxbuf)
    799 			rbindex = 0;
    800 	} while (rbindex != end);
    801 
    802 	/* Mark EOL at new tail */
    803 	rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
    804 	off = IE_RBD_BUFLEN(rbbase, rbindex);
    805 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE|IE_RBD_EOL);
    806 
    807 	/* Remove EOL from current tail */
    808 	off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
    809 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
    810 
    811 	/* New head & tail pointer */
    812 /* hmm, why have both? head is always (tail + 1) % NRXBUF */
    813 	sc->rbhead = end;
    814 	sc->rbtail = rbindex;
    815 }
    816 
    817 /*
    818  * Drop the packet at the head of the RX buffer ring.
    819  * Called if the frame descriptor reports an error on this packet.
    820  * Returns 1 if the buffer descriptor ring appears to be corrupt;
    821  * and 0 otherwise.
    822  */
    823 static int
    824 i82586_drop_frames(struct ie_softc *sc)
    825 {
    826 	u_int16_t bstart, bend;
    827 	int pktlen;
    828 
    829 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0)
    830 		return (1);
    831 	i82586_release_rbd_list(sc, bstart, bend);
    832 	return (0);
    833 }
    834 
    835 /*
    836  * Check the RX frame & buffer descriptor lists for our invariants,
    837  * i.e.: EOL bit set iff. it is pointed at by the r*tail pointer.
    838  *
    839  * Called when the receive unit has stopped unexpectedly.
    840  * Returns 1 if an inconsistency is detected; 0 otherwise.
    841  *
    842  * The Receive Unit is expected to be NOT RUNNING.
    843  */
    844 static int
    845 i82586_chk_rx_ring(struct ie_softc *sc)
    846 {
    847 	int n, off, val;
    848 
    849 	for (n = 0; n < sc->nrxbuf; n++) {
    850 		off = IE_RBD_BUFLEN(sc->rbds, n);
    851 		val = sc->ie_bus_read16(sc, off);
    852 		if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
    853 			/* `rbtail' and EOL flag out of sync */
    854 			log(LOG_ERR,
    855 			    "%s: rx buffer descriptors out of sync at %d\n",
    856 			    device_xname(sc->sc_dev), n);
    857 			return (1);
    858 		}
    859 
    860 		/* Take the opportunity to clear the status fields here ? */
    861 	}
    862 
    863 	for (n = 0; n < sc->nframes; n++) {
    864 		off = IE_RFRAME_LAST(sc->rframes, n);
    865 		val = sc->ie_bus_read16(sc, off);
    866 		if ((n == sc->rftail) ^ ((val & (IE_FD_EOL|IE_FD_SUSP)) != 0)) {
    867 			/* `rftail' and EOL flag out of sync */
    868 			log(LOG_ERR,
    869 			    "%s: rx frame list out of sync at %d\n",
    870 			    device_xname(sc->sc_dev), n);
    871 			return (1);
    872 		}
    873 	}
    874 
    875 	return (0);
    876 }
    877 
    878 /*
    879  * Read data off the interface, and turn it into an mbuf chain.
    880  *
    881  * This code is DRAMATICALLY different from the previous version; this
    882  * version tries to allocate the entire mbuf chain up front, given the
    883  * length of the data available.  This enables us to allocate mbuf
    884  * clusters in many situations where before we would have had a long
    885  * chain of partially-full mbufs.  This should help to speed up the
    886  * operation considerably.  (Provided that it works, of course.)
    887  */
    888 static inline struct mbuf *
    889 ieget(struct ie_softc *sc, int head, int totlen)
    890 {
    891 	struct mbuf *m, *m0, *newm;
    892 	int len, resid;
    893 	int thisrboff, thismboff;
    894 	struct ether_header eh;
    895 
    896 	/*
    897 	 * Snarf the Ethernet header.
    898 	 */
    899 	(sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
    900 	    sizeof(struct ether_header));
    901 
    902 	resid = totlen;
    903 
    904 	MGETHDR(m0, M_DONTWAIT, MT_DATA);
    905 	if (m0 == 0)
    906 		return (0);
    907 	m_set_rcvif(m0, &sc->sc_ethercom.ec_if);
    908 	m0->m_pkthdr.len = totlen;
    909 	len = MHLEN;
    910 	m = m0;
    911 
    912 	/*
    913 	 * This loop goes through and allocates mbufs for all the data we will
    914 	 * be copying in.  It does not actually do the copying yet.
    915 	 */
    916 	while (totlen > 0) {
    917 		if (totlen >= MINCLSIZE) {
    918 			MCLGET(m, M_DONTWAIT);
    919 			if ((m->m_flags & M_EXT) == 0)
    920 				goto bad;
    921 			len = MCLBYTES;
    922 		}
    923 
    924 		if (m == m0) {
    925 			char *newdata = (char *)
    926 			    ALIGN(m->m_data + sizeof(struct ether_header)) -
    927 			    sizeof(struct ether_header);
    928 			len -= newdata - m->m_data;
    929 			m->m_data = newdata;
    930 		}
    931 
    932 		m->m_len = len = uimin(totlen, len);
    933 
    934 		totlen -= len;
    935 		if (totlen > 0) {
    936 			MGET(newm, M_DONTWAIT, MT_DATA);
    937 			if (newm == 0)
    938 				goto bad;
    939 			len = MLEN;
    940 			m = m->m_next = newm;
    941 		}
    942 	}
    943 
    944 	m = m0;
    945 	thismboff = 0;
    946 
    947 	/*
    948 	 * Copy the Ethernet header into the mbuf chain.
    949 	 */
    950 	memcpy(mtod(m, void *), &eh, sizeof(struct ether_header));
    951 	thismboff = sizeof(struct ether_header);
    952 	thisrboff = sizeof(struct ether_header);
    953 	resid -= sizeof(struct ether_header);
    954 
    955 	/*
    956 	 * Now we take the mbuf chain (hopefully only one mbuf most of the
    957 	 * time) and stuff the data into it.  There are no possible failures
    958 	 * at or after this point.
    959 	 */
    960 	while (resid > 0) {
    961 		int thisrblen = IE_RBUF_SIZE - thisrboff,
    962 		    thismblen = m->m_len - thismboff;
    963 		len = uimin(thisrblen, thismblen);
    964 
    965 		(sc->memcopyin)(sc, mtod(m, char *) + thismboff,
    966 				IE_RBUF_ADDR(sc,head) + thisrboff,
    967 				(u_int)len);
    968 		resid -= len;
    969 
    970 		if (len == thismblen) {
    971 			m = m->m_next;
    972 			thismboff = 0;
    973 		} else
    974 			thismboff += len;
    975 
    976 		if (len == thisrblen) {
    977 			if (++head == sc->nrxbuf)
    978 				head = 0;
    979 			thisrboff = 0;
    980 		} else
    981 			thisrboff += len;
    982 	}
    983 
    984 	/*
    985 	 * Unless something changed strangely while we were doing the copy,
    986 	 * we have now copied everything in from the shared memory.
    987 	 * This means that we are done.
    988 	 */
    989 	return (m0);
    990 
    991 bad:
    992 	m_freem(m0);
    993 	return (0);
    994 }
    995 
    996 /*
    997  * Read frame NUM from unit UNIT (pre-cached as IE).
    998  *
    999  * This routine reads the RFD at NUM, and copies in the buffers from the list
   1000  * of RBD, then rotates the RBD list so that the receiver doesn't start
   1001  * complaining.  Trailers are DROPPED---there's no point in wasting time
   1002  * on confusing code to deal with them.  Hopefully, this machine will
   1003  * never ARP for trailers anyway.
   1004  */
   1005 static int
   1006 ie_readframe(
   1007     struct ie_softc *sc,
   1008     int num)		/* frame number to read */
   1009 {
   1010 	struct mbuf *m;
   1011 	u_int16_t bstart, bend;
   1012 	int pktlen;
   1013 
   1014 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
   1015 		sc->sc_ethercom.ec_if.if_ierrors++;
   1016 		return (1);
   1017 	}
   1018 
   1019 	m = ieget(sc, bstart, pktlen);
   1020 	i82586_release_rbd_list(sc, bstart, bend);
   1021 
   1022 	if (m == 0) {
   1023 		sc->sc_ethercom.ec_if.if_ierrors++;
   1024 		return (0);
   1025 	}
   1026 
   1027 #if I82586_DEBUG
   1028 	if (sc->sc_debug & IED_READFRAME) {
   1029 		struct ether_header *eh = mtod(m, struct ether_header *);
   1030 
   1031 		printf("%s: frame from ether %s type 0x%x len %d\n",
   1032 			device_xname(sc->sc_dev),
   1033 			ether_sprintf(eh->ether_shost),
   1034 			(u_int)ntohs(eh->ether_type),
   1035 			pktlen);
   1036 	}
   1037 #endif
   1038 
   1039 	/*
   1040 	 * Finally pass this packet up to higher layers.
   1041 	 */
   1042 	if_percpuq_enqueue((&sc->sc_ethercom.ec_if)->if_percpuq, 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),
   1094 		    0);
   1095 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
   1096 				       IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
   1097 
   1098 		off = IE_SCB_STATUS(sc->scb);
   1099 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1100 		if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
   1101 			printf("iexmit: CU not active\n");
   1102 			i82586_start_transceiver(sc);
   1103 		}
   1104 	} else {
   1105 		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds,cur),
   1106 				       0xffff);
   1107 
   1108 		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
   1109 				       IE_CMD_XMIT | IE_CMD_INTR | IE_CMD_LAST);
   1110 
   1111 		off = IE_SCB_CMDLST(sc->scb);
   1112 		sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds,
   1113 			cur));
   1114 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1115 
   1116 		if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1))
   1117 			aprint_error_dev(sc->sc_dev,
   1118 			    "iexmit: start xmit command timed out\n");
   1119 	}
   1120 
   1121 	sc->sc_ethercom.ec_if.if_timer = 5;
   1122 }
   1123 
   1124 
   1125 /*
   1126  * Start transmission on an interface.
   1127  */
   1128 void
   1129 i82586_start(struct ifnet *ifp)
   1130 {
   1131 	struct ie_softc *sc = ifp->if_softc;
   1132 	struct mbuf *m0, *m;
   1133 	int	buffer, head, xbase;
   1134 	u_short	len;
   1135 	int	s;
   1136 
   1137 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   1138 		return;
   1139 
   1140 	for (;;) {
   1141 		if (sc->xmit_busy == NTXBUF) {
   1142 			ifp->if_flags |= IFF_OACTIVE;
   1143 			break;
   1144 		}
   1145 
   1146 		head = sc->xchead;
   1147 		xbase = sc->xbds;
   1148 
   1149 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1150 		if (m0 == 0)
   1151 			break;
   1152 
   1153 		/* We need to use m->m_pkthdr.len, so require the header */
   1154 		if ((m0->m_flags & M_PKTHDR) == 0)
   1155 			panic("i82586_start: no header mbuf");
   1156 
   1157 		/* Tap off here if there is a BPF listener. */
   1158 		bpf_mtap(ifp, m0, BPF_D_OUT);
   1159 
   1160 #if I82586_DEBUG
   1161 		if (sc->sc_debug & IED_ENQ)
   1162 			printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
   1163 				sc->xchead);
   1164 #endif
   1165 
   1166 		if (m0->m_pkthdr.len > IE_TBUF_SIZE)
   1167 			printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
   1168 
   1169 		buffer = IE_XBUF_ADDR(sc, head);
   1170 		for (m = m0; m != 0; m = m->m_next) {
   1171 			(sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
   1172 			buffer += m->m_len;
   1173 		}
   1174 		len = m0->m_pkthdr.len;
   1175 		if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) {
   1176 			(sc->memcopyout)(sc, padbuf, buffer,
   1177 			    ETHER_MIN_LEN - ETHER_CRC_LEN - len);
   1178 			buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len;
   1179 			len = ETHER_MIN_LEN - ETHER_CRC_LEN;
   1180 		}
   1181 		m_freem(m0);
   1182 
   1183 		/*
   1184 		 * Setup the transmit buffer descriptor here, while we
   1185 		 * know the packet's length.
   1186 		 */
   1187 		sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
   1188 				       len | IE_TBD_EOL);
   1189 		sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
   1190 		sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
   1191 				       IE_XBUF_ADDR(sc, head));
   1192 
   1193 		if (++head == NTXBUF)
   1194 			head = 0;
   1195 		sc->xchead = head;
   1196 
   1197 		s = splnet();
   1198 		/* Start the first packet transmitting. */
   1199 		if (sc->xmit_busy == 0)
   1200 			iexmit(sc);
   1201 
   1202 		sc->xmit_busy++;
   1203 		splx(s);
   1204 	}
   1205 }
   1206 
   1207 /*
   1208  * Probe IE's ram setup   [ Move all this into MD front-end!? ]
   1209  * Use only if SCP and ISCP represent offsets into shared ram space.
   1210  */
   1211 int
   1212 i82586_proberam(struct ie_softc *sc)
   1213 {
   1214 	int result, off;
   1215 
   1216 	/* Put in 16-bit mode */
   1217 	off = IE_SCP_BUS_USE(sc->scp);
   1218 	sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
   1219 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1220 
   1221 	/* Set the ISCP `busy' bit */
   1222 	off = IE_ISCP_BUSY(sc->iscp);
   1223 	sc->ie_bus_write16(sc, off, 1);
   1224 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1225 
   1226 	if (sc->hwreset)
   1227 		(sc->hwreset)(sc, CHIP_PROBE);
   1228 
   1229 	(sc->chan_attn) (sc, CHIP_PROBE);
   1230 
   1231 	delay(100);		/* wait a while... */
   1232 
   1233 	/* Read back the ISCP `busy' bit; it should be clear by now */
   1234 	off = IE_ISCP_BUSY(sc->iscp);
   1235 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1236 	result = sc->ie_bus_read16(sc, off) == 0;
   1237 
   1238 	/* Acknowledge any interrupts we may have caused. */
   1239 	ie_ack(sc, IE_ST_WHENCE);
   1240 
   1241 	return (result);
   1242 }
   1243 
   1244 void
   1245 i82586_reset(struct ie_softc *sc, int hard)
   1246 {
   1247 	int s = splnet();
   1248 
   1249 	if (hard)
   1250 		printf("%s: reset\n", device_xname(sc->sc_dev));
   1251 
   1252 	/* Clear OACTIVE in case we're called from watchdog (frozen xmit). */
   1253 	sc->sc_ethercom.ec_if.if_timer = 0;
   1254 	sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
   1255 
   1256 	/*
   1257 	 * Stop i82586 dead in its tracks.
   1258 	 */
   1259 	if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
   1260 		aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
   1261 
   1262 	/*
   1263 	 * This can really slow down the i82586_reset() on some cards, but it's
   1264 	 * necessary to unwedge other ones (eg, the Sun VME ones) from certain
   1265 	 * lockups.
   1266 	 */
   1267 	if (hard && sc->hwreset)
   1268 		(sc->hwreset)(sc, CARD_RESET);
   1269 
   1270 	delay(100);
   1271 	ie_ack(sc, IE_ST_WHENCE);
   1272 
   1273 	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
   1274 		int retries=0;	/* XXX - find out why init sometimes fails */
   1275 		while (retries++ < 2)
   1276 			if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
   1277 				break;
   1278 	}
   1279 
   1280 	splx(s);
   1281 }
   1282 
   1283 
   1284 static void
   1285 setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
   1286 {
   1287 	/* Setup a simple command */
   1288 	sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
   1289 	sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
   1290 	sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
   1291 
   1292 	/* Assign the command buffer to the SCB command list */
   1293 	sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
   1294 }
   1295 
   1296 /*
   1297  * Run the time-domain reflectometer.
   1298  */
   1299 static void
   1300 ie_run_tdr(struct ie_softc *sc, int cmd)
   1301 {
   1302 	int result;
   1303 
   1304 	setup_simple_command(sc, IE_CMD_TDR, cmd);
   1305 	sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
   1306 
   1307 	if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
   1308 	    (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
   1309 		result = 0x10000; /* XXX */
   1310 	else
   1311 		result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
   1312 
   1313 	/* Squash any pending interrupts */
   1314 	ie_ack(sc, IE_ST_WHENCE);
   1315 
   1316 	if (result & IE_TDR_SUCCESS)
   1317 		return;
   1318 
   1319 	if (result & 0x10000)
   1320 		aprint_error_dev(sc->sc_dev, "TDR command failed\n");
   1321 	else if (result & IE_TDR_XCVR)
   1322 		aprint_error_dev(sc->sc_dev, "transceiver problem\n");
   1323 	else if (result & IE_TDR_OPEN)
   1324 		aprint_error_dev(sc->sc_dev, "TDR detected incorrect "
   1325 		    "termination %d clocks away\n", result & IE_TDR_TIME);
   1326 	else if (result & IE_TDR_SHORT)
   1327 		aprint_error_dev(sc->sc_dev, "TDR detected a short circuit "
   1328 		    "%d clocks away\n", result & IE_TDR_TIME);
   1329 	else
   1330 		aprint_error_dev(sc->sc_dev,
   1331 		    "TDR returned unknown status 0x%x\n", result);
   1332 }
   1333 
   1334 
   1335 /*
   1336  * i82586_setup_bufs: set up the buffers
   1337  *
   1338  * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
   1339  * this is to be used for the buffers.  The chip indexs its control data
   1340  * structures with 16 bit offsets, and it indexes actual buffers with
   1341  * 24 bit addresses.   So we should allocate control buffers first so that
   1342  * we don't overflow the 16 bit offset field.   The number of transmit
   1343  * buffers is fixed at compile time.
   1344  *
   1345  */
   1346 static void
   1347 i82586_setup_bufs(struct ie_softc *sc)
   1348 {
   1349 	int	ptr = sc->buf_area;	/* memory pool */
   1350 	int     n, r;
   1351 
   1352 	/*
   1353 	 * step 0: zero memory and figure out how many recv buffers and
   1354 	 * frames we can have.
   1355 	 */
   1356 	ptr = (ptr + 3) & ~3;	/* set alignment and stick with it */
   1357 
   1358 
   1359 	/*
   1360 	 *  step 1: lay out data structures in the shared-memory area
   1361 	 */
   1362 
   1363 	/* The no-op commands; used if "nop-chaining" is in effect */
   1364 	sc->nop_cmds = ptr;
   1365 	ptr += NTXBUF * IE_CMD_NOP_SZ;
   1366 
   1367 	/* The transmit commands */
   1368 	sc->xmit_cmds = ptr;
   1369 	ptr += NTXBUF * IE_CMD_XMIT_SZ;
   1370 
   1371 	/* The transmit buffers descriptors */
   1372 	sc->xbds = ptr;
   1373 	ptr += NTXBUF * IE_XBD_SZ;
   1374 
   1375 	/* The transmit buffers */
   1376 	sc->xbufs = ptr;
   1377 	ptr += NTXBUF * IE_TBUF_SIZE;
   1378 
   1379 	ptr = (ptr + 3) & ~3;		/* re-align.. just in case */
   1380 
   1381 	/* Compute free space for RECV stuff */
   1382 	n = sc->buf_area_sz - (ptr - sc->buf_area);
   1383 
   1384 	/* Compute size of one RECV frame */
   1385 	r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F);
   1386 
   1387 	sc->nframes = n / r;
   1388 
   1389 	if (sc->nframes <= 0)
   1390 		panic("ie: bogus buffer calc");
   1391 
   1392 	sc->nrxbuf = sc->nframes * B_PER_F;
   1393 
   1394 	/* The receive frame descriptors */
   1395 	sc->rframes = ptr;
   1396 	ptr += sc->nframes * IE_RFRAME_SZ;
   1397 
   1398 	/* The receive buffer descriptors */
   1399 	sc->rbds = ptr;
   1400 	ptr += sc->nrxbuf * IE_RBD_SZ;
   1401 
   1402 	/* The receive buffers */
   1403 	sc->rbufs = ptr;
   1404 	ptr += sc->nrxbuf * IE_RBUF_SIZE;
   1405 
   1406 #if I82586_DEBUG
   1407 	printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev),
   1408 	    sc->nframes, sc->nrxbuf);
   1409 #endif
   1410 
   1411 	/*
   1412 	 * step 2: link together the recv frames and set EOL on last one
   1413 	 */
   1414 	for (n = 0; n < sc->nframes; n++) {
   1415 		int m = (n == sc->nframes - 1) ? 0 : n + 1;
   1416 
   1417 		/* Clear status */
   1418 		sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes,n), 0);
   1419 
   1420 		/* RBD link = NULL */
   1421 		sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,n),
   1422 				       0xffff);
   1423 
   1424 		/* Make a circular list */
   1425 		sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes,n),
   1426 				       IE_RFRAME_ADDR(sc->rframes,m));
   1427 
   1428 		/* Mark last as EOL */
   1429 		sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes,n),
   1430 				       ((m==0)? (IE_FD_EOL|IE_FD_SUSP) : 0));
   1431 	}
   1432 
   1433 	/*
   1434 	 * step 3: link the RBDs and set EOL on last one
   1435 	 */
   1436 	for (n = 0; n < sc->nrxbuf; n++) {
   1437 		int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
   1438 
   1439 		/* Clear status */
   1440 		sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds,n), 0);
   1441 
   1442 		/* Make a circular list */
   1443 		sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds,n),
   1444 				       IE_RBD_ADDR(sc->rbds,m));
   1445 
   1446 		/* Link to data buffers */
   1447 		sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
   1448 				       IE_RBUF_ADDR(sc, n));
   1449 		sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds,n),
   1450 				       IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0));
   1451 	}
   1452 
   1453 	/*
   1454 	 * step 4: all xmit no-op commands loopback onto themselves
   1455 	 */
   1456 	for (n = 0; n < NTXBUF; n++) {
   1457 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
   1458 
   1459 		sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
   1460 					 IE_CMD_NOP);
   1461 
   1462 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
   1463 					 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
   1464 	}
   1465 
   1466 
   1467 	/*
   1468 	 * step 6: set the head and tail pointers on receive to keep track of
   1469 	 * the order in which RFDs and RBDs are used.
   1470 	 */
   1471 
   1472 	/* Pointers to last packet sent and next available transmit buffer. */
   1473 	sc->xchead = sc->xctail = 0;
   1474 
   1475 	/* Clear transmit-busy flag and set number of free transmit buffers. */
   1476 	sc->xmit_busy = 0;
   1477 
   1478 	/*
   1479 	 * Pointers to first and last receive frame.
   1480 	 * The RFD pointed to by rftail is the only one that has EOL set.
   1481 	 */
   1482 	sc->rfhead = 0;
   1483 	sc->rftail = sc->nframes - 1;
   1484 
   1485 	/*
   1486 	 * Pointers to first and last receive descriptor buffer.
   1487 	 * The RBD pointed to by rbtail is the only one that has EOL set.
   1488 	 */
   1489 	sc->rbhead = 0;
   1490 	sc->rbtail = sc->nrxbuf - 1;
   1491 
   1492 /* link in recv frames * and buffer into the scb. */
   1493 #if I82586_DEBUG
   1494 	printf("%s: reserved %d bytes\n",
   1495 		device_xname(sc->sc_dev), ptr - sc->buf_area);
   1496 #endif
   1497 }
   1498 
   1499 static int
   1500 ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
   1501 {
   1502 	int cmdresult, status;
   1503 	u_int8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */
   1504 
   1505 	*IE_CMD_CFG_CNT(buf)       = 0x0c;
   1506 	*IE_CMD_CFG_FIFO(buf)      = 8;
   1507         *IE_CMD_CFG_SAVEBAD(buf)   = 0x40;
   1508 	*IE_CMD_CFG_ADDRLEN(buf)   = 0x2e;
   1509 	*IE_CMD_CFG_PRIORITY(buf)  = 0;
   1510 	*IE_CMD_CFG_IFS(buf)       = 0x60;
   1511 	*IE_CMD_CFG_SLOT_LOW(buf)  = 0;
   1512 	*IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2;
   1513 	*IE_CMD_CFG_PROMISC(buf)   = (!!promiscuous) | manchester << 2;
   1514 	*IE_CMD_CFG_CRSCDT(buf)    = 0;
   1515 	*IE_CMD_CFG_MINLEN(buf)    = 64;
   1516 	*IE_CMD_CFG_JUNK(buf)      = 0xff;
   1517 	sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
   1518 	setup_simple_command(sc, IE_CMD_CONFIG, cmd);
   1519 	IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
   1520 
   1521 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
   1522 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
   1523 	if (cmdresult != 0) {
   1524 		aprint_error_dev(sc->sc_dev,
   1525 		    "configure command timed out; status %x\n", status);
   1526 		return (0);
   1527 	}
   1528 	if ((status & IE_STAT_OK) == 0) {
   1529 		aprint_error_dev(sc->sc_dev,
   1530 		    "configure command failed; status %x\n", status);
   1531 		return (0);
   1532 	}
   1533 
   1534 	/* Squash any pending interrupts */
   1535 	ie_ack(sc, IE_ST_WHENCE);
   1536 	return (1);
   1537 }
   1538 
   1539 static int
   1540 ie_ia_setup(struct ie_softc *sc, int cmdbuf)
   1541 {
   1542 	int cmdresult, status;
   1543 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1544 
   1545 	setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
   1546 
   1547 	(sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
   1548 			 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN);
   1549 
   1550 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
   1551 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1552 	if (cmdresult != 0) {
   1553 		aprint_error_dev(sc->sc_dev,
   1554 		    "individual address command timed out; status %x\n",
   1555 		    status);
   1556 		return (0);
   1557 	}
   1558 	if ((status & IE_STAT_OK) == 0) {
   1559 		aprint_error_dev(sc->sc_dev,
   1560 		    "individual address command failed; status %x\n", status);
   1561 		return (0);
   1562 	}
   1563 
   1564 	/* Squash any pending interrupts */
   1565 	ie_ack(sc, IE_ST_WHENCE);
   1566 	return (1);
   1567 }
   1568 
   1569 /*
   1570  * Run the multicast setup command.
   1571  * Called at splnet().
   1572  */
   1573 static int
   1574 ie_mc_setup(struct ie_softc *sc, int cmdbuf)
   1575 {
   1576 	int cmdresult, status;
   1577 
   1578 	if (sc->mcast_count == 0)
   1579 		return (1);
   1580 
   1581 	setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
   1582 
   1583 	(sc->memcopyout)(sc, (void *)sc->mcast_addrs,
   1584 			 IE_CMD_MCAST_MADDR(cmdbuf),
   1585 			 sc->mcast_count * ETHER_ADDR_LEN);
   1586 
   1587 	sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
   1588 			       sc->mcast_count * ETHER_ADDR_LEN);
   1589 
   1590 	/* Start the command */
   1591 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL,
   1592 	    0);
   1593 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1594 	if (cmdresult != 0) {
   1595 		aprint_error_dev(sc->sc_dev,
   1596 		    "multicast setup command timed out; status %x\n", status);
   1597 		return (0);
   1598 	}
   1599 	if ((status & IE_STAT_OK) == 0) {
   1600 		aprint_error_dev(sc->sc_dev,
   1601 		    "multicast setup command failed; status %x\n", status);
   1602 		return (0);
   1603 	}
   1604 
   1605 	/* Squash any pending interrupts */
   1606 	ie_ack(sc, IE_ST_WHENCE);
   1607 	return (1);
   1608 }
   1609 
   1610 /*
   1611  * This routine takes the environment generated by check_ie_present() and adds
   1612  * to it all the other structures we need to operate the adapter.  This
   1613  * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting
   1614  * the receiver unit, and clearing interrupts.
   1615  *
   1616  * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER.
   1617  */
   1618 int
   1619 i82586_init(struct ifnet *ifp)
   1620 {
   1621 	struct ie_softc *sc = ifp->if_softc;
   1622 	int cmd;
   1623 
   1624 	sc->async_cmd_inprogress = 0;
   1625 
   1626 	cmd = sc->buf_area;
   1627 
   1628 	/*
   1629 	 * Send the configure command first.
   1630 	 */
   1631 	if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
   1632 		return EIO;
   1633 
   1634 	/*
   1635 	 * Send the Individual Address Setup command.
   1636 	 */
   1637 	if (ie_ia_setup(sc, cmd) == 0)
   1638 		return EIO;
   1639 
   1640 	/*
   1641 	 * Run the time-domain reflectometer.
   1642 	 */
   1643 	ie_run_tdr(sc, cmd);
   1644 
   1645 	/*
   1646 	 * Set the multi-cast filter, if any
   1647 	 */
   1648 	if (ie_mc_setup(sc, cmd) == 0)
   1649 		return EIO;
   1650 
   1651 	/*
   1652 	 * Acknowledge any interrupts we have generated thus far.
   1653 	 */
   1654 	ie_ack(sc, IE_ST_WHENCE);
   1655 
   1656 	/*
   1657 	 * Set up the transmit and recv buffers.
   1658 	 */
   1659 	i82586_setup_bufs(sc);
   1660 
   1661 	if (sc->hwinit)
   1662 		(sc->hwinit)(sc);
   1663 
   1664 	ifp->if_flags |= IFF_RUNNING;
   1665 	ifp->if_flags &= ~IFF_OACTIVE;
   1666 
   1667 	if (NTXBUF < 2)
   1668 		sc->do_xmitnopchain = 0;
   1669 
   1670 	i82586_start_transceiver(sc);
   1671 	return (0);
   1672 }
   1673 
   1674 /*
   1675  * Start the RU and possibly the CU unit
   1676  */
   1677 static void
   1678 i82586_start_transceiver(struct ie_softc *sc)
   1679 {
   1680 
   1681 	/*
   1682 	 * Start RU at current position in frame & RBD lists.
   1683 	 */
   1684 	sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,sc->rfhead),
   1685 			       IE_RBD_ADDR(sc->rbds, sc->rbhead));
   1686 
   1687 	sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
   1688 			       IE_RFRAME_ADDR(sc->rframes,sc->rfhead));
   1689 
   1690 	if (sc->do_xmitnopchain) {
   1691 		/* Stop transmit command chain */
   1692 		if (i82586_start_cmd(sc, IE_CUC_SUSPEND|IE_RUC_SUSPEND, 0, 0, 0))
   1693 			aprint_error_dev(sc->sc_dev,
   1694 			    "CU/RU stop command timed out\n");
   1695 
   1696 		/* Start the receiver & transmitter chain */
   1697 		/* sc->scb->ie_command_list =
   1698 			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
   1699 		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
   1700 				   IE_CMD_NOP_ADDR(
   1701 					sc->nop_cmds,
   1702 					(sc->xctail + NTXBUF - 1) % NTXBUF));
   1703 
   1704 		if (i82586_start_cmd(sc, IE_CUC_START|IE_RUC_START, 0, 0, 0))
   1705 			aprint_error_dev(sc->sc_dev,
   1706 			    "CU/RU command timed out\n");
   1707 	} else {
   1708 		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
   1709 			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
   1710 	}
   1711 }
   1712 
   1713 void
   1714 i82586_stop(struct ifnet *ifp, int disable)
   1715 {
   1716 	struct ie_softc *sc = ifp->if_softc;
   1717 
   1718 	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
   1719 		aprint_error_dev(sc->sc_dev,
   1720 		    "iestop: disable commands timed out\n");
   1721 }
   1722 
   1723 int
   1724 i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
   1725 {
   1726 	struct ie_softc *sc = ifp->if_softc;
   1727 	struct ifreq *ifr = (struct ifreq *)data;
   1728 	int s, error = 0;
   1729 
   1730 	s = splnet();
   1731 	switch(cmd) {
   1732         case SIOCGIFMEDIA:
   1733         case SIOCSIFMEDIA:
   1734                 error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
   1735                 break;
   1736 	default:
   1737 		error = ether_ioctl(ifp, cmd, data);
   1738 		if (error == ENETRESET) {
   1739 			/*
   1740 			 * Multicast list has changed; set the hardware filter
   1741 			 * accordingly.
   1742 			 */
   1743 			if (ifp->if_flags & IFF_RUNNING)
   1744 				ie_mc_reset(sc);
   1745 			error = 0;
   1746 		}
   1747 		break;
   1748 	}
   1749 #if I82586_DEBUG
   1750 	if (cmd == SIOCSIFFLAGS)
   1751 		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
   1752 #endif
   1753 	splx(s);
   1754 	return (error);
   1755 }
   1756 
   1757 static void
   1758 ie_mc_reset(struct ie_softc *sc)
   1759 {
   1760 	struct ether_multi *enm;
   1761 	struct ether_multistep step;
   1762 	int size;
   1763 
   1764 	/*
   1765 	 * Step through the list of addresses.
   1766 	 */
   1767 again:
   1768 	size = 0;
   1769 	sc->mcast_count = 0;
   1770 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
   1771 	while (enm) {
   1772 		size += 6;
   1773 		if (sc->mcast_count >= IE_MAXMCAST ||
   1774 		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
   1775 			sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
   1776 			i82586_ioctl(&sc->sc_ethercom.ec_if,
   1777 				     SIOCSIFFLAGS, NULL);
   1778 			return;
   1779 		}
   1780 		ETHER_NEXT_MULTI(step, enm);
   1781 	}
   1782 
   1783 	if (size > sc->mcast_addrs_size) {
   1784 		/* Need to allocate more space */
   1785 		if (sc->mcast_addrs_size)
   1786 			free(sc->mcast_addrs, M_IFMADDR);
   1787 		sc->mcast_addrs = (char *)
   1788 			malloc(size, M_IFMADDR, M_WAITOK);
   1789 		sc->mcast_addrs_size = size;
   1790 	}
   1791 
   1792 	/*
   1793 	 * We've got the space; now copy the addresses
   1794 	 */
   1795 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
   1796 	while (enm) {
   1797 		if (sc->mcast_count >= IE_MAXMCAST)
   1798 			goto again; /* Just in case */
   1799 
   1800 		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
   1801 		sc->mcast_count++;
   1802 		ETHER_NEXT_MULTI(step, enm);
   1803 	}
   1804 	sc->want_mcsetup = 1;
   1805 }
   1806 
   1807 /*
   1808  * Media change callback.
   1809  */
   1810 int
   1811 i82586_mediachange(struct ifnet *ifp)
   1812 {
   1813         struct ie_softc *sc = ifp->if_softc;
   1814 
   1815         if (sc->sc_mediachange)
   1816                 return ((*sc->sc_mediachange)(sc));
   1817         return (0);
   1818 }
   1819 
   1820 /*
   1821  * Media status callback.
   1822  */
   1823 void
   1824 i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   1825 {
   1826         struct ie_softc *sc = ifp->if_softc;
   1827 
   1828         if (sc->sc_mediastatus)
   1829                 (*sc->sc_mediastatus)(sc, ifmr);
   1830 }
   1831 
   1832 #if I82586_DEBUG
   1833 void
   1834 print_rbd(struct ie_softc *sc, int n)
   1835 {
   1836 
   1837 	printf("RBD at %08x:\n  status %04x, next %04x, buffer %lx\n"
   1838 		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds,n),
   1839 		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds,n)),
   1840 		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds,n)),
   1841 		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
   1842 		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds,n)));
   1843 }
   1844 #endif
   1845