Home | History | Annotate | Line # | Download | only in ic
i82586.c revision 1.78.2.1
      1 /*	$NetBSD: i82586.c,v 1.78.2.1 2019/06/10 22:07:10 christos 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.78.2.1 2019/06/10 22:07:10 christos 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 #include <sys/bus.h>
    152 
    153 #include <net/if.h>
    154 #include <net/if_dl.h>
    155 #include <net/if_types.h>
    156 #include <net/if_media.h>
    157 #include <net/if_ether.h>
    158 #include <net/bpf.h>
    159 
    160 #include <dev/ic/i82586reg.h>
    161 #include <dev/ic/i82586var.h>
    162 
    163 void		i82586_reset(struct ie_softc *, int);
    164 void		i82586_watchdog(struct ifnet *);
    165 int		i82586_init(struct ifnet *);
    166 int		i82586_ioctl(struct ifnet *, u_long, void *);
    167 void		i82586_start(struct ifnet *);
    168 void		i82586_stop(struct ifnet *, int);
    169 
    170 
    171 int		i82586_rint(struct ie_softc *, int);
    172 int		i82586_tint(struct ie_softc *, int);
    173 
    174 int		i82586_mediachange(struct ifnet *);
    175 void		i82586_mediastatus(struct ifnet *, struct ifmediareq *);
    176 
    177 static int	ie_readframe(struct ie_softc *, int);
    178 static struct mbuf *ieget(struct ie_softc *, int, int);
    179 static int	i82586_get_rbd_list(struct ie_softc *,
    180 					     uint16_t *, uint16_t *, int *);
    181 static void	i82586_release_rbd_list(struct ie_softc *,
    182 					     uint16_t, uint16_t);
    183 static int	i82586_drop_frames(struct ie_softc *);
    184 static int	i82586_chk_rx_ring(struct ie_softc *);
    185 
    186 static inline void ie_ack(struct ie_softc *, u_int);
    187 static inline void iexmit(struct ie_softc *);
    188 static void	i82586_start_transceiver(struct ie_softc *);
    189 
    190 static void	i82586_count_errors(struct ie_softc *);
    191 static void	i82586_rx_errors(struct ie_softc *, int, int);
    192 static void	i82586_setup_bufs(struct ie_softc *);
    193 static void	setup_simple_command(struct ie_softc *, int, int);
    194 static int	ie_cfg_setup(struct ie_softc *, int, int, int);
    195 static int	ie_ia_setup(struct ie_softc *, int);
    196 static void	ie_run_tdr(struct ie_softc *, int);
    197 static int	ie_mc_setup(struct ie_softc *, int);
    198 static void	ie_mc_reset(struct ie_softc *);
    199 static int	i82586_start_cmd(struct ie_softc *, int, int, int, int);
    200 static int	i82586_cmd_wait(struct ie_softc *);
    201 
    202 #if I82586_DEBUG
    203 void		print_rbd(struct ie_softc *, int);
    204 #endif
    205 
    206 static char* padbuf = NULL;
    207 
    208 /*
    209  * Front-ends call this function to attach to the MI driver.
    210  *
    211  * The front-end has responsibility for managing the ICP and ISCP
    212  * structures. Both of these are opaque to us.  Also, the front-end
    213  * chooses a location for the SCB which is expected to be addressable
    214  * (through `sc->scb') as an offset against the shared-memory bus handle.
    215  *
    216  * The following MD interface function must be setup by the front-end
    217  * before calling here:
    218  *
    219  *	hwreset			- board dependent reset
    220  *	hwinit			- board dependent initialization
    221  *	chan_attn		- channel attention
    222  *	intrhook		- board dependent interrupt processing
    223  *	memcopyin		- shared memory copy: board to KVA
    224  *	memcopyout		- shared memory copy: KVA to board
    225  *	ie_bus_read16		- read a sixteen-bit i82586 pointer
    226  *	ie_bus_write16		- write a sixteen-bit i82586 pointer
    227  *	ie_bus_write24		- write a twenty-four-bit i82586 pointer
    228  *
    229  */
    230 void
    231 i82586_attach(struct ie_softc *sc, const char *name, uint8_t *etheraddr,
    232     int *media, int nmedia, int defmedia)
    233 {
    234 	int i;
    235 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    236 
    237 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    238 	ifp->if_softc = sc;
    239 	ifp->if_start = i82586_start;
    240 	ifp->if_ioctl = i82586_ioctl;
    241 	ifp->if_init = i82586_init;
    242 	ifp->if_stop = i82586_stop;
    243 	ifp->if_watchdog = i82586_watchdog;
    244 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    245 	IFQ_SET_READY(&ifp->if_snd);
    246 
    247 	/* Initialize media goo. */
    248 	sc->sc_ethercom.ec_ifmedia = &sc->sc_media;
    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 	uint16_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, uint16_t *start, uint16_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, uint16_t start, uint16_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 	uint16_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))
    867 		    != 0)) {
    868 			/* `rftail' and EOL flag out of sync */
    869 			log(LOG_ERR,
    870 			    "%s: rx frame list out of sync at %d\n",
    871 			    device_xname(sc->sc_dev), n);
    872 			return (1);
    873 		}
    874 	}
    875 
    876 	return (0);
    877 }
    878 
    879 /*
    880  * Read data off the interface, and turn it into an mbuf chain.
    881  *
    882  * This code is DRAMATICALLY different from the previous version; this
    883  * version tries to allocate the entire mbuf chain up front, given the
    884  * length of the data available.  This enables us to allocate mbuf
    885  * clusters in many situations where before we would have had a long
    886  * chain of partially-full mbufs.  This should help to speed up the
    887  * operation considerably.  (Provided that it works, of course.)
    888  */
    889 static inline struct mbuf *
    890 ieget(struct ie_softc *sc, int head, int totlen)
    891 {
    892 	struct mbuf *m, *m0, *newm;
    893 	int len, resid;
    894 	int thisrboff, thismboff;
    895 	struct ether_header eh;
    896 
    897 	/*
    898 	 * Snarf the Ethernet header.
    899 	 */
    900 	(sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
    901 	    sizeof(struct ether_header));
    902 
    903 	resid = totlen;
    904 
    905 	MGETHDR(m0, M_DONTWAIT, MT_DATA);
    906 	if (m0 == 0)
    907 		return (0);
    908 	m_set_rcvif(m0, &sc->sc_ethercom.ec_if);
    909 	m0->m_pkthdr.len = totlen;
    910 	len = MHLEN;
    911 	m = m0;
    912 
    913 	/*
    914 	 * This loop goes through and allocates mbufs for all the data we will
    915 	 * be copying in.  It does not actually do the copying yet.
    916 	 */
    917 	while (totlen > 0) {
    918 		if (totlen >= MINCLSIZE) {
    919 			MCLGET(m, M_DONTWAIT);
    920 			if ((m->m_flags & M_EXT) == 0)
    921 				goto bad;
    922 			len = MCLBYTES;
    923 		}
    924 
    925 		if (m == m0) {
    926 			char *newdata = (char *)
    927 			    ALIGN(m->m_data + sizeof(struct ether_header)) -
    928 			    sizeof(struct ether_header);
    929 			len -= newdata - m->m_data;
    930 			m->m_data = newdata;
    931 		}
    932 
    933 		m->m_len = len = uimin(totlen, len);
    934 
    935 		totlen -= len;
    936 		if (totlen > 0) {
    937 			MGET(newm, M_DONTWAIT, MT_DATA);
    938 			if (newm == 0)
    939 				goto bad;
    940 			len = MLEN;
    941 			m = m->m_next = newm;
    942 		}
    943 	}
    944 
    945 	m = m0;
    946 	thismboff = 0;
    947 
    948 	/*
    949 	 * Copy the Ethernet header into the mbuf chain.
    950 	 */
    951 	memcpy(mtod(m, void *), &eh, sizeof(struct ether_header));
    952 	thismboff = sizeof(struct ether_header);
    953 	thisrboff = sizeof(struct ether_header);
    954 	resid -= sizeof(struct ether_header);
    955 
    956 	/*
    957 	 * Now we take the mbuf chain (hopefully only one mbuf most of the
    958 	 * time) and stuff the data into it.  There are no possible failures
    959 	 * at or after this point.
    960 	 */
    961 	while (resid > 0) {
    962 		int thisrblen = IE_RBUF_SIZE - thisrboff,
    963 		    thismblen = m->m_len - thismboff;
    964 		len = uimin(thisrblen, thismblen);
    965 
    966 		(sc->memcopyin)(sc, mtod(m, char *) + thismboff,
    967 				IE_RBUF_ADDR(sc, head) + thisrboff,
    968 				(u_int)len);
    969 		resid -= len;
    970 
    971 		if (len == thismblen) {
    972 			m = m->m_next;
    973 			thismboff = 0;
    974 		} else
    975 			thismboff += len;
    976 
    977 		if (len == thisrblen) {
    978 			if (++head == sc->nrxbuf)
    979 				head = 0;
    980 			thisrboff = 0;
    981 		} else
    982 			thisrboff += len;
    983 	}
    984 
    985 	/*
    986 	 * Unless something changed strangely while we were doing the copy,
    987 	 * we have now copied everything in from the shared memory.
    988 	 * This means that we are done.
    989 	 */
    990 	return (m0);
    991 
    992 bad:
    993 	m_freem(m0);
    994 	return (0);
    995 }
    996 
    997 /*
    998  * Read frame NUM from unit UNIT (pre-cached as IE).
    999  *
   1000  * This routine reads the RFD at NUM, and copies in the buffers from the list
   1001  * of RBD, then rotates the RBD list so that the receiver doesn't start
   1002  * complaining.  Trailers are DROPPED---there's no point in wasting time
   1003  * on confusing code to deal with them.  Hopefully, this machine will
   1004  * never ARP for trailers anyway.
   1005  */
   1006 static int
   1007 ie_readframe(
   1008     struct ie_softc *sc,
   1009     int num)		/* frame number to read */
   1010 {
   1011 	struct mbuf *m;
   1012 	uint16_t bstart, bend;
   1013 	int pktlen;
   1014 
   1015 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
   1016 		sc->sc_ethercom.ec_if.if_ierrors++;
   1017 		return (1);
   1018 	}
   1019 
   1020 	m = ieget(sc, bstart, pktlen);
   1021 	i82586_release_rbd_list(sc, bstart, bend);
   1022 
   1023 	if (m == 0) {
   1024 		sc->sc_ethercom.ec_if.if_ierrors++;
   1025 		return (0);
   1026 	}
   1027 
   1028 #if I82586_DEBUG
   1029 	if (sc->sc_debug & IED_READFRAME) {
   1030 		struct ether_header *eh = mtod(m, struct ether_header *);
   1031 
   1032 		printf("%s: frame from ether %s type 0x%x len %d\n",
   1033 			device_xname(sc->sc_dev),
   1034 			ether_sprintf(eh->ether_shost),
   1035 			(u_int)ntohs(eh->ether_type),
   1036 			pktlen);
   1037 	}
   1038 #endif
   1039 
   1040 	/*
   1041 	 * Finally pass this packet up to higher layers.
   1042 	 */
   1043 	if_percpuq_enqueue((&sc->sc_ethercom.ec_if)->if_percpuq, m);
   1044 	sc->sc_ethercom.ec_if.if_ipackets++;
   1045 	return (0);
   1046 }
   1047 
   1048 
   1049 /*
   1050  * Setup all necessary artifacts for an XMIT command, and then pass the XMIT
   1051  * command to the chip to be executed.
   1052  */
   1053 static inline void
   1054 iexmit(struct ie_softc *sc)
   1055 {
   1056 	int off;
   1057 	int cur, prev;
   1058 
   1059 	cur = sc->xctail;
   1060 
   1061 #if I82586_DEBUG
   1062 	if (sc->sc_debug & IED_XMIT)
   1063 		printf("%s: xmit buffer %d\n", device_xname(sc->sc_dev), cur);
   1064 #endif
   1065 
   1066 	/*
   1067 	 * Setup the transmit command.
   1068 	 */
   1069 	sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur),
   1070 			       IE_XBD_ADDR(sc->xbds, cur));
   1071 
   1072 	sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0);
   1073 
   1074 	if (sc->do_xmitnopchain) {
   1075 		/*
   1076 		 * Gate this XMIT command to the following NOP
   1077 		 */
   1078 		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
   1079 				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
   1080 		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
   1081 				       IE_CMD_XMIT | IE_CMD_INTR);
   1082 
   1083 		/*
   1084 		 * Loopback at following NOP
   1085 		 */
   1086 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0);
   1087 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur),
   1088 				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
   1089 
   1090 		/*
   1091 		 * Gate preceding NOP to this XMIT command
   1092 		 */
   1093 		prev = (cur + NTXBUF - 1) % NTXBUF;
   1094 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev),
   1095 		    0);
   1096 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
   1097 				       IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
   1098 
   1099 		off = IE_SCB_STATUS(sc->scb);
   1100 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1101 		if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
   1102 			printf("iexmit: CU not active\n");
   1103 			i82586_start_transceiver(sc);
   1104 		}
   1105 	} else {
   1106 		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
   1107 				       0xffff);
   1108 
   1109 		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
   1110 		    IE_CMD_XMIT | IE_CMD_INTR | IE_CMD_LAST);
   1111 
   1112 		off = IE_SCB_CMDLST(sc->scb);
   1113 		sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds,
   1114 			cur));
   1115 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1116 
   1117 		if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1))
   1118 			aprint_error_dev(sc->sc_dev,
   1119 			    "iexmit: start xmit command timed out\n");
   1120 	}
   1121 
   1122 	sc->sc_ethercom.ec_if.if_timer = 5;
   1123 }
   1124 
   1125 
   1126 /*
   1127  * Start transmission on an interface.
   1128  */
   1129 void
   1130 i82586_start(struct ifnet *ifp)
   1131 {
   1132 	struct ie_softc *sc = ifp->if_softc;
   1133 	struct mbuf *m0, *m;
   1134 	int	buffer, head, xbase;
   1135 	u_short	len;
   1136 	int	s;
   1137 
   1138 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   1139 		return;
   1140 
   1141 	for (;;) {
   1142 		if (sc->xmit_busy == NTXBUF) {
   1143 			ifp->if_flags |= IFF_OACTIVE;
   1144 			break;
   1145 		}
   1146 
   1147 		head = sc->xchead;
   1148 		xbase = sc->xbds;
   1149 
   1150 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1151 		if (m0 == 0)
   1152 			break;
   1153 
   1154 		/* We need to use m->m_pkthdr.len, so require the header */
   1155 		if ((m0->m_flags & M_PKTHDR) == 0)
   1156 			panic("i82586_start: no header mbuf");
   1157 
   1158 		/* Tap off here if there is a BPF listener. */
   1159 		bpf_mtap(ifp, m0, BPF_D_OUT);
   1160 
   1161 #if I82586_DEBUG
   1162 		if (sc->sc_debug & IED_ENQ)
   1163 			printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
   1164 				sc->xchead);
   1165 #endif
   1166 
   1167 		if (m0->m_pkthdr.len > IE_TBUF_SIZE)
   1168 			printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
   1169 
   1170 		buffer = IE_XBUF_ADDR(sc, head);
   1171 		for (m = m0; m != 0; m = m->m_next) {
   1172 			(sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
   1173 			buffer += m->m_len;
   1174 		}
   1175 		len = m0->m_pkthdr.len;
   1176 		if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) {
   1177 			(sc->memcopyout)(sc, padbuf, buffer,
   1178 			    ETHER_MIN_LEN - ETHER_CRC_LEN - len);
   1179 			buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len;
   1180 			len = ETHER_MIN_LEN - ETHER_CRC_LEN;
   1181 		}
   1182 		m_freem(m0);
   1183 
   1184 		/*
   1185 		 * Setup the transmit buffer descriptor here, while we
   1186 		 * know the packet's length.
   1187 		 */
   1188 		sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
   1189 				       len | IE_TBD_EOL);
   1190 		sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
   1191 		sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
   1192 				       IE_XBUF_ADDR(sc, head));
   1193 
   1194 		if (++head == NTXBUF)
   1195 			head = 0;
   1196 		sc->xchead = head;
   1197 
   1198 		s = splnet();
   1199 		/* Start the first packet transmitting. */
   1200 		if (sc->xmit_busy == 0)
   1201 			iexmit(sc);
   1202 
   1203 		sc->xmit_busy++;
   1204 		splx(s);
   1205 	}
   1206 }
   1207 
   1208 /*
   1209  * Probe IE's ram setup   [ Move all this into MD front-end!? ]
   1210  * Use only if SCP and ISCP represent offsets into shared ram space.
   1211  */
   1212 int
   1213 i82586_proberam(struct ie_softc *sc)
   1214 {
   1215 	int result, off;
   1216 
   1217 	/* Put in 16-bit mode */
   1218 	off = IE_SCP_BUS_USE(sc->scp);
   1219 	sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
   1220 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1221 
   1222 	/* Set the ISCP `busy' bit */
   1223 	off = IE_ISCP_BUSY(sc->iscp);
   1224 	sc->ie_bus_write16(sc, off, 1);
   1225 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1226 
   1227 	if (sc->hwreset)
   1228 		(sc->hwreset)(sc, CHIP_PROBE);
   1229 
   1230 	(sc->chan_attn) (sc, CHIP_PROBE);
   1231 
   1232 	delay(100);		/* wait a while... */
   1233 
   1234 	/* Read back the ISCP `busy' bit; it should be clear by now */
   1235 	off = IE_ISCP_BUSY(sc->iscp);
   1236 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1237 	result = sc->ie_bus_read16(sc, off) == 0;
   1238 
   1239 	/* Acknowledge any interrupts we may have caused. */
   1240 	ie_ack(sc, IE_ST_WHENCE);
   1241 
   1242 	return (result);
   1243 }
   1244 
   1245 void
   1246 i82586_reset(struct ie_softc *sc, int hard)
   1247 {
   1248 	int s = splnet();
   1249 
   1250 	if (hard)
   1251 		printf("%s: reset\n", device_xname(sc->sc_dev));
   1252 
   1253 	/* Clear OACTIVE in case we're called from watchdog (frozen xmit). */
   1254 	sc->sc_ethercom.ec_if.if_timer = 0;
   1255 	sc->sc_ethercom.ec_if.if_flags &= ~IFF_OACTIVE;
   1256 
   1257 	/*
   1258 	 * Stop i82586 dead in its tracks.
   1259 	 */
   1260 	if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
   1261 		aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
   1262 
   1263 	/*
   1264 	 * This can really slow down the i82586_reset() on some cards, but it's
   1265 	 * necessary to unwedge other ones (eg, the Sun VME ones) from certain
   1266 	 * lockups.
   1267 	 */
   1268 	if (hard && sc->hwreset)
   1269 		(sc->hwreset)(sc, CARD_RESET);
   1270 
   1271 	delay(100);
   1272 	ie_ack(sc, IE_ST_WHENCE);
   1273 
   1274 	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
   1275 		int retries=0;	/* XXX - find out why init sometimes fails */
   1276 		while (retries++ < 2)
   1277 			if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
   1278 				break;
   1279 	}
   1280 
   1281 	splx(s);
   1282 }
   1283 
   1284 
   1285 static void
   1286 setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
   1287 {
   1288 	/* Setup a simple command */
   1289 	sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
   1290 	sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
   1291 	sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
   1292 
   1293 	/* Assign the command buffer to the SCB command list */
   1294 	sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
   1295 }
   1296 
   1297 /*
   1298  * Run the time-domain reflectometer.
   1299  */
   1300 static void
   1301 ie_run_tdr(struct ie_softc *sc, int cmd)
   1302 {
   1303 	int result;
   1304 
   1305 	setup_simple_command(sc, IE_CMD_TDR, cmd);
   1306 	sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
   1307 
   1308 	if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
   1309 	    (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
   1310 		result = 0x10000; /* XXX */
   1311 	else
   1312 		result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
   1313 
   1314 	/* Squash any pending interrupts */
   1315 	ie_ack(sc, IE_ST_WHENCE);
   1316 
   1317 	if (result & IE_TDR_SUCCESS)
   1318 		return;
   1319 
   1320 	if (result & 0x10000)
   1321 		aprint_error_dev(sc->sc_dev, "TDR command failed\n");
   1322 	else if (result & IE_TDR_XCVR)
   1323 		aprint_error_dev(sc->sc_dev, "transceiver problem\n");
   1324 	else if (result & IE_TDR_OPEN)
   1325 		aprint_error_dev(sc->sc_dev, "TDR detected incorrect "
   1326 		    "termination %d clocks away\n", result & IE_TDR_TIME);
   1327 	else if (result & IE_TDR_SHORT)
   1328 		aprint_error_dev(sc->sc_dev, "TDR detected a short circuit "
   1329 		    "%d clocks away\n", result & IE_TDR_TIME);
   1330 	else
   1331 		aprint_error_dev(sc->sc_dev,
   1332 		    "TDR returned unknown status 0x%x\n", result);
   1333 }
   1334 
   1335 
   1336 /*
   1337  * i82586_setup_bufs: set up the buffers
   1338  *
   1339  * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
   1340  * this is to be used for the buffers.  The chip indexs its control data
   1341  * structures with 16 bit offsets, and it indexes actual buffers with
   1342  * 24 bit addresses.   So we should allocate control buffers first so that
   1343  * we don't overflow the 16 bit offset field.   The number of transmit
   1344  * buffers is fixed at compile time.
   1345  *
   1346  */
   1347 static void
   1348 i82586_setup_bufs(struct ie_softc *sc)
   1349 {
   1350 	int	ptr = sc->buf_area;	/* memory pool */
   1351 	int	n, r;
   1352 
   1353 	/*
   1354 	 * step 0: zero memory and figure out how many recv buffers and
   1355 	 * frames we can have.
   1356 	 */
   1357 	ptr = (ptr + 3) & ~3;	/* set alignment and stick with it */
   1358 
   1359 
   1360 	/*
   1361 	 *  step 1: lay out data structures in the shared-memory area
   1362 	 */
   1363 
   1364 	/* The no-op commands; used if "nop-chaining" is in effect */
   1365 	sc->nop_cmds = ptr;
   1366 	ptr += NTXBUF * IE_CMD_NOP_SZ;
   1367 
   1368 	/* The transmit commands */
   1369 	sc->xmit_cmds = ptr;
   1370 	ptr += NTXBUF * IE_CMD_XMIT_SZ;
   1371 
   1372 	/* The transmit buffers descriptors */
   1373 	sc->xbds = ptr;
   1374 	ptr += NTXBUF * IE_XBD_SZ;
   1375 
   1376 	/* The transmit buffers */
   1377 	sc->xbufs = ptr;
   1378 	ptr += NTXBUF * IE_TBUF_SIZE;
   1379 
   1380 	ptr = (ptr + 3) & ~3;		/* re-align.. just in case */
   1381 
   1382 	/* Compute free space for RECV stuff */
   1383 	n = sc->buf_area_sz - (ptr - sc->buf_area);
   1384 
   1385 	/* Compute size of one RECV frame */
   1386 	r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F);
   1387 
   1388 	sc->nframes = n / r;
   1389 
   1390 	if (sc->nframes <= 0)
   1391 		panic("ie: bogus buffer calc");
   1392 
   1393 	sc->nrxbuf = sc->nframes * B_PER_F;
   1394 
   1395 	/* The receive frame descriptors */
   1396 	sc->rframes = ptr;
   1397 	ptr += sc->nframes * IE_RFRAME_SZ;
   1398 
   1399 	/* The receive buffer descriptors */
   1400 	sc->rbds = ptr;
   1401 	ptr += sc->nrxbuf * IE_RBD_SZ;
   1402 
   1403 	/* The receive buffers */
   1404 	sc->rbufs = ptr;
   1405 	ptr += sc->nrxbuf * IE_RBUF_SIZE;
   1406 
   1407 #if I82586_DEBUG
   1408 	printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev),
   1409 	    sc->nframes, sc->nrxbuf);
   1410 #endif
   1411 
   1412 	/*
   1413 	 * step 2: link together the recv frames and set EOL on last one
   1414 	 */
   1415 	for (n = 0; n < sc->nframes; n++) {
   1416 		int m = (n == sc->nframes - 1) ? 0 : n + 1;
   1417 
   1418 		/* Clear status */
   1419 		sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes, n), 0);
   1420 
   1421 		/* RBD link = NULL */
   1422 		sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, n),
   1423 				       0xffff);
   1424 
   1425 		/* Make a circular list */
   1426 		sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes, n),
   1427 				       IE_RFRAME_ADDR(sc->rframes, m));
   1428 
   1429 		/* Mark last as EOL */
   1430 		sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes, n),
   1431 				       ((m==0)? (IE_FD_EOL | IE_FD_SUSP) : 0));
   1432 	}
   1433 
   1434 	/*
   1435 	 * step 3: link the RBDs and set EOL on last one
   1436 	 */
   1437 	for (n = 0; n < sc->nrxbuf; n++) {
   1438 		int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
   1439 
   1440 		/* Clear status */
   1441 		sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds, n), 0);
   1442 
   1443 		/* Make a circular list */
   1444 		sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds, n),
   1445 				       IE_RBD_ADDR(sc->rbds, m));
   1446 
   1447 		/* Link to data buffers */
   1448 		sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
   1449 				       IE_RBUF_ADDR(sc, n));
   1450 		sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds, n),
   1451 				       IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0));
   1452 	}
   1453 
   1454 	/*
   1455 	 * step 4: all xmit no-op commands loopback onto themselves
   1456 	 */
   1457 	for (n = 0; n < NTXBUF; n++) {
   1458 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
   1459 
   1460 		sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
   1461 					 IE_CMD_NOP);
   1462 
   1463 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
   1464 					 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
   1465 	}
   1466 
   1467 
   1468 	/*
   1469 	 * step 6: set the head and tail pointers on receive to keep track of
   1470 	 * the order in which RFDs and RBDs are used.
   1471 	 */
   1472 
   1473 	/* Pointers to last packet sent and next available transmit buffer. */
   1474 	sc->xchead = sc->xctail = 0;
   1475 
   1476 	/* Clear transmit-busy flag and set number of free transmit buffers. */
   1477 	sc->xmit_busy = 0;
   1478 
   1479 	/*
   1480 	 * Pointers to first and last receive frame.
   1481 	 * The RFD pointed to by rftail is the only one that has EOL set.
   1482 	 */
   1483 	sc->rfhead = 0;
   1484 	sc->rftail = sc->nframes - 1;
   1485 
   1486 	/*
   1487 	 * Pointers to first and last receive descriptor buffer.
   1488 	 * The RBD pointed to by rbtail is the only one that has EOL set.
   1489 	 */
   1490 	sc->rbhead = 0;
   1491 	sc->rbtail = sc->nrxbuf - 1;
   1492 
   1493 /* link in recv frames * and buffer into the scb. */
   1494 #if I82586_DEBUG
   1495 	printf("%s: reserved %d bytes\n",
   1496 		device_xname(sc->sc_dev), ptr - sc->buf_area);
   1497 #endif
   1498 }
   1499 
   1500 static int
   1501 ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
   1502 {
   1503 	int cmdresult, status;
   1504 	uint8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */
   1505 
   1506 	*IE_CMD_CFG_CNT(buf)	   = 0x0c;
   1507 	*IE_CMD_CFG_FIFO(buf)	   = 8;
   1508 	*IE_CMD_CFG_SAVEBAD(buf)   = 0x40;
   1509 	*IE_CMD_CFG_ADDRLEN(buf)   = 0x2e;
   1510 	*IE_CMD_CFG_PRIORITY(buf)  = 0;
   1511 	*IE_CMD_CFG_IFS(buf)	   = 0x60;
   1512 	*IE_CMD_CFG_SLOT_LOW(buf)  = 0;
   1513 	*IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2;
   1514 	*IE_CMD_CFG_PROMISC(buf)   = (!!promiscuous) | manchester << 2;
   1515 	*IE_CMD_CFG_CRSCDT(buf)	   = 0;
   1516 	*IE_CMD_CFG_MINLEN(buf)	   = 64;
   1517 	*IE_CMD_CFG_JUNK(buf)	   = 0xff;
   1518 	sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
   1519 	setup_simple_command(sc, IE_CMD_CONFIG, cmd);
   1520 	IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
   1521 
   1522 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
   1523 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
   1524 	if (cmdresult != 0) {
   1525 		aprint_error_dev(sc->sc_dev,
   1526 		    "configure command timed out; status %x\n", status);
   1527 		return (0);
   1528 	}
   1529 	if ((status & IE_STAT_OK) == 0) {
   1530 		aprint_error_dev(sc->sc_dev,
   1531 		    "configure command failed; status %x\n", status);
   1532 		return (0);
   1533 	}
   1534 
   1535 	/* Squash any pending interrupts */
   1536 	ie_ack(sc, IE_ST_WHENCE);
   1537 	return (1);
   1538 }
   1539 
   1540 static int
   1541 ie_ia_setup(struct ie_softc *sc, int cmdbuf)
   1542 {
   1543 	int cmdresult, status;
   1544 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1545 
   1546 	setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
   1547 
   1548 	(sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
   1549 			 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN);
   1550 
   1551 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
   1552 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1553 	if (cmdresult != 0) {
   1554 		aprint_error_dev(sc->sc_dev,
   1555 		    "individual address command timed out; status %x\n",
   1556 		    status);
   1557 		return (0);
   1558 	}
   1559 	if ((status & IE_STAT_OK) == 0) {
   1560 		aprint_error_dev(sc->sc_dev,
   1561 		    "individual address command failed; status %x\n", status);
   1562 		return (0);
   1563 	}
   1564 
   1565 	/* Squash any pending interrupts */
   1566 	ie_ack(sc, IE_ST_WHENCE);
   1567 	return (1);
   1568 }
   1569 
   1570 /*
   1571  * Run the multicast setup command.
   1572  * Called at splnet().
   1573  */
   1574 static int
   1575 ie_mc_setup(struct ie_softc *sc, int cmdbuf)
   1576 {
   1577 	int cmdresult, status;
   1578 
   1579 	if (sc->mcast_count == 0)
   1580 		return (1);
   1581 
   1582 	setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
   1583 
   1584 	(sc->memcopyout)(sc, (void *)sc->mcast_addrs,
   1585 			 IE_CMD_MCAST_MADDR(cmdbuf),
   1586 			 sc->mcast_count * ETHER_ADDR_LEN);
   1587 
   1588 	sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
   1589 			       sc->mcast_count * ETHER_ADDR_LEN);
   1590 
   1591 	/* Start the command */
   1592 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL,
   1593 	    0);
   1594 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1595 	if (cmdresult != 0) {
   1596 		aprint_error_dev(sc->sc_dev,
   1597 		    "multicast setup command timed out; status %x\n", status);
   1598 		return (0);
   1599 	}
   1600 	if ((status & IE_STAT_OK) == 0) {
   1601 		aprint_error_dev(sc->sc_dev,
   1602 		    "multicast setup command failed; status %x\n", status);
   1603 		return (0);
   1604 	}
   1605 
   1606 	/* Squash any pending interrupts */
   1607 	ie_ack(sc, IE_ST_WHENCE);
   1608 	return (1);
   1609 }
   1610 
   1611 /*
   1612  * This routine takes the environment generated by check_ie_present() and adds
   1613  * to it all the other structures we need to operate the adapter.  This
   1614  * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting
   1615  * the receiver unit, and clearing interrupts.
   1616  *
   1617  * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER.
   1618  */
   1619 int
   1620 i82586_init(struct ifnet *ifp)
   1621 {
   1622 	struct ie_softc *sc = ifp->if_softc;
   1623 	int cmd;
   1624 
   1625 	sc->async_cmd_inprogress = 0;
   1626 
   1627 	cmd = sc->buf_area;
   1628 
   1629 	/*
   1630 	 * Send the configure command first.
   1631 	 */
   1632 	if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
   1633 		return EIO;
   1634 
   1635 	/*
   1636 	 * Send the Individual Address Setup command.
   1637 	 */
   1638 	if (ie_ia_setup(sc, cmd) == 0)
   1639 		return EIO;
   1640 
   1641 	/*
   1642 	 * Run the time-domain reflectometer.
   1643 	 */
   1644 	ie_run_tdr(sc, cmd);
   1645 
   1646 	/*
   1647 	 * Set the multi-cast filter, if any
   1648 	 */
   1649 	if (ie_mc_setup(sc, cmd) == 0)
   1650 		return EIO;
   1651 
   1652 	/*
   1653 	 * Acknowledge any interrupts we have generated thus far.
   1654 	 */
   1655 	ie_ack(sc, IE_ST_WHENCE);
   1656 
   1657 	/*
   1658 	 * Set up the transmit and recv buffers.
   1659 	 */
   1660 	i82586_setup_bufs(sc);
   1661 
   1662 	if (sc->hwinit)
   1663 		(sc->hwinit)(sc);
   1664 
   1665 	ifp->if_flags |= IFF_RUNNING;
   1666 	ifp->if_flags &= ~IFF_OACTIVE;
   1667 
   1668 	if (NTXBUF < 2)
   1669 		sc->do_xmitnopchain = 0;
   1670 
   1671 	i82586_start_transceiver(sc);
   1672 	return (0);
   1673 }
   1674 
   1675 /*
   1676  * Start the RU and possibly the CU unit
   1677  */
   1678 static void
   1679 i82586_start_transceiver(struct ie_softc *sc)
   1680 {
   1681 
   1682 	/*
   1683 	 * Start RU at current position in frame & RBD lists.
   1684 	 */
   1685 	sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, sc->rfhead),
   1686 			       IE_RBD_ADDR(sc->rbds, sc->rbhead));
   1687 
   1688 	sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
   1689 			       IE_RFRAME_ADDR(sc->rframes, sc->rfhead));
   1690 
   1691 	if (sc->do_xmitnopchain) {
   1692 		/* Stop transmit command chain */
   1693 		if (i82586_start_cmd(sc, IE_CUC_SUSPEND | IE_RUC_SUSPEND,
   1694 		    0, 0, 0))
   1695 			aprint_error_dev(sc->sc_dev,
   1696 			    "CU/RU stop command timed out\n");
   1697 
   1698 		/* Start the receiver & transmitter chain */
   1699 		/* sc->scb->ie_command_list =
   1700 			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
   1701 		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
   1702 				   IE_CMD_NOP_ADDR(
   1703 					sc->nop_cmds,
   1704 					(sc->xctail + NTXBUF - 1) % NTXBUF));
   1705 
   1706 		if (i82586_start_cmd(sc, IE_CUC_START | IE_RUC_START, 0, 0, 0))
   1707 			aprint_error_dev(sc->sc_dev,
   1708 			    "CU/RU command timed out\n");
   1709 	} else {
   1710 		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
   1711 			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
   1712 	}
   1713 }
   1714 
   1715 void
   1716 i82586_stop(struct ifnet *ifp, int disable)
   1717 {
   1718 	struct ie_softc *sc = ifp->if_softc;
   1719 
   1720 	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
   1721 		aprint_error_dev(sc->sc_dev,
   1722 		    "iestop: disable commands timed out\n");
   1723 }
   1724 
   1725 int
   1726 i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
   1727 {
   1728 	struct ie_softc *sc = ifp->if_softc;
   1729 	int s, error = 0;
   1730 
   1731 	s = splnet();
   1732 	switch (cmd) {
   1733 	default:
   1734 		error = ether_ioctl(ifp, cmd, data);
   1735 		if (error == ENETRESET) {
   1736 			/*
   1737 			 * Multicast list has changed; set the hardware filter
   1738 			 * accordingly.
   1739 			 */
   1740 			if (ifp->if_flags & IFF_RUNNING)
   1741 				ie_mc_reset(sc);
   1742 			error = 0;
   1743 		}
   1744 		break;
   1745 	}
   1746 #if I82586_DEBUG
   1747 	if (cmd == SIOCSIFFLAGS)
   1748 		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
   1749 #endif
   1750 	splx(s);
   1751 	return (error);
   1752 }
   1753 
   1754 static void
   1755 ie_mc_reset(struct ie_softc *sc)
   1756 {
   1757 	struct ethercom *ec = &sc->sc_ethercom;
   1758 	struct ether_multi *enm;
   1759 	struct ether_multistep step;
   1760 	int size;
   1761 
   1762 	/*
   1763 	 * Step through the list of addresses.
   1764 	 */
   1765 again:
   1766 	size = 0;
   1767 	sc->mcast_count = 0;
   1768 	ETHER_LOCK(ec);
   1769 	ETHER_FIRST_MULTI(step, ec, enm);
   1770 	while (enm) {
   1771 		size += 6;
   1772 		if (sc->mcast_count >= IE_MAXMCAST ||
   1773 		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
   1774 			ec->ec_if.if_flags |= IFF_ALLMULTI;
   1775 			i82586_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL);
   1776 			ETHER_UNLOCK(ec);
   1777 			return;
   1778 		}
   1779 		ETHER_NEXT_MULTI(step, enm);
   1780 	}
   1781 	ETHER_UNLOCK(ec);
   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_LOCK(ec);
   1796 	ETHER_FIRST_MULTI(step, ec, enm);
   1797 	while (enm) {
   1798 		if (sc->mcast_count >= IE_MAXMCAST) {
   1799 			ETHER_UNLOCK(ec);
   1800 			goto again; /* Just in case */
   1801 		}
   1802 
   1803 		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
   1804 		sc->mcast_count++;
   1805 		ETHER_NEXT_MULTI(step, enm);
   1806 	}
   1807 	ETHER_UNLOCK(ec);
   1808 	sc->want_mcsetup = 1;
   1809 }
   1810 
   1811 /*
   1812  * Media change callback.
   1813  */
   1814 int
   1815 i82586_mediachange(struct ifnet *ifp)
   1816 {
   1817 	struct ie_softc *sc = ifp->if_softc;
   1818 
   1819 	if (sc->sc_mediachange)
   1820 		return ((*sc->sc_mediachange)(sc));
   1821 	return (0);
   1822 }
   1823 
   1824 /*
   1825  * Media status callback.
   1826  */
   1827 void
   1828 i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   1829 {
   1830 	struct ie_softc *sc = ifp->if_softc;
   1831 
   1832 	if (sc->sc_mediastatus)
   1833 		(*sc->sc_mediastatus)(sc, ifmr);
   1834 }
   1835 
   1836 #if I82586_DEBUG
   1837 void
   1838 print_rbd(struct ie_softc *sc, int n)
   1839 {
   1840 
   1841 	printf("RBD at %08x:\n	status %04x, next %04x, buffer %lx\n"
   1842 		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds, n),
   1843 		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds, n)),
   1844 		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds, n)),
   1845 		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
   1846 		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds, n)));
   1847 }
   1848 #endif
   1849