Home | History | Annotate | Line # | Download | only in ic
i82586.c revision 1.83
      1 /*	$NetBSD: i82586.c,v 1.83 2019/05/23 13:10:51 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.83 2019/05/23 13:10:51 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 #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 	ifmedia_init(&sc->sc_media, 0, i82586_mediachange, i82586_mediastatus);
    249 	if (media != NULL) {
    250 		for (i = 0; i < nmedia; i++)
    251 			ifmedia_add(&sc->sc_media, media[i], 0, NULL);
    252 		ifmedia_set(&sc->sc_media, defmedia);
    253 	} else {
    254 		ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_MANUAL, 0, NULL);
    255 		ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_MANUAL);
    256 	}
    257 
    258 	if (padbuf == NULL) {
    259 		padbuf = malloc(ETHER_MIN_LEN - ETHER_CRC_LEN, M_DEVBUF,
    260 		    M_ZERO | M_NOWAIT);
    261 		if (padbuf == NULL) {
    262 			 aprint_error_dev(sc->sc_dev,
    263 			     "can't allocate pad buffer\n");
    264 			 return;
    265 		}
    266 	}
    267 
    268 	/* Attach the interface. */
    269 	if_attach(ifp);
    270 	if_deferred_start_init(ifp, NULL);
    271 	ether_ifattach(ifp, etheraddr);
    272 
    273 	aprint_normal(" address %s, type %s\n", ether_sprintf(etheraddr),name);
    274 }
    275 
    276 
    277 /*
    278  * Device timeout/watchdog routine.
    279  * Entered if the device neglects to generate an interrupt after a
    280  * transmit has been started on it.
    281  */
    282 void
    283 i82586_watchdog(struct ifnet *ifp)
    284 {
    285 	struct ie_softc *sc = ifp->if_softc;
    286 
    287 	log(LOG_ERR, "%s: device timeout\n", device_xname(sc->sc_dev));
    288 	++ifp->if_oerrors;
    289 
    290 	i82586_reset(sc, 1);
    291 }
    292 
    293 static int
    294 i82586_cmd_wait(struct ie_softc *sc)
    295 {
    296 	/* spin on i82586 command acknowledge; wait at most 0.9 (!) seconds */
    297 	int i, off;
    298 	uint16_t cmd;
    299 
    300 	for (i = 0; i < 900000; i++) {
    301 		/* Read the command word */
    302 		off = IE_SCB_CMD(sc->scb);
    303 
    304 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    305 		if ((cmd = sc->ie_bus_read16(sc, off)) == 0)
    306 			return (0);
    307 		delay(1);
    308 	}
    309 
    310 	off = IE_SCB_STATUS(sc->scb);
    311 	printf("i82586_cmd_wait: timo(%ssync): scb status: 0x%x, cmd: 0x%x\n",
    312 		sc->async_cmd_inprogress?"a":"",
    313 		sc->ie_bus_read16(sc, off), cmd);
    314 
    315 	return (1);	/* Timeout */
    316 }
    317 
    318 /*
    319  * Send a command to the controller and wait for it to either complete
    320  * or be accepted, depending on the command.  If the command pointer
    321  * is null, then pretend that the command is not an action command.
    322  * If the command pointer is not null, and the command is an action
    323  * command, wait for one of the MASK bits to turn on in the command's
    324  * status field.
    325  * If ASYNC is set, we just call the chip's attention and return.
    326  * We may have to wait for the command's acceptance later though.
    327  */
    328 static int
    329 i82586_start_cmd(struct ie_softc *sc, int cmd, int iecmdbuf, int mask,
    330     int async)
    331 {
    332 	int i;
    333 	int off;
    334 
    335 	if (sc->async_cmd_inprogress != 0) {
    336 		/*
    337 		 * If previous command was issued asynchronously, wait
    338 		 * for it now.
    339 		 */
    340 		if (i82586_cmd_wait(sc) != 0)
    341 			return (1);
    342 		sc->async_cmd_inprogress = 0;
    343 	}
    344 
    345 	off = IE_SCB_CMD(sc->scb);
    346 	sc->ie_bus_write16(sc, off, cmd);
    347 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
    348 	(sc->chan_attn)(sc, CARD_RESET);
    349 
    350 	if (async != 0) {
    351 		sc->async_cmd_inprogress = 1;
    352 		return (0);
    353 	}
    354 
    355 	if (IE_ACTION_COMMAND(cmd) && iecmdbuf) {
    356 		int status;
    357 		/*
    358 		 * Now spin-lock waiting for status.  This is not a very nice
    359 		 * thing to do, and can kill performance pretty well...
    360 		 * According to the packet driver, the minimum timeout
    361 		 * should be .369 seconds.
    362 		 */
    363 		for (i = 0; i < 369000; i++) {
    364 			/* Read the command status */
    365 			off = IE_CMD_COMMON_STATUS(iecmdbuf);
    366 			IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    367 			status = sc->ie_bus_read16(sc, off);
    368 			if (status & mask)
    369 				return (0);
    370 			delay(1);
    371 		}
    372 
    373 	} else {
    374 		/*
    375 		 * Otherwise, just wait for the command to be accepted.
    376 		 */
    377 		return (i82586_cmd_wait(sc));
    378 	}
    379 
    380 	/* Timeout */
    381 	return (1);
    382 }
    383 
    384 /*
    385  * Interrupt Acknowledge.
    386  */
    387 static inline void
    388 ie_ack(struct ie_softc *sc, u_int mask)
    389 	/* mask:	 in native byte-order */
    390 {
    391 	u_int status;
    392 
    393 	IE_BUS_BARRIER(sc, 0, 0, BUS_SPACE_BARRIER_READ);
    394 	status = sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb));
    395 	i82586_start_cmd(sc, status & mask, 0, 0, 0);
    396 	if (sc->intrhook)
    397 		sc->intrhook(sc, INTR_ACK);
    398 }
    399 
    400 /*
    401  * Transfer accumulated chip error counters to IF.
    402  */
    403 static inline void
    404 i82586_count_errors(struct ie_softc *sc)
    405 {
    406 	int scb = sc->scb;
    407 
    408 	sc->sc_ethercom.ec_if.if_ierrors +=
    409 	    sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) +
    410 	    sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) +
    411 	    sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) +
    412 	    sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb));
    413 
    414 	/* Clear error counters */
    415 	sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0);
    416 	sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0);
    417 	sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0);
    418 	sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0);
    419 }
    420 
    421 static void
    422 i82586_rx_errors(struct ie_softc *sc, int fn, int status)
    423 {
    424 	char bits[128];
    425 	snprintb(bits, sizeof(bits), IE_FD_STATUSBITS, status);
    426 	log(LOG_ERR, "%s: rx error (frame# %d): %s\n",
    427 	    device_xname(sc->sc_dev), fn, bits);
    428 }
    429 
    430 /*
    431  * i82586 interrupt entry point.
    432  */
    433 int
    434 i82586_intr(void *v)
    435 {
    436 	struct ie_softc *sc = v;
    437 	u_int status;
    438 	int off;
    439 
    440 	/*
    441 	 * Implementation dependent interrupt handling.
    442 	 */
    443 	if (sc->intrhook)
    444 		(sc->intrhook)(sc, INTR_ENTER);
    445 
    446 	off = IE_SCB_STATUS(sc->scb);
    447 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    448 	status = sc->ie_bus_read16(sc, off) & IE_ST_WHENCE;
    449 
    450 	if ((status & IE_ST_WHENCE) == 0) {
    451 		if (sc->intrhook)
    452 			(sc->intrhook)(sc, INTR_EXIT);
    453 
    454 		return (0);
    455 	}
    456 
    457 loop:
    458 	/* Ack interrupts FIRST in case we receive more during the ISR. */
    459 #if 0
    460 	ie_ack(sc, status & IE_ST_WHENCE);
    461 #endif
    462 	i82586_start_cmd(sc, status & IE_ST_WHENCE, 0, 0, 1);
    463 
    464 	if (status & (IE_ST_FR | IE_ST_RNR))
    465 		if (i82586_rint(sc, status) != 0)
    466 			goto reset;
    467 
    468 	if (status & IE_ST_CX)
    469 		if (i82586_tint(sc, status) != 0)
    470 			goto reset;
    471 
    472 #if I82586_DEBUG
    473 	if ((status & IE_ST_CNA) && (sc->sc_debug & IED_CNA))
    474 		printf("%s: cna; status=0x%x\n", device_xname(sc->sc_dev),
    475 		    status);
    476 #endif
    477 	if (sc->intrhook)
    478 		(sc->intrhook)(sc, INTR_LOOP);
    479 
    480 	/*
    481 	 * Interrupt ACK was posted asynchronously; wait for
    482 	 * completion here before reading SCB status again.
    483 	 *
    484 	 * If ACK fails, try to reset the chip, in hopes that
    485 	 * it helps.
    486 	 */
    487 	if (i82586_cmd_wait(sc) != 0)
    488 		goto reset;
    489 
    490 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    491 	status = sc->ie_bus_read16(sc, off);
    492 	if ((status & IE_ST_WHENCE) != 0)
    493 		goto loop;
    494 
    495 out:
    496 	if (sc->intrhook)
    497 		(sc->intrhook)(sc, INTR_EXIT);
    498 	return (1);
    499 
    500 reset:
    501 	i82586_cmd_wait(sc);
    502 	i82586_reset(sc, 1);
    503 	goto out;
    504 
    505 }
    506 
    507 /*
    508  * Process a received-frame interrupt.
    509  */
    510 int
    511 i82586_rint(struct ie_softc *sc, int scbstatus)
    512 {
    513 static	int timesthru = 1024;
    514 	int i, status, off;
    515 
    516 #if I82586_DEBUG
    517 	if (sc->sc_debug & IED_RINT)
    518 		printf("%s: rint: status 0x%x\n",
    519 			device_xname(sc->sc_dev), scbstatus);
    520 #endif
    521 
    522 	for (;;) {
    523 		int drop = 0;
    524 
    525 		i = sc->rfhead;
    526 		off = IE_RFRAME_STATUS(sc->rframes, i);
    527 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    528 		status = sc->ie_bus_read16(sc, off);
    529 
    530 #if I82586_DEBUG
    531 		if (sc->sc_debug & IED_RINT)
    532 			printf("%s: rint: frame(%d) status 0x%x\n",
    533 				device_xname(sc->sc_dev), i, status);
    534 #endif
    535 		if ((status & IE_FD_COMPLETE) == 0) {
    536 			if ((status & IE_FD_OK) != 0) {
    537 				printf("%s: rint: weird: ",
    538 					device_xname(sc->sc_dev));
    539 				i82586_rx_errors(sc, i, status);
    540 				break;
    541 			}
    542 			if (--timesthru == 0) {
    543 				/* Account the accumulated errors */
    544 				i82586_count_errors(sc);
    545 				timesthru = 1024;
    546 			}
    547 			break;
    548 		} else if ((status & IE_FD_OK) == 0) {
    549 			/*
    550 			 * If the chip is configured to automatically
    551 			 * discard bad frames, the only reason we can
    552 			 * get here is an "out-of-resource" condition.
    553 			 */
    554 			i82586_rx_errors(sc, i, status);
    555 			drop = 1;
    556 		}
    557 
    558 #if I82586_DEBUG
    559 		if ((status & IE_FD_BUSY) != 0)
    560 			printf("%s: rint: frame(%d) busy; status=0x%x\n",
    561 				device_xname(sc->sc_dev), i, status);
    562 #endif
    563 
    564 
    565 		/*
    566 		 * Advance the RFD list, since we're done with
    567 		 * this descriptor.
    568 		 */
    569 
    570 		/* Clear frame status */
    571 		sc->ie_bus_write16(sc, off, 0);
    572 
    573 		/* Put fence at this frame (the head) */
    574 		off = IE_RFRAME_LAST(sc->rframes, i);
    575 		sc->ie_bus_write16(sc, off, IE_FD_EOL | IE_FD_SUSP);
    576 
    577 		/* and clear RBD field */
    578 		off = IE_RFRAME_BUFDESC(sc->rframes, i);
    579 		sc->ie_bus_write16(sc, off, 0xffff);
    580 
    581 		/* Remove fence from current tail */
    582 		off = IE_RFRAME_LAST(sc->rframes, sc->rftail);
    583 		sc->ie_bus_write16(sc, off, 0);
    584 
    585 		if (++sc->rftail == sc->nframes)
    586 			sc->rftail = 0;
    587 		if (++sc->rfhead == sc->nframes)
    588 			sc->rfhead = 0;
    589 
    590 		/* Pull the frame off the board */
    591 		if (drop) {
    592 			i82586_drop_frames(sc);
    593 			if ((status & IE_FD_RNR) != 0)
    594 				sc->rnr_expect = 1;
    595 			sc->sc_ethercom.ec_if.if_ierrors++;
    596 		} else if (ie_readframe(sc, i) != 0)
    597 			return (1);
    598 	}
    599 
    600 	if ((scbstatus & IE_ST_RNR) != 0) {
    601 
    602 		/*
    603 		 * Receiver went "Not Ready". We try to figure out
    604 		 * whether this was an expected event based on past
    605 		 * frame status values.
    606 		 */
    607 
    608 		if ((scbstatus & IE_RUS_SUSPEND) != 0) {
    609 			/*
    610 			 * We use the "suspend on last frame" flag.
    611 			 * Send a RU RESUME command in response, since
    612 			 * we should have dealt with all completed frames
    613 			 * by now.
    614 			 */
    615 			printf("RINT: SUSPENDED; scbstatus=0x%x\n",
    616 				scbstatus);
    617 			if (i82586_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0)
    618 				return (0);
    619 			aprint_error_dev(sc->sc_dev,
    620 			    "RU RESUME command timed out\n");
    621 			return (1);	/* Ask for a reset */
    622 		}
    623 
    624 		if (sc->rnr_expect != 0) {
    625 			/*
    626 			 * The RNR condition was announced in the previously
    627 			 * completed frame.  Assume the receive ring is Ok,
    628 			 * so restart the receiver without further delay.
    629 			 */
    630 			i82586_start_transceiver(sc);
    631 			sc->rnr_expect = 0;
    632 			return (0);
    633 
    634 		} else if ((scbstatus & IE_RUS_NOSPACE) != 0) {
    635 			/*
    636 			 * We saw no previous IF_FD_RNR flag.
    637 			 * We check our ring invariants and, if ok,
    638 			 * just restart the receiver at the current
    639 			 * point in the ring.
    640 			 */
    641 			if (i82586_chk_rx_ring(sc) != 0)
    642 				return (1);
    643 
    644 			i82586_start_transceiver(sc);
    645 			sc->sc_ethercom.ec_if.if_ierrors++;
    646 			return (0);
    647 		} else
    648 			printf("%s: receiver not ready; scbstatus=0x%x\n",
    649 				device_xname(sc->sc_dev), scbstatus);
    650 
    651 		sc->sc_ethercom.ec_if.if_ierrors++;
    652 		return (1);	/* Ask for a reset */
    653 	}
    654 
    655 	return (0);
    656 }
    657 
    658 /*
    659  * Process a command-complete interrupt.  These are only generated by the
    660  * transmission of frames.  This routine is deceptively simple, since most
    661  * of the real work is done by i82586_start().
    662  */
    663 int
    664 i82586_tint(struct ie_softc *sc, int scbstatus)
    665 {
    666 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    667 	int status;
    668 
    669 	ifp->if_timer = 0;
    670 	ifp->if_flags &= ~IFF_OACTIVE;
    671 
    672 #if I82586_DEBUG
    673 	if (sc->xmit_busy <= 0) {
    674 	    printf("i82586_tint: WEIRD: xmit_busy=%d, xctail=%d, xchead=%d\n",
    675 		   sc->xmit_busy, sc->xctail, sc->xchead);
    676 		return (0);
    677 	}
    678 #endif
    679 
    680 	status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds,
    681 							  sc->xctail));
    682 
    683 #if I82586_DEBUG
    684 	if (sc->sc_debug & IED_TINT)
    685 		printf("%s: tint: SCB status 0x%x; xmit status 0x%x\n",
    686 			device_xname(sc->sc_dev), scbstatus, status);
    687 #endif
    688 
    689 	if ((status & IE_STAT_COMPL) == 0 || (status & IE_STAT_BUSY)) {
    690 	    printf("i82586_tint: command still busy; status=0x%x; tail=%d\n",
    691 		   status, sc->xctail);
    692 	    printf("iestatus = 0x%x\n", scbstatus);
    693 	}
    694 
    695 	if (status & IE_STAT_OK) {
    696 		ifp->if_opackets++;
    697 		ifp->if_collisions += (status & IE_XS_MAXCOLL);
    698 	} else {
    699 		ifp->if_oerrors++;
    700 		/*
    701 		 * Check SQE and DEFERRED?
    702 		 * What if more than one bit is set?
    703 		 */
    704 		if (status & IE_STAT_ABORT)
    705 			aprint_error_dev(sc->sc_dev, "send aborted\n");
    706 		else if (status & IE_XS_NOCARRIER)
    707 			aprint_error_dev(sc->sc_dev, "no carrier\n");
    708 		else if (status & IE_XS_LOSTCTS)
    709 			aprint_error_dev(sc->sc_dev, "lost CTS\n");
    710 		else if (status & IE_XS_UNDERRUN)
    711 			aprint_error_dev(sc->sc_dev, "DMA underrun\n");
    712 		else if (status & IE_XS_EXCMAX) {
    713 			aprint_error_dev(sc->sc_dev, "too many collisions\n");
    714 			sc->sc_ethercom.ec_if.if_collisions += 16;
    715 		}
    716 	}
    717 
    718 	/*
    719 	 * If multicast addresses were added or deleted while transmitting,
    720 	 * ie_mc_reset() set the want_mcsetup flag indicating that we
    721 	 * should do it.
    722 	 */
    723 	if (sc->want_mcsetup) {
    724 		ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
    725 		sc->want_mcsetup = 0;
    726 	}
    727 
    728 	/* Done with the buffer. */
    729 	sc->xmit_busy--;
    730 	sc->xctail = (sc->xctail + 1) % NTXBUF;
    731 
    732 	/* Start the next packet, if any, transmitting. */
    733 	if (sc->xmit_busy > 0)
    734 		iexmit(sc);
    735 
    736 	if_schedule_deferred_start(ifp);
    737 	return (0);
    738 }
    739 
    740 /*
    741  * Get a range of receive buffer descriptors that represent one packet.
    742  */
    743 static int
    744 i82586_get_rbd_list(struct ie_softc *sc, uint16_t *start, uint16_t *end,
    745     int *pktlen)
    746 {
    747 	int	off, rbbase = sc->rbds;
    748 	int	rbindex, count = 0;
    749 	int	plen = 0;
    750 	int	rbdstatus;
    751 
    752 	*start = rbindex = sc->rbhead;
    753 
    754 	do {
    755 		off = IE_RBD_STATUS(rbbase, rbindex);
    756 		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
    757 		rbdstatus = sc->ie_bus_read16(sc, off);
    758 		if ((rbdstatus & IE_RBD_USED) == 0) {
    759 			/*
    760 			 * This means we are somehow out of sync.  So, we
    761 			 * reset the adapter.
    762 			 */
    763 #if I82586_DEBUG
    764 			print_rbd(sc, rbindex);
    765 #endif
    766 			log(LOG_ERR,
    767 			    "%s: receive descriptors out of sync at %d\n",
    768 			    device_xname(sc->sc_dev), rbindex);
    769 			return (0);
    770 		}
    771 		plen += (rbdstatus & IE_RBD_CNTMASK);
    772 
    773 		if (++rbindex == sc->nrxbuf)
    774 			rbindex = 0;
    775 
    776 		++count;
    777 	} while ((rbdstatus & IE_RBD_LAST) == 0);
    778 	*end = rbindex;
    779 	*pktlen = plen;
    780 	return (count);
    781 }
    782 
    783 
    784 /*
    785  * Release a range of receive buffer descriptors after we've copied the packet.
    786  */
    787 static void
    788 i82586_release_rbd_list(struct ie_softc *sc, uint16_t start, uint16_t end)
    789 {
    790 	int	off, rbbase = sc->rbds;
    791 	int	rbindex = start;
    792 
    793 	do {
    794 		/* Clear buffer status */
    795 		off = IE_RBD_STATUS(rbbase, rbindex);
    796 		sc->ie_bus_write16(sc, off, 0);
    797 		if (++rbindex == sc->nrxbuf)
    798 			rbindex = 0;
    799 	} while (rbindex != end);
    800 
    801 	/* Mark EOL at new tail */
    802 	rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
    803 	off = IE_RBD_BUFLEN(rbbase, rbindex);
    804 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE | IE_RBD_EOL);
    805 
    806 	/* Remove EOL from current tail */
    807 	off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
    808 	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
    809 
    810 	/* New head & tail pointer */
    811 /* hmm, why have both? head is always (tail + 1) % NRXBUF */
    812 	sc->rbhead = end;
    813 	sc->rbtail = rbindex;
    814 }
    815 
    816 /*
    817  * Drop the packet at the head of the RX buffer ring.
    818  * Called if the frame descriptor reports an error on this packet.
    819  * Returns 1 if the buffer descriptor ring appears to be corrupt;
    820  * and 0 otherwise.
    821  */
    822 static int
    823 i82586_drop_frames(struct ie_softc *sc)
    824 {
    825 	uint16_t bstart, bend;
    826 	int pktlen;
    827 
    828 	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0)
    829 		return (1);
    830 	i82586_release_rbd_list(sc, bstart, bend);
    831 	return (0);
    832 }
    833 
    834 /*
    835  * Check the RX frame & buffer descriptor lists for our invariants,
    836  * i.e.: EOL bit set iff. it is pointed at by the r*tail pointer.
    837  *
    838  * Called when the receive unit has stopped unexpectedly.
    839  * Returns 1 if an inconsistency is detected; 0 otherwise.
    840  *
    841  * The Receive Unit is expected to be NOT RUNNING.
    842  */
    843 static int
    844 i82586_chk_rx_ring(struct ie_softc *sc)
    845 {
    846 	int n, off, val;
    847 
    848 	for (n = 0; n < sc->nrxbuf; n++) {
    849 		off = IE_RBD_BUFLEN(sc->rbds, n);
    850 		val = sc->ie_bus_read16(sc, off);
    851 		if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
    852 			/* `rbtail' and EOL flag out of sync */
    853 			log(LOG_ERR,
    854 			    "%s: rx buffer descriptors out of sync at %d\n",
    855 			    device_xname(sc->sc_dev), n);
    856 			return (1);
    857 		}
    858 
    859 		/* Take the opportunity to clear the status fields here ? */
    860 	}
    861 
    862 	for (n = 0; n < sc->nframes; n++) {
    863 		off = IE_RFRAME_LAST(sc->rframes, n);
    864 		val = sc->ie_bus_read16(sc, off);
    865 		if ((n == sc->rftail) ^ ((val & (IE_FD_EOL | IE_FD_SUSP))
    866 		    != 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 	uint16_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 	uint8_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,
   1693 		    0, 0, 0))
   1694 			aprint_error_dev(sc->sc_dev,
   1695 			    "CU/RU stop command timed out\n");
   1696 
   1697 		/* Start the receiver & transmitter chain */
   1698 		/* sc->scb->ie_command_list =
   1699 			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
   1700 		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
   1701 				   IE_CMD_NOP_ADDR(
   1702 					sc->nop_cmds,
   1703 					(sc->xctail + NTXBUF - 1) % NTXBUF));
   1704 
   1705 		if (i82586_start_cmd(sc, IE_CUC_START | IE_RUC_START, 0, 0, 0))
   1706 			aprint_error_dev(sc->sc_dev,
   1707 			    "CU/RU command timed out\n");
   1708 	} else {
   1709 		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
   1710 			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
   1711 	}
   1712 }
   1713 
   1714 void
   1715 i82586_stop(struct ifnet *ifp, int disable)
   1716 {
   1717 	struct ie_softc *sc = ifp->if_softc;
   1718 
   1719 	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
   1720 		aprint_error_dev(sc->sc_dev,
   1721 		    "iestop: disable commands timed out\n");
   1722 }
   1723 
   1724 int
   1725 i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
   1726 {
   1727 	struct ie_softc *sc = ifp->if_softc;
   1728 	struct ifreq *ifr = (struct ifreq *)data;
   1729 	int s, error = 0;
   1730 
   1731 	s = splnet();
   1732 	switch (cmd) {
   1733 	case SIOCGIFMEDIA:
   1734 	case SIOCSIFMEDIA:
   1735 		error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
   1736 		break;
   1737 	default:
   1738 		error = ether_ioctl(ifp, cmd, data);
   1739 		if (error == ENETRESET) {
   1740 			/*
   1741 			 * Multicast list has changed; set the hardware filter
   1742 			 * accordingly.
   1743 			 */
   1744 			if (ifp->if_flags & IFF_RUNNING)
   1745 				ie_mc_reset(sc);
   1746 			error = 0;
   1747 		}
   1748 		break;
   1749 	}
   1750 #if I82586_DEBUG
   1751 	if (cmd == SIOCSIFFLAGS)
   1752 		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
   1753 #endif
   1754 	splx(s);
   1755 	return (error);
   1756 }
   1757 
   1758 static void
   1759 ie_mc_reset(struct ie_softc *sc)
   1760 {
   1761 	struct ethercom *ec = &sc->sc_ethercom;
   1762 	struct ether_multi *enm;
   1763 	struct ether_multistep step;
   1764 	int size;
   1765 
   1766 	/*
   1767 	 * Step through the list of addresses.
   1768 	 */
   1769 again:
   1770 	size = 0;
   1771 	sc->mcast_count = 0;
   1772 	ETHER_FIRST_MULTI(step, ec, enm);
   1773 	while (enm) {
   1774 		size += 6;
   1775 		if (sc->mcast_count >= IE_MAXMCAST ||
   1776 		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
   1777 			ec->ec_if.if_flags |= IFF_ALLMULTI;
   1778 			i82586_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL);
   1779 			return;
   1780 		}
   1781 		ETHER_NEXT_MULTI(step, enm);
   1782 	}
   1783 
   1784 	if (size > sc->mcast_addrs_size) {
   1785 		/* Need to allocate more space */
   1786 		if (sc->mcast_addrs_size)
   1787 			free(sc->mcast_addrs, M_IFMADDR);
   1788 		sc->mcast_addrs = (char *)
   1789 			malloc(size, M_IFMADDR, M_WAITOK);
   1790 		sc->mcast_addrs_size = size;
   1791 	}
   1792 
   1793 	/*
   1794 	 * We've got the space; now copy the addresses
   1795 	 */
   1796 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
   1797 	while (enm) {
   1798 		if (sc->mcast_count >= IE_MAXMCAST)
   1799 			goto again; /* Just in case */
   1800 
   1801 		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
   1802 		sc->mcast_count++;
   1803 		ETHER_NEXT_MULTI(step, enm);
   1804 	}
   1805 	sc->want_mcsetup = 1;
   1806 }
   1807 
   1808 /*
   1809  * Media change callback.
   1810  */
   1811 int
   1812 i82586_mediachange(struct ifnet *ifp)
   1813 {
   1814 	struct ie_softc *sc = ifp->if_softc;
   1815 
   1816 	if (sc->sc_mediachange)
   1817 		return ((*sc->sc_mediachange)(sc));
   1818 	return (0);
   1819 }
   1820 
   1821 /*
   1822  * Media status callback.
   1823  */
   1824 void
   1825 i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   1826 {
   1827 	struct ie_softc *sc = ifp->if_softc;
   1828 
   1829 	if (sc->sc_mediastatus)
   1830 		(*sc->sc_mediastatus)(sc, ifmr);
   1831 }
   1832 
   1833 #if I82586_DEBUG
   1834 void
   1835 print_rbd(struct ie_softc *sc, int n)
   1836 {
   1837 
   1838 	printf("RBD at %08x:\n	status %04x, next %04x, buffer %lx\n"
   1839 		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds, n),
   1840 		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds, n)),
   1841 		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds, n)),
   1842 		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
   1843 		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds, n)));
   1844 }
   1845 #endif
   1846