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