seeq8005.c revision 1.12
1/* $NetBSD: seeq8005.c,v 1.12 2001/03/24 23:31:06 bjh21 Exp $ */
2
3/*
4 * Copyright (c) 2000 Ben Harris
5 * Copyright (c) 1995-1998 Mark Brinicombe
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by Mark Brinicombe
19 *	for the NetBSD Project.
20 * 4. The name of the company nor the name of the author may be used to
21 *    endorse or promote products derived from this software without specific
22 *    prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36/*
37 * seeq8005.c - SEEQ 8005 device driver
38 */
39/*
40 * This driver currently supports the following chip:
41 * SEEQ 8005 Advanced Ethernet Data Link Controller
42 */
43/*
44 * More information on the 8004 and 8005 AEDLC controllers can be found in
45 * the SEEQ Technology Inc 1992 Data Comm Devices data book.
46 *
47 * This data book may no longer be available as these are rather old chips
48 * (1991 - 1993)
49 */
50/*
51 * This driver is based on the arm32 ea(4) driver, hence the names of many
52 * of the functions.
53 */
54/*
55 * Bugs/possible improvements:
56 *	- Does not currently support DMA
57 *	- Does not transmit multiple packets in one go
58 *	- Does not support 8-bit busses
59 */
60
61#include "opt_inet.h"
62#include "opt_ns.h"
63
64#include <sys/types.h>
65#include <sys/param.h>
66
67__RCSID("$NetBSD: seeq8005.c,v 1.12 2001/03/24 23:31:06 bjh21 Exp $");
68
69#include <sys/systm.h>
70#include <sys/endian.h>
71#include <sys/errno.h>
72#include <sys/ioctl.h>
73#include <sys/mbuf.h>
74#include <sys/socket.h>
75#include <sys/syslog.h>
76#include <sys/device.h>
77
78#include <net/if.h>
79#include <net/if_dl.h>
80#include <net/if_types.h>
81#include <net/if_ether.h>
82#include <net/if_media.h>
83
84#ifdef INET
85#include <netinet/in.h>
86#include <netinet/in_systm.h>
87#include <netinet/in_var.h>
88#include <netinet/ip.h>
89#include <netinet/if_inarp.h>
90#endif
91
92#ifdef NS
93#include <netns/ns.h>
94#include <netns/ns_if.h>
95#endif
96
97#include "bpfilter.h"
98#if NBPFILTER > 0
99#include <net/bpf.h>
100#include <net/bpfdesc.h>
101#endif
102
103#include <machine/bus.h>
104#include <machine/intr.h>
105
106#include <dev/ic/seeq8005reg.h>
107#include <dev/ic/seeq8005var.h>
108
109/*#define SEEQ_DEBUG*/
110
111/* for debugging convenience */
112#ifdef SEEQ_DEBUG
113#define SEEQ_DEBUG_MISC		1
114#define SEEQ_DEBUG_TX		2
115#define SEEQ_DEBUG_RX		4
116#define SEEQ_DEBUG_PKT		8
117#define SEEQ_DEBUG_TXINT	16
118#define SEEQ_DEBUG_RXINT	32
119int seeq_debug = 0;
120#define DPRINTF(f, x) { if (seeq_debug & (f)) printf x; }
121#else
122#define DPRINTF(f, x)
123#endif
124#define dprintf(x) DPRINTF(SEEQ_DEBUG_MISC, x)
125
126#define	SEEQ_TX_BUFFER_SIZE		0x800		/* (> MAX_ETHER_LEN) */
127
128/*
129 * prototypes
130 */
131
132static int ea_init(struct ifnet *);
133static int ea_ioctl(struct ifnet *, u_long, caddr_t);
134static void ea_start(struct ifnet *);
135static void ea_watchdog(struct ifnet *);
136static void ea_chipreset(struct seeq8005_softc *);
137static void ea_ramtest(struct seeq8005_softc *);
138static int ea_stoptx(struct seeq8005_softc *);
139static int ea_stoprx(struct seeq8005_softc *);
140static void ea_stop(struct ifnet *, int);
141static void ea_await_fifo_empty(struct seeq8005_softc *);
142static void ea_await_fifo_full(struct seeq8005_softc *);
143static void ea_writebuf(struct seeq8005_softc *, u_char *, int, size_t);
144static void ea_readbuf(struct seeq8005_softc *, u_char *, int, size_t);
145static void ea_select_buffer(struct seeq8005_softc *, int);
146static void ea_set_address(struct seeq8005_softc *, int, const u_int8_t *);
147static void ea_read(struct seeq8005_softc *, int, int);
148static struct mbuf *ea_get(struct seeq8005_softc *, int, int, struct ifnet *);
149static void ea_getpackets(struct seeq8005_softc *);
150static void eatxpacket(struct seeq8005_softc *);
151static int ea_writembuf(struct seeq8005_softc *, struct mbuf *, int);
152static void ea_mc_reset(struct seeq8005_softc *);
153static void ea_mc_reset_8004(struct seeq8005_softc *);
154static void ea_mc_reset_8005(struct seeq8005_softc *);
155static int ea_mediachange(struct ifnet *);
156static void ea_mediastatus(struct ifnet *, struct ifmediareq *);
157
158
159/*
160 * Attach chip.
161 */
162
163void
164seeq8005_attach(struct seeq8005_softc *sc, const u_int8_t *myaddr, int *media,
165    int nmedia, int defmedia)
166{
167	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
168	u_int id;
169
170	KASSERT(myaddr != NULL);
171	printf(" address %s", ether_sprintf(myaddr));
172
173	/* Stop the board. */
174
175	ea_chipreset(sc);
176
177	/* Get the product ID */
178
179	ea_select_buffer(sc, SEEQ_BUFCODE_PRODUCTID);
180	id = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN);
181
182	switch (id & SEEQ_PRODUCTID_MASK) {
183	case SEEQ_PRODUCTID_8004:
184		sc->sc_variant = SEEQ_8004;
185		break;
186	default:	/* XXX */
187		sc->sc_variant = SEEQ_8005;
188		break;
189	}
190
191	switch (sc->sc_variant) {
192	case SEEQ_8004:
193		printf(", SEEQ80C04 rev %x\n",
194		    id & SEEQ_PRODUCTID_REV_MASK);
195		break;
196	case SEEQ_8005:
197		if (id != 0xff)
198			printf(", SEEQ8005 rev %x\n", id);
199		else
200			printf(", SEEQ8005\n");
201		break;
202	default:
203		printf(", Unknown ethernet controller\n");
204		return;
205	}
206
207	/* Both the 8004 and 8005 are designed for 64K Buffer memory */
208	sc->sc_buffersize = SEEQ_MAX_BUFFER_SIZE;
209
210	/*
211	 * Set up tx and rx buffers.
212	 *
213	 * We use approximately a quarter of the packet memory for TX
214	 * buffers and the rest for RX buffers
215	 */
216	/* sc->sc_tx_bufs = sc->sc_buffersize / SEEQ_TX_BUFFER_SIZE / 4; */
217	sc->sc_tx_bufs = 1;
218	sc->sc_tx_bufsize = sc->sc_tx_bufs * SEEQ_TX_BUFFER_SIZE;
219	sc->sc_rx_bufsize = sc->sc_buffersize - sc->sc_tx_bufsize;
220	sc->sc_enabled = 0;
221
222	/* Test the RAM */
223	ea_ramtest(sc);
224
225	printf("%s: %dKB packet memory, txbuf=%dKB (%d buffers), rxbuf=%dKB",
226	    sc->sc_dev.dv_xname, sc->sc_buffersize >> 10,
227	    sc->sc_tx_bufsize >> 10, sc->sc_tx_bufs, sc->sc_rx_bufsize >> 10);
228
229	/* Initialise ifnet structure. */
230
231	bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
232	ifp->if_softc = sc;
233	ifp->if_start = ea_start;
234	ifp->if_ioctl = ea_ioctl;
235	ifp->if_init = ea_init;
236	ifp->if_stop = ea_stop;
237	ifp->if_watchdog = ea_watchdog;
238	ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST | IFF_NOTRAILERS;
239	if (sc->sc_variant == SEEQ_8004)
240		ifp->if_flags |= IFF_SIMPLEX;
241	IFQ_SET_READY(&ifp->if_snd);
242
243	/* Initialize media goo. */
244	ifmedia_init(&sc->sc_media, 0, ea_mediachange, ea_mediastatus);
245	if (media != NULL) {
246		int i;
247
248		for (i = 0; i < nmedia; i++)
249			ifmedia_add(&sc->sc_media, media[i], 0, NULL);
250		ifmedia_set(&sc->sc_media, defmedia);
251	} else {
252		ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
253		ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
254	}
255
256	/* Now we can attach the interface. */
257
258	if_attach(ifp);
259	ether_ifattach(ifp, myaddr);
260
261	printf("\n");
262}
263
264/*
265 * Media change callback.
266 */
267static int
268ea_mediachange(struct ifnet *ifp)
269{
270	struct seeq8005_softc *sc = ifp->if_softc;
271
272	if (sc->sc_mediachange)
273		return ((*sc->sc_mediachange)(sc));
274	return (EINVAL);
275}
276
277/*
278 * Media status callback.
279 */
280static void
281ea_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
282{
283	struct seeq8005_softc *sc = ifp->if_softc;
284
285	if (sc->sc_enabled == 0) {
286		ifmr->ifm_active = IFM_ETHER | IFM_NONE;
287		ifmr->ifm_status = 0;
288		return;
289	}
290
291	if (sc->sc_mediastatus)
292		(*sc->sc_mediastatus)(sc, ifmr);
293}
294
295/*
296 * Test the RAM on the ethernet card.
297 */
298
299void
300ea_ramtest(struct seeq8005_softc *sc)
301{
302	bus_space_tag_t iot = sc->sc_iot;
303	bus_space_handle_t ioh = sc->sc_ioh;
304	int loop;
305	u_int sum = 0;
306
307/*	dprintf(("ea_ramtest()\n"));*/
308
309	/*
310	 * Test the buffer memory on the board.
311	 * Write simple pattens to it and read them back.
312	 */
313
314	/* Set up the whole buffer RAM for writing */
315
316	ea_select_buffer(sc, SEEQ_BUFCODE_TX_EAP);
317	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, (SEEQ_MAX_BUFFER_SIZE >> 8) - 1);
318	bus_space_write_2(iot, ioh, SEEQ_TX_PTR, 0x0000);
319	bus_space_write_2(iot, ioh, SEEQ_RX_PTR, SEEQ_MAX_BUFFER_SIZE - 2);
320
321#define SEEQ_RAMTEST_LOOP(value)						\
322do {									\
323	/* Set the write start address and write a pattern */		\
324	ea_writebuf(sc, NULL, 0x0000, 0);				\
325	for (loop = 0; loop < SEEQ_MAX_BUFFER_SIZE; loop += 2)		\
326		bus_space_write_2(iot, ioh, SEEQ_BUFWIN, (value));	\
327									\
328	/* Set the read start address and verify the pattern */		\
329	ea_readbuf(sc, NULL, 0x0000, 0);				\
330	for (loop = 0; loop < SEEQ_MAX_BUFFER_SIZE; loop += 2)		\
331		if (bus_space_read_2(iot, ioh, SEEQ_BUFWIN) != (value)) \
332			++sum;						\
333	if (sum != 0)							\
334		dprintf(("sum=%d\n", sum));				\
335} while (/*CONSTCOND*/0)
336
337	SEEQ_RAMTEST_LOOP(loop);
338	SEEQ_RAMTEST_LOOP(loop ^ (SEEQ_MAX_BUFFER_SIZE - 1));
339	SEEQ_RAMTEST_LOOP(0xaa55);
340	SEEQ_RAMTEST_LOOP(0x55aa);
341
342	/* Report */
343
344	if (sum > 0)
345		printf("%s: buffer RAM failed self test, %d faults\n",
346		       sc->sc_dev.dv_xname, sum);
347}
348
349
350/*
351 * Stop the tx interface.
352 *
353 * Returns 0 if the tx was already stopped or 1 if it was active
354 */
355
356static int
357ea_stoptx(struct seeq8005_softc *sc)
358{
359	bus_space_tag_t iot = sc->sc_iot;
360	bus_space_handle_t ioh = sc->sc_ioh;
361	int timeout;
362	int status;
363
364	DPRINTF(SEEQ_DEBUG_TX, ("seeq_stoptx()\n"));
365
366	sc->sc_enabled = 0;
367
368	status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
369	if (!(status & SEEQ_STATUS_TX_ON))
370		return 0;
371
372	/* Stop any tx and wait for confirmation */
373	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
374			  sc->sc_command | SEEQ_CMD_TX_OFF);
375
376	timeout = 20000;
377	do {
378		status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
379		delay(1);
380	} while ((status & SEEQ_STATUS_TX_ON) && --timeout > 0);
381 	if (timeout == 0)
382		log(LOG_ERR, "%s: timeout waiting for tx termination\n",
383		    sc->sc_dev.dv_xname);
384
385	/* Clear any pending tx interrupt */
386	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
387		   sc->sc_command | SEEQ_CMD_TX_INTACK);
388	return 1;
389}
390
391
392/*
393 * Stop the rx interface.
394 *
395 * Returns 0 if the tx was already stopped or 1 if it was active
396 */
397
398static int
399ea_stoprx(struct seeq8005_softc *sc)
400{
401	bus_space_tag_t iot = sc->sc_iot;
402	bus_space_handle_t ioh = sc->sc_ioh;
403	int timeout;
404	int status;
405
406	DPRINTF(SEEQ_DEBUG_RX, ("seeq_stoprx()\n"));
407
408	status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
409	if (!(status & SEEQ_STATUS_RX_ON))
410		return 0;
411
412	/* Stop any rx and wait for confirmation */
413
414	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
415			  sc->sc_command | SEEQ_CMD_RX_OFF);
416
417	timeout = 20000;
418	do {
419		status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
420	} while ((status & SEEQ_STATUS_RX_ON) && --timeout > 0);
421	if (timeout == 0)
422		log(LOG_ERR, "%s: timeout waiting for rx termination\n",
423		    sc->sc_dev.dv_xname);
424
425	/* Clear any pending rx interrupt */
426
427	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
428		   sc->sc_command | SEEQ_CMD_RX_INTACK);
429	return 1;
430}
431
432
433/*
434 * Stop interface.
435 * Stop all IO and shut the interface down
436 */
437
438static void
439ea_stop(struct ifnet *ifp, int disable)
440{
441	struct seeq8005_softc *sc = ifp->if_softc;
442	bus_space_tag_t iot = sc->sc_iot;
443	bus_space_handle_t ioh = sc->sc_ioh;
444
445	DPRINTF(SEEQ_DEBUG_MISC, ("seeq_stop()\n"));
446
447	/* Stop all IO */
448	ea_stoptx(sc);
449	ea_stoprx(sc);
450
451	/* Disable rx and tx interrupts */
452	sc->sc_command &= (SEEQ_CMD_RX_INTEN | SEEQ_CMD_TX_INTEN);
453
454	/* Clear any pending interrupts */
455	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
456			  sc->sc_command | SEEQ_CMD_RX_INTACK |
457			  SEEQ_CMD_TX_INTACK | SEEQ_CMD_DMA_INTACK |
458			  SEEQ_CMD_BW_INTACK);
459
460	if (sc->sc_variant == SEEQ_8004) {
461		/* Put the chip to sleep */
462		ea_select_buffer(sc, SEEQ_BUFCODE_CONFIG3);
463		bus_space_write_2(iot, ioh, SEEQ_BUFWIN,
464		    sc->sc_config3 | SEEQ_CFG3_SLEEP);
465	}
466
467	/* Cancel any watchdog timer */
468       	sc->sc_ethercom.ec_if.if_timer = 0;
469}
470
471
472/*
473 * Reset the chip
474 * Following this the software registers are reset
475 */
476
477static void
478ea_chipreset(struct seeq8005_softc *sc)
479{
480	bus_space_tag_t iot = sc->sc_iot;
481	bus_space_handle_t ioh = sc->sc_ioh;
482
483	DPRINTF(SEEQ_DEBUG_MISC, ("seeq_chipreset()\n"));
484
485	/* Reset the controller. Min of 4us delay here */
486
487	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, SEEQ_CFG2_RESET);
488	delay(4);
489
490	sc->sc_command = 0;
491	sc->sc_config1 = 0;
492	sc->sc_config2 = 0;
493	sc->sc_config3 = 0;
494}
495
496
497/*
498 * If the DMA FIFO's in write mode, wait for it to empty.  Needed when
499 * switching the FIFO from write to read.  We also use it when changing
500 * the address for writes.
501 */
502static void
503ea_await_fifo_empty(struct seeq8005_softc *sc)
504{
505	bus_space_tag_t iot = sc->sc_iot;
506	bus_space_handle_t ioh = sc->sc_ioh;
507	int timeout;
508
509	timeout = 20000;
510	if ((bus_space_read_2(iot, ioh, SEEQ_STATUS) &
511	     SEEQ_STATUS_FIFO_DIR) != 0)
512		return; /* FIFO is reading anyway. */
513	while ((bus_space_read_2(iot, ioh, SEEQ_STATUS) &
514		SEEQ_STATUS_FIFO_EMPTY) == 0 &&
515	       --timeout > 0)
516		continue;
517}
518
519/*
520 * Wait for the DMA FIFO to fill before reading from it.
521 */
522static void
523ea_await_fifo_full(struct seeq8005_softc *sc)
524{
525	bus_space_tag_t iot = sc->sc_iot;
526	bus_space_handle_t ioh = sc->sc_ioh;
527	int timeout;
528
529	timeout = 20000;
530	while ((bus_space_read_2(iot, ioh, SEEQ_STATUS) &
531		SEEQ_STATUS_FIFO_FULL) == 0 &&
532	       --timeout > 0)
533		continue;
534}
535
536/*
537 * write to the buffer memory on the interface
538 *
539 * The buffer address is set to ADDR.
540 * If len != 0 then data is copied from the address starting at buf
541 * to the interface buffer.
542 * BUF must be usable as a u_int16_t *.
543 * If LEN is odd, it must be safe to overwrite one extra byte.
544 */
545
546static void
547ea_writebuf(struct seeq8005_softc *sc, u_char *buf, int addr, size_t len)
548{
549	bus_space_tag_t iot = sc->sc_iot;
550	bus_space_handle_t ioh = sc->sc_ioh;
551
552	dprintf(("writebuf: st=%04x\n",
553		 bus_space_read_2(iot, ioh, SEEQ_STATUS)));
554
555#ifdef DIAGNOSTIC
556	if (__predict_false(!ALIGNED_POINTER(buf, u_int16_t)))
557		panic("%s: unaligned writebuf", sc->sc_dev.dv_xname);
558#endif
559	if (__predict_false(addr >= SEEQ_MAX_BUFFER_SIZE))
560		panic("%s: writebuf out of range", sc->sc_dev.dv_xname);
561
562	/* Assume that copying too much is safe. */
563	if (len % 2 != 0)
564		len++;
565
566	if (addr != -1) {
567		ea_await_fifo_empty(sc);
568
569		ea_select_buffer(sc, SEEQ_BUFCODE_LOCAL_MEM);
570		bus_space_write_2(iot, ioh, SEEQ_COMMAND,
571		    sc->sc_command | SEEQ_CMD_FIFO_WRITE);
572		bus_space_write_2(iot, ioh, SEEQ_DMA_ADDR, addr);
573	}
574
575	if (len > 0)
576		bus_space_write_multi_2(iot, ioh, SEEQ_BUFWIN,
577					(u_int16_t *)buf, len / 2);
578	/* Leave FIFO to empty in the background */
579}
580
581
582/*
583 * read from the buffer memory on the interface
584 *
585 * The buffer address is set to ADDR.
586 * If len != 0 then data is copied from the interface buffer to the
587 * address starting at buf.
588 * BUF must be usable as a u_int16_t *.
589 * If LEN is odd, it must be safe to overwrite one extra byte.
590 */
591
592static void
593ea_readbuf(struct seeq8005_softc *sc, u_char *buf, int addr, size_t len)
594{
595
596	bus_space_tag_t iot = sc->sc_iot;
597	bus_space_handle_t ioh = sc->sc_ioh;
598
599	dprintf(("readbuf: st=%04x addr=%04x len=%d\n",
600		 bus_space_read_2(iot, ioh, SEEQ_STATUS), addr, len));
601
602#ifdef DIAGNOSTIC
603	if (!ALIGNED_POINTER(buf, u_int16_t))
604		panic("%s: unaligned readbuf", sc->sc_dev.dv_xname);
605#endif
606	if (addr >= SEEQ_MAX_BUFFER_SIZE)
607		panic("%s: writebuf out of range", sc->sc_dev.dv_xname);
608
609	/* Assume that copying too much is safe. */
610	if (len % 2 != 0)
611		len++;
612
613	if (addr != -1) {
614		ea_await_fifo_empty(sc);
615
616		ea_select_buffer(sc, SEEQ_BUFCODE_LOCAL_MEM);
617		bus_space_write_2(iot, ioh, SEEQ_DMA_ADDR, addr);
618		bus_space_write_2(iot, ioh, SEEQ_COMMAND,
619		    sc->sc_command | SEEQ_CMD_FIFO_READ);
620
621		ea_await_fifo_full(sc);
622	}
623
624	if (len > 0)
625		bus_space_read_multi_2(iot, ioh, SEEQ_BUFWIN,
626				       (u_int16_t *)buf, len / 2);
627}
628
629static void
630ea_select_buffer(struct seeq8005_softc *sc, int bufcode)
631{
632
633	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEEQ_CONFIG1,
634			  sc->sc_config1 | bufcode);
635}
636
637/* Must be called at splnet */
638static void
639ea_set_address(struct seeq8005_softc *sc, int which, u_int8_t const *ea)
640{
641	int i;
642
643	ea_select_buffer(sc, SEEQ_BUFCODE_STATION_ADDR0 + which);
644	for (i = 0; i < ETHER_ADDR_LEN; ++i)
645		bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN,
646				  ea[i]);
647}
648
649/*
650 * Initialize interface.
651 *
652 * This should leave the interface in a state for packet reception and
653 * transmission.
654 */
655
656static int
657ea_init(struct ifnet *ifp)
658{
659	struct seeq8005_softc *sc = ifp->if_softc;
660	bus_space_tag_t iot = sc->sc_iot;
661	bus_space_handle_t ioh = sc->sc_ioh;
662	int s;
663
664	dprintf(("ea_init()\n"));
665
666	s = splnet();
667
668	/* First, reset the board. */
669
670	ea_chipreset(sc);
671
672	/* Set up defaults for the registers */
673
674	sc->sc_command = 0;
675	sc->sc_config1 = 0;
676#if BYTE_ORDER == BIG_ENDIAN
677	sc->sc_config2 = SEEQ_CFG2_BYTESWAP;
678#else
679	sc->sc_config2 = 0;
680#endif
681	sc->sc_config3 = 0;
682
683	bus_space_write_2(iot, ioh, SEEQ_COMMAND, sc->sc_command);
684	bus_space_write_2(iot, ioh, SEEQ_CONFIG1, sc->sc_config1);
685	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
686	if (sc->sc_variant == SEEQ_8004) {
687		ea_select_buffer(sc, SEEQ_BUFCODE_CONFIG3);
688		bus_space_write_2(iot, ioh, SEEQ_BUFWIN, sc->sc_config3);
689	}
690
691	/* Write the station address - the receiver must be off */
692	ea_set_address(sc, 0, LLADDR(ifp->if_sadl));
693
694	/* Split board memory into Rx and Tx. */
695	ea_select_buffer(sc, SEEQ_BUFCODE_TX_EAP);
696	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, (sc->sc_tx_bufsize>> 8) - 1);
697
698	if (sc->sc_variant == SEEQ_8004)
699		sc->sc_config2 |= SEEQ_CFG2_RX_TX_DISABLE;
700
701	/* Configure rx. */
702	if (ifp->if_flags & IFF_PROMISC)
703		sc->sc_config1 = SEEQ_CFG1_PROMISCUOUS;
704	else if (ifp->if_flags & IFF_ALLMULTI)
705		sc->sc_config1 = SEEQ_CFG1_MULTICAST;
706	else
707		sc->sc_config1 = SEEQ_CFG1_BROADCAST;
708	sc->sc_config1 |= SEEQ_CFG1_STATION_ADDR0;
709	bus_space_write_2(iot, ioh, SEEQ_CONFIG1, sc->sc_config1);
710
711	/* Setup the Rx pointers */
712	sc->sc_rx_ptr = sc->sc_tx_bufsize;
713
714	bus_space_write_2(iot, ioh, SEEQ_RX_PTR, sc->sc_rx_ptr);
715	bus_space_write_2(iot, ioh, SEEQ_RX_END, sc->sc_rx_ptr >> 8);
716
717
718	/* Place a NULL header at the beginning of the receive area */
719	ea_writebuf(sc, NULL, sc->sc_rx_ptr, 0);
720
721	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, 0x0000);
722	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, 0x0000);
723
724
725	/* Configure TX. */
726	dprintf(("Configuring tx...\n"));
727
728	bus_space_write_2(iot, ioh, SEEQ_TX_PTR, 0x0000);
729
730	sc->sc_config2 |= SEEQ_CFG2_OUTPUT;
731	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
732
733	/* Reset tx buffer pointers */
734	sc->sc_tx_cur = 0;
735	sc->sc_tx_used = 0;
736	sc->sc_tx_next = 0;
737
738	/* Place a NULL header at the beginning of the transmit area */
739	ea_writebuf(sc, NULL, 0x0000, 0);
740
741	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, 0x0000);
742	bus_space_write_2(iot, ioh, SEEQ_BUFWIN, 0x0000);
743
744	sc->sc_command |= SEEQ_CMD_TX_INTEN;
745	bus_space_write_2(iot, ioh, SEEQ_COMMAND, sc->sc_command);
746
747	/* Turn on Rx */
748	sc->sc_command |= SEEQ_CMD_RX_INTEN;
749	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
750			  sc->sc_command | SEEQ_CMD_RX_ON);
751
752	/* TX_ON gets set by ea_txpacket when there's something to transmit. */
753
754
755	/* Set flags appropriately. */
756	ifp->if_flags |= IFF_RUNNING;
757	ifp->if_flags &= ~IFF_OACTIVE;
758	sc->sc_enabled = 1;
759
760	/* And start output. */
761	ea_start(ifp);
762
763	splx(s);
764	return 0;
765}
766
767/*
768 * Start output on interface. Get datagrams from the queue and output them,
769 * giving the receiver a chance between datagrams. Call only from splnet or
770 * interrupt level!
771 */
772
773static void
774ea_start(struct ifnet *ifp)
775{
776	struct seeq8005_softc *sc = ifp->if_softc;
777	int s;
778
779	s = splnet();
780#ifdef SEEQ_TX_DEBUG
781	dprintf(("ea_start()...\n"));
782#endif
783
784	/* Don't do anything if output is active. */
785
786	if (ifp->if_flags & IFF_OACTIVE)
787		return;
788
789	/* Mark interface as output active */
790
791	ifp->if_flags |= IFF_OACTIVE;
792
793	/* tx packets */
794
795	eatxpacket(sc);
796	splx(s);
797}
798
799
800/*
801 * Transfer a packet to the interface buffer and start transmission
802 *
803 * Called at splnet()
804 */
805
806void
807eatxpacket(struct seeq8005_softc *sc)
808{
809	bus_space_tag_t iot = sc->sc_iot;
810	bus_space_handle_t ioh = sc->sc_ioh;
811	struct mbuf *m0;
812	struct ifnet *ifp;
813
814	ifp = &sc->sc_ethercom.ec_if;
815
816	/* Dequeue the next packet. */
817	IFQ_DEQUEUE(&ifp->if_snd, m0);
818
819	/* If there's nothing to send, return. */
820	if (!m0) {
821		ifp->if_flags &= ~IFF_OACTIVE;
822		sc->sc_config2 |= SEEQ_CFG2_OUTPUT;
823		bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
824#ifdef SEEQ_TX_DEBUG
825		dprintf(("tx finished\n"));
826#endif
827		return;
828	}
829
830#if NBPFILTER > 0
831	/* Give the packet to the bpf, if any. */
832	if (ifp->if_bpf)
833		bpf_mtap(ifp->if_bpf, m0);
834#endif
835
836#ifdef SEEQ_TX_DEBUG
837	dprintf(("Tx new packet\n"));
838#endif
839
840	sc->sc_config2 &= ~SEEQ_CFG2_OUTPUT;
841	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
842
843	ea_writembuf(sc, m0, 0x0000);
844	m_freem(m0);
845
846	bus_space_write_2(iot, ioh, SEEQ_TX_PTR, 0x0000);
847
848/*	dprintf(("st=%04x\n", bus_space_read_2(iot, ioh, SEEQ_STATUS)));*/
849
850#ifdef SEEQ_PACKET_DEBUG
851	ea_dump_buffer(sc, 0);
852#endif
853
854
855	/* Now transmit the datagram. */
856/*	dprintf(("st=%04x\n", bus_space_read_2(iot, ioh, SEEQ_STATUS)));*/
857	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
858			  sc->sc_command | SEEQ_CMD_TX_ON);
859#ifdef SEEQ_TX_DEBUG
860	dprintf(("st=%04x\n", bus_space_read_2(iot, ioh, SEEQ_STATUS)));
861	dprintf(("tx: queued\n"));
862#endif
863}
864
865/*
866 * Copy a packet from an mbuf to the transmit buffer on the card.
867 *
868 * Puts a valid Tx header at the start of the packet, and a null header at
869 * the end.
870 */
871static int
872ea_writembuf(struct seeq8005_softc *sc, struct mbuf *m0, int bufstart)
873{
874	struct mbuf *m;
875	int len, nextpacket;
876	u_int8_t hdr[4];
877
878	/*
879	 * Copy the datagram to the packet buffer.
880	 */
881	ea_writebuf(sc, NULL, bufstart + 4, 0);
882
883	len = 0;
884	for (m = m0; m; m = m->m_next) {
885		if (m->m_len == 0)
886			continue;
887		ea_writebuf(sc, mtod(m, caddr_t), -1, m->m_len);
888		len += m->m_len;
889	}
890
891	/* If packet size is odd round up to the next 16 bit boundry */
892	if (len % 2)
893		++len;
894
895	len = max(len, ETHER_MIN_LEN);
896
897	ea_writebuf(sc, NULL, bufstart + 4 + len, 0);
898	/* Follow it with a NULL packet header */
899	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN, 0x0000);
900	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN, 0x0000);
901
902	/* Ok we now have a packet len bytes long in our packet buffer */
903	DPRINTF(SEEQ_DEBUG_TX, ("seeq_writembuf: length=%d\n", len));
904
905	/* Write the packet header */
906	nextpacket = len + 4;
907	hdr[0] = (nextpacket >> 8) & 0xff;
908	hdr[1] = nextpacket & 0xff;
909	hdr[2] = SEEQ_PKTCMD_TX | SEEQ_PKTCMD_DATA_FOLLOWS |
910		SEEQ_TXCMD_XMIT_SUCCESS_INT | SEEQ_TXCMD_COLLISION_INT;
911	hdr[3] = 0; /* Status byte -- will be update by hardware. */
912	ea_writebuf(sc, hdr, 0x0000, 4);
913
914	return len;
915}
916
917/*
918 * Ethernet controller interrupt.
919 */
920
921int
922seeq8005intr(void *arg)
923{
924	struct seeq8005_softc *sc = arg;
925	bus_space_tag_t iot = sc->sc_iot;
926	bus_space_handle_t ioh = sc->sc_ioh;
927	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
928	int status, handled;
929	u_int8_t txhdr[4];
930	u_int txstatus;
931
932	handled = 0;
933	dprintf(("eaintr: "));
934
935
936	/* Get the controller status */
937	status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
938        dprintf(("st=%04x ", status));
939
940
941	/* Tx interrupt ? */
942	if (status & SEEQ_STATUS_TX_INT) {
943		dprintf(("txint "));
944		handled = 1;
945
946		/* Acknowledge the interrupt */
947		bus_space_write_2(iot, ioh, SEEQ_COMMAND,
948				  sc->sc_command | SEEQ_CMD_TX_INTACK);
949
950		ea_readbuf(sc, txhdr, 0x0000, 4);
951
952#ifdef SEEQ_TX_DEBUG
953		dprintf(("txstatus=%02x %02x %02x %02x\n",
954			 txhdr[0], txhdr[1], txhdr[2], txhdr[3]));
955#endif
956		txstatus = txhdr[3];
957
958		/*
959		 * If SEEQ_TXSTAT_COLLISION is set then we received at least
960		 * one collision. On the 8004 we can find out exactly how many
961		 * collisions occurred.
962		 *
963		 * The SEEQ_PKTSTAT_DONE will be set if the transmission has
964		 * completed.
965		 *
966		 * If SEEQ_TXSTAT_COLLISION16 is set then 16 collisions
967		 * occurred and the packet transmission was aborted.
968		 * This situation is untested as present.
969		 *
970		 * The SEEQ_TXSTAT_BABBLE should never be set and is untested
971		 * as we should never xmit oversized packets.
972		 */
973		if (txstatus & SEEQ_TXSTAT_COLLISION) {
974			switch (sc->sc_variant) {
975			case SEEQ_8004: {
976				int colls;
977
978				/*
979				 * The 8004 contains a 4 bit collision count
980				 * in the status register.
981				 */
982
983				/* This appears to be broken on 80C04.AE */
984/*				ifp->if_collisions +=
985				    (txstatus >> SEEQ_TXSTAT_COLLISIONS_SHIFT)
986				    & SEEQ_TXSTAT_COLLISION_MASK;*/
987
988				/* Use the TX Collision register */
989				ea_select_buffer(sc, SEEQ_BUFCODE_TX_COLLS);
990				colls = bus_space_read_1(iot, ioh,
991				    SEEQ_BUFWIN);
992				ifp->if_collisions += colls;
993				break;
994			}
995			case SEEQ_8005:
996				/* We known there was at least 1 collision */
997				ifp->if_collisions++;
998				break;
999			}
1000		} else if (txstatus & SEEQ_TXSTAT_COLLISION16) {
1001			printf("seeq_intr: col16 %x\n", txstatus);
1002			ifp->if_collisions += 16;
1003			ifp->if_oerrors++;
1004		} else if (txstatus & SEEQ_TXSTAT_BABBLE) {
1005			ifp->if_oerrors++;
1006		}
1007
1008		/* Have we completed transmission on the packet ? */
1009		if (txstatus & SEEQ_PKTSTAT_DONE) {
1010			/* Clear watchdog timer. */
1011			ifp->if_timer = 0;
1012			ifp->if_flags &= ~IFF_OACTIVE;
1013
1014			/* Update stats */
1015			ifp->if_opackets++;
1016
1017			/* Tx next packet */
1018
1019			eatxpacket(sc);
1020		}
1021
1022	}
1023
1024
1025	/* Rx interrupt ? */
1026	if (status & SEEQ_STATUS_RX_INT) {
1027		dprintf(("rxint "));
1028		handled = 1;
1029
1030		/* Acknowledge the interrupt */
1031		bus_space_write_2(iot, ioh, SEEQ_COMMAND,
1032				  sc->sc_command | SEEQ_CMD_RX_INTACK);
1033
1034		/* Processes the received packets */
1035		ea_getpackets(sc);
1036
1037
1038#if 0
1039		/* Make sure the receiver is on */
1040		if ((status & SEEQ_STATUS_RX_ON) == 0) {
1041			bus_space_write_2(iot, ioh, SEEQ_COMMAND,
1042					  sc->sc_command | SEEQ_CMD_RX_ON);
1043			printf("rxintr: rx is off st=%04x\n",status);
1044		}
1045#endif
1046	}
1047
1048#ifdef SEEQ_DEBUG
1049	status = bus_space_read_2(iot, ioh, SEEQ_STATUS);
1050        dprintf(("st=%04x\n", status));
1051#endif
1052
1053	return handled;
1054}
1055
1056
1057void
1058ea_getpackets(struct seeq8005_softc *sc)
1059{
1060	bus_space_tag_t iot = sc->sc_iot;
1061	bus_space_handle_t ioh = sc->sc_ioh;
1062	u_int addr;
1063	int len;
1064	int ctrl;
1065	int ptr;
1066	int pack;
1067	int status;
1068	u_int8_t rxhdr[4];
1069	struct ifnet *ifp;
1070
1071	ifp = &sc->sc_ethercom.ec_if;
1072
1073
1074	/* We start from the last rx pointer position */
1075	addr = sc->sc_rx_ptr;
1076	sc->sc_config2 &= ~SEEQ_CFG2_OUTPUT;
1077	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
1078
1079	do {
1080		/* Read rx header */
1081		ea_readbuf(sc, rxhdr, addr, 4);
1082
1083		/* Split the packet header */
1084		ptr = (rxhdr[0] << 8) | rxhdr[1];
1085		ctrl = rxhdr[2];
1086		status = rxhdr[3];
1087
1088#ifdef SEEQ_RX_DEBUG
1089		dprintf(("addr=%04x ptr=%04x ctrl=%02x status=%02x\n",
1090			 addr, ptr, ctrl, status));
1091#endif
1092
1093
1094		/* Zero packet ptr ? then must be null header so exit */
1095		if (ptr == 0) break;
1096
1097
1098		/* Get packet length */
1099       		len = (ptr - addr) - 4;
1100
1101		if (len < 0)
1102			len += sc->sc_rx_bufsize;
1103
1104#ifdef SEEQ_RX_DEBUG
1105		dprintf(("len=%04x\n", len));
1106#endif
1107
1108
1109		/* Has the packet rx completed ? if not then exit */
1110		if ((status & SEEQ_PKTSTAT_DONE) == 0)
1111			break;
1112
1113		/*
1114		 * Did we have any errors? then note error and go to
1115		 * next packet
1116		 */
1117		if (__predict_false(status & SEEQ_RXSTAT_ERROR_MASK)) {
1118			++ifp->if_ierrors;
1119			log(LOG_WARNING,
1120			    "%s: rx packet error (%02x) - dropping packet\n",
1121			    sc->sc_dev.dv_xname, status & 0x0f);
1122			sc->sc_config2 |= SEEQ_CFG2_OUTPUT;
1123			bus_space_write_2(iot, ioh, SEEQ_CONFIG2,
1124					  sc->sc_config2);
1125			ea_init(ifp);
1126			return;
1127		}
1128
1129		/*
1130		 * Is the packet too big ? - this will probably be trapped
1131		 * above as a receive error
1132		 */
1133		if (__predict_false(len > (ETHER_MAX_LEN - ETHER_CRC_LEN))) {
1134			++ifp->if_ierrors;
1135			log(LOG_WARNING, "%s: rx packet size error len=%d\n",
1136			    sc->sc_dev.dv_xname, len);
1137			sc->sc_config2 |= SEEQ_CFG2_OUTPUT;
1138			bus_space_write_2(iot, ioh, SEEQ_CONFIG2,
1139					  sc->sc_config2);
1140			ea_init(ifp);
1141			return;
1142		}
1143
1144		ifp->if_ipackets++;
1145		/* Pass data up to upper levels. */
1146		ea_read(sc, addr + 4, len);
1147
1148		addr = ptr;
1149		++pack;
1150	} while (len != 0);
1151
1152	sc->sc_config2 |= SEEQ_CFG2_OUTPUT;
1153	bus_space_write_2(iot, ioh, SEEQ_CONFIG2, sc->sc_config2);
1154
1155#ifdef SEEQ_RX_DEBUG
1156	dprintf(("new rx ptr=%04x\n", addr));
1157#endif
1158
1159
1160	/* Store new rx pointer */
1161	sc->sc_rx_ptr = addr;
1162	bus_space_write_2(iot, ioh, SEEQ_RX_END, sc->sc_rx_ptr >> 8);
1163
1164	/* Make sure the receiver is on */
1165	bus_space_write_2(iot, ioh, SEEQ_COMMAND,
1166			  sc->sc_command | SEEQ_CMD_RX_ON);
1167
1168}
1169
1170
1171/*
1172 * Pass a packet up to the higher levels.
1173 */
1174
1175static void
1176ea_read(struct seeq8005_softc *sc, int addr, int len)
1177{
1178	struct mbuf *m;
1179	struct ifnet *ifp;
1180
1181	ifp = &sc->sc_ethercom.ec_if;
1182
1183	/* Pull packet off interface. */
1184	m = ea_get(sc, addr, len, ifp);
1185	if (m == 0)
1186		return;
1187
1188#ifdef SEEQ_RX_DEBUG
1189	dprintf(("%s-->", ether_sprintf(eh->ether_shost)));
1190	dprintf(("%s\n", ether_sprintf(eh->ether_dhost)));
1191#endif
1192
1193#if NBPFILTER > 0
1194	/*
1195	 * Check if there's a BPF listener on this interface.
1196	 * If so, hand off the raw packet to bpf.
1197	 */
1198	if (ifp->if_bpf)
1199		bpf_mtap(ifp->if_bpf, m);
1200#endif
1201
1202	(*ifp->if_input)(ifp, m);
1203}
1204
1205/*
1206 * Pull read data off a interface.  Len is length of data, with local net
1207 * header stripped.  We copy the data into mbufs.  When full cluster sized
1208 * units are present we copy into clusters.
1209 */
1210
1211struct mbuf *
1212ea_get(struct seeq8005_softc *sc, int addr, int totlen, struct ifnet *ifp)
1213{
1214        struct mbuf *top, **mp, *m;
1215        int len;
1216        u_int cp, epkt;
1217
1218        cp = addr;
1219        epkt = cp + totlen;
1220
1221        MGETHDR(m, M_DONTWAIT, MT_DATA);
1222        if (m == 0)
1223                return 0;
1224        m->m_pkthdr.rcvif = ifp;
1225        m->m_pkthdr.len = totlen;
1226        m->m_len = MHLEN;
1227        top = 0;
1228        mp = &top;
1229
1230        while (totlen > 0) {
1231                if (top) {
1232                        MGET(m, M_DONTWAIT, MT_DATA);
1233                        if (m == 0) {
1234                                m_freem(top);
1235                                return 0;
1236                        }
1237                        m->m_len = MLEN;
1238                }
1239                len = min(totlen, epkt - cp);
1240                if (len >= MINCLSIZE) {
1241                        MCLGET(m, M_DONTWAIT);
1242                        if (m->m_flags & M_EXT)
1243                                m->m_len = len = min(len, MCLBYTES);
1244                        else
1245                                len = m->m_len;
1246                } else {
1247                        /*
1248                         * Place initial small packet/header at end of mbuf.
1249                         */
1250                        if (len < m->m_len) {
1251                                if (top == 0 && len + max_linkhdr <= m->m_len)
1252                                        m->m_data += max_linkhdr;
1253                                m->m_len = len;
1254                        } else
1255                                len = m->m_len;
1256                }
1257		if (top == 0) {
1258			/* Make sure the payload is aligned */
1259			caddr_t newdata = (caddr_t)
1260			    ALIGN(m->m_data + sizeof(struct ether_header)) -
1261			    sizeof(struct ether_header);
1262			len -= newdata - m->m_data;
1263			m->m_len = len;
1264			m->m_data = newdata;
1265		}
1266                ea_readbuf(sc, mtod(m, u_char *),
1267		    cp < SEEQ_MAX_BUFFER_SIZE ? cp : cp - sc->sc_rx_bufsize,
1268		    len);
1269                cp += len;
1270                *mp = m;
1271                mp = &m->m_next;
1272                totlen -= len;
1273                if (cp == epkt)
1274                        cp = addr;
1275        }
1276
1277        return top;
1278}
1279
1280/*
1281 * Process an ioctl request.  Mostly boilerplate.
1282 */
1283static int
1284ea_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1285{
1286	struct seeq8005_softc *sc = ifp->if_softc;
1287	int s, error = 0;
1288
1289	s = splnet();
1290	switch (cmd) {
1291
1292	default:
1293		error = ether_ioctl(ifp, cmd, data);
1294		if (error == ENETRESET) {
1295			/*
1296			 * Multicast list has changed; set the hardware filter
1297			 * accordingly.
1298			 */
1299			ea_mc_reset(sc);
1300			error = 0;
1301		}
1302		break;
1303	}
1304
1305	splx(s);
1306	return error;
1307}
1308
1309/* Must be called at splnet() */
1310
1311static void
1312ea_mc_reset(struct seeq8005_softc *sc)
1313{
1314
1315	switch (sc->sc_variant) {
1316	case SEEQ_8004:
1317		ea_mc_reset_8004(sc);
1318		return;
1319	case SEEQ_8005:
1320		ea_mc_reset_8005(sc);
1321		return;
1322	}
1323}
1324
1325static void
1326ea_mc_reset_8004(struct seeq8005_softc *sc)
1327{
1328	struct ethercom *ec = &sc->sc_ethercom;
1329	struct ifnet *ifp = &ec->ec_if;
1330	struct ether_multi *enm;
1331	u_int8_t *cp, c;
1332	u_int32_t crc;
1333	int i, len;
1334	struct ether_multistep step;
1335	u_int8_t af[8];
1336
1337	/*
1338	 * Set up multicast address filter by passing all multicast addresses
1339	 * through a crc generator, and then using bits 2 - 7 as an index
1340	 * into the 64 bit logical address filter.  The high order bits
1341	 * selects the word, while the rest of the bits select the bit within
1342	 * the word.
1343	 */
1344
1345	if (ifp->if_flags & IFF_PROMISC) {
1346		ifp->if_flags |= IFF_ALLMULTI;
1347		for (i = 0; i < 8; i++)
1348			af[i] = 0xff;
1349		return;
1350	}
1351	for (i = 0; i < 8; i++)
1352		af[i] = 0;
1353	ETHER_FIRST_MULTI(step, ec, enm);
1354	while (enm != NULL) {
1355		if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
1356		    sizeof(enm->enm_addrlo)) != 0) {
1357			/*
1358			 * We must listen to a range of multicast addresses.
1359			 * For now, just accept all multicasts, rather than
1360			 * trying to set only those filter bits needed to match
1361			 * the range.  (At this time, the only use of address
1362			 * ranges is for IP multicast routing, for which the
1363			 * range is big enough to require all bits set.)
1364			 */
1365			ifp->if_flags |= IFF_ALLMULTI;
1366			for (i = 0; i < 8; i++)
1367				af[i] = 0xff;
1368			return;
1369		}
1370		cp = enm->enm_addrlo;
1371		crc = 0xffffffff;
1372		for (len = sizeof(enm->enm_addrlo); --len >= 0;) {
1373			c = *cp++;
1374			for (i = 8; --i >= 0;) {
1375				if (((crc & 0x80000000) ? 1 : 0) ^ (c & 0x01)) {
1376					crc <<= 1;
1377					crc ^= 0x04c11db6 | 1;
1378				} else
1379					crc <<= 1;
1380				c >>= 1;
1381			}
1382		}
1383		/* Just want the 6 most significant bits. */
1384		crc = (crc >> 2) & 0x3f;
1385
1386		/* Turn on the corresponding bit in the filter. */
1387		af[crc >> 3] |= 1 << (crc & 0x7);
1388
1389		ETHER_NEXT_MULTI(step, enm);
1390	}
1391	ifp->if_flags &= ~IFF_ALLMULTI;
1392
1393	ea_select_buffer(sc, SEEQ_BUFCODE_MULTICAST);
1394		for (i = 0; i < 8; ++i)
1395			bus_space_write_1(sc->sc_iot, sc->sc_ioh,
1396			    SEEQ_BUFWIN, af[i]);
1397}
1398
1399static void
1400ea_mc_reset_8005(struct seeq8005_softc *sc)
1401{
1402	struct ether_multi *enm;
1403	struct ether_multistep step;
1404	int naddr, maxaddrs;
1405
1406	naddr = 0;
1407	maxaddrs = 5;
1408	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
1409	while (enm != NULL) {
1410		/* Have we got space? */
1411		if (naddr >= maxaddrs ||
1412		    bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
1413			sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
1414			ea_ioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS, NULL);
1415			return;
1416		}
1417		ea_set_address(sc, 1 + naddr, enm->enm_addrlo);
1418		sc->sc_config1 |= SEEQ_CFG1_STATION_ADDR1 << naddr;
1419		naddr++;
1420		ETHER_NEXT_MULTI(step, enm);
1421	}
1422	for (; naddr < maxaddrs; naddr++)
1423		sc->sc_config1 &= ~(SEEQ_CFG1_STATION_ADDR1 << naddr);
1424	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEEQ_CONFIG1,
1425			  sc->sc_config1);
1426}
1427
1428/*
1429 * Device timeout routine.
1430 *
1431 * Ok I am not sure exactly how the device timeout should work....
1432 * Currently what will happens is that that the device timeout is only
1433 * set when a packet it received. This indicates we are on an active
1434 * network and thus we should expect more packets. If non arrive in
1435 * in the timeout period then we reinitialise as we may have jammed.
1436 * We zero the timeout at this point so that we don't end up with
1437 * an endless stream of timeouts if the network goes down.
1438 */
1439
1440static void
1441ea_watchdog(struct ifnet *ifp)
1442{
1443	struct seeq8005_softc *sc = ifp->if_softc;
1444
1445	log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
1446	ifp->if_oerrors++;
1447	dprintf(("ea_watchdog: "));
1448	dprintf(("st=%04x\n",
1449		 bus_space_read_2(sc->sc_iot, sc->sc_ioh, SEEQ_STATUS)));
1450
1451	/* Kick the interface */
1452
1453	ea_init(ifp);
1454
1455/*	ifp->if_timer = SEEQ_TIMEOUT;*/
1456	ifp->if_timer = 0;
1457}
1458
1459/* End of if_ea.c */
1460