1/*	$NetBSD: i82586.c,v 1.91 2024/02/09 22:08:34 andvar 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 controlled by the same
100 * driver.
101 */
102
103/*
104Mode 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.91 2024/02/09 22:08:34 andvar 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
163void		i82586_reset(struct ie_softc *, int);
164void		i82586_watchdog(struct ifnet *);
165int		i82586_init(struct ifnet *);
166int		i82586_ioctl(struct ifnet *, u_long, void *);
167void		i82586_start(struct ifnet *);
168void		i82586_stop(struct ifnet *, int);
169
170
171int		i82586_rint(struct ie_softc *, int);
172int		i82586_tint(struct ie_softc *, int);
173
174int		i82586_mediachange(struct ifnet *);
175void		i82586_mediastatus(struct ifnet *, struct ifmediareq *);
176
177static int	ie_readframe(struct ie_softc *, int);
178static struct mbuf *ieget(struct ie_softc *, int, int);
179static int	i82586_get_rbd_list(struct ie_softc *,
180					     uint16_t *, uint16_t *, int *);
181static void	i82586_release_rbd_list(struct ie_softc *,
182					     uint16_t, uint16_t);
183static int	i82586_drop_frames(struct ie_softc *);
184static int	i82586_chk_rx_ring(struct ie_softc *);
185
186static inline void ie_ack(struct ie_softc *, u_int);
187static inline void iexmit(struct ie_softc *);
188static void	i82586_start_transceiver(struct ie_softc *);
189
190static void	i82586_count_errors(struct ie_softc *);
191static void	i82586_rx_errors(struct ie_softc *, int, int);
192static void	i82586_setup_bufs(struct ie_softc *);
193static void	setup_simple_command(struct ie_softc *, int, int);
194static int	ie_cfg_setup(struct ie_softc *, int, int, int);
195static int	ie_ia_setup(struct ie_softc *, int);
196static void	ie_run_tdr(struct ie_softc *, int);
197static int	ie_mc_setup(struct ie_softc *, int);
198static void	ie_mc_reset(struct ie_softc *);
199static int	i82586_start_cmd(struct ie_softc *, int, int, int, int);
200static int	i82586_cmd_wait(struct ie_softc *);
201
202#if I82586_DEBUG
203void		print_rbd(struct ie_softc *, int);
204#endif
205
206static 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 */
230void
231i82586_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 */
278void
279i82586_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	if_statinc(ifp, if_oerrors);
285
286	i82586_reset(sc, 1);
287}
288
289static int
290i82586_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 */
324static int
325i82586_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 */
383static inline void
384ie_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 */
399static inline void
400i82586_count_errors(struct ie_softc *sc)
401{
402	int scb = sc->scb;
403
404	if_statadd(&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
417static void
418i82586_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 */
429int
430i82586_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
453loop:
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
491out:
492	if (sc->intrhook)
493		(sc->intrhook)(sc, INTR_EXIT);
494	return (1);
495
496reset:
497	i82586_cmd_wait(sc);
498	i82586_reset(sc, 1);
499	goto out;
500
501}
502
503/*
504 * Process a received-frame interrupt.
505 */
506int
507i82586_rint(struct ie_softc *sc, int scbstatus)
508{
509static	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			if_statinc(&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			if_statinc(&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		if_statinc(&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 */
659int
660i82586_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
667#if I82586_DEBUG
668	if (sc->xmit_busy <= 0) {
669	    printf("i82586_tint: WEIRD: xmit_busy=%d, xctail=%d, xchead=%d\n",
670		   sc->xmit_busy, sc->xctail, sc->xchead);
671		return (0);
672	}
673#endif
674
675	status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds,
676							  sc->xctail));
677
678#if I82586_DEBUG
679	if (sc->sc_debug & IED_TINT)
680		printf("%s: tint: SCB status 0x%x; xmit status 0x%x\n",
681			device_xname(sc->sc_dev), scbstatus, status);
682#endif
683
684	if ((status & IE_STAT_COMPL) == 0 || (status & IE_STAT_BUSY)) {
685	    printf("i82586_tint: command still busy; status=0x%x; tail=%d\n",
686		   status, sc->xctail);
687	    printf("iestatus = 0x%x\n", scbstatus);
688	}
689
690	if (status & IE_STAT_OK) {
691		if_statadd2(ifp, if_opackets, 1,
692		    if_collisions, status & IE_XS_MAXCOLL);
693	} else {
694		if_statinc(ifp, if_oerrors);
695		/*
696		 * Check SQE and DEFERRED?
697		 * What if more than one bit is set?
698		 */
699		if (status & IE_STAT_ABORT)
700			aprint_error_dev(sc->sc_dev, "send aborted\n");
701		else if (status & IE_XS_NOCARRIER)
702			aprint_error_dev(sc->sc_dev, "no carrier\n");
703		else if (status & IE_XS_LOSTCTS)
704			aprint_error_dev(sc->sc_dev, "lost CTS\n");
705		else if (status & IE_XS_UNDERRUN)
706			aprint_error_dev(sc->sc_dev, "DMA underrun\n");
707		else if (status & IE_XS_EXCMAX) {
708			aprint_error_dev(sc->sc_dev, "too many collisions\n");
709			if_statadd(&sc->sc_ethercom.ec_if, if_collisions, 16);
710		}
711	}
712
713	/*
714	 * If multicast addresses were added or deleted while transmitting,
715	 * ie_mc_reset() set the want_mcsetup flag indicating that we
716	 * should do it.
717	 */
718	if (sc->want_mcsetup) {
719		ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
720		sc->want_mcsetup = 0;
721	}
722
723	/* Done with the buffer. */
724	sc->xmit_busy--;
725	sc->xctail = (sc->xctail + 1) % NTXBUF;
726
727	/* Start the next packet, if any, transmitting. */
728	if (sc->xmit_busy > 0)
729		iexmit(sc);
730
731	if_schedule_deferred_start(ifp);
732	return (0);
733}
734
735/*
736 * Get a range of receive buffer descriptors that represent one packet.
737 */
738static int
739i82586_get_rbd_list(struct ie_softc *sc, uint16_t *start, uint16_t *end,
740    int *pktlen)
741{
742	int	off, rbbase = sc->rbds;
743	int	rbindex, count = 0;
744	int	plen = 0;
745	int	rbdstatus;
746
747	*start = rbindex = sc->rbhead;
748
749	do {
750		off = IE_RBD_STATUS(rbbase, rbindex);
751		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
752		rbdstatus = sc->ie_bus_read16(sc, off);
753		if ((rbdstatus & IE_RBD_USED) == 0) {
754			/*
755			 * This means we are somehow out of sync.  So, we
756			 * reset the adapter.
757			 */
758#if I82586_DEBUG
759			print_rbd(sc, rbindex);
760#endif
761			log(LOG_ERR,
762			    "%s: receive descriptors out of sync at %d\n",
763			    device_xname(sc->sc_dev), rbindex);
764			return (0);
765		}
766		plen += (rbdstatus & IE_RBD_CNTMASK);
767
768		if (++rbindex == sc->nrxbuf)
769			rbindex = 0;
770
771		++count;
772	} while ((rbdstatus & IE_RBD_LAST) == 0);
773	*end = rbindex;
774	*pktlen = plen;
775	return (count);
776}
777
778
779/*
780 * Release a range of receive buffer descriptors after we've copied the packet.
781 */
782static void
783i82586_release_rbd_list(struct ie_softc *sc, uint16_t start, uint16_t end)
784{
785	int	off, rbbase = sc->rbds;
786	int	rbindex = start;
787
788	do {
789		/* Clear buffer status */
790		off = IE_RBD_STATUS(rbbase, rbindex);
791		sc->ie_bus_write16(sc, off, 0);
792		if (++rbindex == sc->nrxbuf)
793			rbindex = 0;
794	} while (rbindex != end);
795
796	/* Mark EOL at new tail */
797	rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
798	off = IE_RBD_BUFLEN(rbbase, rbindex);
799	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE | IE_RBD_EOL);
800
801	/* Remove EOL from current tail */
802	off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
803	sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
804
805	/* New head & tail pointer */
806/* hmm, why have both? head is always (tail + 1) % NRXBUF */
807	sc->rbhead = end;
808	sc->rbtail = rbindex;
809}
810
811/*
812 * Drop the packet at the head of the RX buffer ring.
813 * Called if the frame descriptor reports an error on this packet.
814 * Returns 1 if the buffer descriptor ring appears to be corrupt;
815 * and 0 otherwise.
816 */
817static int
818i82586_drop_frames(struct ie_softc *sc)
819{
820	uint16_t bstart, bend;
821	int pktlen;
822
823	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0)
824		return (1);
825	i82586_release_rbd_list(sc, bstart, bend);
826	return (0);
827}
828
829/*
830 * Check the RX frame & buffer descriptor lists for our invariants,
831 * i.e.: EOL bit set iff. it is pointed at by the r*tail pointer.
832 *
833 * Called when the receive unit has stopped unexpectedly.
834 * Returns 1 if an inconsistency is detected; 0 otherwise.
835 *
836 * The Receive Unit is expected to be NOT RUNNING.
837 */
838static int
839i82586_chk_rx_ring(struct ie_softc *sc)
840{
841	int n, off, val;
842
843	for (n = 0; n < sc->nrxbuf; n++) {
844		off = IE_RBD_BUFLEN(sc->rbds, n);
845		val = sc->ie_bus_read16(sc, off);
846		if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
847			/* `rbtail' and EOL flag out of sync */
848			log(LOG_ERR,
849			    "%s: rx buffer descriptors out of sync at %d\n",
850			    device_xname(sc->sc_dev), n);
851			return (1);
852		}
853
854		/* Take the opportunity to clear the status fields here ? */
855	}
856
857	for (n = 0; n < sc->nframes; n++) {
858		off = IE_RFRAME_LAST(sc->rframes, n);
859		val = sc->ie_bus_read16(sc, off);
860		if ((n == sc->rftail) ^ ((val & (IE_FD_EOL | IE_FD_SUSP))
861		    != 0)) {
862			/* `rftail' and EOL flag out of sync */
863			log(LOG_ERR,
864			    "%s: rx frame list out of sync at %d\n",
865			    device_xname(sc->sc_dev), n);
866			return (1);
867		}
868	}
869
870	return (0);
871}
872
873/*
874 * Read data off the interface, and turn it into an mbuf chain.
875 *
876 * This code is DRAMATICALLY different from the previous version; this
877 * version tries to allocate the entire mbuf chain up front, given the
878 * length of the data available.  This enables us to allocate mbuf
879 * clusters in many situations where before we would have had a long
880 * chain of partially-full mbufs.  This should help to speed up the
881 * operation considerably.  (Provided that it works, of course.)
882 */
883static inline struct mbuf *
884ieget(struct ie_softc *sc, int head, int totlen)
885{
886	struct mbuf *m, *m0, *newm;
887	int len, resid;
888	int thisrboff, thismboff;
889	struct ether_header eh;
890
891	/*
892	 * Snarf the Ethernet header.
893	 */
894	(sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
895	    sizeof(struct ether_header));
896
897	resid = totlen;
898
899	MGETHDR(m0, M_DONTWAIT, MT_DATA);
900	if (m0 == 0)
901		return (0);
902	m_set_rcvif(m0, &sc->sc_ethercom.ec_if);
903	m0->m_pkthdr.len = totlen;
904	len = MHLEN;
905	m = m0;
906
907	/*
908	 * This loop goes through and allocates mbufs for all the data we will
909	 * be copying in.  It does not actually do the copying yet.
910	 */
911	while (totlen > 0) {
912		if (totlen >= MINCLSIZE) {
913			MCLGET(m, M_DONTWAIT);
914			if ((m->m_flags & M_EXT) == 0)
915				goto bad;
916			len = MCLBYTES;
917		}
918
919		if (m == m0) {
920			char *newdata = (char *)
921			    ALIGN(m->m_data + sizeof(struct ether_header)) -
922			    sizeof(struct ether_header);
923			len -= newdata - m->m_data;
924			m->m_data = newdata;
925		}
926
927		m->m_len = len = uimin(totlen, len);
928
929		totlen -= len;
930		if (totlen > 0) {
931			MGET(newm, M_DONTWAIT, MT_DATA);
932			if (newm == 0)
933				goto bad;
934			len = MLEN;
935			m = m->m_next = newm;
936		}
937	}
938
939	m = m0;
940	thismboff = 0;
941
942	/*
943	 * Copy the Ethernet header into the mbuf chain.
944	 */
945	memcpy(mtod(m, void *), &eh, sizeof(struct ether_header));
946	thismboff = sizeof(struct ether_header);
947	thisrboff = sizeof(struct ether_header);
948	resid -= sizeof(struct ether_header);
949
950	/*
951	 * Now we take the mbuf chain (hopefully only one mbuf most of the
952	 * time) and stuff the data into it.  There are no possible failures
953	 * at or after this point.
954	 */
955	while (resid > 0) {
956		int thisrblen = IE_RBUF_SIZE - thisrboff,
957		    thismblen = m->m_len - thismboff;
958		len = uimin(thisrblen, thismblen);
959
960		(sc->memcopyin)(sc, mtod(m, char *) + thismboff,
961				IE_RBUF_ADDR(sc, head) + thisrboff,
962				(u_int)len);
963		resid -= len;
964
965		if (len == thismblen) {
966			m = m->m_next;
967			thismboff = 0;
968		} else
969			thismboff += len;
970
971		if (len == thisrblen) {
972			if (++head == sc->nrxbuf)
973				head = 0;
974			thisrboff = 0;
975		} else
976			thisrboff += len;
977	}
978
979	/*
980	 * Unless something changed strangely while we were doing the copy,
981	 * we have now copied everything in from the shared memory.
982	 * This means that we are done.
983	 */
984	return (m0);
985
986bad:
987	m_freem(m0);
988	return (0);
989}
990
991/*
992 * Read frame NUM from unit UNIT (pre-cached as IE).
993 *
994 * This routine reads the RFD at NUM, and copies in the buffers from the list
995 * of RBD, then rotates the RBD list so that the receiver doesn't start
996 * complaining.  Trailers are DROPPED---there's no point in wasting time
997 * on confusing code to deal with them.  Hopefully, this machine will
998 * never ARP for trailers anyway.
999 */
1000static int
1001ie_readframe(
1002    struct ie_softc *sc,
1003    int num)		/* frame number to read */
1004{
1005	struct mbuf *m;
1006	uint16_t bstart, bend;
1007	int pktlen;
1008
1009	if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
1010		if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
1011		return (1);
1012	}
1013
1014	m = ieget(sc, bstart, pktlen);
1015	i82586_release_rbd_list(sc, bstart, bend);
1016
1017	if (m == 0) {
1018		if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
1019		return (0);
1020	}
1021
1022#if I82586_DEBUG
1023	if (sc->sc_debug & IED_READFRAME) {
1024		struct ether_header *eh = mtod(m, struct ether_header *);
1025
1026		printf("%s: frame from ether %s type 0x%x len %d\n",
1027			device_xname(sc->sc_dev),
1028			ether_sprintf(eh->ether_shost),
1029			(u_int)ntohs(eh->ether_type),
1030			pktlen);
1031	}
1032#endif
1033
1034	/*
1035	 * Finally pass this packet up to higher layers.
1036	 */
1037	if_percpuq_enqueue((&sc->sc_ethercom.ec_if)->if_percpuq, m);
1038	return (0);
1039}
1040
1041
1042/*
1043 * Setup all necessary artifacts for an XMIT command, and then pass the XMIT
1044 * command to the chip to be executed.
1045 */
1046static inline void
1047iexmit(struct ie_softc *sc)
1048{
1049	int off;
1050	int cur, prev;
1051
1052	cur = sc->xctail;
1053
1054#if I82586_DEBUG
1055	if (sc->sc_debug & IED_XMIT)
1056		printf("%s: xmit buffer %d\n", device_xname(sc->sc_dev), cur);
1057#endif
1058
1059	/*
1060	 * Setup the transmit command.
1061	 */
1062	sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur),
1063			       IE_XBD_ADDR(sc->xbds, cur));
1064
1065	sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0);
1066
1067	if (sc->do_xmitnopchain) {
1068		/*
1069		 * Gate this XMIT command to the following NOP
1070		 */
1071		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
1072				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1073		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1074				       IE_CMD_XMIT | IE_CMD_INTR);
1075
1076		/*
1077		 * Loopback at following NOP
1078		 */
1079		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0);
1080		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur),
1081				       IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1082
1083		/*
1084		 * Gate preceding NOP to this XMIT command
1085		 */
1086		prev = (cur + NTXBUF - 1) % NTXBUF;
1087		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev),
1088		    0);
1089		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
1090				       IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
1091
1092		off = IE_SCB_STATUS(sc->scb);
1093		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1094		if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
1095			printf("iexmit: CU not active\n");
1096			i82586_start_transceiver(sc);
1097		}
1098	} else {
1099		sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
1100				       0xffff);
1101
1102		sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1103		    IE_CMD_XMIT | IE_CMD_INTR | IE_CMD_LAST);
1104
1105		off = IE_SCB_CMDLST(sc->scb);
1106		sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds,
1107			cur));
1108		IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1109
1110		if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1))
1111			aprint_error_dev(sc->sc_dev,
1112			    "iexmit: start xmit command timed out\n");
1113	}
1114
1115	sc->sc_ethercom.ec_if.if_timer = 5;
1116}
1117
1118
1119/*
1120 * Start transmission on an interface.
1121 */
1122void
1123i82586_start(struct ifnet *ifp)
1124{
1125	struct ie_softc *sc = ifp->if_softc;
1126	struct mbuf *m0, *m;
1127	int	buffer, head, xbase;
1128	u_short	len;
1129	int	s;
1130
1131	if ((ifp->if_flags & IFF_RUNNING) != IFF_RUNNING)
1132		return;
1133
1134	while (sc->xmit_busy < NTXBUF) {
1135		head = sc->xchead;
1136		xbase = sc->xbds;
1137
1138		IFQ_DEQUEUE(&ifp->if_snd, m0);
1139		if (m0 == 0)
1140			break;
1141
1142		/* We need to use m->m_pkthdr.len, so require the header */
1143		if ((m0->m_flags & M_PKTHDR) == 0)
1144			panic("i82586_start: no header mbuf");
1145
1146		/* Tap off here if there is a BPF listener. */
1147		bpf_mtap(ifp, m0, BPF_D_OUT);
1148
1149#if I82586_DEBUG
1150		if (sc->sc_debug & IED_ENQ)
1151			printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
1152				sc->xchead);
1153#endif
1154
1155		if (m0->m_pkthdr.len > IE_TBUF_SIZE)
1156			printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
1157
1158		buffer = IE_XBUF_ADDR(sc, head);
1159		for (m = m0; m != 0; m = m->m_next) {
1160			(sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
1161			buffer += m->m_len;
1162		}
1163		len = m0->m_pkthdr.len;
1164		if (len < ETHER_MIN_LEN - ETHER_CRC_LEN) {
1165			(sc->memcopyout)(sc, padbuf, buffer,
1166			    ETHER_MIN_LEN - ETHER_CRC_LEN - len);
1167			buffer += ETHER_MIN_LEN -ETHER_CRC_LEN - len;
1168			len = ETHER_MIN_LEN - ETHER_CRC_LEN;
1169		}
1170		m_freem(m0);
1171
1172		/*
1173		 * Setup the transmit buffer descriptor here, while we
1174		 * know the packet's length.
1175		 */
1176		sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
1177				       len | IE_TBD_EOL);
1178		sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
1179		sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
1180				       IE_XBUF_ADDR(sc, head));
1181
1182		if (++head == NTXBUF)
1183			head = 0;
1184		sc->xchead = head;
1185
1186		s = splnet();
1187		/* Start the first packet transmitting. */
1188		if (sc->xmit_busy == 0)
1189			iexmit(sc);
1190
1191		sc->xmit_busy++;
1192		splx(s);
1193	}
1194}
1195
1196/*
1197 * Probe IE's ram setup   [ Move all this into MD front-end!? ]
1198 * Use only if SCP and ISCP represent offsets into shared ram space.
1199 */
1200int
1201i82586_proberam(struct ie_softc *sc)
1202{
1203	int result, off;
1204
1205	/* Put in 16-bit mode */
1206	off = IE_SCP_BUS_USE(sc->scp);
1207	sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
1208	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
1209
1210	/* Set the ISCP `busy' bit */
1211	off = IE_ISCP_BUSY(sc->iscp);
1212	sc->ie_bus_write16(sc, off, 1);
1213	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
1214
1215	if (sc->hwreset)
1216		(sc->hwreset)(sc, CHIP_PROBE);
1217
1218	(sc->chan_attn) (sc, CHIP_PROBE);
1219
1220	delay(100);		/* wait a while... */
1221
1222	/* Read back the ISCP `busy' bit; it should be clear by now */
1223	off = IE_ISCP_BUSY(sc->iscp);
1224	IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1225	result = sc->ie_bus_read16(sc, off) == 0;
1226
1227	/* Acknowledge any interrupts we may have caused. */
1228	ie_ack(sc, IE_ST_WHENCE);
1229
1230	return (result);
1231}
1232
1233void
1234i82586_reset(struct ie_softc *sc, int hard)
1235{
1236	int s = splnet();
1237
1238	if (hard)
1239		printf("%s: reset\n", device_xname(sc->sc_dev));
1240
1241	sc->sc_ethercom.ec_if.if_timer = 0;
1242
1243	/*
1244	 * Stop i82586 dead in its tracks.
1245	 */
1246	if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
1247		aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
1248
1249	/*
1250	 * This can really slow down the i82586_reset() on some cards, but it's
1251	 * necessary to unwedge other ones (eg, the Sun VME ones) from certain
1252	 * lockups.
1253	 */
1254	if (hard && sc->hwreset)
1255		(sc->hwreset)(sc, CARD_RESET);
1256
1257	delay(100);
1258	ie_ack(sc, IE_ST_WHENCE);
1259
1260	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
1261		int retries=0;	/* XXX - find out why init sometimes fails */
1262		while (retries++ < 2)
1263			if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
1264				break;
1265	}
1266
1267	splx(s);
1268}
1269
1270
1271static void
1272setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
1273{
1274	/* Setup a simple command */
1275	sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
1276	sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
1277	sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
1278
1279	/* Assign the command buffer to the SCB command list */
1280	sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
1281}
1282
1283/*
1284 * Run the time-domain reflectometer.
1285 */
1286static void
1287ie_run_tdr(struct ie_softc *sc, int cmd)
1288{
1289	int result;
1290
1291	setup_simple_command(sc, IE_CMD_TDR, cmd);
1292	sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
1293
1294	if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
1295	    (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
1296		result = 0x10000; /* XXX */
1297	else
1298		result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
1299
1300	/* Squash any pending interrupts */
1301	ie_ack(sc, IE_ST_WHENCE);
1302
1303	if (result & IE_TDR_SUCCESS)
1304		return;
1305
1306	if (result & 0x10000)
1307		aprint_error_dev(sc->sc_dev, "TDR command failed\n");
1308	else if (result & IE_TDR_XCVR)
1309		aprint_error_dev(sc->sc_dev, "transceiver problem\n");
1310	else if (result & IE_TDR_OPEN)
1311		aprint_error_dev(sc->sc_dev, "TDR detected incorrect "
1312		    "termination %d clocks away\n", result & IE_TDR_TIME);
1313	else if (result & IE_TDR_SHORT)
1314		aprint_error_dev(sc->sc_dev, "TDR detected a short circuit "
1315		    "%d clocks away\n", result & IE_TDR_TIME);
1316	else
1317		aprint_error_dev(sc->sc_dev,
1318		    "TDR returned unknown status 0x%x\n", result);
1319}
1320
1321
1322/*
1323 * i82586_setup_bufs: set up the buffers
1324 *
1325 * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
1326 * this is to be used for the buffers.  The chip indexes its control data
1327 * structures with 16 bit offsets, and it indexes actual buffers with
1328 * 24 bit addresses.   So we should allocate control buffers first so that
1329 * we don't overflow the 16 bit offset field.   The number of transmit
1330 * buffers is fixed at compile time.
1331 *
1332 */
1333static void
1334i82586_setup_bufs(struct ie_softc *sc)
1335{
1336	int	ptr = sc->buf_area;	/* memory pool */
1337	int	n, r;
1338
1339	/*
1340	 * step 0: zero memory and figure out how many recv buffers and
1341	 * frames we can have.
1342	 */
1343	ptr = (ptr + 3) & ~3;	/* set alignment and stick with it */
1344
1345
1346	/*
1347	 *  step 1: lay out data structures in the shared-memory area
1348	 */
1349
1350	/* The no-op commands; used if "nop-chaining" is in effect */
1351	sc->nop_cmds = ptr;
1352	ptr += NTXBUF * IE_CMD_NOP_SZ;
1353
1354	/* The transmit commands */
1355	sc->xmit_cmds = ptr;
1356	ptr += NTXBUF * IE_CMD_XMIT_SZ;
1357
1358	/* The transmit buffers descriptors */
1359	sc->xbds = ptr;
1360	ptr += NTXBUF * IE_XBD_SZ;
1361
1362	/* The transmit buffers */
1363	sc->xbufs = ptr;
1364	ptr += NTXBUF * IE_TBUF_SIZE;
1365
1366	ptr = (ptr + 3) & ~3;		/* re-align.. just in case */
1367
1368	/* Compute free space for RECV stuff */
1369	n = sc->buf_area_sz - (ptr - sc->buf_area);
1370
1371	/* Compute size of one RECV frame */
1372	r = IE_RFRAME_SZ + ((IE_RBD_SZ + IE_RBUF_SIZE) * B_PER_F);
1373
1374	sc->nframes = n / r;
1375
1376	if (sc->nframes <= 0)
1377		panic("ie: bogus buffer calc");
1378
1379	sc->nrxbuf = sc->nframes * B_PER_F;
1380
1381	/* The receive frame descriptors */
1382	sc->rframes = ptr;
1383	ptr += sc->nframes * IE_RFRAME_SZ;
1384
1385	/* The receive buffer descriptors */
1386	sc->rbds = ptr;
1387	ptr += sc->nrxbuf * IE_RBD_SZ;
1388
1389	/* The receive buffers */
1390	sc->rbufs = ptr;
1391	ptr += sc->nrxbuf * IE_RBUF_SIZE;
1392
1393#if I82586_DEBUG
1394	printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev),
1395	    sc->nframes, sc->nrxbuf);
1396#endif
1397
1398	/*
1399	 * step 2: link together the recv frames and set EOL on last one
1400	 */
1401	for (n = 0; n < sc->nframes; n++) {
1402		int m = (n == sc->nframes - 1) ? 0 : n + 1;
1403
1404		/* Clear status */
1405		sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes, n), 0);
1406
1407		/* RBD link = NULL */
1408		sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, n),
1409				       0xffff);
1410
1411		/* Make a circular list */
1412		sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes, n),
1413				       IE_RFRAME_ADDR(sc->rframes, m));
1414
1415		/* Mark last as EOL */
1416		sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes, n),
1417				       ((m==0)? (IE_FD_EOL | IE_FD_SUSP) : 0));
1418	}
1419
1420	/*
1421	 * step 3: link the RBDs and set EOL on last one
1422	 */
1423	for (n = 0; n < sc->nrxbuf; n++) {
1424		int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
1425
1426		/* Clear status */
1427		sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds, n), 0);
1428
1429		/* Make a circular list */
1430		sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds, n),
1431				       IE_RBD_ADDR(sc->rbds, m));
1432
1433		/* Link to data buffers */
1434		sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
1435				       IE_RBUF_ADDR(sc, n));
1436		sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds, n),
1437				       IE_RBUF_SIZE | ((m==0)?IE_RBD_EOL:0));
1438	}
1439
1440	/*
1441	 * step 4: all xmit no-op commands loopback onto themselves
1442	 */
1443	for (n = 0; n < NTXBUF; n++) {
1444		sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
1445
1446		sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
1447					 IE_CMD_NOP);
1448
1449		sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
1450					 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
1451	}
1452
1453
1454	/*
1455	 * step 6: set the head and tail pointers on receive to keep track of
1456	 * the order in which RFDs and RBDs are used.
1457	 */
1458
1459	/* Pointers to last packet sent and next available transmit buffer. */
1460	sc->xchead = sc->xctail = 0;
1461
1462	/* Clear transmit-busy flag and set number of free transmit buffers. */
1463	sc->xmit_busy = 0;
1464
1465	/*
1466	 * Pointers to first and last receive frame.
1467	 * The RFD pointed to by rftail is the only one that has EOL set.
1468	 */
1469	sc->rfhead = 0;
1470	sc->rftail = sc->nframes - 1;
1471
1472	/*
1473	 * Pointers to first and last receive descriptor buffer.
1474	 * The RBD pointed to by rbtail is the only one that has EOL set.
1475	 */
1476	sc->rbhead = 0;
1477	sc->rbtail = sc->nrxbuf - 1;
1478
1479/* link in recv frames * and buffer into the scb. */
1480#if I82586_DEBUG
1481	printf("%s: reserved %d bytes\n",
1482		device_xname(sc->sc_dev), ptr - sc->buf_area);
1483#endif
1484}
1485
1486static int
1487ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
1488{
1489	int cmdresult, status;
1490	uint8_t buf[IE_CMD_CFG_SZ]; /* XXX malloc? */
1491
1492	*IE_CMD_CFG_CNT(buf)	   = 0x0c;
1493	*IE_CMD_CFG_FIFO(buf)	   = 8;
1494	*IE_CMD_CFG_SAVEBAD(buf)   = 0x40;
1495	*IE_CMD_CFG_ADDRLEN(buf)   = 0x2e;
1496	*IE_CMD_CFG_PRIORITY(buf)  = 0;
1497	*IE_CMD_CFG_IFS(buf)	   = 0x60;
1498	*IE_CMD_CFG_SLOT_LOW(buf)  = 0;
1499	*IE_CMD_CFG_SLOT_HIGH(buf) = 0xf2;
1500	*IE_CMD_CFG_PROMISC(buf)   = (!!promiscuous) | manchester << 2;
1501	*IE_CMD_CFG_CRSCDT(buf)	   = 0;
1502	*IE_CMD_CFG_MINLEN(buf)	   = 64;
1503	*IE_CMD_CFG_JUNK(buf)	   = 0xff;
1504	sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
1505	setup_simple_command(sc, IE_CMD_CONFIG, cmd);
1506	IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
1507
1508	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
1509	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
1510	if (cmdresult != 0) {
1511		aprint_error_dev(sc->sc_dev,
1512		    "configure command timed out; status %x\n", status);
1513		return (0);
1514	}
1515	if ((status & IE_STAT_OK) == 0) {
1516		aprint_error_dev(sc->sc_dev,
1517		    "configure command failed; status %x\n", status);
1518		return (0);
1519	}
1520
1521	/* Squash any pending interrupts */
1522	ie_ack(sc, IE_ST_WHENCE);
1523	return (1);
1524}
1525
1526static int
1527ie_ia_setup(struct ie_softc *sc, int cmdbuf)
1528{
1529	int cmdresult, status;
1530	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1531
1532	setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
1533
1534	(sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
1535			 IE_CMD_IAS_EADDR(cmdbuf), ETHER_ADDR_LEN);
1536
1537	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
1538	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1539	if (cmdresult != 0) {
1540		aprint_error_dev(sc->sc_dev,
1541		    "individual address command timed out; status %x\n",
1542		    status);
1543		return (0);
1544	}
1545	if ((status & IE_STAT_OK) == 0) {
1546		aprint_error_dev(sc->sc_dev,
1547		    "individual address command failed; status %x\n", status);
1548		return (0);
1549	}
1550
1551	/* Squash any pending interrupts */
1552	ie_ack(sc, IE_ST_WHENCE);
1553	return (1);
1554}
1555
1556/*
1557 * Run the multicast setup command.
1558 * Called at splnet().
1559 */
1560static int
1561ie_mc_setup(struct ie_softc *sc, int cmdbuf)
1562{
1563	int cmdresult, status;
1564
1565	if (sc->mcast_count == 0)
1566		return (1);
1567
1568	setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
1569
1570	(sc->memcopyout)(sc, (void *)sc->mcast_addrs,
1571			 IE_CMD_MCAST_MADDR(cmdbuf),
1572			 sc->mcast_count * ETHER_ADDR_LEN);
1573
1574	sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
1575			       sc->mcast_count * ETHER_ADDR_LEN);
1576
1577	/* Start the command */
1578	cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL,
1579	    0);
1580	status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1581	if (cmdresult != 0) {
1582		aprint_error_dev(sc->sc_dev,
1583		    "multicast setup command timed out; status %x\n", status);
1584		return (0);
1585	}
1586	if ((status & IE_STAT_OK) == 0) {
1587		aprint_error_dev(sc->sc_dev,
1588		    "multicast setup command failed; status %x\n", status);
1589		return (0);
1590	}
1591
1592	/* Squash any pending interrupts */
1593	ie_ack(sc, IE_ST_WHENCE);
1594	return (1);
1595}
1596
1597/*
1598 * This routine takes the environment generated by check_ie_present() and adds
1599 * to it all the other structures we need to operate the adapter.  This
1600 * includes executing the CONFIGURE, IA-SETUP, and MC-SETUP commands, starting
1601 * the receiver unit, and clearing interrupts.
1602 *
1603 * THIS ROUTINE MUST BE CALLED AT splnet() OR HIGHER.
1604 */
1605int
1606i82586_init(struct ifnet *ifp)
1607{
1608	struct ie_softc *sc = ifp->if_softc;
1609	int cmd;
1610
1611	sc->async_cmd_inprogress = 0;
1612
1613	cmd = sc->buf_area;
1614
1615	/*
1616	 * Send the configure command first.
1617	 */
1618	if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
1619		return EIO;
1620
1621	/*
1622	 * Send the Individual Address Setup command.
1623	 */
1624	if (ie_ia_setup(sc, cmd) == 0)
1625		return EIO;
1626
1627	/*
1628	 * Run the time-domain reflectometer.
1629	 */
1630	ie_run_tdr(sc, cmd);
1631
1632	/*
1633	 * Set the multi-cast filter, if any
1634	 */
1635	if (ie_mc_setup(sc, cmd) == 0)
1636		return EIO;
1637
1638	/*
1639	 * Acknowledge any interrupts we have generated thus far.
1640	 */
1641	ie_ack(sc, IE_ST_WHENCE);
1642
1643	/*
1644	 * Set up the transmit and recv buffers.
1645	 */
1646	i82586_setup_bufs(sc);
1647
1648	if (sc->hwinit)
1649		(sc->hwinit)(sc);
1650
1651	ifp->if_flags |= IFF_RUNNING;
1652
1653	if (NTXBUF < 2)
1654		sc->do_xmitnopchain = 0;
1655
1656	i82586_start_transceiver(sc);
1657	return (0);
1658}
1659
1660/*
1661 * Start the RU and possibly the CU unit
1662 */
1663static void
1664i82586_start_transceiver(struct ie_softc *sc)
1665{
1666
1667	/*
1668	 * Start RU at current position in frame & RBD lists.
1669	 */
1670	sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, sc->rfhead),
1671			       IE_RBD_ADDR(sc->rbds, sc->rbhead));
1672
1673	sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
1674			       IE_RFRAME_ADDR(sc->rframes, sc->rfhead));
1675
1676	if (sc->do_xmitnopchain) {
1677		/* Stop transmit command chain */
1678		if (i82586_start_cmd(sc, IE_CUC_SUSPEND | IE_RUC_SUSPEND,
1679		    0, 0, 0))
1680			aprint_error_dev(sc->sc_dev,
1681			    "CU/RU stop command timed out\n");
1682
1683		/* Start the receiver & transmitter chain */
1684		/* sc->scb->ie_command_list =
1685			IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
1686		sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
1687				   IE_CMD_NOP_ADDR(
1688					sc->nop_cmds,
1689					(sc->xctail + NTXBUF - 1) % NTXBUF));
1690
1691		if (i82586_start_cmd(sc, IE_CUC_START | IE_RUC_START, 0, 0, 0))
1692			aprint_error_dev(sc->sc_dev,
1693			    "CU/RU command timed out\n");
1694	} else {
1695		if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
1696			aprint_error_dev(sc->sc_dev, "RU command timed out\n");
1697	}
1698}
1699
1700void
1701i82586_stop(struct ifnet *ifp, int disable)
1702{
1703	struct ie_softc *sc = ifp->if_softc;
1704
1705	if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
1706		aprint_error_dev(sc->sc_dev,
1707		    "iestop: disable commands timed out\n");
1708}
1709
1710int
1711i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
1712{
1713	struct ie_softc *sc = ifp->if_softc;
1714	int s, error = 0;
1715
1716	s = splnet();
1717	switch (cmd) {
1718	default:
1719		error = ether_ioctl(ifp, cmd, data);
1720		if (error == ENETRESET) {
1721			/*
1722			 * Multicast list has changed; set the hardware filter
1723			 * accordingly.
1724			 */
1725			if (ifp->if_flags & IFF_RUNNING)
1726				ie_mc_reset(sc);
1727			error = 0;
1728		}
1729		break;
1730	}
1731#if I82586_DEBUG
1732	if (cmd == SIOCSIFFLAGS)
1733		sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
1734#endif
1735	splx(s);
1736	return (error);
1737}
1738
1739static void
1740ie_mc_reset(struct ie_softc *sc)
1741{
1742	struct ethercom *ec = &sc->sc_ethercom;
1743	struct ether_multi *enm;
1744	struct ether_multistep step;
1745	int size;
1746
1747	/*
1748	 * Step through the list of addresses.
1749	 */
1750again:
1751	size = 0;
1752	sc->mcast_count = 0;
1753	ETHER_LOCK(ec);
1754	ETHER_FIRST_MULTI(step, ec, enm);
1755	while (enm) {
1756		size += 6;
1757		if (sc->mcast_count >= IE_MAXMCAST ||
1758		    memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
1759			ec->ec_if.if_flags |= IFF_ALLMULTI;
1760			i82586_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL);
1761			ETHER_UNLOCK(ec);
1762			return;
1763		}
1764		ETHER_NEXT_MULTI(step, enm);
1765	}
1766	ETHER_UNLOCK(ec);
1767
1768	if (size > sc->mcast_addrs_size) {
1769		/* Need to allocate more space */
1770		if (sc->mcast_addrs_size)
1771			free(sc->mcast_addrs, M_IFMADDR);
1772		sc->mcast_addrs = (char *)
1773			malloc(size, M_IFMADDR, M_WAITOK);
1774		sc->mcast_addrs_size = size;
1775	}
1776
1777	/*
1778	 * We've got the space; now copy the addresses
1779	 */
1780	ETHER_LOCK(ec);
1781	ETHER_FIRST_MULTI(step, ec, enm);
1782	while (enm) {
1783		if (sc->mcast_count >= IE_MAXMCAST) {
1784			ETHER_UNLOCK(ec);
1785			goto again; /* Just in case */
1786		}
1787
1788		memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
1789		sc->mcast_count++;
1790		ETHER_NEXT_MULTI(step, enm);
1791	}
1792	ETHER_UNLOCK(ec);
1793	sc->want_mcsetup = 1;
1794}
1795
1796/*
1797 * Media change callback.
1798 */
1799int
1800i82586_mediachange(struct ifnet *ifp)
1801{
1802	struct ie_softc *sc = ifp->if_softc;
1803
1804	if (sc->sc_mediachange)
1805		return ((*sc->sc_mediachange)(sc));
1806	return (0);
1807}
1808
1809/*
1810 * Media status callback.
1811 */
1812void
1813i82586_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
1814{
1815	struct ie_softc *sc = ifp->if_softc;
1816
1817	if (sc->sc_mediastatus)
1818		(*sc->sc_mediastatus)(sc, ifmr);
1819}
1820
1821#if I82586_DEBUG
1822void
1823print_rbd(struct ie_softc *sc, int n)
1824{
1825
1826	printf("RBD at %08x:\n	status %04x, next %04x, buffer %lx\n"
1827		"length/EOL %04x\n", IE_RBD_ADDR(sc->rbds, n),
1828		sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds, n)),
1829		sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds, n)),
1830		(u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
1831		sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds, n)));
1832}
1833#endif
1834