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