Home | History | Annotate | Line # | Download | only in ic
i82586.c revision 1.78.2.2
      1 /*	$NetBSD: i82586.c,v 1.78.2.2 2020/04/08 14:08:06 martin 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.2 2020/04/08 14:08:06 martin 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 	if_statinc(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 	if_statadd(&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 			if_statinc(&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 			if_statinc(&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 		if_statinc(&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 
    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 		if_statadd2(ifp, if_opackets, 1,
    697 		    if_collisions, status & IE_XS_MAXCOLL);
    698 	} else {
    699 		if_statinc(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 			if_statadd(&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 		if_statinc(&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 		if_statinc(&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_RUNNING)
   1138 		return;
   1139 
   1140 	while (sc->xmit_busy < NTXBUF) {
   1141 		head = sc->xchead;
   1142 		xbase = sc->xbds;
   1143 
   1144 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1145 		if (m0 == 0)
   1146 			break;
   1147 
   1148 		/* We need to use m->m_pkthdr.len, so require the header */
   1149 		if ((m0->m_flags & M_PKTHDR) == 0)
   1150 			panic("i82586_start: no header mbuf");
   1151 
   1152 		/* Tap off here if there is a BPF listener. */
   1153 		bpf_mtap(ifp, m0, BPF_D_OUT);
   1154 
   1155 #if I82586_DEBUG
   1156 		if (sc->sc_debug & IED_ENQ)
   1157 			printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
   1158 				sc->xchead);
   1159 #endif
   1160 
   1161 		if (m0->m_pkthdr.len > IE_TBUF_SIZE)
   1162 			printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
   1163 
   1164 		buffer = IE_XBUF_ADDR(sc, head);
   1165 		for (m = m0; m != 0; m = m->m_next) {
   1166 			(sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
   1167 			buffer += m->m_len;
   1168 		}
   1169 		len = m0->m_pkthdr.len;
   1170 		if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) {
   1171 			(sc->memcopyout)(sc, padbuf, buffer,
   1172 			    ETHER_MIN_LEN - ETHER_CRC_LEN - len);
   1173 			buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len;
   1174 			len = ETHER_MIN_LEN - ETHER_CRC_LEN;
   1175 		}
   1176 		m_freem(m0);
   1177 
   1178 		/*
   1179 		 * Setup the transmit buffer descriptor here, while we
   1180 		 * know the packet's length.
   1181 		 */
   1182 		sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
   1183 				       len | IE_TBD_EOL);
   1184 		sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
   1185 		sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
   1186 				       IE_XBUF_ADDR(sc, head));
   1187 
   1188 		if (++head == NTXBUF)
   1189 			head = 0;
   1190 		sc->xchead = head;
   1191 
   1192 		s = splnet();
   1193 		/* Start the first packet transmitting. */
   1194 		if (sc->xmit_busy == 0)
   1195 			iexmit(sc);
   1196 
   1197 		sc->xmit_busy++;
   1198 		splx(s);
   1199 	}
   1200 }
   1201 
   1202 /*
   1203  * Probe IE's ram setup   [ Move all this into MD front-end!? ]
   1204  * Use only if SCP and ISCP represent offsets into shared ram space.
   1205  */
   1206 int
   1207 i82586_proberam(struct ie_softc *sc)
   1208 {
   1209 	int result, off;
   1210 
   1211 	/* Put in 16-bit mode */
   1212 	off = IE_SCP_BUS_USE(sc->scp);
   1213 	sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
   1214 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1215 
   1216 	/* Set the ISCP `busy' bit */
   1217 	off = IE_ISCP_BUSY(sc->iscp);
   1218 	sc->ie_bus_write16(sc, off, 1);
   1219 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
   1220 
   1221 	if (sc->hwreset)
   1222 		(sc->hwreset)(sc, CHIP_PROBE);
   1223 
   1224 	(sc->chan_attn) (sc, CHIP_PROBE);
   1225 
   1226 	delay(100);		/* wait a while... */
   1227 
   1228 	/* Read back the ISCP `busy' bit; it should be clear by now */
   1229 	off = IE_ISCP_BUSY(sc->iscp);
   1230 	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
   1231 	result = sc->ie_bus_read16(sc, off) == 0;
   1232 
   1233 	/* Acknowledge any interrupts we may have caused. */
   1234 	ie_ack(sc, IE_ST_WHENCE);
   1235 
   1236 	return (result);
   1237 }
   1238 
   1239 void
   1240 i82586_reset(struct ie_softc *sc, int hard)
   1241 {
   1242 	int s = splnet();
   1243 
   1244 	if (hard)
   1245 		printf("%s: reset\n", device_xname(sc->sc_dev));
   1246 
   1247 	sc->sc_ethercom.ec_if.if_timer = 0;
   1248 
   1249 	/*
   1250 	 * Stop i82586 dead in its tracks.
   1251 	 */
   1252 	if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
   1253 		aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
   1254 
   1255 	/*
   1256 	 * This can really slow down the i82586_reset() on some cards, but it's
   1257 	 * necessary to unwedge other ones (eg, the Sun VME ones) from certain
   1258 	 * lockups.
   1259 	 */
   1260 	if (hard && sc->hwreset)
   1261 		(sc->hwreset)(sc, CARD_RESET);
   1262 
   1263 	delay(100);
   1264 	ie_ack(sc, IE_ST_WHENCE);
   1265 
   1266 	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
   1267 		int retries=0;	/* XXX - find out why init sometimes fails */
   1268 		while (retries++ < 2)
   1269 			if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
   1270 				break;
   1271 	}
   1272 
   1273 	splx(s);
   1274 }
   1275 
   1276 
   1277 static void
   1278 setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
   1279 {
   1280 	/* Setup a simple command */
   1281 	sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
   1282 	sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
   1283 	sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
   1284 
   1285 	/* Assign the command buffer to the SCB command list */
   1286 	sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
   1287 }
   1288 
   1289 /*
   1290  * Run the time-domain reflectometer.
   1291  */
   1292 static void
   1293 ie_run_tdr(struct ie_softc *sc, int cmd)
   1294 {
   1295 	int result;
   1296 
   1297 	setup_simple_command(sc, IE_CMD_TDR, cmd);
   1298 	sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
   1299 
   1300 	if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
   1301 	    (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
   1302 		result = 0x10000; /* XXX */
   1303 	else
   1304 		result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
   1305 
   1306 	/* Squash any pending interrupts */
   1307 	ie_ack(sc, IE_ST_WHENCE);
   1308 
   1309 	if (result & IE_TDR_SUCCESS)
   1310 		return;
   1311 
   1312 	if (result & 0x10000)
   1313 		aprint_error_dev(sc->sc_dev, "TDR command failed\n");
   1314 	else if (result & IE_TDR_XCVR)
   1315 		aprint_error_dev(sc->sc_dev, "transceiver problem\n");
   1316 	else if (result & IE_TDR_OPEN)
   1317 		aprint_error_dev(sc->sc_dev, "TDR detected incorrect "
   1318 		    "termination %d clocks away\n", result & IE_TDR_TIME);
   1319 	else if (result & IE_TDR_SHORT)
   1320 		aprint_error_dev(sc->sc_dev, "TDR detected a short circuit "
   1321 		    "%d clocks away\n", result & IE_TDR_TIME);
   1322 	else
   1323 		aprint_error_dev(sc->sc_dev,
   1324 		    "TDR returned unknown status 0x%x\n", result);
   1325 }
   1326 
   1327 
   1328 /*
   1329  * i82586_setup_bufs: set up the buffers
   1330  *
   1331  * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
   1332  * this is to be used for the buffers.  The chip indexs its control data
   1333  * structures with 16 bit offsets, and it indexes actual buffers with
   1334  * 24 bit addresses.   So we should allocate control buffers first so that
   1335  * we don't overflow the 16 bit offset field.   The number of transmit
   1336  * buffers is fixed at compile time.
   1337  *
   1338  */
   1339 static void
   1340 i82586_setup_bufs(struct ie_softc *sc)
   1341 {
   1342 	int	ptr = sc->buf_area;	/* memory pool */
   1343 	int	n, r;
   1344 
   1345 	/*
   1346 	 * step 0: zero memory and figure out how many recv buffers and
   1347 	 * frames we can have.
   1348 	 */
   1349 	ptr = (ptr + 3) & ~3;	/* set alignment and stick with it */
   1350 
   1351 
   1352 	/*
   1353 	 *  step 1: lay out data structures in the shared-memory area
   1354 	 */
   1355 
   1356 	/* The no-op commands; used if "nop-chaining" is in effect */
   1357 	sc->nop_cmds = ptr;
   1358 	ptr += NTXBUF * IE_CMD_NOP_SZ;
   1359 
   1360 	/* The transmit commands */
   1361 	sc->xmit_cmds = ptr;
   1362 	ptr += NTXBUF * IE_CMD_XMIT_SZ;
   1363 
   1364 	/* The transmit buffers descriptors */
   1365 	sc->xbds = ptr;
   1366 	ptr += NTXBUF * IE_XBD_SZ;
   1367 
   1368 	/* The transmit buffers */
   1369 	sc->xbufs = ptr;
   1370 	ptr += NTXBUF * IE_TBUF_SIZE;
   1371 
   1372 	ptr = (ptr + 3) & ~3;		/* re-align.. just in case */
   1373 
   1374 	/* Compute free space for RECV stuff */
   1375 	n = sc->buf_area_sz - (ptr - sc->buf_area);
   1376 
   1377 	/* Compute size of one RECV frame */
   1378 	r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F);
   1379 
   1380 	sc->nframes = n / r;
   1381 
   1382 	if (sc->nframes <= 0)
   1383 		panic("ie: bogus buffer calc");
   1384 
   1385 	sc->nrxbuf = sc->nframes * B_PER_F;
   1386 
   1387 	/* The receive frame descriptors */
   1388 	sc->rframes = ptr;
   1389 	ptr += sc->nframes * IE_RFRAME_SZ;
   1390 
   1391 	/* The receive buffer descriptors */
   1392 	sc->rbds = ptr;
   1393 	ptr += sc->nrxbuf * IE_RBD_SZ;
   1394 
   1395 	/* The receive buffers */
   1396 	sc->rbufs = ptr;
   1397 	ptr += sc->nrxbuf * IE_RBUF_SIZE;
   1398 
   1399 #if I82586_DEBUG
   1400 	printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev),
   1401 	    sc->nframes, sc->nrxbuf);
   1402 #endif
   1403 
   1404 	/*
   1405 	 * step 2: link together the recv frames and set EOL on last one
   1406 	 */
   1407 	for (n = 0; n < sc->nframes; n++) {
   1408 		int m = (n == sc->nframes - 1) ? 0 : n + 1;
   1409 
   1410 		/* Clear status */
   1411 		sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes, n), 0);
   1412 
   1413 		/* RBD link = NULL */
   1414 		sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, n),
   1415 				       0xffff);
   1416 
   1417 		/* Make a circular list */
   1418 		sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes, n),
   1419 				       IE_RFRAME_ADDR(sc->rframes, m));
   1420 
   1421 		/* Mark last as EOL */
   1422 		sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes, n),
   1423 				       ((m==0)? (IE_FD_EOL | IE_FD_SUSP) : 0));
   1424 	}
   1425 
   1426 	/*
   1427 	 * step 3: link the RBDs and set EOL on last one
   1428 	 */
   1429 	for (n = 0; n < sc->nrxbuf; n++) {
   1430 		int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
   1431 
   1432 		/* Clear status */
   1433 		sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds, n), 0);
   1434 
   1435 		/* Make a circular list */
   1436 		sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds, n),
   1437 				       IE_RBD_ADDR(sc->rbds, m));
   1438 
   1439 		/* Link to data buffers */
   1440 		sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
   1441 				       IE_RBUF_ADDR(sc, n));
   1442 		sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds, n),
   1443 				       IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0));
   1444 	}
   1445 
   1446 	/*
   1447 	 * step 4: all xmit no-op commands loopback onto themselves
   1448 	 */
   1449 	for (n = 0; n < NTXBUF; n++) {
   1450 		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
   1451 
   1452 		sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
   1453 					 IE_CMD_NOP);
   1454 
   1455 		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
   1456 					 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
   1457 	}
   1458 
   1459 
   1460 	/*
   1461 	 * step 6: set the head and tail pointers on receive to keep track of
   1462 	 * the order in which RFDs and RBDs are used.
   1463 	 */
   1464 
   1465 	/* Pointers to last packet sent and next available transmit buffer. */
   1466 	sc->xchead = sc->xctail = 0;
   1467 
   1468 	/* Clear transmit-busy flag and set number of free transmit buffers. */
   1469 	sc->xmit_busy = 0;
   1470 
   1471 	/*
   1472 	 * Pointers to first and last receive frame.
   1473 	 * The RFD pointed to by rftail is the only one that has EOL set.
   1474 	 */
   1475 	sc->rfhead = 0;
   1476 	sc->rftail = sc->nframes - 1;
   1477 
   1478 	/*
   1479 	 * Pointers to first and last receive descriptor buffer.
   1480 	 * The RBD pointed to by rbtail is the only one that has EOL set.
   1481 	 */
   1482 	sc->rbhead = 0;
   1483 	sc->rbtail = sc->nrxbuf - 1;
   1484 
   1485 /* link in recv frames * and buffer into the scb. */
   1486 #if I82586_DEBUG
   1487 	printf("%s: reserved %d bytes\n",
   1488 		device_xname(sc->sc_dev), ptr - sc->buf_area);
   1489 #endif
   1490 }
   1491 
   1492 static int
   1493 ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
   1494 {
   1495 	int cmdresult, status;
   1496 	uint8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */
   1497 
   1498 	*IE_CMD_CFG_CNT(buf)	   = 0x0c;
   1499 	*IE_CMD_CFG_FIFO(buf)	   = 8;
   1500 	*IE_CMD_CFG_SAVEBAD(buf)   = 0x40;
   1501 	*IE_CMD_CFG_ADDRLEN(buf)   = 0x2e;
   1502 	*IE_CMD_CFG_PRIORITY(buf)  = 0;
   1503 	*IE_CMD_CFG_IFS(buf)	   = 0x60;
   1504 	*IE_CMD_CFG_SLOT_LOW(buf)  = 0;
   1505 	*IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2;
   1506 	*IE_CMD_CFG_PROMISC(buf)   = (!!promiscuous) | manchester << 2;
   1507 	*IE_CMD_CFG_CRSCDT(buf)	   = 0;
   1508 	*IE_CMD_CFG_MINLEN(buf)	   = 64;
   1509 	*IE_CMD_CFG_JUNK(buf)	   = 0xff;
   1510 	sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
   1511 	setup_simple_command(sc, IE_CMD_CONFIG, cmd);
   1512 	IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
   1513 
   1514 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
   1515 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
   1516 	if (cmdresult != 0) {
   1517 		aprint_error_dev(sc->sc_dev,
   1518 		    "configure command timed out; status %x\n", status);
   1519 		return (0);
   1520 	}
   1521 	if ((status & IE_STAT_OK) == 0) {
   1522 		aprint_error_dev(sc->sc_dev,
   1523 		    "configure command failed; status %x\n", status);
   1524 		return (0);
   1525 	}
   1526 
   1527 	/* Squash any pending interrupts */
   1528 	ie_ack(sc, IE_ST_WHENCE);
   1529 	return (1);
   1530 }
   1531 
   1532 static int
   1533 ie_ia_setup(struct ie_softc *sc, int cmdbuf)
   1534 {
   1535 	int cmdresult, status;
   1536 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1537 
   1538 	setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
   1539 
   1540 	(sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
   1541 			 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN);
   1542 
   1543 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
   1544 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1545 	if (cmdresult != 0) {
   1546 		aprint_error_dev(sc->sc_dev,
   1547 		    "individual address command timed out; status %x\n",
   1548 		    status);
   1549 		return (0);
   1550 	}
   1551 	if ((status & IE_STAT_OK) == 0) {
   1552 		aprint_error_dev(sc->sc_dev,
   1553 		    "individual address command failed; status %x\n", status);
   1554 		return (0);
   1555 	}
   1556 
   1557 	/* Squash any pending interrupts */
   1558 	ie_ack(sc, IE_ST_WHENCE);
   1559 	return (1);
   1560 }
   1561 
   1562 /*
   1563  * Run the multicast setup command.
   1564  * Called at splnet().
   1565  */
   1566 static int
   1567 ie_mc_setup(struct ie_softc *sc, int cmdbuf)
   1568 {
   1569 	int cmdresult, status;
   1570 
   1571 	if (sc->mcast_count == 0)
   1572 		return (1);
   1573 
   1574 	setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
   1575 
   1576 	(sc->memcopyout)(sc, (void *)sc->mcast_addrs,
   1577 			 IE_CMD_MCAST_MADDR(cmdbuf),
   1578 			 sc->mcast_count * ETHER_ADDR_LEN);
   1579 
   1580 	sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
   1581 			       sc->mcast_count * ETHER_ADDR_LEN);
   1582 
   1583 	/* Start the command */
   1584 	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL,
   1585 	    0);
   1586 	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
   1587 	if (cmdresult != 0) {
   1588 		aprint_error_dev(sc->sc_dev,
   1589 		    "multicast setup command timed out; status %x\n", status);
   1590 		return (0);
   1591 	}
   1592 	if ((status & IE_STAT_OK) == 0) {
   1593 		aprint_error_dev(sc->sc_dev,
   1594 		    "multicast setup command failed; status %x\n", status);
   1595 		return (0);
   1596 	}
   1597 
   1598 	/* Squash any pending interrupts */
   1599 	ie_ack(sc, IE_ST_WHENCE);
   1600 	return (1);
   1601 }
   1602 
   1603 /*
   1604  * This routine takes the environment generated by check_ie_present() and adds
   1605  * to it all the other structures we need to operate the adapter.  This
   1606  * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting
   1607  * the receiver unit, and clearing interrupts.
   1608  *
   1609  * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER.
   1610  */
   1611 int
   1612 i82586_init(struct ifnet *ifp)
   1613 {
   1614 	struct ie_softc *sc = ifp->if_softc;
   1615 	int cmd;
   1616 
   1617 	sc->async_cmd_inprogress = 0;
   1618 
   1619 	cmd = sc->buf_area;
   1620 
   1621 	/*
   1622 	 * Send the configure command first.
   1623 	 */
   1624 	if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
   1625 		return EIO;
   1626 
   1627 	/*
   1628 	 * Send the Individual Address Setup command.
   1629 	 */
   1630 	if (ie_ia_setup(sc, cmd) == 0)
   1631 		return EIO;
   1632 
   1633 	/*
   1634 	 * Run the time-domain reflectometer.
   1635 	 */
   1636 	ie_run_tdr(sc, cmd);
   1637 
   1638 	/*
   1639 	 * Set the multi-cast filter, if any
   1640 	 */
   1641 	if (ie_mc_setup(sc, cmd) == 0)
   1642 		return EIO;
   1643 
   1644 	/*
   1645 	 * Acknowledge any interrupts we have generated thus far.
   1646 	 */
   1647 	ie_ack(sc, IE_ST_WHENCE);
   1648 
   1649 	/*
   1650 	 * Set up the transmit and recv buffers.
   1651 	 */
   1652 	i82586_setup_bufs(sc);
   1653 
   1654 	if (sc->hwinit)
   1655 		(sc->hwinit)(sc);
   1656 
   1657 	ifp->if_flags |= IFF_RUNNING;
   1658 
   1659 	if (NTXBUF < 2)
   1660 		sc->do_xmitnopchain = 0;
   1661 
   1662 	i82586_start_transceiver(sc);
   1663 	return (0);
   1664 }
   1665 
   1666 /*
   1667  * Start the RU and possibly the CU unit
   1668  */
   1669 static void
   1670 i82586_start_transceiver(struct ie_softc *sc)
   1671 {
   1672 
   1673 	/*
   1674 	 * Start RU at current position in frame & RBD lists.
   1675 	 */
   1676 	sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, sc->rfhead),
   1677 			       IE_RBD_ADDR(sc->rbds, sc->rbhead));
   1678 
   1679 	sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
   1680 			       IE_RFRAME_ADDR(sc->rframes, sc->rfhead));
   1681 
   1682 	if (sc->do_xmitnopchain) {
   1683 		/* Stop transmit command chain */
   1684 		if (i82586_start_cmd(sc, IE_CUC_SUSPEND | IE_RUC_SUSPEND,
   1685 		    0, 0, 0))
   1686 			aprint_error_dev(sc->sc_dev,
   1687 			    "CU/RU stop command timed out\n");
   1688 
   1689 		/* Start the receiver & transmitter chain */
   1690 		/* sc->scb->ie_command_list =
   1691 			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
   1692 		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
   1693 				   IE_CMD_NOP_ADDR(
   1694 					sc->nop_cmds,
   1695 					(sc->xctail + NTXBUF - 1) % NTXBUF));
   1696 
   1697 		if (i82586_start_cmd(sc, IE_CUC_START | IE_RUC_START, 0, 0, 0))
   1698 			aprint_error_dev(sc->sc_dev,
   1699 			    "CU/RU command timed out\n");
   1700 	} else {
   1701 		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
   1702 			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
   1703 	}
   1704 }
   1705 
   1706 void
   1707 i82586_stop(struct ifnet *ifp, int disable)
   1708 {
   1709 	struct ie_softc *sc = ifp->if_softc;
   1710 
   1711 	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
   1712 		aprint_error_dev(sc->sc_dev,
   1713 		    "iestop: disable commands timed out\n");
   1714 }
   1715 
   1716 int
   1717 i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
   1718 {
   1719 	struct ie_softc *sc = ifp->if_softc;
   1720 	int s, error = 0;
   1721 
   1722 	s = splnet();
   1723 	switch (cmd) {
   1724 	default:
   1725 		error = ether_ioctl(ifp, cmd, data);
   1726 		if (error == ENETRESET) {
   1727 			/*
   1728 			 * Multicast list has changed; set the hardware filter
   1729 			 * accordingly.
   1730 			 */
   1731 			if (ifp->if_flags & IFF_RUNNING)
   1732 				ie_mc_reset(sc);
   1733 			error = 0;
   1734 		}
   1735 		break;
   1736 	}
   1737 #if I82586_DEBUG
   1738 	if (cmd == SIOCSIFFLAGS)
   1739 		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
   1740 #endif
   1741 	splx(s);
   1742 	return (error);
   1743 }
   1744 
   1745 static void
   1746 ie_mc_reset(struct ie_softc *sc)
   1747 {
   1748 	struct ethercom *ec = &sc->sc_ethercom;
   1749 	struct ether_multi *enm;
   1750 	struct ether_multistep step;
   1751 	int size;
   1752 
   1753 	/*
   1754 	 * Step through the list of addresses.
   1755 	 */
   1756 again:
   1757 	size = 0;
   1758 	sc->mcast_count = 0;
   1759 	ETHER_LOCK(ec);
   1760 	ETHER_FIRST_MULTI(step, ec, enm);
   1761 	while (enm) {
   1762 		size += 6;
   1763 		if (sc->mcast_count >= IE_MAXMCAST ||
   1764 		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
   1765 			ec->ec_if.if_flags |= IFF_ALLMULTI;
   1766 			i82586_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL);
   1767 			ETHER_UNLOCK(ec);
   1768 			return;
   1769 		}
   1770 		ETHER_NEXT_MULTI(step, enm);
   1771 	}
   1772 	ETHER_UNLOCK(ec);
   1773 
   1774 	if (size > sc->mcast_addrs_size) {
   1775 		/* Need to allocate more space */
   1776 		if (sc->mcast_addrs_size)
   1777 			free(sc->mcast_addrs, M_IFMADDR);
   1778 		sc->mcast_addrs = (char *)
   1779 			malloc(size, M_IFMADDR, M_WAITOK);
   1780 		sc->mcast_addrs_size = size;
   1781 	}
   1782 
   1783 	/*
   1784 	 * We've got the space; now copy the addresses
   1785 	 */
   1786 	ETHER_LOCK(ec);
   1787 	ETHER_FIRST_MULTI(step, ec, enm);
   1788 	while (enm) {
   1789 		if (sc->mcast_count >= IE_MAXMCAST) {
   1790 			ETHER_UNLOCK(ec);
   1791 			goto again; /* Just in case */
   1792 		}
   1793 
   1794 		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
   1795 		sc->mcast_count++;
   1796 		ETHER_NEXT_MULTI(step, enm);
   1797 	}
   1798 	ETHER_UNLOCK(ec);
   1799 	sc->want_mcsetup = 1;
   1800 }
   1801 
   1802 /*
   1803  * Media change callback.
   1804  */
   1805 int
   1806 i82586_mediachange(struct ifnet *ifp)
   1807 {
   1808 	struct ie_softc *sc = ifp->if_softc;
   1809 
   1810 	if (sc->sc_mediachange)
   1811 		return ((*sc->sc_mediachange)(sc));
   1812 	return (0);
   1813 }
   1814 
   1815 /*
   1816  * Media status callback.
   1817  */
   1818 void
   1819 i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   1820 {
   1821 	struct ie_softc *sc = ifp->if_softc;
   1822 
   1823 	if (sc->sc_mediastatus)
   1824 		(*sc->sc_mediastatus)(sc, ifmr);
   1825 }
   1826 
   1827 #if I82586_DEBUG
   1828 void
   1829 print_rbd(struct ie_softc *sc, int n)
   1830 {
   1831 
   1832 	printf("RBD at %08x:\n	status %04x, next %04x, buffer %lx\n"
   1833 		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds, n),
   1834 		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds, n)),
   1835 		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds, n)),
   1836 		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
   1837 		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds, n)));
   1838 }
   1839 #endif
   1840