xref: /netbsd/sys/dev/ic/dp83932.c (revision 6550d01e)
1 /*	$NetBSD: dp83932.c,v 1.35 2010/11/13 13:52:00 uebayasi Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe.
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  * Device driver for the National Semiconductor DP83932
34  * Systems-Oriented Network Interface Controller (SONIC).
35  */
36 
37 #include <sys/cdefs.h>
38 __KERNEL_RCSID(0, "$NetBSD: dp83932.c,v 1.35 2010/11/13 13:52:00 uebayasi Exp $");
39 
40 
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/mbuf.h>
44 #include <sys/malloc.h>
45 #include <sys/kernel.h>
46 #include <sys/socket.h>
47 #include <sys/ioctl.h>
48 #include <sys/errno.h>
49 #include <sys/device.h>
50 
51 #include <net/if.h>
52 #include <net/if_dl.h>
53 #include <net/if_ether.h>
54 
55 #include <net/bpf.h>
56 
57 #include <sys/bus.h>
58 #include <sys/intr.h>
59 
60 #include <dev/ic/dp83932reg.h>
61 #include <dev/ic/dp83932var.h>
62 
63 static void	sonic_start(struct ifnet *);
64 static void	sonic_watchdog(struct ifnet *);
65 static int	sonic_ioctl(struct ifnet *, u_long, void *);
66 static int	sonic_init(struct ifnet *);
67 static void	sonic_stop(struct ifnet *, int);
68 
69 static bool	sonic_shutdown(device_t, int);
70 
71 static void	sonic_reset(struct sonic_softc *);
72 static void	sonic_rxdrain(struct sonic_softc *);
73 static int	sonic_add_rxbuf(struct sonic_softc *, int);
74 static void	sonic_set_filter(struct sonic_softc *);
75 
76 static uint16_t sonic_txintr(struct sonic_softc *);
77 static void	sonic_rxintr(struct sonic_softc *);
78 
79 int	sonic_copy_small = 0;
80 
81 #define ETHER_PAD_LEN (ETHER_MIN_LEN - ETHER_CRC_LEN)
82 
83 /*
84  * sonic_attach:
85  *
86  *	Attach a SONIC interface to the system.
87  */
88 void
89 sonic_attach(struct sonic_softc *sc, const uint8_t *enaddr)
90 {
91 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
92 	int i, rseg, error;
93 	bus_dma_segment_t seg;
94 	size_t cdatasize;
95 	uint8_t *nullbuf;
96 
97 	/*
98 	 * Allocate the control data structures, and create and load the
99 	 * DMA map for it.
100 	 */
101 	if (sc->sc_32bit)
102 		cdatasize = sizeof(struct sonic_control_data32);
103 	else
104 		cdatasize = sizeof(struct sonic_control_data16);
105 
106 	if ((error = bus_dmamem_alloc(sc->sc_dmat, cdatasize + ETHER_PAD_LEN,
107 	     PAGE_SIZE, (64 * 1024), &seg, 1, &rseg,
108 	     BUS_DMA_NOWAIT)) != 0) {
109 		aprint_error_dev(sc->sc_dev,
110 		    "unable to allocate control data, error = %d\n", error);
111 		goto fail_0;
112 	}
113 
114 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
115 	    cdatasize + ETHER_PAD_LEN, (void **) &sc->sc_cdata16,
116 	    BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) {
117 		aprint_error_dev(sc->sc_dev,
118 		    "unable to map control data, error = %d\n", error);
119 		goto fail_1;
120 	}
121 	nullbuf = (uint8_t *)sc->sc_cdata16 + cdatasize;
122 	memset(nullbuf, 0, ETHER_PAD_LEN);
123 
124 	if ((error = bus_dmamap_create(sc->sc_dmat,
125 	     cdatasize, 1, cdatasize, 0, BUS_DMA_NOWAIT,
126 	     &sc->sc_cddmamap)) != 0) {
127 		aprint_error_dev(sc->sc_dev,
128 		    "unable to create control data DMA map, error = %d\n",
129 		    error);
130 		goto fail_2;
131 	}
132 
133 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
134 	     sc->sc_cdata16, cdatasize, NULL, BUS_DMA_NOWAIT)) != 0) {
135 		aprint_error_dev(sc->sc_dev,
136 		    "unable to load control data DMA map, error = %d\n", error);
137 		goto fail_3;
138 	}
139 
140 	/*
141 	 * Create the transmit buffer DMA maps.
142 	 */
143 	for (i = 0; i < SONIC_NTXDESC; i++) {
144 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
145 		     SONIC_NTXFRAGS, MCLBYTES, 0, BUS_DMA_NOWAIT,
146 		     &sc->sc_txsoft[i].ds_dmamap)) != 0) {
147 			aprint_error_dev(sc->sc_dev,
148 			    "unable to create tx DMA map %d, error = %d\n",
149 			    i, error);
150 			goto fail_4;
151 		}
152 	}
153 
154 	/*
155 	 * Create the receive buffer DMA maps.
156 	 */
157 	for (i = 0; i < SONIC_NRXDESC; i++) {
158 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
159 		     MCLBYTES, 0, BUS_DMA_NOWAIT,
160 		     &sc->sc_rxsoft[i].ds_dmamap)) != 0) {
161 			aprint_error_dev(sc->sc_dev,
162 			    "unable to create rx DMA map %d, error = %d\n",
163 			    i, error);
164 			goto fail_5;
165 		}
166 		sc->sc_rxsoft[i].ds_mbuf = NULL;
167 	}
168 
169 	/*
170 	 * create and map the pad buffer
171 	 */
172 	if ((error = bus_dmamap_create(sc->sc_dmat, ETHER_PAD_LEN, 1,
173 	    ETHER_PAD_LEN, 0, BUS_DMA_NOWAIT, &sc->sc_nulldmamap)) != 0) {
174 		aprint_error_dev(sc->sc_dev,
175 		    "unable to create pad buffer DMA map, error = %d\n", error);
176 		goto fail_5;
177 	}
178 
179 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_nulldmamap,
180 	    nullbuf, ETHER_PAD_LEN, NULL, BUS_DMA_NOWAIT)) != 0) {
181 		aprint_error_dev(sc->sc_dev,
182 		    "unable to load pad buffer DMA map, error = %d\n", error);
183 		goto fail_6;
184 	}
185 	bus_dmamap_sync(sc->sc_dmat, sc->sc_nulldmamap, 0, ETHER_PAD_LEN,
186 	    BUS_DMASYNC_PREWRITE);
187 
188 	/*
189 	 * Reset the chip to a known state.
190 	 */
191 	sonic_reset(sc);
192 
193 	aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
194 	    ether_sprintf(enaddr));
195 
196 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
197 	ifp->if_softc = sc;
198 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
199 	ifp->if_ioctl = sonic_ioctl;
200 	ifp->if_start = sonic_start;
201 	ifp->if_watchdog = sonic_watchdog;
202 	ifp->if_init = sonic_init;
203 	ifp->if_stop = sonic_stop;
204 	IFQ_SET_READY(&ifp->if_snd);
205 
206 	/*
207 	 * We can support 802.1Q VLAN-sized frames.
208 	 */
209 	sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU;
210 
211 	/*
212 	 * Attach the interface.
213 	 */
214 	if_attach(ifp);
215 	ether_ifattach(ifp, enaddr);
216 
217 	/*
218 	 * Make sure the interface is shutdown during reboot.
219 	 */
220 	if (pmf_device_register1(sc->sc_dev, NULL, NULL, sonic_shutdown))
221 		pmf_class_network_register(sc->sc_dev, ifp);
222 	else
223 		aprint_error_dev(sc->sc_dev,
224 		    "couldn't establish power handler\n");
225 
226 	return;
227 
228 	/*
229 	 * Free any resources we've allocated during the failed attach
230 	 * attempt.  Do this in reverse order and fall through.
231 	 */
232  fail_6:
233 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_nulldmamap);
234  fail_5:
235 	for (i = 0; i < SONIC_NRXDESC; i++) {
236 		if (sc->sc_rxsoft[i].ds_dmamap != NULL)
237 			bus_dmamap_destroy(sc->sc_dmat,
238 			    sc->sc_rxsoft[i].ds_dmamap);
239 	}
240  fail_4:
241 	for (i = 0; i < SONIC_NTXDESC; i++) {
242 		if (sc->sc_txsoft[i].ds_dmamap != NULL)
243 			bus_dmamap_destroy(sc->sc_dmat,
244 			    sc->sc_txsoft[i].ds_dmamap);
245 	}
246 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
247  fail_3:
248 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
249  fail_2:
250 	bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_cdata16, cdatasize);
251  fail_1:
252 	bus_dmamem_free(sc->sc_dmat, &seg, rseg);
253  fail_0:
254 	return;
255 }
256 
257 /*
258  * sonic_shutdown:
259  *
260  *	Make sure the interface is stopped at reboot.
261  */
262 bool
263 sonic_shutdown(device_t self, int howto)
264 {
265 	struct sonic_softc *sc = device_private(self);
266 
267 	sonic_stop(&sc->sc_ethercom.ec_if, 1);
268 
269 	return true;
270 }
271 
272 /*
273  * sonic_start:		[ifnet interface function]
274  *
275  *	Start packet transmission on the interface.
276  */
277 void
278 sonic_start(struct ifnet *ifp)
279 {
280 	struct sonic_softc *sc = ifp->if_softc;
281 	struct mbuf *m0, *m;
282 	struct sonic_tda16 *tda16;
283 	struct sonic_tda32 *tda32;
284 	struct sonic_descsoft *ds;
285 	bus_dmamap_t dmamap;
286 	int error, olasttx, nexttx, opending, totlen, olseg;
287 	int seg = 0;	/* XXX: gcc */
288 
289 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
290 		return;
291 
292 	/*
293 	 * Remember the previous txpending and the current "last txdesc
294 	 * used" index.
295 	 */
296 	opending = sc->sc_txpending;
297 	olasttx = sc->sc_txlast;
298 
299 	/*
300 	 * Loop through the send queue, setting up transmit descriptors
301 	 * until we drain the queue, or use up all available transmit
302 	 * descriptors.  Leave one at the end for sanity's sake.
303 	 */
304 	while (sc->sc_txpending < (SONIC_NTXDESC - 1)) {
305 		/*
306 		 * Grab a packet off the queue.
307 		 */
308 		IFQ_POLL(&ifp->if_snd, m0);
309 		if (m0 == NULL)
310 			break;
311 		m = NULL;
312 
313 		/*
314 		 * Get the next available transmit descriptor.
315 		 */
316 		nexttx = SONIC_NEXTTX(sc->sc_txlast);
317 		ds = &sc->sc_txsoft[nexttx];
318 		dmamap = ds->ds_dmamap;
319 
320 		/*
321 		 * Load the DMA map.  If this fails, the packet either
322 		 * didn't fit in the allotted number of frags, or we were
323 		 * short on resources.  In this case, we'll copy and try
324 		 * again.
325 		 */
326 		if ((error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
327 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT)) != 0 ||
328 		    (m0->m_pkthdr.len < ETHER_PAD_LEN &&
329 		    dmamap->dm_nsegs == SONIC_NTXFRAGS)) {
330 			if (error == 0)
331 				bus_dmamap_unload(sc->sc_dmat, dmamap);
332 			MGETHDR(m, M_DONTWAIT, MT_DATA);
333 			if (m == NULL) {
334 				printf("%s: unable to allocate Tx mbuf\n",
335 				    device_xname(sc->sc_dev));
336 				break;
337 			}
338 			if (m0->m_pkthdr.len > MHLEN) {
339 				MCLGET(m, M_DONTWAIT);
340 				if ((m->m_flags & M_EXT) == 0) {
341 					printf("%s: unable to allocate Tx "
342 					    "cluster\n",
343 					    device_xname(sc->sc_dev));
344 					m_freem(m);
345 					break;
346 				}
347 			}
348 			m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, void *));
349 			m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
350 			error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap,
351 			    m, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
352 			if (error) {
353 				printf("%s: unable to load Tx buffer, "
354 				    "error = %d\n", device_xname(sc->sc_dev),
355 				    error);
356 				m_freem(m);
357 				break;
358 			}
359 		}
360 		IFQ_DEQUEUE(&ifp->if_snd, m0);
361 		if (m != NULL) {
362 			m_freem(m0);
363 			m0 = m;
364 		}
365 
366 		/*
367 		 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
368 		 */
369 
370 		/* Sync the DMA map. */
371 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
372 		    BUS_DMASYNC_PREWRITE);
373 
374 		/*
375 		 * Store a pointer to the packet so we can free it later.
376 		 */
377 		ds->ds_mbuf = m0;
378 
379 		/*
380 		 * Initialize the transmit descriptor.
381 		 */
382 		totlen = 0;
383 		if (sc->sc_32bit) {
384 			tda32 = &sc->sc_tda32[nexttx];
385 			for (seg = 0; seg < dmamap->dm_nsegs; seg++) {
386 				tda32->tda_frags[seg].frag_ptr1 =
387 				    htosonic32(sc,
388 				    (dmamap->dm_segs[seg].ds_addr >> 16) &
389 				    0xffff);
390 				tda32->tda_frags[seg].frag_ptr0 =
391 				    htosonic32(sc,
392 				    dmamap->dm_segs[seg].ds_addr & 0xffff);
393 				tda32->tda_frags[seg].frag_size =
394 				    htosonic32(sc, dmamap->dm_segs[seg].ds_len);
395 				totlen += dmamap->dm_segs[seg].ds_len;
396 			}
397 			if (totlen < ETHER_PAD_LEN) {
398 				tda32->tda_frags[seg].frag_ptr1 =
399 				    htosonic32(sc,
400 				    (sc->sc_nulldma >> 16) & 0xffff);
401 				tda32->tda_frags[seg].frag_ptr0 =
402 				    htosonic32(sc, sc->sc_nulldma & 0xffff);
403 				tda32->tda_frags[seg].frag_size =
404 				    htosonic32(sc, ETHER_PAD_LEN - totlen);
405 				totlen = ETHER_PAD_LEN;
406 				seg++;
407 			}
408 
409 			tda32->tda_status = 0;
410 			tda32->tda_pktconfig = 0;
411 			tda32->tda_pktsize = htosonic32(sc, totlen);
412 			tda32->tda_fragcnt = htosonic32(sc, seg);
413 
414 			/* Link it up. */
415 			tda32->tda_frags[seg].frag_ptr0 =
416 			    htosonic32(sc, SONIC_CDTXADDR32(sc,
417 			    SONIC_NEXTTX(nexttx)) & 0xffff);
418 
419 			/* Sync the Tx descriptor. */
420 			SONIC_CDTXSYNC32(sc, nexttx,
421 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
422 		} else {
423 			tda16 = &sc->sc_tda16[nexttx];
424 			for (seg = 0; seg < dmamap->dm_nsegs; seg++) {
425 				tda16->tda_frags[seg].frag_ptr1 =
426 				    htosonic16(sc,
427 				    (dmamap->dm_segs[seg].ds_addr >> 16) &
428 				    0xffff);
429 				tda16->tda_frags[seg].frag_ptr0 =
430 				    htosonic16(sc,
431 				    dmamap->dm_segs[seg].ds_addr & 0xffff);
432 				tda16->tda_frags[seg].frag_size =
433 				    htosonic16(sc, dmamap->dm_segs[seg].ds_len);
434 				totlen += dmamap->dm_segs[seg].ds_len;
435 			}
436 			if (totlen < ETHER_PAD_LEN) {
437 				tda16->tda_frags[seg].frag_ptr1 =
438 				    htosonic16(sc,
439 				    (sc->sc_nulldma >> 16) & 0xffff);
440 				tda16->tda_frags[seg].frag_ptr0 =
441 				    htosonic16(sc, sc->sc_nulldma & 0xffff);
442 				tda16->tda_frags[seg].frag_size =
443 				    htosonic16(sc, ETHER_PAD_LEN - totlen);
444 				totlen = ETHER_PAD_LEN;
445 				seg++;
446 			}
447 
448 			tda16->tda_status = 0;
449 			tda16->tda_pktconfig = 0;
450 			tda16->tda_pktsize = htosonic16(sc, totlen);
451 			tda16->tda_fragcnt = htosonic16(sc, seg);
452 
453 			/* Link it up. */
454 			tda16->tda_frags[seg].frag_ptr0 =
455 			    htosonic16(sc, SONIC_CDTXADDR16(sc,
456 			    SONIC_NEXTTX(nexttx)) & 0xffff);
457 
458 			/* Sync the Tx descriptor. */
459 			SONIC_CDTXSYNC16(sc, nexttx,
460 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
461 		}
462 
463 		/* Advance the Tx pointer. */
464 		sc->sc_txpending++;
465 		sc->sc_txlast = nexttx;
466 
467 		/*
468 		 * Pass the packet to any BPF listeners.
469 		 */
470 		bpf_mtap(ifp, m0);
471 	}
472 
473 	if (sc->sc_txpending == (SONIC_NTXDESC - 1)) {
474 		/* No more slots left; notify upper layer. */
475 		ifp->if_flags |= IFF_OACTIVE;
476 	}
477 
478 	if (sc->sc_txpending != opending) {
479 		/*
480 		 * We enqueued packets.  If the transmitter was idle,
481 		 * reset the txdirty pointer.
482 		 */
483 		if (opending == 0)
484 			sc->sc_txdirty = SONIC_NEXTTX(olasttx);
485 
486 		/*
487 		 * Stop the SONIC on the last packet we've set up,
488 		 * and clear end-of-list on the descriptor previous
489 		 * to our new chain.
490 		 *
491 		 * NOTE: our `seg' variable should still be valid!
492 		 */
493 		if (sc->sc_32bit) {
494 			olseg =
495 			    sonic32toh(sc, sc->sc_tda32[olasttx].tda_fragcnt);
496 			sc->sc_tda32[sc->sc_txlast].tda_frags[seg].frag_ptr0 |=
497 			    htosonic32(sc, TDA_LINK_EOL);
498 			SONIC_CDTXSYNC32(sc, sc->sc_txlast,
499 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
500 			sc->sc_tda32[olasttx].tda_frags[olseg].frag_ptr0 &=
501 			    htosonic32(sc, ~TDA_LINK_EOL);
502 			SONIC_CDTXSYNC32(sc, olasttx,
503 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
504 		} else {
505 			olseg =
506 			    sonic16toh(sc, sc->sc_tda16[olasttx].tda_fragcnt);
507 			sc->sc_tda16[sc->sc_txlast].tda_frags[seg].frag_ptr0 |=
508 			    htosonic16(sc, TDA_LINK_EOL);
509 			SONIC_CDTXSYNC16(sc, sc->sc_txlast,
510 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
511 			sc->sc_tda16[olasttx].tda_frags[olseg].frag_ptr0 &=
512 			    htosonic16(sc, ~TDA_LINK_EOL);
513 			SONIC_CDTXSYNC16(sc, olasttx,
514 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
515 		}
516 
517 		/* Start the transmitter. */
518 		CSR_WRITE(sc, SONIC_CR, CR_TXP);
519 
520 		/* Set a watchdog timer in case the chip flakes out. */
521 		ifp->if_timer = 5;
522 	}
523 }
524 
525 /*
526  * sonic_watchdog:	[ifnet interface function]
527  *
528  *	Watchdog timer handler.
529  */
530 void
531 sonic_watchdog(struct ifnet *ifp)
532 {
533 	struct sonic_softc *sc = ifp->if_softc;
534 
535 	printf("%s: device timeout\n", device_xname(sc->sc_dev));
536 	ifp->if_oerrors++;
537 
538 	(void)sonic_init(ifp);
539 }
540 
541 /*
542  * sonic_ioctl:		[ifnet interface function]
543  *
544  *	Handle control requests from the operator.
545  */
546 int
547 sonic_ioctl(struct ifnet *ifp, u_long cmd, void *data)
548 {
549 	int s, error;
550 
551 	s = splnet();
552 
553 	error = ether_ioctl(ifp, cmd, data);
554 	if (error == ENETRESET) {
555 		/*
556 		 * Multicast list has changed; set the hardware
557 		 * filter accordingly.
558 		 */
559 		if (ifp->if_flags & IFF_RUNNING)
560 			(void)sonic_init(ifp);
561 		error = 0;
562 	}
563 
564 	splx(s);
565 	return error;
566 }
567 
568 /*
569  * sonic_intr:
570  *
571  *	Interrupt service routine.
572  */
573 int
574 sonic_intr(void *arg)
575 {
576 	struct sonic_softc *sc = arg;
577 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
578 	uint16_t isr;
579 	int handled = 0, wantinit;
580 
581 	for (wantinit = 0; wantinit == 0;) {
582 		isr = CSR_READ(sc, SONIC_ISR) & sc->sc_imr;
583 		if (isr == 0)
584 			break;
585 		CSR_WRITE(sc, SONIC_ISR, isr);	/* ACK */
586 
587 		handled = 1;
588 
589 		if (isr & IMR_PRX)
590 			sonic_rxintr(sc);
591 
592 		if (isr & (IMR_PTX|IMR_TXER)) {
593 			if (sonic_txintr(sc) & TCR_FU) {
594 				printf("%s: transmit FIFO underrun\n",
595 				    device_xname(sc->sc_dev));
596 				wantinit = 1;
597 			}
598 		}
599 
600 		if (isr & (IMR_RFO|IMR_RBA|IMR_RBE|IMR_RDE)) {
601 #define	PRINTERR(bit, str)						\
602 			if (isr & (bit))				\
603 				printf("%s: %s\n",device_xname(sc->sc_dev), str)
604 			PRINTERR(IMR_RFO, "receive FIFO overrun");
605 			PRINTERR(IMR_RBA, "receive buffer exceeded");
606 			PRINTERR(IMR_RBE, "receive buffers exhausted");
607 			PRINTERR(IMR_RDE, "receive descriptors exhausted");
608 			wantinit = 1;
609 		}
610 	}
611 
612 	if (handled) {
613 		if (wantinit)
614 			(void)sonic_init(ifp);
615 		sonic_start(ifp);
616 	}
617 
618 	return handled;
619 }
620 
621 /*
622  * sonic_txintr:
623  *
624  *	Helper; handle transmit complete interrupts.
625  */
626 uint16_t
627 sonic_txintr(struct sonic_softc *sc)
628 {
629 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
630 	struct sonic_descsoft *ds;
631 	struct sonic_tda32 *tda32;
632 	struct sonic_tda16 *tda16;
633 	uint16_t status, totstat = 0;
634 	int i;
635 
636 	ifp->if_flags &= ~IFF_OACTIVE;
637 
638 	for (i = sc->sc_txdirty; sc->sc_txpending != 0;
639 	     i = SONIC_NEXTTX(i), sc->sc_txpending--) {
640 		ds = &sc->sc_txsoft[i];
641 
642 		if (sc->sc_32bit) {
643 			SONIC_CDTXSYNC32(sc, i,
644 			    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
645 			tda32 = &sc->sc_tda32[i];
646 			status = sonic32toh(sc, tda32->tda_status);
647 			SONIC_CDTXSYNC32(sc, i, BUS_DMASYNC_PREREAD);
648 		} else {
649 			SONIC_CDTXSYNC16(sc, i,
650 			    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
651 			tda16 = &sc->sc_tda16[i];
652 			status = sonic16toh(sc, tda16->tda_status);
653 			SONIC_CDTXSYNC16(sc, i, BUS_DMASYNC_PREREAD);
654 		}
655 
656 		if ((status & ~(TCR_EXDIS|TCR_CRCI|TCR_POWC|TCR_PINT)) == 0)
657 			break;
658 
659 		totstat |= status;
660 
661 		bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
662 		    ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
663 		bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap);
664 		m_freem(ds->ds_mbuf);
665 		ds->ds_mbuf = NULL;
666 
667 		/*
668 		 * Check for errors and collisions.
669 		 */
670 		if (status & TCR_PTX)
671 			ifp->if_opackets++;
672 		else
673 			ifp->if_oerrors++;
674 		ifp->if_collisions += TDA_STATUS_NCOL(status);
675 	}
676 
677 	/* Update the dirty transmit buffer pointer. */
678 	sc->sc_txdirty = i;
679 
680 	/*
681 	 * Cancel the watchdog timer if there are no pending
682 	 * transmissions.
683 	 */
684 	if (sc->sc_txpending == 0)
685 		ifp->if_timer = 0;
686 
687 	return totstat;
688 }
689 
690 /*
691  * sonic_rxintr:
692  *
693  *	Helper; handle receive interrupts.
694  */
695 void
696 sonic_rxintr(struct sonic_softc *sc)
697 {
698 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
699 	struct sonic_descsoft *ds;
700 	struct sonic_rda32 *rda32;
701 	struct sonic_rda16 *rda16;
702 	struct mbuf *m;
703 	int i, len;
704 	uint16_t status, bytecount, ptr0, ptr1, seqno;
705 
706 	for (i = sc->sc_rxptr;; i = SONIC_NEXTRX(i)) {
707 		ds = &sc->sc_rxsoft[i];
708 
709 		if (sc->sc_32bit) {
710 			SONIC_CDRXSYNC32(sc, i,
711 			    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
712 			rda32 = &sc->sc_rda32[i];
713 			SONIC_CDRXSYNC32(sc, i, BUS_DMASYNC_PREREAD);
714 			if (rda32->rda_inuse != 0)
715 				break;
716 			status = sonic32toh(sc, rda32->rda_status);
717 			bytecount = sonic32toh(sc, rda32->rda_bytecount);
718 			ptr0 = sonic32toh(sc, rda32->rda_pkt_ptr0);
719 			ptr1 = sonic32toh(sc, rda32->rda_pkt_ptr1);
720 			seqno = sonic32toh(sc, rda32->rda_seqno);
721 		} else {
722 			SONIC_CDRXSYNC16(sc, i,
723 			    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
724 			rda16 = &sc->sc_rda16[i];
725 			SONIC_CDRXSYNC16(sc, i, BUS_DMASYNC_PREREAD);
726 			if (rda16->rda_inuse != 0)
727 				break;
728 			status = sonic16toh(sc, rda16->rda_status);
729 			bytecount = sonic16toh(sc, rda16->rda_bytecount);
730 			ptr0 = sonic16toh(sc, rda16->rda_pkt_ptr0);
731 			ptr1 = sonic16toh(sc, rda16->rda_pkt_ptr1);
732 			seqno = sonic16toh(sc, rda16->rda_seqno);
733 		}
734 
735 		/*
736 		 * Make absolutely sure this is the only packet
737 		 * in this receive buffer.  Our entire Rx buffer
738 		 * management scheme depends on this, and if the
739 		 * SONIC didn't follow our rule, it means we've
740 		 * misconfigured it.
741 		 */
742 		KASSERT(status & RCR_LPKT);
743 
744 		/*
745 		 * Make sure the packet arrived OK.  If an error occurred,
746 		 * update stats and reset the descriptor.  The buffer will
747 		 * be reused the next time the descriptor comes up in the
748 		 * ring.
749 		 */
750 		if ((status & RCR_PRX) == 0) {
751 			if (status & RCR_FAER)
752 				printf("%s: Rx frame alignment error\n",
753 				    device_xname(sc->sc_dev));
754 			else if (status & RCR_CRCR)
755 				printf("%s: Rx CRC error\n",
756 				    device_xname(sc->sc_dev));
757 			ifp->if_ierrors++;
758 			SONIC_INIT_RXDESC(sc, i);
759 			continue;
760 		}
761 
762 		bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
763 		    ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
764 
765 		/*
766 		 * The SONIC includes the CRC with every packet.
767 		 */
768 		len = bytecount - ETHER_CRC_LEN;
769 
770 		/*
771 		 * Ok, if the chip is in 32-bit mode, then receive
772 		 * buffers must be aligned to 32-bit boundaries,
773 		 * which means the payload is misaligned.  In this
774 		 * case, we must allocate a new mbuf, and copy the
775 		 * packet into it, scooted forward 2 bytes to ensure
776 		 * proper alignment.
777 		 *
778 		 * Note, in 16-bit mode, we can configure the SONIC
779 		 * to do what we want, and we have.
780 		 */
781 #ifndef __NO_STRICT_ALIGNMENT
782 		if (sc->sc_32bit) {
783 			MGETHDR(m, M_DONTWAIT, MT_DATA);
784 			if (m == NULL)
785 				goto dropit;
786 			if (len > (MHLEN - 2)) {
787 				MCLGET(m, M_DONTWAIT);
788 				if ((m->m_flags & M_EXT) == 0)
789 					goto dropit;
790 			}
791 			m->m_data += 2;
792 			/*
793 			 * Note that we use a cluster for incoming frames,
794 			 * so the buffer is virtually contiguous.
795 			 */
796 			memcpy(mtod(m, void *), mtod(ds->ds_mbuf, void *),
797 			    len);
798 			SONIC_INIT_RXDESC(sc, i);
799 			bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
800 			    ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
801 		} else
802 #endif /* ! __NO_STRICT_ALIGNMENT */
803 		/*
804 		 * If the packet is small enough to fit in a single
805 		 * header mbuf, allocate one and copy the data into
806 		 * it.  This greatly reduces memory consumption when
807 		 * we receive lots of small packets.
808 		 */
809 		if (sonic_copy_small != 0 && len <= (MHLEN - 2)) {
810 			MGETHDR(m, M_DONTWAIT, MT_DATA);
811 			if (m == NULL)
812 				goto dropit;
813 			m->m_data += 2;
814 			/*
815 			 * Note that we use a cluster for incoming frames,
816 			 * so the buffer is virtually contiguous.
817 			 */
818 			memcpy(mtod(m, void *), mtod(ds->ds_mbuf, void *),
819 			    len);
820 			SONIC_INIT_RXDESC(sc, i);
821 			bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
822 			    ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
823 		} else {
824 			m = ds->ds_mbuf;
825 			if (sonic_add_rxbuf(sc, i) != 0) {
826  dropit:
827 				ifp->if_ierrors++;
828 				SONIC_INIT_RXDESC(sc, i);
829 				bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
830 				    ds->ds_dmamap->dm_mapsize,
831 				    BUS_DMASYNC_PREREAD);
832 				continue;
833 			}
834 		}
835 
836 		ifp->if_ipackets++;
837 		m->m_pkthdr.rcvif = ifp;
838 		m->m_pkthdr.len = m->m_len = len;
839 
840 		/*
841 		 * Pass this up to any BPF listeners.
842 		 */
843 		bpf_mtap(ifp, m);
844 
845 		/* Pass it on. */
846 		(*ifp->if_input)(ifp, m);
847 	}
848 
849 	/* Update the receive pointer. */
850 	sc->sc_rxptr = i;
851 	CSR_WRITE(sc, SONIC_RWR, SONIC_CDRRADDR(sc, SONIC_PREVRX(i)));
852 }
853 
854 /*
855  * sonic_reset:
856  *
857  *	Perform a soft reset on the SONIC.
858  */
859 void
860 sonic_reset(struct sonic_softc *sc)
861 {
862 
863 	/* stop TX, RX and timer, and ensure RST is clear */
864 	CSR_WRITE(sc, SONIC_CR, CR_STP | CR_RXDIS | CR_HTX);
865 	delay(1000);
866 
867 	CSR_WRITE(sc, SONIC_CR, CR_RST);
868 	delay(1000);
869 
870 	/* clear all interrupts */
871 	CSR_WRITE(sc, SONIC_IMR, 0);
872 	CSR_WRITE(sc, SONIC_ISR, IMR_ALL);
873 
874 	CSR_WRITE(sc, SONIC_CR, 0);
875 	delay(1000);
876 }
877 
878 /*
879  * sonic_init:		[ifnet interface function]
880  *
881  *	Initialize the interface.  Must be called at splnet().
882  */
883 int
884 sonic_init(struct ifnet *ifp)
885 {
886 	struct sonic_softc *sc = ifp->if_softc;
887 	struct sonic_descsoft *ds;
888 	int i, error = 0;
889 	uint16_t reg;
890 
891 	/*
892 	 * Cancel any pending I/O.
893 	 */
894 	sonic_stop(ifp, 0);
895 
896 	/*
897 	 * Reset the SONIC to a known state.
898 	 */
899 	sonic_reset(sc);
900 
901 	/*
902 	 * Bring the SONIC into reset state, and program the DCR.
903 	 *
904 	 * Note: We don't bother optimizing the transmit and receive
905 	 * thresholds, here. TFT/RFT values should be set in MD attachments.
906 	 */
907 	reg = sc->sc_dcr;
908 	if (sc->sc_32bit)
909 		reg |= DCR_DW;
910 	CSR_WRITE(sc, SONIC_CR, CR_RST);
911 	CSR_WRITE(sc, SONIC_DCR, reg);
912 	CSR_WRITE(sc, SONIC_DCR2, sc->sc_dcr2);
913 	CSR_WRITE(sc, SONIC_CR, 0);
914 
915 	/*
916 	 * Initialize the transmit descriptors.
917 	 */
918 	if (sc->sc_32bit) {
919 		for (i = 0; i < SONIC_NTXDESC; i++) {
920 			memset(&sc->sc_tda32[i], 0, sizeof(struct sonic_tda32));
921 			SONIC_CDTXSYNC32(sc, i,
922 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
923 		}
924 	} else {
925 		for (i = 0; i < SONIC_NTXDESC; i++) {
926 			memset(&sc->sc_tda16[i], 0, sizeof(struct sonic_tda16));
927 			SONIC_CDTXSYNC16(sc, i,
928 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
929 		}
930 	}
931 	sc->sc_txpending = 0;
932 	sc->sc_txdirty = 0;
933 	sc->sc_txlast = SONIC_NTXDESC - 1;
934 
935 	/*
936 	 * Initialize the receive descriptor ring.
937 	 */
938 	for (i = 0; i < SONIC_NRXDESC; i++) {
939 		ds = &sc->sc_rxsoft[i];
940 		if (ds->ds_mbuf == NULL) {
941 			if ((error = sonic_add_rxbuf(sc, i)) != 0) {
942 				printf("%s: unable to allocate or map Rx "
943 				    "buffer %d, error = %d\n",
944 				    device_xname(sc->sc_dev), i, error);
945 				/*
946 				 * XXX Should attempt to run with fewer receive
947 				 * XXX buffers instead of just failing.
948 				 */
949 				sonic_rxdrain(sc);
950 				goto out;
951 			}
952 		} else
953 			SONIC_INIT_RXDESC(sc, i);
954 	}
955 	sc->sc_rxptr = 0;
956 
957 	/* Give the transmit ring to the SONIC. */
958 	CSR_WRITE(sc, SONIC_UTDAR, (SONIC_CDTXADDR(sc, 0) >> 16) & 0xffff);
959 	CSR_WRITE(sc, SONIC_CTDAR, SONIC_CDTXADDR(sc, 0) & 0xffff);
960 
961 	/* Give the receive descriptor ring to the SONIC. */
962 	CSR_WRITE(sc, SONIC_URDAR, (SONIC_CDRXADDR(sc, 0) >> 16) & 0xffff);
963 	CSR_WRITE(sc, SONIC_CRDAR, SONIC_CDRXADDR(sc, 0) & 0xffff);
964 
965 	/* Give the receive buffer ring to the SONIC. */
966 	CSR_WRITE(sc, SONIC_URRAR, (SONIC_CDRRADDR(sc, 0) >> 16) & 0xffff);
967 	CSR_WRITE(sc, SONIC_RSAR, SONIC_CDRRADDR(sc, 0) & 0xffff);
968 	if (sc->sc_32bit)
969 		CSR_WRITE(sc, SONIC_REAR,
970 		    (SONIC_CDRRADDR(sc, SONIC_NRXDESC - 1) +
971 		    sizeof(struct sonic_rra32)) & 0xffff);
972 	else
973 		CSR_WRITE(sc, SONIC_REAR,
974 		    (SONIC_CDRRADDR(sc, SONIC_NRXDESC - 1) +
975 		    sizeof(struct sonic_rra16)) & 0xffff);
976 	CSR_WRITE(sc, SONIC_RRR, SONIC_CDRRADDR(sc, 0) & 0xffff);
977 	CSR_WRITE(sc, SONIC_RWR, SONIC_CDRRADDR(sc, SONIC_NRXDESC - 1));
978 
979 	/*
980 	 * Set the End-Of-Buffer counter such that only one packet
981 	 * will be placed into each buffer we provide.  Note we are
982 	 * following the recommendation of section 3.4.4 of the manual
983 	 * here, and have "lengthened" the receive buffers accordingly.
984 	 */
985 	if (sc->sc_32bit)
986 		CSR_WRITE(sc, SONIC_EOBC, (ETHER_MAX_LEN + 2) / 2);
987 	else
988 		CSR_WRITE(sc, SONIC_EOBC, (ETHER_MAX_LEN / 2));
989 
990 	/* Reset the receive sequence counter. */
991 	CSR_WRITE(sc, SONIC_RSC, 0);
992 
993 	/* Clear the tally registers. */
994 	CSR_WRITE(sc, SONIC_CRCETC, 0xffff);
995 	CSR_WRITE(sc, SONIC_FAET, 0xffff);
996 	CSR_WRITE(sc, SONIC_MPT, 0xffff);
997 
998 	/* Set the receive filter. */
999 	sonic_set_filter(sc);
1000 
1001 	/*
1002 	 * Set the interrupt mask register.
1003 	 */
1004 	sc->sc_imr = IMR_RFO | IMR_RBA | IMR_RBE | IMR_RDE |
1005 	    IMR_TXER | IMR_PTX | IMR_PRX;
1006 	CSR_WRITE(sc, SONIC_IMR, sc->sc_imr);
1007 
1008 	/*
1009 	 * Start the receive process in motion.  Note, we don't
1010 	 * start the transmit process until we actually try to
1011 	 * transmit packets.
1012 	 */
1013 	CSR_WRITE(sc, SONIC_CR, CR_RXEN | CR_RRRA);
1014 
1015 	/*
1016 	 * ...all done!
1017 	 */
1018 	ifp->if_flags |= IFF_RUNNING;
1019 	ifp->if_flags &= ~IFF_OACTIVE;
1020 
1021  out:
1022 	if (error)
1023 		printf("%s: interface not running\n", device_xname(sc->sc_dev));
1024 	return error;
1025 }
1026 
1027 /*
1028  * sonic_rxdrain:
1029  *
1030  *	Drain the receive queue.
1031  */
1032 void
1033 sonic_rxdrain(struct sonic_softc *sc)
1034 {
1035 	struct sonic_descsoft *ds;
1036 	int i;
1037 
1038 	for (i = 0; i < SONIC_NRXDESC; i++) {
1039 		ds = &sc->sc_rxsoft[i];
1040 		if (ds->ds_mbuf != NULL) {
1041 			bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap);
1042 			m_freem(ds->ds_mbuf);
1043 			ds->ds_mbuf = NULL;
1044 		}
1045 	}
1046 }
1047 
1048 /*
1049  * sonic_stop:		[ifnet interface function]
1050  *
1051  *	Stop transmission on the interface.
1052  */
1053 void
1054 sonic_stop(struct ifnet *ifp, int disable)
1055 {
1056 	struct sonic_softc *sc = ifp->if_softc;
1057 	struct sonic_descsoft *ds;
1058 	int i;
1059 
1060 	/*
1061 	 * Disable interrupts.
1062 	 */
1063 	CSR_WRITE(sc, SONIC_IMR, 0);
1064 
1065 	/*
1066 	 * Stop the transmitter, receiver, and timer.
1067 	 */
1068 	CSR_WRITE(sc, SONIC_CR, CR_HTX|CR_RXDIS|CR_STP);
1069 	for (i = 0; i < 1000; i++) {
1070 		if ((CSR_READ(sc, SONIC_CR) & (CR_TXP|CR_RXEN|CR_ST)) == 0)
1071 			break;
1072 		delay(2);
1073 	}
1074 	if ((CSR_READ(sc, SONIC_CR) & (CR_TXP|CR_RXEN|CR_ST)) != 0)
1075 		printf("%s: SONIC failed to stop\n", device_xname(sc->sc_dev));
1076 
1077 	/*
1078 	 * Release any queued transmit buffers.
1079 	 */
1080 	for (i = 0; i < SONIC_NTXDESC; i++) {
1081 		ds = &sc->sc_txsoft[i];
1082 		if (ds->ds_mbuf != NULL) {
1083 			bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap);
1084 			m_freem(ds->ds_mbuf);
1085 			ds->ds_mbuf = NULL;
1086 		}
1087 	}
1088 
1089 	/*
1090 	 * Mark the interface down and cancel the watchdog timer.
1091 	 */
1092 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1093 	ifp->if_timer = 0;
1094 
1095 	if (disable)
1096 		sonic_rxdrain(sc);
1097 }
1098 
1099 /*
1100  * sonic_add_rxbuf:
1101  *
1102  *	Add a receive buffer to the indicated descriptor.
1103  */
1104 int
1105 sonic_add_rxbuf(struct sonic_softc *sc, int idx)
1106 {
1107 	struct sonic_descsoft *ds = &sc->sc_rxsoft[idx];
1108 	struct mbuf *m;
1109 	int error;
1110 
1111 	MGETHDR(m, M_DONTWAIT, MT_DATA);
1112 	if (m == NULL)
1113 		return ENOBUFS;
1114 
1115 	MCLGET(m, M_DONTWAIT);
1116 	if ((m->m_flags & M_EXT) == 0) {
1117 		m_freem(m);
1118 		return ENOBUFS;
1119 	}
1120 
1121 	if (ds->ds_mbuf != NULL)
1122 		bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap);
1123 
1124 	ds->ds_mbuf = m;
1125 
1126 	error = bus_dmamap_load(sc->sc_dmat, ds->ds_dmamap,
1127 	    m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
1128 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
1129 	if (error) {
1130 		printf("%s: can't load rx DMA map %d, error = %d\n",
1131 		    device_xname(sc->sc_dev), idx, error);
1132 		panic("sonic_add_rxbuf");	/* XXX */
1133 	}
1134 
1135 	bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0,
1136 	    ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1137 
1138 	SONIC_INIT_RXDESC(sc, idx);
1139 
1140 	return 0;
1141 }
1142 
1143 static void
1144 sonic_set_camentry(struct sonic_softc *sc, int entry, const uint8_t *enaddr)
1145 {
1146 
1147 	if (sc->sc_32bit) {
1148 		struct sonic_cda32 *cda = &sc->sc_cda32[entry];
1149 
1150 		cda->cda_entry = htosonic32(sc, entry);
1151 		cda->cda_addr0 = htosonic32(sc, enaddr[0] | (enaddr[1] << 8));
1152 		cda->cda_addr1 = htosonic32(sc, enaddr[2] | (enaddr[3] << 8));
1153 		cda->cda_addr2 = htosonic32(sc, enaddr[4] | (enaddr[5] << 8));
1154 	} else {
1155 		struct sonic_cda16 *cda = &sc->sc_cda16[entry];
1156 
1157 		cda->cda_entry = htosonic16(sc, entry);
1158 		cda->cda_addr0 = htosonic16(sc, enaddr[0] | (enaddr[1] << 8));
1159 		cda->cda_addr1 = htosonic16(sc, enaddr[2] | (enaddr[3] << 8));
1160 		cda->cda_addr2 = htosonic16(sc, enaddr[4] | (enaddr[5] << 8));
1161 	}
1162 }
1163 
1164 /*
1165  * sonic_set_filter:
1166  *
1167  *	Set the SONIC receive filter.
1168  */
1169 void
1170 sonic_set_filter(struct sonic_softc *sc)
1171 {
1172 	struct ethercom *ec = &sc->sc_ethercom;
1173 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1174 	struct ether_multi *enm;
1175 	struct ether_multistep step;
1176 	int i, entry = 0;
1177 	uint16_t camvalid = 0;
1178 	uint16_t rcr = 0;
1179 
1180 	if (ifp->if_flags & IFF_BROADCAST)
1181 		rcr |= RCR_BRD;
1182 
1183 	if (ifp->if_flags & IFF_PROMISC) {
1184 		rcr |= RCR_PRO;
1185 		goto allmulti;
1186 	}
1187 
1188 	/* Put our station address in the first CAM slot. */
1189 	sonic_set_camentry(sc, entry, CLLADDR(ifp->if_sadl));
1190 	camvalid |= (1U << entry);
1191 	entry++;
1192 
1193 	/* Add the multicast addresses to the CAM. */
1194 	ETHER_FIRST_MULTI(step, ec, enm);
1195 	while (enm != NULL) {
1196 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
1197 			/*
1198 			 * We must listen to a range of multicast addresses.
1199 			 * The only way to do this on the SONIC is to enable
1200 			 * reception of all multicast packets.
1201 			 */
1202 			goto allmulti;
1203 		}
1204 
1205 		if (entry == SONIC_NCAMENT) {
1206 			/*
1207 			 * Out of CAM slots.  Have to enable reception
1208 			 * of all multicast addresses.
1209 			 */
1210 			goto allmulti;
1211 		}
1212 
1213 		sonic_set_camentry(sc, entry, enm->enm_addrlo);
1214 		camvalid |= (1U << entry);
1215 		entry++;
1216 
1217 		ETHER_NEXT_MULTI(step, enm);
1218 	}
1219 
1220 	ifp->if_flags &= ~IFF_ALLMULTI;
1221 	goto setit;
1222 
1223  allmulti:
1224 	/* Use only the first CAM slot (station address). */
1225 	camvalid = 0x0001;
1226 	entry = 1;
1227 	rcr |= RCR_AMC;
1228 
1229  setit:
1230 	/* set mask for the CAM Enable register */
1231 	if (sc->sc_32bit) {
1232 		if (entry == SONIC_NCAMENT)
1233 			sc->sc_cdaenable32 = htosonic32(sc, camvalid);
1234 		else
1235 			sc->sc_cda32[entry].cda_entry =
1236 			    htosonic32(sc, camvalid);
1237 	} else {
1238 		if (entry == SONIC_NCAMENT)
1239 			sc->sc_cdaenable16 = htosonic16(sc, camvalid);
1240 		else
1241 			sc->sc_cda16[entry].cda_entry =
1242 			    htosonic16(sc, camvalid);
1243 	}
1244 
1245 	/* Load the CAM. */
1246 	SONIC_CDCAMSYNC(sc, BUS_DMASYNC_PREWRITE);
1247 	CSR_WRITE(sc, SONIC_CDP, SONIC_CDCAMADDR(sc) & 0xffff);
1248 	CSR_WRITE(sc, SONIC_CDC, entry);
1249 	CSR_WRITE(sc, SONIC_CR, CR_LCAM);
1250 	for (i = 0; i < 10000; i++) {
1251 		if ((CSR_READ(sc, SONIC_CR) & CR_LCAM) == 0)
1252 			break;
1253 		delay(2);
1254 	}
1255 	if (CSR_READ(sc, SONIC_CR) & CR_LCAM)
1256 		printf("%s: CAM load failed\n", device_xname(sc->sc_dev));
1257 	SONIC_CDCAMSYNC(sc, BUS_DMASYNC_POSTWRITE);
1258 
1259 	/* Set the receive control register. */
1260 	CSR_WRITE(sc, SONIC_RCR, rcr);
1261 }
1262