xref: /netbsd-src/sys/dev/ic/tulip.c (revision f3cfa6f6ce31685c6c4a758bc430e69eb99f50a4)
1 /*	$NetBSD: tulip.c,v 1.197 2019/05/28 08:59:34 msaitoh Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998, 1999, 2000, 2002 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 of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center; and by Charles M. Hannum.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * Device driver for the Digital Semiconductor ``Tulip'' (21x4x)
35  * Ethernet controller family, and a variety of clone chips.
36  */
37 
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.197 2019/05/28 08:59:34 msaitoh Exp $");
40 
41 
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/callout.h>
45 #include <sys/mbuf.h>
46 #include <sys/malloc.h>
47 #include <sys/kernel.h>
48 #include <sys/socket.h>
49 #include <sys/ioctl.h>
50 #include <sys/errno.h>
51 #include <sys/device.h>
52 
53 #include <machine/endian.h>
54 
55 #include <net/if.h>
56 #include <net/if_dl.h>
57 #include <net/if_media.h>
58 #include <net/if_ether.h>
59 
60 #include <net/bpf.h>
61 
62 #include <sys/bus.h>
63 #include <sys/intr.h>
64 
65 #include <dev/mii/mii.h>
66 #include <dev/mii/miivar.h>
67 #include <dev/mii/mii_bitbang.h>
68 
69 #include <dev/ic/tulipreg.h>
70 #include <dev/ic/tulipvar.h>
71 
72 static const char * const tlp_chip_names[] = TULIP_CHIP_NAMES;
73 
74 static const struct tulip_txthresh_tab tlp_10_txthresh_tab[] =
75     TLP_TXTHRESH_TAB_10;
76 
77 static const struct tulip_txthresh_tab tlp_10_100_txthresh_tab[] =
78     TLP_TXTHRESH_TAB_10_100;
79 
80 static const struct tulip_txthresh_tab tlp_dm9102_txthresh_tab[] =
81     TLP_TXTHRESH_TAB_DM9102;
82 
83 static void	tlp_start(struct ifnet *);
84 static void	tlp_watchdog(struct ifnet *);
85 static int	tlp_ioctl(struct ifnet *, u_long, void *);
86 static int	tlp_init(struct ifnet *);
87 static void	tlp_stop(struct ifnet *, int);
88 static int	tlp_ifflags_cb(struct ethercom *);
89 
90 static void	tlp_rxdrain(struct tulip_softc *);
91 static int	tlp_add_rxbuf(struct tulip_softc *, int);
92 static void	tlp_srom_idle(struct tulip_softc *);
93 static int	tlp_srom_size(struct tulip_softc *);
94 
95 static int	tlp_enable(struct tulip_softc *);
96 static void	tlp_disable(struct tulip_softc *);
97 
98 static void	tlp_filter_setup(struct tulip_softc *);
99 static void	tlp_winb_filter_setup(struct tulip_softc *);
100 static void	tlp_al981_filter_setup(struct tulip_softc *);
101 static void	tlp_asix_filter_setup(struct tulip_softc *);
102 
103 static void	tlp_rxintr(struct tulip_softc *);
104 static void	tlp_txintr(struct tulip_softc *);
105 
106 static void	tlp_mii_tick(void *);
107 static void	tlp_mii_statchg(struct ifnet *);
108 static void	tlp_winb_mii_statchg(struct ifnet *);
109 static void	tlp_dm9102_mii_statchg(struct ifnet *);
110 
111 static void	tlp_mii_getmedia(struct tulip_softc *, struct ifmediareq *);
112 static int	tlp_mii_setmedia(struct tulip_softc *);
113 
114 static int	tlp_bitbang_mii_readreg(device_t, int, int, uint16_t *);
115 static int	tlp_bitbang_mii_writereg(device_t, int, int, uint16_t);
116 
117 static int	tlp_pnic_mii_readreg(device_t, int, int, uint16_t *);
118 static int	tlp_pnic_mii_writereg(device_t, int, int, uint16_t);
119 
120 static int	tlp_al981_mii_readreg(device_t, int, int, uint16_t *);
121 static int	tlp_al981_mii_writereg(device_t, int, int, uint16_t);
122 
123 static void	tlp_2114x_preinit(struct tulip_softc *);
124 static void	tlp_2114x_mii_preinit(struct tulip_softc *);
125 static void	tlp_pnic_preinit(struct tulip_softc *);
126 static void	tlp_dm9102_preinit(struct tulip_softc *);
127 static void	tlp_asix_preinit(struct tulip_softc *);
128 
129 static void	tlp_21140_reset(struct tulip_softc *);
130 static void	tlp_21142_reset(struct tulip_softc *);
131 static void	tlp_pmac_reset(struct tulip_softc *);
132 #if 0
133 static void	tlp_dm9102_reset(struct tulip_softc *);
134 #endif
135 
136 static void	tlp_2114x_nway_tick(void *);
137 
138 #define	tlp_mchash(addr, sz)						\
139 	(ether_crc32_le((addr), ETHER_ADDR_LEN) & ((sz) - 1))
140 
141 /*
142  * MII bit-bang glue.
143  */
144 static uint32_t tlp_sio_mii_bitbang_read(device_t);
145 static void	tlp_sio_mii_bitbang_write(device_t, uint32_t);
146 
147 static const struct mii_bitbang_ops tlp_sio_mii_bitbang_ops = {
148 	tlp_sio_mii_bitbang_read,
149 	tlp_sio_mii_bitbang_write,
150 	{
151 		MIIROM_MDO,		/* MII_BIT_MDO */
152 		MIIROM_MDI,		/* MII_BIT_MDI */
153 		MIIROM_MDC,		/* MII_BIT_MDC */
154 		0,			/* MII_BIT_DIR_HOST_PHY */
155 		MIIROM_MIIDIR,		/* MII_BIT_DIR_PHY_HOST */
156 	}
157 };
158 
159 #ifdef TLP_DEBUG
160 #define	DPRINTF(sc, x)	if ((sc)->sc_ethercom.ec_if.if_flags & IFF_DEBUG) \
161 				printf x
162 #else
163 #define	DPRINTF(sc, x)	/* nothing */
164 #endif
165 
166 #ifdef TLP_STATS
167 static void	tlp_print_stats(struct tulip_softc *);
168 #endif
169 
170 /*
171  * Can be used to debug the SROM-related things, including contents.
172  * Initialized so that it's patchable.
173  */
174 int	tlp_srom_debug = 0;
175 
176 /*
177  * tlp_attach:
178  *
179  *	Attach a Tulip interface to the system.
180  */
181 int
182 tlp_attach(struct tulip_softc *sc, const uint8_t *enaddr)
183 {
184 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
185 	device_t self = sc->sc_dev;
186 	int i, error;
187 
188 	callout_init(&sc->sc_nway_callout, 0);
189 	callout_init(&sc->sc_tick_callout, 0);
190 
191 	/*
192 	 * NOTE: WE EXPECT THE FRONT-END TO INITIALIZE sc_regshift!
193 	 */
194 
195 	/*
196 	 * Setup the transmit threshold table.
197 	 */
198 	switch (sc->sc_chip) {
199 	case TULIP_CHIP_DE425:
200 	case TULIP_CHIP_21040:
201 	case TULIP_CHIP_21041:
202 		sc->sc_txth = tlp_10_txthresh_tab;
203 		break;
204 
205 	case TULIP_CHIP_DM9102:
206 	case TULIP_CHIP_DM9102A:
207 		sc->sc_txth = tlp_dm9102_txthresh_tab;
208 		break;
209 
210 	default:
211 		sc->sc_txth = tlp_10_100_txthresh_tab;
212 		break;
213 	}
214 
215 	/*
216 	 * Setup the filter setup function.
217 	 */
218 	switch (sc->sc_chip) {
219 	case TULIP_CHIP_WB89C840F:
220 		sc->sc_filter_setup = tlp_winb_filter_setup;
221 		break;
222 
223 	case TULIP_CHIP_AL981:
224 	case TULIP_CHIP_AN983:
225 	case TULIP_CHIP_AN985:
226 		sc->sc_filter_setup = tlp_al981_filter_setup;
227 		break;
228 
229 	case TULIP_CHIP_AX88140:
230 	case TULIP_CHIP_AX88141:
231 		sc->sc_filter_setup = tlp_asix_filter_setup;
232 		break;
233 
234 	default:
235 		sc->sc_filter_setup = tlp_filter_setup;
236 		break;
237 	}
238 
239 	/*
240 	 * Set up the media status change function.
241 	 */
242 	switch (sc->sc_chip) {
243 	case TULIP_CHIP_WB89C840F:
244 		sc->sc_statchg = tlp_winb_mii_statchg;
245 		break;
246 
247 	case TULIP_CHIP_DM9102:
248 	case TULIP_CHIP_DM9102A:
249 		sc->sc_statchg = tlp_dm9102_mii_statchg;
250 		break;
251 
252 	default:
253 		/*
254 		 * We may override this if we have special media
255 		 * handling requirements (e.g. flipping GPIO pins).
256 		 *
257 		 * The pure-MII statchg function covers the basics.
258 		 */
259 		sc->sc_statchg = tlp_mii_statchg;
260 		break;
261 	}
262 
263 	/*
264 	 * Default to no FS|LS in setup packet descriptors.  They're
265 	 * supposed to be zero according to the 21040 and 21143
266 	 * manuals, and some chips fall over badly if they're
267 	 * included.  Yet, other chips seem to require them.  Sigh.
268 	 */
269 	switch (sc->sc_chip) {
270 	case TULIP_CHIP_X3201_3:
271 		sc->sc_setup_fsls = TDCTL_Tx_FS | TDCTL_Tx_LS;
272 		break;
273 
274 	default:
275 		sc->sc_setup_fsls = 0;
276 	}
277 
278 	/*
279 	 * Set up various chip-specific quirks.
280 	 *
281 	 * Note that wherever we can, we use the "ring" option for
282 	 * transmit and receive descriptors.  This is because some
283 	 * clone chips apparently have problems when using chaining,
284 	 * although some *only* support chaining.
285 	 *
286 	 * What we do is always program the "next" pointer, and then
287 	 * conditionally set the TDCTL_CH and TDCTL_ER bits in the
288 	 * appropriate places.
289 	 */
290 	switch (sc->sc_chip) {
291 	case TULIP_CHIP_21140:
292 	case TULIP_CHIP_21140A:
293 	case TULIP_CHIP_21142:
294 	case TULIP_CHIP_21143:
295 	case TULIP_CHIP_82C115:		/* 21143-like */
296 	case TULIP_CHIP_MX98713:	/* 21140-like */
297 	case TULIP_CHIP_MX98713A:	/* 21143-like */
298 	case TULIP_CHIP_MX98715:	/* 21143-like */
299 	case TULIP_CHIP_MX98715A:	/* 21143-like */
300 	case TULIP_CHIP_MX98715AEC_X:	/* 21143-like */
301 	case TULIP_CHIP_MX98725:	/* 21143-like */
302 	case TULIP_CHIP_RS7112:		/* 21143-like */
303 		/*
304 		 * Run these chips in ring mode.
305 		 */
306 		sc->sc_tdctl_ch = 0;
307 		sc->sc_tdctl_er = TDCTL_ER;
308 		sc->sc_preinit = tlp_2114x_preinit;
309 		break;
310 
311 	case TULIP_CHIP_82C168:
312 	case TULIP_CHIP_82C169:
313 		/*
314 		 * Run these chips in ring mode.
315 		 */
316 		sc->sc_tdctl_ch = 0;
317 		sc->sc_tdctl_er = TDCTL_ER;
318 		sc->sc_preinit = tlp_pnic_preinit;
319 
320 		/*
321 		 * These chips seem to have busted DMA engines; just put them
322 		 * in Store-and-Forward mode from the get-go.
323 		 */
324 		sc->sc_txthresh = TXTH_SF;
325 		break;
326 
327 	case TULIP_CHIP_WB89C840F:
328 		/*
329 		 * Run this chip in chained mode.
330 		 */
331 		sc->sc_tdctl_ch = TDCTL_CH;
332 		sc->sc_tdctl_er = 0;
333 		sc->sc_flags |= TULIPF_IC_FS;
334 		break;
335 
336 	case TULIP_CHIP_DM9102:
337 	case TULIP_CHIP_DM9102A:
338 		/*
339 		 * Run these chips in chained mode.
340 		 */
341 		sc->sc_tdctl_ch = TDCTL_CH;
342 		sc->sc_tdctl_er = 0;
343 		sc->sc_preinit = tlp_dm9102_preinit;
344 
345 		/*
346 		 * These chips have a broken bus interface, so we
347 		 * can't use any optimized bus commands.  For this
348 		 * reason, we tend to underrun pretty quickly, so
349 		 * just to Store-and-Forward mode from the get-go.
350 		 */
351 		sc->sc_txthresh = TXTH_DM9102_SF;
352 		break;
353 
354 	case TULIP_CHIP_AX88140:
355 	case TULIP_CHIP_AX88141:
356 		/*
357 		 * Run these chips in ring mode.
358 		 */
359 		sc->sc_tdctl_ch = 0;
360 		sc->sc_tdctl_er = TDCTL_ER;
361 		sc->sc_preinit = tlp_asix_preinit;
362 		break;
363 
364 	default:
365 		/*
366 		 * Default to running in ring mode.
367 		 */
368 		sc->sc_tdctl_ch = 0;
369 		sc->sc_tdctl_er = TDCTL_ER;
370 	}
371 
372 	/*
373 	 * Set up the MII bit-bang operations.
374 	 */
375 	switch (sc->sc_chip) {
376 	case TULIP_CHIP_WB89C840F:	/* XXX direction bit different? */
377 		sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops;
378 		break;
379 
380 	default:
381 		sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops;
382 	}
383 
384 	SIMPLEQ_INIT(&sc->sc_txfreeq);
385 	SIMPLEQ_INIT(&sc->sc_txdirtyq);
386 
387 	/*
388 	 * Allocate the control data structures, and create and load the
389 	 * DMA map for it.
390 	 */
391 	if ((error = bus_dmamem_alloc(sc->sc_dmat,
392 	    sizeof(struct tulip_control_data), PAGE_SIZE, 0, &sc->sc_cdseg,
393 	    1, &sc->sc_cdnseg, 0)) != 0) {
394 		aprint_error_dev(self,
395 		    "unable to allocate control data, error = %d\n", error);
396 		goto fail_0;
397 	}
398 
399 	if ((error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg,
400 	    sizeof(struct tulip_control_data), (void **)&sc->sc_control_data,
401 	    BUS_DMA_COHERENT)) != 0) {
402 		aprint_error_dev(self,
403 		    "unable to map control data, error = %d\n", error);
404 		goto fail_1;
405 	}
406 
407 	if ((error = bus_dmamap_create(sc->sc_dmat,
408 	    sizeof(struct tulip_control_data), 1,
409 	    sizeof(struct tulip_control_data), 0, 0, &sc->sc_cddmamap)) != 0) {
410 		sc->sc_cddmamap = NULL;
411 		aprint_error_dev(self,
412 		    "unable to create control data DMA map, error = %d\n",
413 		    error);
414 		goto fail_2;
415 	}
416 
417 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
418 	    sc->sc_control_data, sizeof(struct tulip_control_data), NULL,
419 	    0)) != 0) {
420 		aprint_error_dev(self,
421 		    "unable to load control data DMA map, error = %d\n",
422 		    error);
423 		goto fail_3;
424 	}
425 
426 	/*
427 	 * Create the transmit buffer DMA maps.
428 	 *
429 	 * Note that on the Xircom clone, transmit buffers must be
430 	 * 4-byte aligned.  We're almost guaranteed to have to copy
431 	 * the packet in that case, so we just limit ourselves to
432 	 * one segment.
433 	 *
434 	 * On the DM9102, the transmit logic can only handle one
435 	 * DMA segment.
436 	 */
437 	switch (sc->sc_chip) {
438 	case TULIP_CHIP_X3201_3:
439 	case TULIP_CHIP_DM9102:
440 	case TULIP_CHIP_DM9102A:
441 	case TULIP_CHIP_AX88140:
442 	case TULIP_CHIP_AX88141:
443 		sc->sc_ntxsegs = 1;
444 		break;
445 
446 	default:
447 		sc->sc_ntxsegs = TULIP_NTXSEGS;
448 	}
449 	for (i = 0; i < TULIP_TXQUEUELEN; i++) {
450 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
451 		    sc->sc_ntxsegs, MCLBYTES, 0, 0,
452 		    &sc->sc_txsoft[i].txs_dmamap)) != 0) {
453 			sc->sc_txsoft[i].txs_dmamap = NULL;
454 			aprint_error_dev(self,
455 			    "unable to create tx DMA map %d, error = %d\n", i,
456 			    error);
457 			goto fail_4;
458 		}
459 	}
460 
461 	/*
462 	 * Create the receive buffer DMA maps.
463 	 */
464 	for (i = 0; i < TULIP_NRXDESC; i++) {
465 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
466 		    MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
467 			sc->sc_rxsoft[i].rxs_dmamap = NULL;
468 			aprint_error_dev(self,
469 			    "unable to create rx DMA map %d, error = %d\n", i,
470 			    error);
471 			goto fail_5;
472 		}
473 		sc->sc_rxsoft[i].rxs_mbuf = NULL;
474 	}
475 
476 	/*
477 	 * From this point forward, the attachment cannot fail.  A failure
478 	 * before this point releases all resources that may have been
479 	 * allocated.
480 	 */
481 	sc->sc_flags |= TULIPF_ATTACHED;
482 
483 	/*
484 	 * Reset the chip to a known state.
485 	 */
486 	tlp_reset(sc);
487 
488 	/* Announce ourselves. */
489 	aprint_normal_dev(self, "%s%sEthernet address %s\n",
490 	    sc->sc_name[0] != '\0' ? sc->sc_name : "",
491 	    sc->sc_name[0] != '\0' ? ", " : "",
492 	    ether_sprintf(enaddr));
493 
494 	/*
495 	 * Check to see if we're the simulated Ethernet on Connectix
496 	 * Virtual PC.
497 	 */
498 	if (enaddr[0] == 0x00 && enaddr[1] == 0x03 && enaddr[2] == 0xff)
499 		sc->sc_flags |= TULIPF_VPC;
500 
501 	/*
502 	 * Initialize our media structures.  This may probe the MII, if
503 	 * present.
504 	 */
505 	(*sc->sc_mediasw->tmsw_init)(sc);
506 
507 	strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
508 	ifp->if_softc = sc;
509 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
510 	sc->sc_if_flags = ifp->if_flags;
511 	ifp->if_ioctl = tlp_ioctl;
512 	ifp->if_start = tlp_start;
513 	ifp->if_watchdog = tlp_watchdog;
514 	ifp->if_init = tlp_init;
515 	ifp->if_stop = tlp_stop;
516 	IFQ_SET_READY(&ifp->if_snd);
517 
518 	/*
519 	 * We can support 802.1Q VLAN-sized frames.
520 	 */
521 	sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU;
522 
523 	/*
524 	 * Attach the interface.
525 	 */
526 	if_attach(ifp);
527 	if_deferred_start_init(ifp, NULL);
528 	ether_ifattach(ifp, enaddr);
529 	ether_set_ifflags_cb(&sc->sc_ethercom, tlp_ifflags_cb);
530 
531 	rnd_attach_source(&sc->sc_rnd_source, device_xname(self),
532 	    RND_TYPE_NET, RND_FLAG_DEFAULT);
533 
534 	if (pmf_device_register(self, NULL, NULL))
535 		pmf_class_network_register(self, ifp);
536 	else
537 		aprint_error_dev(self, "couldn't establish power handler\n");
538 
539 	return 0;
540 
541 	/*
542 	 * Free any resources we've allocated during the failed attach
543 	 * attempt.  Do this in reverse order and fall through.
544 	 */
545  fail_5:
546 	for (i = 0; i < TULIP_NRXDESC; i++) {
547 		if (sc->sc_rxsoft[i].rxs_dmamap != NULL)
548 			bus_dmamap_destroy(sc->sc_dmat,
549 			    sc->sc_rxsoft[i].rxs_dmamap);
550 	}
551  fail_4:
552 	for (i = 0; i < TULIP_TXQUEUELEN; i++) {
553 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
554 			bus_dmamap_destroy(sc->sc_dmat,
555 			    sc->sc_txsoft[i].txs_dmamap);
556 	}
557 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
558  fail_3:
559 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
560  fail_2:
561 	bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data,
562 	    sizeof(struct tulip_control_data));
563  fail_1:
564 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg);
565  fail_0:
566 	return error;
567 }
568 
569 /*
570  * tlp_activate:
571  *
572  *	Handle device activation/deactivation requests.
573  */
574 int
575 tlp_activate(device_t self, enum devact act)
576 {
577 	struct tulip_softc *sc = device_private(self);
578 
579 	switch (act) {
580 	case DVACT_DEACTIVATE:
581 		if_deactivate(&sc->sc_ethercom.ec_if);
582 		return 0;
583 	default:
584 		return EOPNOTSUPP;
585 	}
586 }
587 
588 /*
589  * tlp_detach:
590  *
591  *	Detach a Tulip interface.
592  */
593 int
594 tlp_detach(struct tulip_softc *sc)
595 {
596 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
597 	struct tulip_rxsoft *rxs;
598 	struct tulip_txsoft *txs;
599 	device_t self = sc->sc_dev;
600 	int i, s;
601 
602 	/*
603 	 * Succeed now if there isn't any work to do.
604 	 */
605 	if ((sc->sc_flags & TULIPF_ATTACHED) == 0)
606 		return 0;
607 
608 	s = splnet();
609 	/* Stop the interface. Callouts are stopped in it. */
610 	tlp_stop(ifp, 1);
611 	splx(s);
612 
613 	/* Destroy our callouts. */
614 	callout_destroy(&sc->sc_nway_callout);
615 	callout_destroy(&sc->sc_tick_callout);
616 
617 	if (sc->sc_flags & TULIPF_HAS_MII) {
618 		/* Detach all PHYs */
619 		mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
620 	}
621 
622 	/* Delete all remaining media. */
623 	ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
624 
625 	rnd_detach_source(&sc->sc_rnd_source);
626 
627 	ether_ifdetach(ifp);
628 	if_detach(ifp);
629 
630 	for (i = 0; i < TULIP_NRXDESC; i++) {
631 		rxs = &sc->sc_rxsoft[i];
632 		if (rxs->rxs_mbuf != NULL) {
633 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
634 			m_freem(rxs->rxs_mbuf);
635 			rxs->rxs_mbuf = NULL;
636 		}
637 		bus_dmamap_destroy(sc->sc_dmat, rxs->rxs_dmamap);
638 	}
639 	for (i = 0; i < TULIP_TXQUEUELEN; i++) {
640 		txs = &sc->sc_txsoft[i];
641 		if (txs->txs_mbuf != NULL) {
642 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
643 			m_freem(txs->txs_mbuf);
644 			txs->txs_mbuf = NULL;
645 		}
646 		bus_dmamap_destroy(sc->sc_dmat, txs->txs_dmamap);
647 	}
648 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
649 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
650 	bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data,
651 	    sizeof(struct tulip_control_data));
652 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg);
653 
654 	pmf_device_deregister(self);
655 
656 	if (sc->sc_srom)
657 		free(sc->sc_srom, M_DEVBUF);
658 
659 	return 0;
660 }
661 
662 /*
663  * tlp_start:		[ifnet interface function]
664  *
665  *	Start packet transmission on the interface.
666  */
667 static void
668 tlp_start(struct ifnet *ifp)
669 {
670 	struct tulip_softc *sc = ifp->if_softc;
671 	struct mbuf *m0, *m;
672 	struct tulip_txsoft *txs, *last_txs = NULL;
673 	bus_dmamap_t dmamap;
674 	int error, firsttx, nexttx, lasttx = 1, ofree, seg;
675 	struct tulip_desc *txd;
676 
677 	DPRINTF(sc, ("%s: tlp_start: sc_flags 0x%08x, if_flags 0x%08x\n",
678 	    device_xname(sc->sc_dev), sc->sc_flags, ifp->if_flags));
679 
680 	/*
681 	 * If we want a filter setup, it means no more descriptors were
682 	 * available for the setup routine.  Let it get a chance to wedge
683 	 * itself into the ring.
684 	 */
685 	if (sc->sc_flags & TULIPF_WANT_SETUP)
686 		ifp->if_flags |= IFF_OACTIVE;
687 
688 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
689 		return;
690 
691 	if (sc->sc_tick == tlp_2114x_nway_tick &&
692 	    (sc->sc_flags & TULIPF_LINK_UP) == 0 && ifp->if_snd.ifq_len < 10)
693 		return;
694 
695 	/*
696 	 * Remember the previous number of free descriptors and
697 	 * the first descriptor we'll use.
698 	 */
699 	ofree = sc->sc_txfree;
700 	firsttx = sc->sc_txnext;
701 
702 	DPRINTF(sc, ("%s: tlp_start: txfree %d, txnext %d\n",
703 	    device_xname(sc->sc_dev), ofree, firsttx));
704 
705 	/*
706 	 * Loop through the send queue, setting up transmit descriptors
707 	 * until we drain the queue, or use up all available transmit
708 	 * descriptors.
709 	 */
710 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL &&
711 	       sc->sc_txfree != 0) {
712 		/*
713 		 * Grab a packet off the queue.
714 		 */
715 		IFQ_POLL(&ifp->if_snd, m0);
716 		if (m0 == NULL)
717 			break;
718 		m = NULL;
719 
720 		dmamap = txs->txs_dmamap;
721 
722 		/*
723 		 * Load the DMA map.  If this fails, the packet either
724 		 * didn't fit in the alloted number of segments, or we were
725 		 * short on resources.  In this case, we'll copy and try
726 		 * again.
727 		 *
728 		 * Note that if we're only allowed 1 Tx segment, we
729 		 * have an alignment restriction.  Do this test before
730 		 * attempting to load the DMA map, because it's more
731 		 * likely we'll trip the alignment test than the
732 		 * more-than-one-segment test.
733 		 */
734 		if ((sc->sc_ntxsegs == 1 && (mtod(m0, uintptr_t) & 3) != 0) ||
735 		    bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
736 		      BUS_DMA_WRITE | BUS_DMA_NOWAIT) != 0) {
737 			MGETHDR(m, M_DONTWAIT, MT_DATA);
738 			if (m == NULL) {
739 				aprint_error_dev(sc->sc_dev, "unable to allocate Tx mbuf\n");
740 				break;
741 			}
742 			MCLAIM(m, &sc->sc_ethercom.ec_tx_mowner);
743 			if (m0->m_pkthdr.len > MHLEN) {
744 				MCLGET(m, M_DONTWAIT);
745 				if ((m->m_flags & M_EXT) == 0) {
746 					aprint_error_dev(sc->sc_dev,
747 					    "unable to allocate Tx cluster\n");
748 					m_freem(m);
749 					break;
750 				}
751 			}
752 			m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, void *));
753 			m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
754 			error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap,
755 			    m, BUS_DMA_WRITE | BUS_DMA_NOWAIT);
756 			if (error) {
757 				aprint_error_dev(sc->sc_dev,
758 				    "unable to load Tx buffer, error = %d",
759 				    error);
760 				break;
761 			}
762 		}
763 
764 		/*
765 		 * Ensure we have enough descriptors free to describe
766 		 * the packet.
767 		 */
768 		if (dmamap->dm_nsegs > sc->sc_txfree) {
769 			/*
770 			 * Not enough free descriptors to transmit this
771 			 * packet.  We haven't committed to anything yet,
772 			 * so just unload the DMA map, put the packet
773 			 * back on the queue, and punt.  Notify the upper
774 			 * layer that there are no more slots left.
775 			 *
776 			 * XXX We could allocate an mbuf and copy, but
777 			 * XXX it is worth it?
778 			 */
779 			ifp->if_flags |= IFF_OACTIVE;
780 			bus_dmamap_unload(sc->sc_dmat, dmamap);
781 			if (m != NULL)
782 				m_freem(m);
783 			break;
784 		}
785 
786 		IFQ_DEQUEUE(&ifp->if_snd, m0);
787 		if (m != NULL) {
788 			m_freem(m0);
789 			m0 = m;
790 		}
791 
792 		/*
793 		 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
794 		 */
795 
796 		/* Sync the DMA map. */
797 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
798 		    BUS_DMASYNC_PREWRITE);
799 
800 		/*
801 		 * Initialize the transmit descriptors.
802 		 */
803 		for (nexttx = sc->sc_txnext, seg = 0;
804 		     seg < dmamap->dm_nsegs;
805 		     seg++, nexttx = TULIP_NEXTTX(nexttx)) {
806 			/*
807 			 * If this is the first descriptor we're
808 			 * enqueueing, don't set the OWN bit just
809 			 * yet.  That could cause a race condition.
810 			 * We'll do it below.
811 			 */
812 			txd = &sc->sc_txdescs[nexttx];
813 			txd->td_status =
814 			    (nexttx == firsttx) ? 0 : htole32(TDSTAT_OWN);
815 			txd->td_bufaddr1 =
816 			    htole32(dmamap->dm_segs[seg].ds_addr);
817 			txd->td_ctl =
818 			    htole32((dmamap->dm_segs[seg].ds_len <<
819 				TDCTL_SIZE1_SHIFT) | sc->sc_tdctl_ch |
820 				(nexttx == (TULIP_NTXDESC - 1) ?
821 				 sc->sc_tdctl_er : 0));
822 			lasttx = nexttx;
823 		}
824 
825 		KASSERT(lasttx != -1);
826 
827 		/* Set `first segment' and `last segment' appropriately. */
828 		sc->sc_txdescs[sc->sc_txnext].td_ctl |= htole32(TDCTL_Tx_FS);
829 		sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_LS);
830 
831 #ifdef TLP_DEBUG
832 		if (ifp->if_flags & IFF_DEBUG) {
833 			printf("     txsoft %p transmit chain:\n", txs);
834 			for (seg = sc->sc_txnext;; seg = TULIP_NEXTTX(seg)) {
835 				txd = &sc->sc_txdescs[seg];
836 				printf("     descriptor %d:\n", seg);
837 				printf("       td_status:   0x%08x\n",
838 				    le32toh(txd->td_status));
839 				printf("       td_ctl:      0x%08x\n",
840 				    le32toh(txd->td_ctl));
841 				printf("       td_bufaddr1: 0x%08x\n",
842 				    le32toh(txd->td_bufaddr1));
843 				printf("       td_bufaddr2: 0x%08x\n",
844 				    le32toh(txd->td_bufaddr2));
845 				if (seg == lasttx)
846 					break;
847 			}
848 		}
849 #endif
850 
851 		/* Sync the descriptors we're using. */
852 		TULIP_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs,
853 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
854 
855 		/*
856 		 * Store a pointer to the packet so we can free it later,
857 		 * and remember what txdirty will be once the packet is
858 		 * done.
859 		 */
860 		txs->txs_mbuf = m0;
861 		txs->txs_firstdesc = sc->sc_txnext;
862 		txs->txs_lastdesc = lasttx;
863 		txs->txs_ndescs = dmamap->dm_nsegs;
864 
865 		/* Advance the tx pointer. */
866 		sc->sc_txfree -= dmamap->dm_nsegs;
867 		sc->sc_txnext = nexttx;
868 
869 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q);
870 		SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q);
871 
872 		last_txs = txs;
873 
874 		/*
875 		 * Pass the packet to any BPF listeners.
876 		 */
877 		bpf_mtap(ifp, m0, BPF_D_OUT);
878 	}
879 
880 	if (txs == NULL || sc->sc_txfree == 0) {
881 		/* No more slots left; notify upper layer. */
882 		ifp->if_flags |= IFF_OACTIVE;
883 	}
884 
885 	if (sc->sc_txfree != ofree) {
886 		DPRINTF(sc, ("%s: packets enqueued, IC on %d, OWN on %d\n",
887 		    device_xname(sc->sc_dev), lasttx, firsttx));
888 		/*
889 		 * Cause a transmit interrupt to happen on the
890 		 * last packet we enqueued.
891 		 */
892 		sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_IC);
893 		TULIP_CDTXSYNC(sc, lasttx, 1,
894 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
895 
896 		/*
897 		 * Some clone chips want IC on the *first* segment in
898 		 * the packet.  Appease them.
899 		 */
900 		KASSERT(last_txs != NULL);
901 		if ((sc->sc_flags & TULIPF_IC_FS) != 0 &&
902 		    last_txs->txs_firstdesc != lasttx) {
903 			sc->sc_txdescs[last_txs->txs_firstdesc].td_ctl |=
904 			    htole32(TDCTL_Tx_IC);
905 			TULIP_CDTXSYNC(sc, last_txs->txs_firstdesc, 1,
906 			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
907 		}
908 
909 		/*
910 		 * The entire packet chain is set up.  Give the
911 		 * first descriptor to the chip now.
912 		 */
913 		sc->sc_txdescs[firsttx].td_status |= htole32(TDSTAT_OWN);
914 		TULIP_CDTXSYNC(sc, firsttx, 1,
915 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
916 
917 		/* Wake up the transmitter. */
918 		/* XXX USE AUTOPOLLING? */
919 		TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD);
920 
921 		/* Set a watchdog timer in case the chip flakes out. */
922 		ifp->if_timer = 5;
923 	}
924 }
925 
926 /*
927  * tlp_watchdog:	[ifnet interface function]
928  *
929  *	Watchdog timer handler.
930  */
931 static void
932 tlp_watchdog(struct ifnet *ifp)
933 {
934 	struct tulip_softc *sc = ifp->if_softc;
935 	int doing_setup, doing_transmit;
936 
937 	doing_setup = (sc->sc_flags & TULIPF_DOING_SETUP);
938 	doing_transmit = (! SIMPLEQ_EMPTY(&sc->sc_txdirtyq));
939 
940 	if (doing_setup && doing_transmit) {
941 		printf("%s: filter setup and transmit timeout\n",
942 		    device_xname(sc->sc_dev));
943 		ifp->if_oerrors++;
944 	} else if (doing_transmit) {
945 		printf("%s: transmit timeout\n", device_xname(sc->sc_dev));
946 		ifp->if_oerrors++;
947 	} else if (doing_setup)
948 		printf("%s: filter setup timeout\n", device_xname(sc->sc_dev));
949 	else
950 		printf("%s: spurious watchdog timeout\n",
951 		    device_xname(sc->sc_dev));
952 
953 	(void) tlp_init(ifp);
954 
955 	/* Try to get more packets going. */
956 	tlp_start(ifp);
957 }
958 
959 /* If the interface is up and running, only modify the receive
960  * filter when setting promiscuous or debug mode.  Otherwise fall
961  * through to ether_ioctl, which will reset the chip.
962  */
963 static int
964 tlp_ifflags_cb(struct ethercom *ec)
965 {
966 	struct ifnet *ifp = &ec->ec_if;
967 	struct tulip_softc *sc = ifp->if_softc;
968 	int change = ifp->if_flags ^ sc->sc_if_flags;
969 
970 	if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0)
971 		return ENETRESET;
972 	if ((change & IFF_PROMISC) != 0)
973 		(*sc->sc_filter_setup)(sc);
974 	return 0;
975 }
976 
977 /*
978  * tlp_ioctl:		[ifnet interface function]
979  *
980  *	Handle control requests from the operator.
981  */
982 static int
983 tlp_ioctl(struct ifnet *ifp, u_long cmd, void *data)
984 {
985 	struct tulip_softc *sc = ifp->if_softc;
986 	int s, error;
987 
988 	s = splnet();
989 
990 	switch (cmd) {
991 	default:
992 		error = ether_ioctl(ifp, cmd, data);
993 		if (error == ENETRESET) {
994 			if (ifp->if_flags & IFF_RUNNING) {
995 				/*
996 				 * Multicast list has changed.  Set the
997 				 * hardware filter accordingly.
998 				 */
999 				(*sc->sc_filter_setup)(sc);
1000 			}
1001 			error = 0;
1002 		}
1003 		break;
1004 	}
1005 
1006 	/* Try to get more packets going. */
1007 	if (TULIP_IS_ENABLED(sc))
1008 		tlp_start(ifp);
1009 
1010 	sc->sc_if_flags = ifp->if_flags;
1011 	splx(s);
1012 	return error;
1013 }
1014 
1015 /*
1016  * tlp_intr:
1017  *
1018  *	Interrupt service routine.
1019  */
1020 int
1021 tlp_intr(void *arg)
1022 {
1023 	struct tulip_softc *sc = arg;
1024 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1025 	uint32_t status, rxstatus, txstatus;
1026 	int handled = 0, txthresh;
1027 
1028 	DPRINTF(sc, ("%s: tlp_intr\n", device_xname(sc->sc_dev)));
1029 
1030 #ifdef DEBUG
1031 	if (TULIP_IS_ENABLED(sc) == 0)
1032 		panic("%s: tlp_intr: not enabled", device_xname(sc->sc_dev));
1033 #endif
1034 
1035 	/*
1036 	 * If the interface isn't running, the interrupt couldn't
1037 	 * possibly have come from us.
1038 	 */
1039 	if ((ifp->if_flags & IFF_RUNNING) == 0 ||
1040 	    !device_is_active(sc->sc_dev))
1041 		return 0;
1042 
1043 	/* Disable interrupts on the DM9102 (interrupt edge bug). */
1044 	switch (sc->sc_chip) {
1045 	case TULIP_CHIP_DM9102:
1046 	case TULIP_CHIP_DM9102A:
1047 		TULIP_WRITE(sc, CSR_INTEN, 0);
1048 		break;
1049 
1050 	default:
1051 		/* Nothing. */
1052 		break;
1053 	}
1054 
1055 	for (;;) {
1056 		status = TULIP_READ(sc, CSR_STATUS);
1057 		if (status)
1058 			TULIP_WRITE(sc, CSR_STATUS, status);
1059 
1060 		if ((status & sc->sc_inten) == 0)
1061 			break;
1062 
1063 		handled = 1;
1064 
1065 		rxstatus = status & sc->sc_rxint_mask;
1066 		txstatus = status & sc->sc_txint_mask;
1067 
1068 		if (rxstatus) {
1069 			/* Grab new any new packets. */
1070 			tlp_rxintr(sc);
1071 
1072 			if (rxstatus & STATUS_RWT)
1073 				printf("%s: receive watchdog timeout\n",
1074 				    device_xname(sc->sc_dev));
1075 
1076 			if (rxstatus & STATUS_RU) {
1077 				printf("%s: receive ring overrun\n",
1078 				    device_xname(sc->sc_dev));
1079 				/* Get the receive process going again. */
1080 				if (sc->sc_tdctl_er != TDCTL_ER) {
1081 					tlp_idle(sc, OPMODE_SR);
1082 					TULIP_WRITE(sc, CSR_RXLIST,
1083 					    TULIP_CDRXADDR(sc, sc->sc_rxptr));
1084 					TULIP_WRITE(sc, CSR_OPMODE,
1085 					    sc->sc_opmode);
1086 				}
1087 				TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD);
1088 				break;
1089 			}
1090 		}
1091 
1092 		if (txstatus) {
1093 			/* Sweep up transmit descriptors. */
1094 			tlp_txintr(sc);
1095 
1096 			if (txstatus & STATUS_TJT)
1097 				printf("%s: transmit jabber timeout\n",
1098 				    device_xname(sc->sc_dev));
1099 
1100 			if (txstatus & STATUS_UNF) {
1101 				/*
1102 				 * Increase our transmit threshold if
1103 				 * another is available.
1104 				 */
1105 				txthresh = sc->sc_txthresh + 1;
1106 				if (sc->sc_txth[txthresh].txth_name != NULL) {
1107 					/* Idle the transmit process. */
1108 					tlp_idle(sc, OPMODE_ST);
1109 
1110 					sc->sc_txthresh = txthresh;
1111 					sc->sc_opmode &= ~(OPMODE_TR|OPMODE_SF);
1112 					sc->sc_opmode |=
1113 					    sc->sc_txth[txthresh].txth_opmode;
1114 					printf("%s: transmit underrun; new "
1115 					    "threshold: %s\n",
1116 					    device_xname(sc->sc_dev),
1117 					    sc->sc_txth[txthresh].txth_name);
1118 
1119 					/*
1120 					 * Set the new threshold and restart
1121 					 * the transmit process.
1122 					 */
1123 					TULIP_WRITE(sc, CSR_OPMODE,
1124 					    sc->sc_opmode);
1125 				}
1126 					/*
1127 					 * XXX Log every Nth underrun from
1128 					 * XXX now on?
1129 					 */
1130 			}
1131 		}
1132 
1133 		if (status & (STATUS_TPS | STATUS_RPS)) {
1134 			if (status & STATUS_TPS)
1135 				printf("%s: transmit process stopped\n",
1136 				    device_xname(sc->sc_dev));
1137 			if (status & STATUS_RPS)
1138 				printf("%s: receive process stopped\n",
1139 				    device_xname(sc->sc_dev));
1140 			(void) tlp_init(ifp);
1141 			break;
1142 		}
1143 
1144 		if (status & STATUS_SE) {
1145 			const char *str;
1146 			switch (status & STATUS_EB) {
1147 			case STATUS_EB_PARITY:
1148 				str = "parity error";
1149 				break;
1150 
1151 			case STATUS_EB_MABT:
1152 				str = "master abort";
1153 				break;
1154 
1155 			case STATUS_EB_TABT:
1156 				str = "target abort";
1157 				break;
1158 
1159 			default:
1160 				str = "unknown error";
1161 				break;
1162 			}
1163 			aprint_error_dev(sc->sc_dev,
1164 			    "fatal system error: %s\n", str);
1165 			(void) tlp_init(ifp);
1166 			break;
1167 		}
1168 
1169 		/*
1170 		 * Not handled:
1171 		 *
1172 		 *	Transmit buffer unavailable -- normal
1173 		 *	condition, nothing to do, really.
1174 		 *
1175 		 *	General purpose timer experied -- we don't
1176 		 *	use the general purpose timer.
1177 		 *
1178 		 *	Early receive interrupt -- not available on
1179 		 *	all chips, we just use RI.  We also only
1180 		 *	use single-segment receive DMA, so this
1181 		 *	is mostly useless.
1182 		 */
1183 	}
1184 
1185 	/* Bring interrupts back up on the DM9102. */
1186 	switch (sc->sc_chip) {
1187 	case TULIP_CHIP_DM9102:
1188 	case TULIP_CHIP_DM9102A:
1189 		TULIP_WRITE(sc, CSR_INTEN, sc->sc_inten);
1190 		break;
1191 
1192 	default:
1193 		/* Nothing. */
1194 		break;
1195 	}
1196 
1197 	/* Try to get more packets going. */
1198 	if_schedule_deferred_start(ifp);
1199 
1200 	if (handled)
1201 		rnd_add_uint32(&sc->sc_rnd_source, status);
1202 
1203 	return handled;
1204 }
1205 
1206 /*
1207  * tlp_rxintr:
1208  *
1209  *	Helper; handle receive interrupts.
1210  */
1211 static void
1212 tlp_rxintr(struct tulip_softc *sc)
1213 {
1214 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1215 	struct ether_header *eh;
1216 	struct tulip_rxsoft *rxs;
1217 	struct mbuf *m;
1218 	uint32_t rxstat, errors;
1219 	int i, len;
1220 
1221 	for (i = sc->sc_rxptr;; i = TULIP_NEXTRX(i)) {
1222 		rxs = &sc->sc_rxsoft[i];
1223 
1224 		TULIP_CDRXSYNC(sc, i,
1225 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1226 
1227 		rxstat = le32toh(sc->sc_rxdescs[i].td_status);
1228 
1229 		if (rxstat & TDSTAT_OWN) {
1230 			/*
1231 			 * We have processed all of the receive buffers.
1232 			 */
1233 			break;
1234 		}
1235 
1236 		/*
1237 		 * Make sure the packet fit in one buffer.  This should
1238 		 * always be the case.  But the Lite-On PNIC, rev 33
1239 		 * has an awful receive engine bug, which may require
1240 		 * a very icky work-around.
1241 		 */
1242 		if ((rxstat & (TDSTAT_Rx_FS | TDSTAT_Rx_LS)) !=
1243 		    (TDSTAT_Rx_FS | TDSTAT_Rx_LS)) {
1244 			printf("%s: incoming packet spilled, resetting\n",
1245 			    device_xname(sc->sc_dev));
1246 			(void) tlp_init(ifp);
1247 			return;
1248 		}
1249 
1250 		/*
1251 		 * If any collisions were seen on the wire, count one.
1252 		 */
1253 		if (rxstat & TDSTAT_Rx_CS)
1254 			ifp->if_collisions++;
1255 
1256 		/*
1257 		 * If an error occurred, update stats, clear the status
1258 		 * word, and leave the packet buffer in place.  It will
1259 		 * simply be reused the next time the ring comes around.
1260 		 */
1261 		errors = TDSTAT_Rx_DE | TDSTAT_Rx_RF | TDSTAT_Rx_TL |
1262 		    TDSTAT_Rx_CS | TDSTAT_Rx_RE | TDSTAT_Rx_DB | TDSTAT_Rx_CE;
1263 		/*
1264 	 	 * If 802.1Q VLAN MTU is enabled, ignore the Frame Too Long
1265 		 * error.
1266 		 */
1267 		if ((sc->sc_ethercom.ec_capenable & ETHERCAP_VLAN_MTU) != 0)
1268 			errors &= ~TDSTAT_Rx_TL;
1269 		/*
1270 		 * If chip doesn't have MII, ignore the MII error bit.
1271 		 */
1272 		if ((sc->sc_flags & TULIPF_HAS_MII) == 0)
1273 			errors &= ~TDSTAT_Rx_RE;
1274 
1275 		if ((rxstat & TDSTAT_ES) != 0 &&
1276 		    (rxstat & errors) != 0) {
1277 			rxstat &= errors;
1278 #define	PRINTERR(bit, str)						\
1279 			if (rxstat & (bit))				\
1280 				aprint_error_dev(sc->sc_dev,		\
1281 				    "receive error: %s\n", str)
1282 			ifp->if_ierrors++;
1283 			PRINTERR(TDSTAT_Rx_DE, "descriptor error");
1284 			PRINTERR(TDSTAT_Rx_RF, "runt frame");
1285 			PRINTERR(TDSTAT_Rx_TL, "frame too long");
1286 			PRINTERR(TDSTAT_Rx_RE, "MII error");
1287 			PRINTERR(TDSTAT_Rx_DB, "dribbling bit");
1288 			PRINTERR(TDSTAT_Rx_CE, "CRC error");
1289 #undef PRINTERR
1290 			TULIP_INIT_RXDESC(sc, i);
1291 			continue;
1292 		}
1293 
1294 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1295 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
1296 
1297 		/*
1298 		 * No errors; receive the packet.  Note the Tulip
1299 		 * includes the CRC with every packet.
1300 		 */
1301 		len = TDSTAT_Rx_LENGTH(rxstat) - ETHER_CRC_LEN;
1302 
1303 #ifdef __NO_STRICT_ALIGNMENT
1304 		/*
1305 		 * Allocate a new mbuf cluster.  If that fails, we are
1306 		 * out of memory, and must drop the packet and recycle
1307 		 * the buffer that's already attached to this descriptor.
1308 		 */
1309 		m = rxs->rxs_mbuf;
1310 		if (tlp_add_rxbuf(sc, i) != 0) {
1311 			ifp->if_ierrors++;
1312 			TULIP_INIT_RXDESC(sc, i);
1313 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1314 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1315 			continue;
1316 		}
1317 #else
1318 		/*
1319 		 * The Tulip's receive buffers must be 4-byte aligned.
1320 		 * But this means that the data after the Ethernet header
1321 		 * is misaligned.  We must allocate a new buffer and
1322 		 * copy the data, shifted forward 2 bytes.
1323 		 */
1324 		MGETHDR(m, M_DONTWAIT, MT_DATA);
1325 		if (m == NULL) {
1326  dropit:
1327 			ifp->if_ierrors++;
1328 			TULIP_INIT_RXDESC(sc, i);
1329 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1330 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1331 			continue;
1332 		}
1333 		MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner);
1334 		if (len > (MHLEN - 2)) {
1335 			MCLGET(m, M_DONTWAIT);
1336 			if ((m->m_flags & M_EXT) == 0) {
1337 				m_freem(m);
1338 				goto dropit;
1339 			}
1340 		}
1341 		m->m_data += 2;
1342 
1343 		/*
1344 		 * Note that we use clusters for incoming frames, so the
1345 		 * buffer is virtually contiguous.
1346 		 */
1347 		memcpy(mtod(m, void *), mtod(rxs->rxs_mbuf, void *), len);
1348 
1349 		/* Allow the receive descriptor to continue using its mbuf. */
1350 		TULIP_INIT_RXDESC(sc, i);
1351 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1352 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1353 #endif /* __NO_STRICT_ALIGNMENT */
1354 
1355 		eh = mtod(m, struct ether_header *);
1356 		m_set_rcvif(m, ifp);
1357 		m->m_pkthdr.len = m->m_len = len;
1358 
1359 		/*
1360 		 * XXX Work-around for a weird problem with the emulated
1361 		 * 21041 on Connectix Virtual PC:
1362 		 *
1363 		 * When we receive a full-size TCP segment, we seem to get
1364 		 * a packet there the Rx status says 1522 bytes, yet we do
1365 		 * not get a frame-too-long error from the chip.  The extra
1366 		 * bytes seem to always be zeros.  Perhaps Virtual PC is
1367 		 * inserting 4 bytes of zeros after every packet.  In any
1368 		 * case, let's try and detect this condition and truncate
1369 		 * the length so that it will pass up the stack.
1370 		 */
1371 		if (__predict_false((sc->sc_flags & TULIPF_VPC) != 0)) {
1372 			uint16_t etype = ntohs(eh->ether_type);
1373 
1374 			if (len > ETHER_MAX_FRAME(ifp, etype, 0))
1375 				m->m_pkthdr.len = m->m_len = len =
1376 				    ETHER_MAX_FRAME(ifp, etype, 0);
1377 		}
1378 
1379 		/*
1380 		 * We sometimes have to run the 21140 in Hash-Only
1381 		 * mode.  If we're in that mode, and not in promiscuous
1382 		 * mode, and we have a unicast packet that isn't for
1383 		 * us, then drop it.
1384 		 */
1385 		if (sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY &&
1386 		    (ifp->if_flags & IFF_PROMISC) == 0 &&
1387 		    ETHER_IS_MULTICAST(eh->ether_dhost) == 0 &&
1388 		    memcmp(CLLADDR(ifp->if_sadl), eh->ether_dhost,
1389 			   ETHER_ADDR_LEN) != 0) {
1390 			m_freem(m);
1391 			continue;
1392 		}
1393 
1394 		/* Pass it on. */
1395 		if_percpuq_enqueue(ifp->if_percpuq, m);
1396 	}
1397 
1398 	/* Update the receive pointer. */
1399 	sc->sc_rxptr = i;
1400 }
1401 
1402 /*
1403  * tlp_txintr:
1404  *
1405  *	Helper; handle transmit interrupts.
1406  */
1407 static void
1408 tlp_txintr(struct tulip_softc *sc)
1409 {
1410 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1411 	struct tulip_txsoft *txs;
1412 	uint32_t txstat;
1413 
1414 	DPRINTF(sc, ("%s: tlp_txintr: sc_flags 0x%08x\n",
1415 	    device_xname(sc->sc_dev), sc->sc_flags));
1416 
1417 	ifp->if_flags &= ~IFF_OACTIVE;
1418 
1419 	/*
1420 	 * Go through our Tx list and free mbufs for those
1421 	 * frames that have been transmitted.
1422 	 */
1423 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
1424 		TULIP_CDTXSYNC(sc, txs->txs_lastdesc, txs->txs_ndescs,
1425 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1426 
1427 #ifdef TLP_DEBUG
1428 		if (ifp->if_flags & IFF_DEBUG) {
1429 			int i;
1430 			struct tulip_desc *txd;
1431 			printf("    txsoft %p transmit chain:\n", txs);
1432 			for (i = txs->txs_firstdesc;; i = TULIP_NEXTTX(i)) {
1433 				txd = &sc->sc_txdescs[i];
1434 				printf("     descriptor %d:\n", i);
1435 				printf("       td_status:   0x%08x\n",
1436 				    le32toh(txd->td_status));
1437 				printf("       td_ctl:      0x%08x\n",
1438 				    le32toh(txd->td_ctl));
1439 				printf("       td_bufaddr1: 0x%08x\n",
1440 				    le32toh(txd->td_bufaddr1));
1441 				printf("       td_bufaddr2: 0x%08x\n",
1442 				    le32toh(sc->sc_txdescs[i].td_bufaddr2));
1443 				if (i == txs->txs_lastdesc)
1444 					break;
1445 			}
1446 		}
1447 #endif
1448 
1449 		txstat = le32toh(sc->sc_txdescs[txs->txs_lastdesc].td_status);
1450 		if (txstat & TDSTAT_OWN)
1451 			break;
1452 
1453 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
1454 
1455 		sc->sc_txfree += txs->txs_ndescs;
1456 
1457 		if (txs->txs_mbuf == NULL) {
1458 			/*
1459 			 * If we didn't have an mbuf, it was the setup
1460 			 * packet.
1461 			 */
1462 #ifdef DIAGNOSTIC
1463 			if ((sc->sc_flags & TULIPF_DOING_SETUP) == 0)
1464 				panic("tlp_txintr: null mbuf, not doing setup");
1465 #endif
1466 			TULIP_CDSPSYNC(sc, BUS_DMASYNC_POSTWRITE);
1467 			sc->sc_flags &= ~TULIPF_DOING_SETUP;
1468 			SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
1469 			continue;
1470 		}
1471 
1472 		bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
1473 		    0, txs->txs_dmamap->dm_mapsize,
1474 		    BUS_DMASYNC_POSTWRITE);
1475 		bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
1476 		m_freem(txs->txs_mbuf);
1477 		txs->txs_mbuf = NULL;
1478 
1479 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
1480 
1481 		/*
1482 		 * Check for errors and collisions.
1483 		 */
1484 #ifdef TLP_STATS
1485 		if (txstat & TDSTAT_Tx_UF)
1486 			sc->sc_stats.ts_tx_uf++;
1487 		if (txstat & TDSTAT_Tx_TO)
1488 			sc->sc_stats.ts_tx_to++;
1489 		if (txstat & TDSTAT_Tx_EC)
1490 			sc->sc_stats.ts_tx_ec++;
1491 		if (txstat & TDSTAT_Tx_LC)
1492 			sc->sc_stats.ts_tx_lc++;
1493 #endif
1494 
1495 		if (txstat & (TDSTAT_Tx_UF | TDSTAT_Tx_TO))
1496 			ifp->if_oerrors++;
1497 
1498 		if (txstat & TDSTAT_Tx_EC)
1499 			ifp->if_collisions += 16;
1500 		else
1501 			ifp->if_collisions += TDSTAT_Tx_COLLISIONS(txstat);
1502 		if (txstat & TDSTAT_Tx_LC)
1503 			ifp->if_collisions++;
1504 
1505 		ifp->if_opackets++;
1506 	}
1507 
1508 	/*
1509 	 * If there are no more pending transmissions, cancel the watchdog
1510 	 * timer.
1511 	 */
1512 	if (txs == NULL && (sc->sc_flags & TULIPF_DOING_SETUP) == 0)
1513 		ifp->if_timer = 0;
1514 
1515 	/*
1516 	 * If we have a receive filter setup pending, do it now.
1517 	 */
1518 	if (sc->sc_flags & TULIPF_WANT_SETUP)
1519 		(*sc->sc_filter_setup)(sc);
1520 }
1521 
1522 #ifdef TLP_STATS
1523 void
1524 tlp_print_stats(struct tulip_softc *sc)
1525 {
1526 
1527 	printf("%s: tx_uf %lu, tx_to %lu, tx_ec %lu, tx_lc %lu\n",
1528 	    device_xname(sc->sc_dev),
1529 	    sc->sc_stats.ts_tx_uf, sc->sc_stats.ts_tx_to,
1530 	    sc->sc_stats.ts_tx_ec, sc->sc_stats.ts_tx_lc);
1531 }
1532 #endif
1533 
1534 /*
1535  * tlp_reset:
1536  *
1537  *	Perform a soft reset on the Tulip.
1538  */
1539 void
1540 tlp_reset(struct tulip_softc *sc)
1541 {
1542 	int i;
1543 
1544 	TULIP_WRITE(sc, CSR_BUSMODE, BUSMODE_SWR);
1545 
1546 	/*
1547 	 * Xircom, ASIX and Conexant clones don't bring themselves
1548 	 * out of reset automatically.
1549 	 * Instead, we have to wait at least 50 PCI cycles, and then
1550 	 * clear SWR.
1551 	 */
1552 	switch (sc->sc_chip) {
1553 		case TULIP_CHIP_X3201_3:
1554 		case TULIP_CHIP_AX88140:
1555 		case TULIP_CHIP_AX88141:
1556 		case TULIP_CHIP_RS7112:
1557 			delay(10);
1558 			TULIP_WRITE(sc, CSR_BUSMODE, 0);
1559 			break;
1560 		default:
1561 			break;
1562 	}
1563 
1564 	for (i = 0; i < 1000; i++) {
1565 		/*
1566 		 * Wait at least 50 PCI cycles for the reset to
1567 		 * complete before peeking at the Tulip again.
1568 		 * 10 uSec is a bit longer than 50 PCI cycles
1569 		 * (at 33MHz), but it doesn't hurt have the extra
1570 		 * wait.
1571 		 */
1572 		delay(10);
1573 		if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR) == 0)
1574 			break;
1575 	}
1576 
1577 	if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR))
1578 		aprint_error_dev(sc->sc_dev, "reset failed to complete\n");
1579 
1580 	delay(1000);
1581 
1582 	/*
1583 	 * If the board has any GPIO reset sequences to issue, do them now.
1584 	 */
1585 	if (sc->sc_reset != NULL)
1586 		(*sc->sc_reset)(sc);
1587 }
1588 
1589 /*
1590  * tlp_init:		[ ifnet interface function ]
1591  *
1592  *	Initialize the interface.  Must be called at splnet().
1593  */
1594 static int
1595 tlp_init(struct ifnet *ifp)
1596 {
1597 	struct tulip_softc *sc = ifp->if_softc;
1598 	struct tulip_txsoft *txs;
1599 	struct tulip_rxsoft *rxs;
1600 	int i, error = 0;
1601 
1602 	if ((error = tlp_enable(sc)) != 0)
1603 		goto out;
1604 
1605 	/*
1606 	 * Cancel any pending I/O.
1607 	 */
1608 	tlp_stop(ifp, 0);
1609 
1610 	/*
1611 	 * Initialize `opmode' to 0, and call the pre-init routine, if
1612 	 * any.  This is required because the 2114x and some of the
1613 	 * clones require that the media-related bits in `opmode' be
1614 	 * set before performing a soft-reset in order to get internal
1615 	 * chip pathways are correct.  Yay!
1616 	 */
1617 	sc->sc_opmode = 0;
1618 	if (sc->sc_preinit != NULL)
1619 		(*sc->sc_preinit)(sc);
1620 
1621 	/*
1622 	 * Reset the Tulip to a known state.
1623 	 */
1624 	tlp_reset(sc);
1625 
1626 	/*
1627 	 * Initialize the BUSMODE register.
1628 	 */
1629 	sc->sc_busmode = BUSMODE_BAR;
1630 	switch (sc->sc_chip) {
1631 	case TULIP_CHIP_21140:
1632 	case TULIP_CHIP_21140A:
1633 	case TULIP_CHIP_21142:
1634 	case TULIP_CHIP_21143:
1635 	case TULIP_CHIP_82C115:
1636 	case TULIP_CHIP_MX98725:
1637 		/*
1638 		 * If we're allowed to do so, use Memory Read Line
1639 		 * and Memory Read Multiple.
1640 		 *
1641 		 * XXX Should we use Memory Write and Invalidate?
1642 		 */
1643 		if (sc->sc_flags & TULIPF_MRL)
1644 			sc->sc_busmode |= BUSMODE_RLE;
1645 		if (sc->sc_flags & TULIPF_MRM)
1646 			sc->sc_busmode |= BUSMODE_RME;
1647 #if 0
1648 		if (sc->sc_flags & TULIPF_MWI)
1649 			sc->sc_busmode |= BUSMODE_WLE;
1650 #endif
1651 		break;
1652 
1653 	case TULIP_CHIP_82C168:
1654 	case TULIP_CHIP_82C169:
1655 		sc->sc_busmode |= BUSMODE_PNIC_MBO;
1656 		if (sc->sc_maxburst == 0)
1657 			sc->sc_maxburst = 16;
1658 		break;
1659 
1660 	case TULIP_CHIP_AX88140:
1661 	case TULIP_CHIP_AX88141:
1662 		if (sc->sc_maxburst == 0)
1663 			sc->sc_maxburst = 16;
1664 		break;
1665 
1666 	default:
1667 		/* Nothing. */
1668 		break;
1669 	}
1670 	switch (sc->sc_cacheline) {
1671 	default:
1672 		/*
1673 		 * Note: We must *always* set these bits; a cache
1674 		 * alignment of 0 is RESERVED.
1675 		 */
1676 	case 8:
1677 		sc->sc_busmode |= BUSMODE_CAL_8LW;
1678 		break;
1679 	case 16:
1680 		sc->sc_busmode |= BUSMODE_CAL_16LW;
1681 		break;
1682 	case 32:
1683 		sc->sc_busmode |= BUSMODE_CAL_32LW;
1684 		break;
1685 	}
1686 	switch (sc->sc_maxburst) {
1687 	case 1:
1688 		sc->sc_busmode |= BUSMODE_PBL_1LW;
1689 		break;
1690 	case 2:
1691 		sc->sc_busmode |= BUSMODE_PBL_2LW;
1692 		break;
1693 	case 4:
1694 		sc->sc_busmode |= BUSMODE_PBL_4LW;
1695 		break;
1696 	case 8:
1697 		sc->sc_busmode |= BUSMODE_PBL_8LW;
1698 		break;
1699 	case 16:
1700 		sc->sc_busmode |= BUSMODE_PBL_16LW;
1701 		break;
1702 	case 32:
1703 		sc->sc_busmode |= BUSMODE_PBL_32LW;
1704 		break;
1705 	default:
1706 		sc->sc_busmode |= BUSMODE_PBL_DEFAULT;
1707 		break;
1708 	}
1709 #if BYTE_ORDER == BIG_ENDIAN
1710 	/*
1711 	 * Can't use BUSMODE_BLE or BUSMODE_DBO; not all chips
1712 	 * support them, and even on ones that do, it doesn't
1713 	 * always work.  So we always access descriptors with
1714 	 * little endian via htole32/le32toh.
1715 	 */
1716 #endif
1717 	/*
1718 	 * Big-endian bus requires BUSMODE_BLE anyway.
1719 	 * Also, BUSMODE_DBO is needed because we assume
1720 	 * descriptors are little endian.
1721 	 */
1722 	if (sc->sc_flags & TULIPF_BLE)
1723 		sc->sc_busmode |= BUSMODE_BLE;
1724 	if (sc->sc_flags & TULIPF_DBO)
1725 		sc->sc_busmode |= BUSMODE_DBO;
1726 
1727 	/*
1728 	 * Some chips have a broken bus interface.
1729 	 */
1730 	switch (sc->sc_chip) {
1731 	case TULIP_CHIP_DM9102:
1732 	case TULIP_CHIP_DM9102A:
1733 		sc->sc_busmode = 0;
1734 		break;
1735 
1736 	default:
1737 		/* Nothing. */
1738 		break;
1739 	}
1740 
1741 	TULIP_WRITE(sc, CSR_BUSMODE, sc->sc_busmode);
1742 
1743 	/*
1744 	 * Initialize the OPMODE register.  We don't write it until
1745 	 * we're ready to begin the transmit and receive processes.
1746 	 *
1747 	 * Media-related OPMODE bits are set in the media callbacks
1748 	 * for each specific chip/board.
1749 	 */
1750 	sc->sc_opmode |= OPMODE_SR | OPMODE_ST |
1751 	    sc->sc_txth[sc->sc_txthresh].txth_opmode;
1752 
1753 	/*
1754 	 * Magical mystery initialization on the Macronix chips.
1755 	 * The MX98713 uses its own magic value, the rest share
1756 	 * a common one.
1757 	 */
1758 	switch (sc->sc_chip) {
1759 	case TULIP_CHIP_MX98713:
1760 		TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98713);
1761 		break;
1762 
1763 	case TULIP_CHIP_MX98713A:
1764 	case TULIP_CHIP_MX98715:
1765 	case TULIP_CHIP_MX98715A:
1766 	case TULIP_CHIP_MX98715AEC_X:
1767 	case TULIP_CHIP_MX98725:
1768 		TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98715);
1769 		break;
1770 
1771 	default:
1772 		/* Nothing. */
1773 		break;
1774 	}
1775 
1776 	/*
1777 	 * Initialize the transmit descriptor ring.
1778 	 */
1779 	memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
1780 	for (i = 0; i < TULIP_NTXDESC; i++) {
1781 		struct tulip_desc *txd = &sc->sc_txdescs[i];
1782 		txd->td_ctl = htole32(sc->sc_tdctl_ch);
1783 		txd->td_bufaddr2 = htole32(TULIP_CDTXADDR(sc, TULIP_NEXTTX(i)));
1784 	}
1785 	sc->sc_txdescs[TULIP_NTXDESC - 1].td_ctl |= htole32(sc->sc_tdctl_er);
1786 	TULIP_CDTXSYNC(sc, 0, TULIP_NTXDESC,
1787 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1788 	sc->sc_txfree = TULIP_NTXDESC;
1789 	sc->sc_txnext = 0;
1790 
1791 	/*
1792 	 * Initialize the transmit job descriptors.
1793 	 */
1794 	SIMPLEQ_INIT(&sc->sc_txfreeq);
1795 	SIMPLEQ_INIT(&sc->sc_txdirtyq);
1796 	for (i = 0; i < TULIP_TXQUEUELEN; i++) {
1797 		txs = &sc->sc_txsoft[i];
1798 		txs->txs_mbuf = NULL;
1799 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
1800 	}
1801 
1802 	/*
1803 	 * Initialize the receive descriptor and receive job
1804 	 * descriptor rings.
1805 	 */
1806 	for (i = 0; i < TULIP_NRXDESC; i++) {
1807 		rxs = &sc->sc_rxsoft[i];
1808 		if (rxs->rxs_mbuf == NULL) {
1809 			if ((error = tlp_add_rxbuf(sc, i)) != 0) {
1810 				aprint_error_dev(sc->sc_dev,
1811 				    "unable to allocate or map rx "
1812 				    "buffer %d, error = %d\n", i, error);
1813 				/*
1814 				 * XXX Should attempt to run with fewer receive
1815 				 * XXX buffers instead of just failing.
1816 				 */
1817 				tlp_rxdrain(sc);
1818 				goto out;
1819 			}
1820 		} else
1821 			TULIP_INIT_RXDESC(sc, i);
1822 	}
1823 	sc->sc_rxptr = 0;
1824 
1825 	/*
1826 	 * Initialize the interrupt mask and enable interrupts.
1827 	 */
1828 	/* normal interrupts */
1829 	sc->sc_inten = STATUS_TI | STATUS_TU | STATUS_RI | STATUS_NIS;
1830 
1831 	/* abnormal interrupts */
1832 	sc->sc_inten |= STATUS_TPS | STATUS_TJT | STATUS_UNF |
1833 	    STATUS_RU | STATUS_RPS | STATUS_RWT | STATUS_SE | STATUS_AIS;
1834 
1835 	sc->sc_rxint_mask = STATUS_RI | STATUS_RU | STATUS_RWT;
1836 	sc->sc_txint_mask = STATUS_TI | STATUS_UNF | STATUS_TJT;
1837 
1838 	switch (sc->sc_chip) {
1839 	case TULIP_CHIP_WB89C840F:
1840 		/*
1841 		 * Clear bits that we don't want that happen to
1842 		 * overlap or don't exist.
1843 		 */
1844 		sc->sc_inten &= ~(STATUS_WINB_REI | STATUS_RWT);
1845 		break;
1846 
1847 	default:
1848 		/* Nothing. */
1849 		break;
1850 	}
1851 
1852 	sc->sc_rxint_mask &= sc->sc_inten;
1853 	sc->sc_txint_mask &= sc->sc_inten;
1854 
1855 	TULIP_WRITE(sc, CSR_INTEN, sc->sc_inten);
1856 	TULIP_WRITE(sc, CSR_STATUS, 0xffffffff);
1857 
1858 	/*
1859 	 * Give the transmit and receive rings to the Tulip.
1860 	 */
1861 	TULIP_WRITE(sc, CSR_TXLIST, TULIP_CDTXADDR(sc, sc->sc_txnext));
1862 	TULIP_WRITE(sc, CSR_RXLIST, TULIP_CDRXADDR(sc, sc->sc_rxptr));
1863 
1864 	/*
1865 	 * On chips that do this differently, set the station address.
1866 	 */
1867 	switch (sc->sc_chip) {
1868 	case TULIP_CHIP_WB89C840F:
1869 	    {
1870 		/* XXX Do this with stream writes? */
1871 		bus_addr_t cpa = TULIP_CSR_OFFSET(sc, CSR_WINB_CPA0);
1872 
1873 		for (i = 0; i < ETHER_ADDR_LEN; i++) {
1874 			bus_space_write_1(sc->sc_st, sc->sc_sh,
1875 			    cpa + i, CLLADDR(ifp->if_sadl)[i]);
1876 		}
1877 		break;
1878 	    }
1879 
1880 	case TULIP_CHIP_AL981:
1881 	case TULIP_CHIP_AN983:
1882 	case TULIP_CHIP_AN985:
1883 	    {
1884 		uint32_t reg;
1885 		const uint8_t *enaddr = CLLADDR(ifp->if_sadl);
1886 
1887 		reg = enaddr[0] |
1888 		      (enaddr[1] << 8) |
1889 		      (enaddr[2] << 16) |
1890 		      (enaddr[3] << 24);
1891 		bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR0, reg);
1892 
1893 		reg = enaddr[4] |
1894 		      (enaddr[5] << 8);
1895 		bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR1, reg);
1896 		break;
1897 	    }
1898 
1899 	case TULIP_CHIP_AX88140:
1900 	case TULIP_CHIP_AX88141:
1901 	    {
1902 		uint32_t reg;
1903 		const uint8_t *enaddr = CLLADDR(ifp->if_sadl);
1904 
1905 		reg = enaddr[0] |
1906 		      (enaddr[1] << 8) |
1907 		      (enaddr[2] << 16) |
1908 		      (enaddr[3] << 24);
1909 		TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_PAR0);
1910 		TULIP_WRITE(sc, CSR_AX_FILTDATA, reg);
1911 
1912 		reg = enaddr[4] | (enaddr[5] << 8);
1913 		TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_PAR1);
1914 		TULIP_WRITE(sc, CSR_AX_FILTDATA, reg);
1915 		break;
1916 	    }
1917 
1918 	default:
1919 		/* Nothing. */
1920 		break;
1921 	}
1922 
1923 	/*
1924 	 * Set the receive filter.  This will start the transmit and
1925 	 * receive processes.
1926 	 */
1927 	(*sc->sc_filter_setup)(sc);
1928 
1929 	/*
1930 	 * Set the current media.
1931 	 */
1932 	(void)(*sc->sc_mediasw->tmsw_set)(sc);
1933 
1934 	/*
1935 	 * Start the receive process.
1936 	 */
1937 	TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD);
1938 
1939 	if (sc->sc_tick != NULL) {
1940 		/* Start the one second clock. */
1941 		callout_reset(&sc->sc_tick_callout, hz >> 3, sc->sc_tick, sc);
1942 	}
1943 
1944 	/*
1945 	 * Note that the interface is now running.
1946 	 */
1947 	ifp->if_flags |= IFF_RUNNING;
1948 	ifp->if_flags &= ~IFF_OACTIVE;
1949 	sc->sc_if_flags = ifp->if_flags;
1950 
1951  out:
1952 	if (error) {
1953 		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1954 		ifp->if_timer = 0;
1955 		printf("%s: interface not running\n", device_xname(sc->sc_dev));
1956 	}
1957 	return error;
1958 }
1959 
1960 /*
1961  * tlp_enable:
1962  *
1963  *	Enable the Tulip chip.
1964  */
1965 static int
1966 tlp_enable(struct tulip_softc *sc)
1967 {
1968 
1969 	if (TULIP_IS_ENABLED(sc) == 0 && sc->sc_enable != NULL) {
1970 		if ((*sc->sc_enable)(sc) != 0) {
1971 			aprint_error_dev(sc->sc_dev, "device enable failed\n");
1972 			return EIO;
1973 		}
1974 		sc->sc_flags |= TULIPF_ENABLED;
1975 	}
1976 	return 0;
1977 }
1978 
1979 /*
1980  * tlp_disable:
1981  *
1982  *	Disable the Tulip chip.
1983  */
1984 static void
1985 tlp_disable(struct tulip_softc *sc)
1986 {
1987 
1988 	if (TULIP_IS_ENABLED(sc) && sc->sc_disable != NULL) {
1989 		(*sc->sc_disable)(sc);
1990 		sc->sc_flags &= ~TULIPF_ENABLED;
1991 	}
1992 }
1993 
1994 /*
1995  * tlp_rxdrain:
1996  *
1997  *	Drain the receive queue.
1998  */
1999 static void
2000 tlp_rxdrain(struct tulip_softc *sc)
2001 {
2002 	struct tulip_rxsoft *rxs;
2003 	int i;
2004 
2005 	for (i = 0; i < TULIP_NRXDESC; i++) {
2006 		rxs = &sc->sc_rxsoft[i];
2007 		if (rxs->rxs_mbuf != NULL) {
2008 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2009 			m_freem(rxs->rxs_mbuf);
2010 			rxs->rxs_mbuf = NULL;
2011 		}
2012 	}
2013 }
2014 
2015 /*
2016  * tlp_stop:		[ ifnet interface function ]
2017  *
2018  *	Stop transmission on the interface.
2019  */
2020 static void
2021 tlp_stop(struct ifnet *ifp, int disable)
2022 {
2023 	struct tulip_softc *sc = ifp->if_softc;
2024 	struct tulip_txsoft *txs;
2025 
2026 	if (sc->sc_tick != NULL) {
2027 		/* Stop the one second clock. */
2028 		callout_stop(&sc->sc_tick_callout);
2029 	}
2030 
2031 	if (sc->sc_flags & TULIPF_HAS_MII) {
2032 		/* Down the MII. */
2033 		mii_down(&sc->sc_mii);
2034 	}
2035 
2036 	/* Disable interrupts. */
2037 	TULIP_WRITE(sc, CSR_INTEN, 0);
2038 
2039 	/* Stop the transmit and receive processes. */
2040 	sc->sc_opmode = 0;
2041 	TULIP_WRITE(sc, CSR_OPMODE, 0);
2042 	TULIP_WRITE(sc, CSR_RXLIST, 0);
2043 	TULIP_WRITE(sc, CSR_TXLIST, 0);
2044 
2045 	/*
2046 	 * Release any queued transmit buffers.
2047 	 */
2048 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
2049 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
2050 		if (txs->txs_mbuf != NULL) {
2051 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
2052 			m_freem(txs->txs_mbuf);
2053 			txs->txs_mbuf = NULL;
2054 		}
2055 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
2056 	}
2057 
2058 	sc->sc_flags &= ~(TULIPF_WANT_SETUP | TULIPF_DOING_SETUP);
2059 
2060 	/*
2061 	 * Mark the interface down and cancel the watchdog timer.
2062 	 */
2063 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2064 	sc->sc_if_flags = ifp->if_flags;
2065 	ifp->if_timer = 0;
2066 
2067 	/*
2068 	 * Reset the chip (needed on some flavors to actually disable it).
2069 	 */
2070 	tlp_reset(sc);
2071 
2072 	if (disable) {
2073 		tlp_rxdrain(sc);
2074 		tlp_disable(sc);
2075 	}
2076 }
2077 
2078 #define	SROM_EMIT(sc, x)						\
2079 do {									\
2080 	TULIP_WRITE((sc), CSR_MIIROM, (x));				\
2081 	delay(2);							\
2082 } while (0)
2083 
2084 /*
2085  * tlp_srom_idle:
2086  *
2087  *	Put the SROM in idle state.
2088  */
2089 static void
2090 tlp_srom_idle(struct tulip_softc *sc)
2091 {
2092 	uint32_t miirom;
2093 	int i;
2094 
2095 	miirom = MIIROM_SR;
2096 	SROM_EMIT(sc, miirom);
2097 
2098 	miirom |= MIIROM_RD;
2099 	SROM_EMIT(sc, miirom);
2100 
2101 	miirom |= MIIROM_SROMCS;
2102 	SROM_EMIT(sc, miirom);
2103 
2104 	SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2105 
2106 	/* Strobe the clock 32 times. */
2107 	for (i = 0; i < 32; i++) {
2108 		SROM_EMIT(sc, miirom);
2109 		SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2110 	}
2111 
2112 	SROM_EMIT(sc, miirom);
2113 
2114 	miirom &= ~MIIROM_SROMCS;
2115 	SROM_EMIT(sc, miirom);
2116 
2117 	SROM_EMIT(sc, 0);
2118 }
2119 
2120 /*
2121  * tlp_srom_size:
2122  *
2123  *	Determine the number of address bits in the SROM.
2124  */
2125 static int
2126 tlp_srom_size(struct tulip_softc *sc)
2127 {
2128 	uint32_t miirom;
2129 	int x;
2130 
2131 	/* Select the SROM. */
2132 	miirom = MIIROM_SR;
2133 	SROM_EMIT(sc, miirom);
2134 
2135 	miirom |= MIIROM_RD;
2136 	SROM_EMIT(sc, miirom);
2137 
2138 	/* Send CHIP SELECT for one clock tick. */
2139 	miirom |= MIIROM_SROMCS;
2140 	SROM_EMIT(sc, miirom);
2141 
2142 	/* Shift in the READ opcode. */
2143 	for (x = 3; x > 0; x--) {
2144 		if (TULIP_SROM_OPC_READ & (1 << (x - 1)))
2145 			miirom |= MIIROM_SROMDI;
2146 		else
2147 			miirom &= ~MIIROM_SROMDI;
2148 		SROM_EMIT(sc, miirom);
2149 		SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2150 		SROM_EMIT(sc, miirom);
2151 	}
2152 
2153 	/* Shift in address and look for dummy 0 bit. */
2154 	for (x = 1; x <= 12; x++) {
2155 		miirom &= ~MIIROM_SROMDI;
2156 		SROM_EMIT(sc, miirom);
2157 		SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2158 		if (!TULIP_ISSET(sc, CSR_MIIROM, MIIROM_SROMDO))
2159 			break;
2160 		SROM_EMIT(sc, miirom);
2161 	}
2162 
2163 	/* Clear CHIP SELECT. */
2164 	miirom &= ~MIIROM_SROMCS;
2165 	SROM_EMIT(sc, miirom);
2166 
2167 	/* Deselect the SROM. */
2168 	SROM_EMIT(sc, 0);
2169 
2170 	if (x < 4 || x > 12) {
2171 		aprint_debug_dev(sc->sc_dev, "broken MicroWire interface "
2172 		    "detected; setting SROM size to 1Kb\n");
2173 		return 6;
2174 	} else {
2175 		if (tlp_srom_debug)
2176 			printf("%s: SROM size is 2^%d*16 bits (%d bytes)\n",
2177 			    device_xname(sc->sc_dev), x, (1 << (x + 4)) >> 3);
2178 		return x;
2179 	}
2180 }
2181 
2182 /*
2183  * tlp_read_srom:
2184  *
2185  *	Read the Tulip SROM.
2186  */
2187 int
2188 tlp_read_srom(struct tulip_softc *sc)
2189 {
2190 	int size;
2191 	uint32_t miirom;
2192 	uint16_t datain;
2193 	int i, x;
2194 
2195 	tlp_srom_idle(sc);
2196 
2197 	sc->sc_srom_addrbits = tlp_srom_size(sc);
2198 	if (sc->sc_srom_addrbits == 0)
2199 		return 0;
2200 	size = TULIP_ROM_SIZE(sc->sc_srom_addrbits);
2201 	sc->sc_srom = malloc(size, M_DEVBUF, M_NOWAIT);
2202 
2203 	/* Select the SROM. */
2204 	miirom = MIIROM_SR;
2205 	SROM_EMIT(sc, miirom);
2206 
2207 	miirom |= MIIROM_RD;
2208 	SROM_EMIT(sc, miirom);
2209 
2210 	for (i = 0; i < size; i += 2) {
2211 		/* Send CHIP SELECT for one clock tick. */
2212 		miirom |= MIIROM_SROMCS;
2213 		SROM_EMIT(sc, miirom);
2214 
2215 		/* Shift in the READ opcode. */
2216 		for (x = 3; x > 0; x--) {
2217 			if (TULIP_SROM_OPC_READ & (1 << (x - 1)))
2218 				miirom |= MIIROM_SROMDI;
2219 			else
2220 				miirom &= ~MIIROM_SROMDI;
2221 			SROM_EMIT(sc, miirom);
2222 			SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2223 			SROM_EMIT(sc, miirom);
2224 		}
2225 
2226 		/* Shift in address. */
2227 		for (x = sc->sc_srom_addrbits; x > 0; x--) {
2228 			if (i & (1 << x))
2229 				miirom |= MIIROM_SROMDI;
2230 			else
2231 				miirom &= ~MIIROM_SROMDI;
2232 			SROM_EMIT(sc, miirom);
2233 			SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2234 			SROM_EMIT(sc, miirom);
2235 		}
2236 
2237 		/* Shift out data. */
2238 		miirom &= ~MIIROM_SROMDI;
2239 		datain = 0;
2240 		for (x = 16; x > 0; x--) {
2241 			SROM_EMIT(sc, miirom | MIIROM_SROMSK);
2242 			if (TULIP_ISSET(sc, CSR_MIIROM, MIIROM_SROMDO))
2243 				datain |= (1 << (x - 1));
2244 			SROM_EMIT(sc, miirom);
2245 		}
2246 		sc->sc_srom[i] = datain & 0xff;
2247 		sc->sc_srom[i + 1] = datain >> 8;
2248 
2249 		/* Clear CHIP SELECT. */
2250 		miirom &= ~MIIROM_SROMCS;
2251 		SROM_EMIT(sc, miirom);
2252 	}
2253 
2254 	/* Deselect the SROM. */
2255 	SROM_EMIT(sc, 0);
2256 
2257 	/* ...and idle it. */
2258 	tlp_srom_idle(sc);
2259 
2260 	if (tlp_srom_debug) {
2261 		printf("SROM CONTENTS:");
2262 		for (i = 0; i < size; i++) {
2263 			if ((i % 8) == 0)
2264 				printf("\n\t");
2265 			printf("0x%02x ", sc->sc_srom[i]);
2266 		}
2267 		printf("\n");
2268 	}
2269 
2270 	return 1;
2271 }
2272 
2273 #undef SROM_EMIT
2274 
2275 /*
2276  * tlp_add_rxbuf:
2277  *
2278  *	Add a receive buffer to the indicated descriptor.
2279  */
2280 static int
2281 tlp_add_rxbuf(struct tulip_softc *sc, int idx)
2282 {
2283 	struct tulip_rxsoft *rxs = &sc->sc_rxsoft[idx];
2284 	struct mbuf *m;
2285 	int error;
2286 
2287 	MGETHDR(m, M_DONTWAIT, MT_DATA);
2288 	if (m == NULL)
2289 		return ENOBUFS;
2290 
2291 	MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner);
2292 	MCLGET(m, M_DONTWAIT);
2293 	if ((m->m_flags & M_EXT) == 0) {
2294 		m_freem(m);
2295 		return ENOBUFS;
2296 	}
2297 
2298 	if (rxs->rxs_mbuf != NULL)
2299 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2300 
2301 	rxs->rxs_mbuf = m;
2302 
2303 	error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap,
2304 	    m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
2305 	    BUS_DMA_READ | BUS_DMA_NOWAIT);
2306 	if (error) {
2307 		aprint_error_dev(sc->sc_dev,
2308 		    "can't load rx DMA map %d, error = %d\n", idx, error);
2309 		panic("tlp_add_rxbuf");	/* XXX */
2310 	}
2311 
2312 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
2313 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
2314 
2315 	TULIP_INIT_RXDESC(sc, idx);
2316 
2317 	return 0;
2318 }
2319 
2320 /*
2321  * tlp_srom_crcok:
2322  *
2323  *	Check the CRC of the Tulip SROM.
2324  */
2325 int
2326 tlp_srom_crcok(const uint8_t *romdata)
2327 {
2328 	uint32_t crc;
2329 
2330 	crc = ether_crc32_le(romdata, TULIP_ROM_CRC32_CHECKSUM);
2331 	crc = (crc & 0xffff) ^ 0xffff;
2332 	if (crc == TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM))
2333 		return 1;
2334 
2335 	/*
2336 	 * Try an alternate checksum.
2337 	 */
2338 	crc = ether_crc32_le(romdata, TULIP_ROM_CRC32_CHECKSUM1);
2339 	crc = (crc & 0xffff) ^ 0xffff;
2340 	if (crc == TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM1))
2341 		return 1;
2342 
2343 	return 0;
2344 }
2345 
2346 /*
2347  * tlp_isv_srom:
2348  *
2349  *	Check to see if the SROM is in the new standardized format.
2350  */
2351 int
2352 tlp_isv_srom(const uint8_t *romdata)
2353 {
2354 	int i;
2355 	uint16_t cksum;
2356 
2357 	if (tlp_srom_crcok(romdata)) {
2358 		/*
2359 		 * SROM CRC checks out; must be in the new format.
2360 		 */
2361 		return 1;
2362 	}
2363 
2364 	cksum = TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM);
2365 	if (cksum == 0xffff || cksum == 0) {
2366 		/*
2367 		 * No checksum present.  Check the SROM ID; 18 bytes of 0
2368 		 * followed by 1 (version) followed by the number of
2369 		 * adapters which use this SROM (should be non-zero).
2370 		 */
2371 		for (i = 0; i < TULIP_ROM_SROM_FORMAT_VERION; i++) {
2372 			if (romdata[i] != 0)
2373 				return 0;
2374 		}
2375 		if (romdata[TULIP_ROM_SROM_FORMAT_VERION] != 1)
2376 			return 0;
2377 		if (romdata[TULIP_ROM_CHIP_COUNT] == 0)
2378 			return 0;
2379 		return 1;
2380 	}
2381 
2382 	return 0;
2383 }
2384 
2385 /*
2386  * tlp_isv_srom_enaddr:
2387  *
2388  *	Get the Ethernet address from an ISV SROM.
2389  */
2390 int
2391 tlp_isv_srom_enaddr(struct tulip_softc *sc, uint8_t *enaddr)
2392 {
2393 	int i, devcnt;
2394 
2395 	if (tlp_isv_srom(sc->sc_srom) == 0)
2396 		return 0;
2397 
2398 	devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT];
2399 	for (i = 0; i < devcnt; i++) {
2400 		if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1)
2401 			break;
2402 		if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] ==
2403 		    sc->sc_devno)
2404 			break;
2405 	}
2406 
2407 	if (i == devcnt)
2408 		return 0;
2409 
2410 	memcpy(enaddr, &sc->sc_srom[TULIP_ROM_IEEE_NETWORK_ADDRESS],
2411 	    ETHER_ADDR_LEN);
2412 	enaddr[5] += i;
2413 
2414 	return 1;
2415 }
2416 
2417 /*
2418  * tlp_parse_old_srom:
2419  *
2420  *	Parse old-format SROMs.
2421  *
2422  *	This routine is largely lifted from Matt Thomas's `de' driver.
2423  */
2424 int
2425 tlp_parse_old_srom(struct tulip_softc *sc, uint8_t *enaddr)
2426 {
2427 	static const uint8_t testpat[] =
2428 	    { 0xff, 0, 0x55, 0xaa, 0xff, 0, 0x55, 0xaa };
2429 	int i;
2430 	uint32_t cksum;
2431 
2432 	if (memcmp(&sc->sc_srom[0], &sc->sc_srom[16], 8) != 0) {
2433 		/*
2434 		 * Phobos G100 interfaces have the address at
2435 		 * offsets 0 and 20, but each pair of bytes is
2436 		 * swapped.
2437 		 */
2438 		if (sc->sc_srom_addrbits == 6 &&
2439 		    sc->sc_srom[1] == 0x00 &&
2440 		    sc->sc_srom[0] == 0x60 &&
2441 		    sc->sc_srom[3] == 0xf5 &&
2442 		    memcmp(&sc->sc_srom[0], &sc->sc_srom[20], 6) == 0) {
2443 			for (i = 0; i < 6; i += 2) {
2444 				enaddr[i] = sc->sc_srom[i + 1];
2445 				enaddr[i + 1] = sc->sc_srom[i];
2446 			}
2447 			return 1;
2448 		}
2449 
2450 		/*
2451 		 * Phobos G130/G160 interfaces have the address at
2452 		 * offsets 20 and 84, but each pair of bytes is
2453 		 * swapped.
2454 		 */
2455 		if (sc->sc_srom_addrbits == 6 &&
2456 		    sc->sc_srom[21] == 0x00 &&
2457 		    sc->sc_srom[20] == 0x60 &&
2458 		    sc->sc_srom[23] == 0xf5 &&
2459 		    memcmp(&sc->sc_srom[20], &sc->sc_srom[84], 6) == 0) {
2460 			for (i = 0; i < 6; i += 2) {
2461 				enaddr[i] = sc->sc_srom[20 + i + 1];
2462 				enaddr[i + 1] = sc->sc_srom[20 + i];
2463 			}
2464 			return 1;
2465 		}
2466 
2467 		/*
2468 		 * Cobalt Networks interfaces simply have the address
2469 		 * in the first six bytes. The rest is zeroed out
2470 		 * on some models, but others contain unknown data.
2471 		 */
2472 		if (sc->sc_srom[0] == 0x00 &&
2473 		    sc->sc_srom[1] == 0x10 &&
2474 		    sc->sc_srom[2] == 0xe0) {
2475 			memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN);
2476 			return 1;
2477 		}
2478 
2479 		/*
2480 		 * Some vendors (e.g. ZNYX) don't use the standard
2481 		 * DEC Address ROM format, but rather just have an
2482 		 * Ethernet address in the first 6 bytes, maybe a
2483 		 * 2 byte checksum, and then all 0xff's.
2484 		 */
2485 		for (i = 8; i < 32; i++) {
2486 			if (sc->sc_srom[i] != 0xff &&
2487 			    sc->sc_srom[i] != 0)
2488 				return 0;
2489 		}
2490 
2491 		/*
2492 		 * Sanity check the Ethernet address:
2493 		 *
2494 		 *	- Make sure it's not multicast or locally
2495 		 *	  assigned
2496 		 *	- Make sure it has a non-0 OUI
2497 		 */
2498 		if (sc->sc_srom[0] & 3)
2499 			return 0;
2500 		if (sc->sc_srom[0] == 0 && sc->sc_srom[1] == 0 &&
2501 		    sc->sc_srom[2] == 0)
2502 			return 0;
2503 
2504 		memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN);
2505 		return 1;
2506 	}
2507 
2508 	/*
2509 	 * Standard DEC Address ROM test.
2510 	 */
2511 
2512 	if (memcmp(&sc->sc_srom[24], testpat, 8) != 0)
2513 		return 0;
2514 
2515 	for (i = 0; i < 8; i++) {
2516 		if (sc->sc_srom[i] != sc->sc_srom[15 - i])
2517 			return 0;
2518 	}
2519 
2520 	memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN);
2521 
2522 	cksum = *(uint16_t *) &enaddr[0];
2523 
2524 	cksum <<= 1;
2525 	if (cksum > 0xffff)
2526 		cksum -= 0xffff;
2527 
2528 	cksum += *(uint16_t *) &enaddr[2];
2529 	if (cksum > 0xffff)
2530 		cksum -= 0xffff;
2531 
2532 	cksum <<= 1;
2533 	if (cksum > 0xffff)
2534 		cksum -= 0xffff;
2535 
2536 	cksum += *(uint16_t *) &enaddr[4];
2537 	if (cksum >= 0xffff)
2538 		cksum -= 0xffff;
2539 
2540 	if (cksum != *(uint16_t *) &sc->sc_srom[6])
2541 		return 0;
2542 
2543 	return 1;
2544 }
2545 
2546 /*
2547  * tlp_filter_setup:
2548  *
2549  *	Set the Tulip's receive filter.
2550  */
2551 static void
2552 tlp_filter_setup(struct tulip_softc *sc)
2553 {
2554 	struct ethercom *ec = &sc->sc_ethercom;
2555 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2556 	struct ether_multi *enm;
2557 	struct ether_multistep step;
2558 	volatile uint32_t *sp;
2559 	struct tulip_txsoft *txs;
2560 	struct tulip_desc *txd;
2561 	uint8_t enaddr[ETHER_ADDR_LEN];
2562 	uint32_t hash, hashsize;
2563 	int cnt, nexttx;
2564 
2565 	DPRINTF(sc, ("%s: tlp_filter_setup: sc_flags 0x%08x\n",
2566 	    device_xname(sc->sc_dev), sc->sc_flags));
2567 
2568 	memcpy(enaddr, CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
2569 
2570 	/*
2571 	 * If there are transmissions pending, wait until they have
2572 	 * completed.
2573 	 */
2574 	if (! SIMPLEQ_EMPTY(&sc->sc_txdirtyq) ||
2575 	    (sc->sc_flags & TULIPF_DOING_SETUP) != 0) {
2576 		sc->sc_flags |= TULIPF_WANT_SETUP;
2577 		DPRINTF(sc, ("%s: tlp_filter_setup: deferring\n",
2578 		    device_xname(sc->sc_dev)));
2579 		return;
2580 	}
2581 	sc->sc_flags &= ~TULIPF_WANT_SETUP;
2582 
2583 	switch (sc->sc_chip) {
2584 	case TULIP_CHIP_82C115:
2585 		hashsize = TULIP_PNICII_HASHSIZE;
2586 		break;
2587 
2588 	default:
2589 		hashsize = TULIP_MCHASHSIZE;
2590 	}
2591 
2592 	/*
2593 	 * If we're running, idle the transmit and receive engines.  If
2594 	 * we're NOT running, we're being called from tlp_init(), and our
2595 	 * writing OPMODE will start the transmit and receive processes
2596 	 * in motion.
2597 	 */
2598 	if (ifp->if_flags & IFF_RUNNING)
2599 		tlp_idle(sc, OPMODE_ST | OPMODE_SR);
2600 
2601 	sc->sc_opmode &= ~(OPMODE_PR | OPMODE_PM);
2602 
2603 	if (ifp->if_flags & IFF_PROMISC) {
2604 		sc->sc_opmode |= OPMODE_PR;
2605 		goto allmulti;
2606 	}
2607 
2608 	/*
2609 	 * Try Perfect filtering first.
2610 	 */
2611 
2612 	sc->sc_filtmode = TDCTL_Tx_FT_PERFECT;
2613 	sp = TULIP_CDSP(sc);
2614 	memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN);
2615 	cnt = 0;
2616 	ETHER_LOCK(ec);
2617 	ETHER_FIRST_MULTI(step, ec, enm);
2618 	while (enm != NULL) {
2619 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
2620 			/*
2621 			 * We must listen to a range of multicast addresses.
2622 			 * For now, just accept all multicasts, rather than
2623 			 * trying to set only those filter bits needed to match
2624 			 * the range.  (At this time, the only use of address
2625 			 * ranges is for IP multicast routing, for which the
2626 			 * range is big enough to require all bits set.)
2627 			 */
2628 			ETHER_UNLOCK(ec);
2629 			goto allmulti;
2630 		}
2631 		if (cnt == (TULIP_MAXADDRS - 2)) {
2632 			/*
2633 			 * We already have our multicast limit (still need
2634 			 * our station address and broadcast).  Go to
2635 			 * Hash-Perfect mode.
2636 			 */
2637 			ETHER_UNLOCK(ec);
2638 			goto hashperfect;
2639 		}
2640 		cnt++;
2641 		*sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 0));
2642 		*sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 1));
2643 		*sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 2));
2644 		ETHER_NEXT_MULTI(step, enm);
2645 	}
2646 	ETHER_UNLOCK(ec);
2647 
2648 	if (ifp->if_flags & IFF_BROADCAST) {
2649 		/* ...and the broadcast address. */
2650 		cnt++;
2651 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2652 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2653 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2654 	}
2655 
2656 	/* Pad the rest with our station address. */
2657 	for (; cnt < TULIP_MAXADDRS; cnt++) {
2658 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 0));
2659 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 1));
2660 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 2));
2661 	}
2662 	ifp->if_flags &= ~IFF_ALLMULTI;
2663 	goto setit;
2664 
2665  hashperfect:
2666 	/*
2667 	 * Try Hash-Perfect mode.
2668 	 */
2669 
2670 	/*
2671 	 * Some 21140 chips have broken Hash-Perfect modes.  On these
2672 	 * chips, we simply use Hash-Only mode, and put our station
2673 	 * address into the filter.
2674 	 */
2675 	if (sc->sc_chip == TULIP_CHIP_21140)
2676 		sc->sc_filtmode = TDCTL_Tx_FT_HASHONLY;
2677 	else
2678 		sc->sc_filtmode = TDCTL_Tx_FT_HASH;
2679 	sp = TULIP_CDSP(sc);
2680 	memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN);
2681 	ETHER_LOCK(ec);
2682 	ETHER_FIRST_MULTI(step, ec, enm);
2683 	while (enm != NULL) {
2684 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
2685 			/*
2686 			 * We must listen to a range of multicast addresses.
2687 			 * For now, just accept all multicasts, rather than
2688 			 * trying to set only those filter bits needed to match
2689 			 * the range.  (At this time, the only use of address
2690 			 * ranges is for IP multicast routing, for which the
2691 			 * range is big enough to require all bits set.)
2692 			 */
2693 			ETHER_UNLOCK(ec);
2694 			goto allmulti;
2695 		}
2696 		hash = tlp_mchash(enm->enm_addrlo, hashsize);
2697 		sp[hash >> 4] |= htole32(1 << (hash & 0xf));
2698 		ETHER_NEXT_MULTI(step, enm);
2699 	}
2700 	ETHER_UNLOCK(ec);
2701 
2702 	if (ifp->if_flags & IFF_BROADCAST) {
2703 		/* ...and the broadcast address. */
2704 		hash = tlp_mchash(etherbroadcastaddr, hashsize);
2705 		sp[hash >> 4] |= htole32(1 << (hash & 0xf));
2706 	}
2707 
2708 	if (sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY) {
2709 		/* ...and our station address. */
2710 		hash = tlp_mchash(enaddr, hashsize);
2711 		sp[hash >> 4] |= htole32(1 << (hash & 0xf));
2712 	} else {
2713 		/*
2714 		 * Hash-Perfect mode; put our station address after
2715 		 * the hash table.
2716 		 */
2717 		sp[39] = htole32(TULIP_SP_FIELD(enaddr, 0));
2718 		sp[40] = htole32(TULIP_SP_FIELD(enaddr, 1));
2719 		sp[41] = htole32(TULIP_SP_FIELD(enaddr, 2));
2720 	}
2721 	ifp->if_flags &= ~IFF_ALLMULTI;
2722 	goto setit;
2723 
2724  allmulti:
2725 	/*
2726 	 * Use Perfect filter mode.  First address is the broadcast address,
2727 	 * and pad the rest with our station address.  We'll set Pass-all-
2728 	 * multicast in OPMODE below.
2729 	 */
2730 	sc->sc_filtmode = TDCTL_Tx_FT_PERFECT;
2731 	sp = TULIP_CDSP(sc);
2732 	memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN);
2733 	cnt = 0;
2734 	if (ifp->if_flags & IFF_BROADCAST) {
2735 		cnt++;
2736 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2737 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2738 		*sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff));
2739 	}
2740 	for (; cnt < TULIP_MAXADDRS; cnt++) {
2741 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 0));
2742 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 1));
2743 		*sp++ = htole32(TULIP_SP_FIELD(enaddr, 2));
2744 	}
2745 	ifp->if_flags |= IFF_ALLMULTI;
2746 
2747  setit:
2748 	if (ifp->if_flags & IFF_ALLMULTI)
2749 		sc->sc_opmode |= OPMODE_PM;
2750 
2751 	/* Sync the setup packet buffer. */
2752 	TULIP_CDSPSYNC(sc, BUS_DMASYNC_PREWRITE);
2753 
2754 	/*
2755 	 * Fill in the setup packet descriptor.
2756 	 */
2757 	txs = SIMPLEQ_FIRST(&sc->sc_txfreeq);
2758 
2759 	txs->txs_firstdesc = sc->sc_txnext;
2760 	txs->txs_lastdesc = sc->sc_txnext;
2761 	txs->txs_ndescs = 1;
2762 	txs->txs_mbuf = NULL;
2763 
2764 	nexttx = sc->sc_txnext;
2765 	txd = &sc->sc_txdescs[nexttx];
2766 	txd->td_status = 0;
2767 	txd->td_bufaddr1 = htole32(TULIP_CDSPADDR(sc));
2768 	txd->td_ctl = htole32((TULIP_SETUP_PACKET_LEN << TDCTL_SIZE1_SHIFT) |
2769 	    sc->sc_filtmode | TDCTL_Tx_SET | sc->sc_setup_fsls |
2770 	    TDCTL_Tx_IC | sc->sc_tdctl_ch |
2771 	    (nexttx == (TULIP_NTXDESC - 1) ? sc->sc_tdctl_er : 0));
2772 	TULIP_CDTXSYNC(sc, nexttx, 1,
2773 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2774 
2775 #ifdef TLP_DEBUG
2776 	if (ifp->if_flags & IFF_DEBUG) {
2777 		printf("     filter_setup %p transmit chain:\n", txs);
2778 		printf("     descriptor %d:\n", nexttx);
2779 		printf("       td_status:   0x%08x\n", le32toh(txd->td_status));
2780 		printf("       td_ctl:      0x%08x\n", le32toh(txd->td_ctl));
2781 		printf("       td_bufaddr1: 0x%08x\n",
2782 		    le32toh(txd->td_bufaddr1));
2783 		printf("       td_bufaddr2: 0x%08x\n",
2784 		    le32toh(txd->td_bufaddr2));
2785 	}
2786 #endif
2787 
2788 	txd->td_status = htole32(TDSTAT_OWN);
2789 	TULIP_CDTXSYNC(sc, nexttx, 1,
2790 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2791 
2792 	/* Advance the tx pointer. */
2793 	sc->sc_txfree -= 1;
2794 	sc->sc_txnext = TULIP_NEXTTX(nexttx);
2795 
2796 	SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q);
2797 	SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q);
2798 
2799 	/*
2800 	 * Set the OPMODE register.  This will also resume the
2801 	 * transmit process we idled above.
2802 	 */
2803 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
2804 
2805 	sc->sc_flags |= TULIPF_DOING_SETUP;
2806 
2807 	/*
2808 	 * Kick the transmitter; this will cause the Tulip to
2809 	 * read the setup descriptor.
2810 	 */
2811 	/* XXX USE AUTOPOLLING? */
2812 	TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD);
2813 
2814 	/* Set up a watchdog timer in case the chip flakes out. */
2815 	ifp->if_timer = 5;
2816 
2817 	DPRINTF(sc, ("%s: tlp_filter_setup: returning\n",
2818 		device_xname(sc->sc_dev)));
2819 }
2820 
2821 /*
2822  * tlp_winb_filter_setup:
2823  *
2824  *	Set the Winbond 89C840F's receive filter.
2825  */
2826 static void
2827 tlp_winb_filter_setup(struct tulip_softc *sc)
2828 {
2829 	struct ethercom *ec = &sc->sc_ethercom;
2830 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2831 	struct ether_multi *enm;
2832 	struct ether_multistep step;
2833 	uint32_t hash, mchash[2];
2834 
2835 	DPRINTF(sc, ("%s: tlp_winb_filter_setup: sc_flags 0x%08x\n",
2836 	    device_xname(sc->sc_dev), sc->sc_flags));
2837 
2838 	sc->sc_opmode &= ~(OPMODE_WINB_APP | OPMODE_WINB_AMP |OPMODE_WINB_ABP);
2839 
2840 	if (ifp->if_flags & IFF_MULTICAST)
2841 		sc->sc_opmode |= OPMODE_WINB_AMP;
2842 
2843 	if (ifp->if_flags & IFF_BROADCAST)
2844 		sc->sc_opmode |= OPMODE_WINB_ABP;
2845 
2846 	if (ifp->if_flags & IFF_PROMISC) {
2847 		sc->sc_opmode |= OPMODE_WINB_APP;
2848 		goto allmulti;
2849 	}
2850 
2851 	mchash[0] = mchash[1] = 0;
2852 
2853 	ETHER_FIRST_MULTI(step, ec, enm);
2854 	while (enm != NULL) {
2855 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
2856 			/*
2857 			 * We must listen to a range of multicast addresses.
2858 			 * For now, just accept all multicasts, rather than
2859 			 * trying to set only those filter bits needed to match
2860 			 * the range.  (At this time, the only use of address
2861 			 * ranges is for IP multicast routing, for which the
2862 			 * range is big enough to require all bits set.)
2863 			 */
2864 			goto allmulti;
2865 		}
2866 
2867 		/*
2868 		 * According to the FreeBSD `wb' driver, yes, you
2869 		 * really do invert the hash.
2870 		 */
2871 		hash =
2872 		    (~(ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26))
2873 		    & 0x3f;
2874 		mchash[hash >> 5] |= 1 << (hash & 0x1f);
2875 		ETHER_NEXT_MULTI(step, enm);
2876 	}
2877 	ifp->if_flags &= ~IFF_ALLMULTI;
2878 	goto setit;
2879 
2880  allmulti:
2881 	ifp->if_flags |= IFF_ALLMULTI;
2882 	mchash[0] = mchash[1] = 0xffffffff;
2883 
2884  setit:
2885 	TULIP_WRITE(sc, CSR_WINB_CMA0, mchash[0]);
2886 	TULIP_WRITE(sc, CSR_WINB_CMA1, mchash[1]);
2887 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
2888 	DPRINTF(sc, ("%s: tlp_winb_filter_setup: returning\n",
2889 	    device_xname(sc->sc_dev)));
2890 }
2891 
2892 /*
2893  * tlp_al981_filter_setup:
2894  *
2895  *	Set the ADMtek AL981's receive filter.
2896  */
2897 static void
2898 tlp_al981_filter_setup(struct tulip_softc *sc)
2899 {
2900 	struct ethercom *ec = &sc->sc_ethercom;
2901 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2902 	struct ether_multi *enm;
2903 	struct ether_multistep step;
2904 	uint32_t hash, mchash[2];
2905 
2906 	/*
2907 	 * If the chip is running, we need to reset the interface,
2908 	 * and will revisit here (with IFF_RUNNING) clear.  The
2909 	 * chip seems to really not like to have its multicast
2910 	 * filter programmed without a reset.
2911 	 */
2912 	if (ifp->if_flags & IFF_RUNNING) {
2913 		(void) tlp_init(ifp);
2914 		return;
2915 	}
2916 
2917 	DPRINTF(sc, ("%s: tlp_al981_filter_setup: sc_flags 0x%08x\n",
2918 	    device_xname(sc->sc_dev), sc->sc_flags));
2919 
2920 	sc->sc_opmode &= ~(OPMODE_PR | OPMODE_PM);
2921 
2922 	if (ifp->if_flags & IFF_PROMISC) {
2923 		sc->sc_opmode |= OPMODE_PR;
2924 		goto allmulti;
2925 	}
2926 
2927 	mchash[0] = mchash[1] = 0;
2928 
2929 	ETHER_LOCK(ec);
2930 	ETHER_FIRST_MULTI(step, ec, enm);
2931 	while (enm != NULL) {
2932 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
2933 			/*
2934 			 * We must listen to a range of multicast addresses.
2935 			 * For now, just accept all multicasts, rather than
2936 			 * trying to set only those filter bits needed to match
2937 			 * the range.  (At this time, the only use of address
2938 			 * ranges is for IP multicast routing, for which the
2939 			 * range is big enough to require all bits set.)
2940 			 */
2941 			ETHER_UNLOCK(ec);
2942 			goto allmulti;
2943 		}
2944 
2945 		hash = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) & 0x3f;
2946 		mchash[hash >> 5] |= 1 << (hash & 0x1f);
2947 		ETHER_NEXT_MULTI(step, enm);
2948 	}
2949 	ETHER_UNLOCK(ec);
2950 	ifp->if_flags &= ~IFF_ALLMULTI;
2951 	goto setit;
2952 
2953  allmulti:
2954 	ifp->if_flags |= IFF_ALLMULTI;
2955 	mchash[0] = mchash[1] = 0xffffffff;
2956 
2957  setit:
2958 	bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_MAR0, mchash[0]);
2959 	bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_MAR1, mchash[1]);
2960 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
2961 	DPRINTF(sc, ("%s: tlp_al981_filter_setup: returning\n",
2962 	    device_xname(sc->sc_dev)));
2963 }
2964 
2965 /*
2966  * tlp_asix_filter_setup:
2967  *
2968  * 	Set the ASIX AX8814x receive filter.
2969  */
2970 static void
2971 tlp_asix_filter_setup(struct tulip_softc *sc)
2972 {
2973 	struct ethercom *ec = &sc->sc_ethercom;
2974 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2975 	struct ether_multi *enm;
2976 	struct ether_multistep step;
2977 	uint32_t hash, mchash[2];
2978 
2979 	DPRINTF(sc, ("%s: tlp_asix_filter_setup: sc_flags 0x%08x\n",
2980 		device_xname(sc->sc_dev), sc->sc_flags));
2981 
2982 	sc->sc_opmode &= ~(OPMODE_PM | OPMODE_AX_RB | OPMODE_PR);
2983 
2984 	if (ifp->if_flags & IFF_MULTICAST)
2985 		sc->sc_opmode |= OPMODE_PM;
2986 
2987 	if (ifp->if_flags & IFF_BROADCAST)
2988 		sc->sc_opmode |= OPMODE_AX_RB;
2989 
2990 	if (ifp->if_flags & IFF_PROMISC) {
2991 		sc->sc_opmode |= OPMODE_PR;
2992 		goto allmulti;
2993 	}
2994 
2995 	mchash[0] = mchash[1] = 0;
2996 
2997 	ETHER_LOCK(ec);
2998 	ETHER_FIRST_MULTI(step, ec, enm);
2999 	while (enm != NULL) {
3000 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3001 			/*
3002 			 * We must listen to a range of multicast addresses.
3003 			 * For now, just accept all multicasts, rather than
3004 			 * trying to set only those filter bits needed to match
3005 			 * the range.  (At this time, the only use of address
3006 			 * ranges is for IP multicast routing, for which the
3007 			 * range is big enough to require all bits set.)
3008 			 */
3009 			ETHER_UNLOCK(ec);
3010 			goto allmulti;
3011 		}
3012 		hash = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26)
3013 		       & 0x3f;
3014 		if (hash < 32)
3015 			mchash[0] |= (1 << hash);
3016 		else
3017 			mchash[1] |= (1 << (hash - 32));
3018 		ETHER_NEXT_MULTI(step, enm);
3019 	}
3020 	ETHER_UNLOCK(ec);
3021 	ifp->if_flags &= ~IFF_ALLMULTI;
3022 	goto setit;
3023 
3024 allmulti:
3025 	ifp->if_flags |= IFF_ALLMULTI;
3026 	mchash[0] = mchash[1] = 0xffffffff;
3027 
3028 setit:
3029 	TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_MAR0);
3030 	TULIP_WRITE(sc, CSR_AX_FILTDATA, mchash[0]);
3031 	TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_MAR1);
3032 	TULIP_WRITE(sc, CSR_AX_FILTDATA, mchash[1]);
3033 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3034 	DPRINTF(sc, ("%s: tlp_asix_filter_setup: returning\n",
3035 		device_xname(sc->sc_dev)));
3036 }
3037 
3038 
3039 /*
3040  * tlp_idle:
3041  *
3042  *	Cause the transmit and/or receive processes to go idle.
3043  */
3044 void
3045 tlp_idle(struct tulip_softc *sc, uint32_t bits)
3046 {
3047 	static const char * const tlp_tx_state_names[] = {
3048 		"STOPPED",
3049 		"RUNNING - FETCH",
3050 		"RUNNING - WAIT",
3051 		"RUNNING - READING",
3052 		"-- RESERVED --",
3053 		"RUNNING - SETUP",
3054 		"SUSPENDED",
3055 		"RUNNING - CLOSE",
3056 	};
3057 	static const char * const tlp_rx_state_names[] = {
3058 		"STOPPED",
3059 		"RUNNING - FETCH",
3060 		"RUNNING - CHECK",
3061 		"RUNNING - WAIT",
3062 		"SUSPENDED",
3063 		"RUNNING - CLOSE",
3064 		"RUNNING - FLUSH",
3065 		"RUNNING - QUEUE",
3066 	};
3067 	static const char * const dm9102_tx_state_names[] = {
3068 		"STOPPED",
3069 		"RUNNING - FETCH",
3070 		"RUNNING - SETUP",
3071 		"RUNNING - READING",
3072 		"RUNNING - CLOSE - CLEAR OWNER",
3073 		"RUNNING - WAIT",
3074 		"RUNNING - CLOSE - WRITE STATUS",
3075 		"SUSPENDED",
3076 	};
3077 	static const char * const dm9102_rx_state_names[] = {
3078 		"STOPPED",
3079 		"RUNNING - FETCH",
3080 		"RUNNING - WAIT",
3081 		"RUNNING - QUEUE",
3082 		"RUNNING - CLOSE - CLEAR OWNER",
3083 		"RUNNING - CLOSE - WRITE STATUS",
3084 		"SUSPENDED",
3085 		"RUNNING - FLUSH",
3086 	};
3087 
3088 	const char * const *tx_state_names, * const *rx_state_names;
3089 	uint32_t csr, ackmask = 0;
3090 	int i;
3091 
3092 	switch (sc->sc_chip) {
3093 	case TULIP_CHIP_DM9102:
3094 	case TULIP_CHIP_DM9102A:
3095 		tx_state_names = dm9102_tx_state_names;
3096 		rx_state_names = dm9102_rx_state_names;
3097 		break;
3098 
3099 	default:
3100 		tx_state_names = tlp_tx_state_names;
3101 		rx_state_names = tlp_rx_state_names;
3102 		break;
3103 	}
3104 
3105 	if (bits & OPMODE_ST)
3106 		ackmask |= STATUS_TPS;
3107 
3108 	if (bits & OPMODE_SR)
3109 		ackmask |= STATUS_RPS;
3110 
3111 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode & ~bits);
3112 
3113 	for (i = 0; i < 1000; i++) {
3114 		if (TULIP_ISSET(sc, CSR_STATUS, ackmask) == ackmask)
3115 			break;
3116 		delay(10);
3117 	}
3118 
3119 	csr = TULIP_READ(sc, CSR_STATUS);
3120 	if ((csr & ackmask) != ackmask) {
3121 		if ((bits & OPMODE_ST) != 0 && (csr & STATUS_TPS) == 0 &&
3122 		    (csr & STATUS_TS) != STATUS_TS_STOPPED) {
3123 			switch (sc->sc_chip) {
3124 			case TULIP_CHIP_AX88140:
3125 			case TULIP_CHIP_AX88141:
3126 				/*
3127 				 * Filter the message out on noisy chips.
3128 				 */
3129 				break;
3130 			default:
3131 				printf("%s: transmit process failed to idle: "
3132 				    "state %s\n", device_xname(sc->sc_dev),
3133 				    tx_state_names[(csr & STATUS_TS) >> 20]);
3134 			}
3135 		}
3136 		if ((bits & OPMODE_SR) != 0 && (csr & STATUS_RPS) == 0 &&
3137 		    (csr & STATUS_RS) != STATUS_RS_STOPPED) {
3138 			switch (sc->sc_chip) {
3139 			case TULIP_CHIP_AN983:
3140 			case TULIP_CHIP_AN985:
3141 			case TULIP_CHIP_DM9102A:
3142 			case TULIP_CHIP_RS7112:
3143 				/*
3144 				 * Filter the message out on noisy chips.
3145 				 */
3146 				break;
3147 			default:
3148 				printf("%s: receive process failed to idle: "
3149 				    "state %s\n", device_xname(sc->sc_dev),
3150 				    rx_state_names[(csr & STATUS_RS) >> 17]);
3151 			}
3152 		}
3153 	}
3154 	TULIP_WRITE(sc, CSR_STATUS, ackmask);
3155 }
3156 
3157 /*****************************************************************************
3158  * Generic media support functions.
3159  *****************************************************************************/
3160 
3161 /*
3162  * tlp_mediastatus:	[ifmedia interface function]
3163  *
3164  *	Query the current media.
3165  */
3166 void
3167 tlp_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
3168 {
3169 	struct tulip_softc *sc = ifp->if_softc;
3170 
3171 	if (TULIP_IS_ENABLED(sc) == 0) {
3172 		ifmr->ifm_active = IFM_ETHER | IFM_NONE;
3173 		ifmr->ifm_status = 0;
3174 		return;
3175 	}
3176 
3177 	(*sc->sc_mediasw->tmsw_get)(sc, ifmr);
3178 }
3179 
3180 /*
3181  * tlp_mediachange:	[ifmedia interface function]
3182  *
3183  *	Update the current media.
3184  */
3185 int
3186 tlp_mediachange(struct ifnet *ifp)
3187 {
3188 	struct tulip_softc *sc = ifp->if_softc;
3189 
3190 	if ((ifp->if_flags & IFF_UP) == 0)
3191 		return 0;
3192 	return (*sc->sc_mediasw->tmsw_set)(sc);
3193 }
3194 
3195 /*****************************************************************************
3196  * Support functions for MII-attached media.
3197  *****************************************************************************/
3198 
3199 /*
3200  * tlp_mii_tick:
3201  *
3202  *	One second timer, used to tick the MII.
3203  */
3204 static void
3205 tlp_mii_tick(void *arg)
3206 {
3207 	struct tulip_softc *sc = arg;
3208 	int s;
3209 
3210 	if (!device_is_active(sc->sc_dev))
3211 		return;
3212 
3213 	s = splnet();
3214 	mii_tick(&sc->sc_mii);
3215 	splx(s);
3216 
3217 	callout_reset(&sc->sc_tick_callout, hz, sc->sc_tick, sc);
3218 }
3219 
3220 /*
3221  * tlp_mii_statchg:	[mii interface function]
3222  *
3223  *	Callback from PHY when media changes.
3224  */
3225 static void
3226 tlp_mii_statchg(struct ifnet *ifp)
3227 {
3228 	struct tulip_softc *sc = ifp->if_softc;
3229 
3230 	/* Idle the transmit and receive processes. */
3231 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
3232 
3233 	sc->sc_opmode &= ~(OPMODE_TTM | OPMODE_FD | OPMODE_HBD);
3234 
3235 	if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T)
3236 		sc->sc_opmode |= OPMODE_TTM;
3237 	else
3238 		sc->sc_opmode |= OPMODE_HBD;
3239 
3240 	if (sc->sc_mii.mii_media_active & IFM_FDX)
3241 		sc->sc_opmode |= OPMODE_FD | OPMODE_HBD;
3242 
3243 	/*
3244 	 * Write new OPMODE bits.  This also restarts the transmit
3245 	 * and receive processes.
3246 	 */
3247 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3248 }
3249 
3250 /*
3251  * tlp_winb_mii_statchg: [mii interface function]
3252  *
3253  *	Callback from PHY when media changes.  This version is
3254  *	for the Winbond 89C840F, which has different OPMODE bits.
3255  */
3256 static void
3257 tlp_winb_mii_statchg(struct ifnet *ifp)
3258 {
3259 	struct tulip_softc *sc = ifp->if_softc;
3260 
3261 	/* Idle the transmit and receive processes. */
3262 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
3263 
3264 	sc->sc_opmode &= ~(OPMODE_WINB_FES | OPMODE_FD);
3265 
3266 	if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_100_TX)
3267 		sc->sc_opmode |= OPMODE_WINB_FES;
3268 
3269 	if (sc->sc_mii.mii_media_active & IFM_FDX)
3270 		sc->sc_opmode |= OPMODE_FD;
3271 
3272 	/*
3273 	 * Write new OPMODE bits.  This also restarts the transmit
3274 	 * and receive processes.
3275 	 */
3276 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3277 }
3278 
3279 /*
3280  * tlp_dm9102_mii_statchg: [mii interface function]
3281  *
3282  *	Callback from PHY when media changes.  This version is
3283  *	for the DM9102.
3284  */
3285 static void
3286 tlp_dm9102_mii_statchg(struct ifnet *ifp)
3287 {
3288 	struct tulip_softc *sc = ifp->if_softc;
3289 
3290 	/*
3291 	 * Don't idle the transmit and receive processes, here.  It
3292 	 * seems to fail, and just causes excess noise.
3293 	 */
3294 	sc->sc_opmode &= ~(OPMODE_TTM | OPMODE_FD);
3295 
3296 	if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) != IFM_100_TX)
3297 		sc->sc_opmode |= OPMODE_TTM;
3298 
3299 	if (sc->sc_mii.mii_media_active & IFM_FDX)
3300 		sc->sc_opmode |= OPMODE_FD;
3301 
3302 	/*
3303 	 * Write new OPMODE bits.
3304 	 */
3305 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3306 }
3307 
3308 /*
3309  * tlp_mii_getmedia:
3310  *
3311  *	Callback from ifmedia to request current media status.
3312  */
3313 static void
3314 tlp_mii_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr)
3315 {
3316 	struct mii_data * const mii = &sc->sc_mii;
3317 
3318 	mii_pollstat(mii);
3319 	ifmr->ifm_status = mii->mii_media_status;
3320 	ifmr->ifm_active = mii->mii_media_active;
3321 }
3322 
3323 /*
3324  * tlp_mii_setmedia:
3325  *
3326  *	Callback from ifmedia to request new media setting.
3327  */
3328 static int
3329 tlp_mii_setmedia(struct tulip_softc *sc)
3330 {
3331 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3332 	int rc;
3333 
3334 	if ((ifp->if_flags & IFF_UP) == 0)
3335 		return 0;
3336 	switch (sc->sc_chip) {
3337 	case TULIP_CHIP_21142:
3338 	case TULIP_CHIP_21143:
3339 		/* Disable the internal Nway engine. */
3340 		TULIP_WRITE(sc, CSR_SIATXRX, 0);
3341 		break;
3342 
3343 	default:
3344 		/* Nothing. */
3345 		break;
3346 	}
3347 	if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
3348 		return 0;
3349 	return rc;
3350 }
3351 
3352 /*
3353  * tlp_bitbang_mii_readreg:
3354  *
3355  *	Read a PHY register via bit-bang'ing the MII.
3356  */
3357 static int
3358 tlp_bitbang_mii_readreg(device_t self, int phy, int reg, uint16_t *val)
3359 {
3360 	struct tulip_softc *sc = device_private(self);
3361 
3362 	return mii_bitbang_readreg(self, sc->sc_bitbang_ops, phy, reg, val);
3363 }
3364 
3365 /*
3366  * tlp_bitbang_mii_writereg:
3367  *
3368  *	Write a PHY register via bit-bang'ing the MII.
3369  */
3370 static int
3371 tlp_bitbang_mii_writereg(device_t self, int phy, int reg, uint16_t val)
3372 {
3373 	struct tulip_softc *sc = device_private(self);
3374 
3375 	return mii_bitbang_writereg(self, sc->sc_bitbang_ops, phy, reg, val);
3376 }
3377 
3378 /*
3379  * tlp_sio_mii_bitbang_read:
3380  *
3381  *	Read the MII serial port for the MII bit-bang module.
3382  */
3383 static uint32_t
3384 tlp_sio_mii_bitbang_read(device_t self)
3385 {
3386 	struct tulip_softc *sc = device_private(self);
3387 
3388 	return TULIP_READ(sc, CSR_MIIROM);
3389 }
3390 
3391 /*
3392  * tlp_sio_mii_bitbang_write:
3393  *
3394  *	Write the MII serial port for the MII bit-bang module.
3395  */
3396 static void
3397 tlp_sio_mii_bitbang_write(device_t self, uint32_t val)
3398 {
3399 	struct tulip_softc *sc = device_private(self);
3400 
3401 	TULIP_WRITE(sc, CSR_MIIROM, val);
3402 }
3403 
3404 /*
3405  * tlp_pnic_mii_readreg:
3406  *
3407  *	Read a PHY register on the Lite-On PNIC.
3408  */
3409 static int
3410 tlp_pnic_mii_readreg(device_t self, int phy, int reg, uint16_t *val)
3411 {
3412 	struct tulip_softc *sc = device_private(self);
3413 	uint32_t data;
3414 	int i;
3415 
3416 	TULIP_WRITE(sc, CSR_PNIC_MII,
3417 	    PNIC_MII_MBO | PNIC_MII_RESERVED |
3418 	    PNIC_MII_READ | (phy << PNIC_MII_PHYSHIFT) |
3419 	    (reg << PNIC_MII_REGSHIFT));
3420 
3421 	for (i = 0; i < 1000; i++) {
3422 		delay(10);
3423 		data = TULIP_READ(sc, CSR_PNIC_MII);
3424 		if ((data & PNIC_MII_BUSY) == 0) {
3425 			if ((data & PNIC_MII_DATA) == PNIC_MII_DATA)
3426 				return -1;
3427 			else {
3428 				*val = data & PNIC_MII_DATA;
3429 				return 0;
3430 			}
3431 		}
3432 	}
3433 	printf("%s: MII read timed out\n", device_xname(sc->sc_dev));
3434 	return ETIMEDOUT;
3435 }
3436 
3437 /*
3438  * tlp_pnic_mii_writereg:
3439  *
3440  *	Write a PHY register on the Lite-On PNIC.
3441  */
3442 static int
3443 tlp_pnic_mii_writereg(device_t self, int phy, int reg, uint16_t val)
3444 {
3445 	struct tulip_softc *sc = device_private(self);
3446 	int i;
3447 
3448 	TULIP_WRITE(sc, CSR_PNIC_MII,
3449 	    PNIC_MII_MBO | PNIC_MII_RESERVED |
3450 	    PNIC_MII_WRITE | (phy << PNIC_MII_PHYSHIFT) |
3451 	    (reg << PNIC_MII_REGSHIFT) | val);
3452 
3453 	for (i = 0; i < 1000; i++) {
3454 		delay(10);
3455 		if (TULIP_ISSET(sc, CSR_PNIC_MII, PNIC_MII_BUSY) == 0)
3456 			return 0;
3457 	}
3458 	printf("%s: MII write timed out\n", device_xname(sc->sc_dev));
3459 	return ETIMEDOUT;
3460 }
3461 
3462 static const bus_addr_t tlp_al981_phy_regmap[] = {
3463 	CSR_ADM_BMCR,
3464 	CSR_ADM_BMSR,
3465 	CSR_ADM_PHYIDR1,
3466 	CSR_ADM_PHYIDR2,
3467 	CSR_ADM_ANAR,
3468 	CSR_ADM_ANLPAR,
3469 	CSR_ADM_ANER,
3470 
3471 	CSR_ADM_XMC,
3472 	CSR_ADM_XCIIS,
3473 	CSR_ADM_XIE,
3474 	CSR_ADM_100CTR,
3475 };
3476 static const int tlp_al981_phy_regmap_size = sizeof(tlp_al981_phy_regmap) /
3477     sizeof(tlp_al981_phy_regmap[0]);
3478 
3479 /*
3480  * tlp_al981_mii_readreg:
3481  *
3482  *	Read a PHY register on the ADMtek AL981.
3483  */
3484 static int
3485 tlp_al981_mii_readreg(device_t self, int phy, int reg, uint16_t *val)
3486 {
3487 	struct tulip_softc *sc = device_private(self);
3488 
3489 	/* AL981 only has an internal PHY. */
3490 	if (phy != 0)
3491 		return -1;
3492 
3493 	if (reg >= tlp_al981_phy_regmap_size)
3494 		return -1;
3495 
3496 	*val = bus_space_read_4(sc->sc_st, sc->sc_sh,
3497 	    tlp_al981_phy_regmap[reg]) & 0xffff;
3498 	return 0;
3499 }
3500 
3501 /*
3502  * tlp_al981_mii_writereg:
3503  *
3504  *	Write a PHY register on the ADMtek AL981.
3505  */
3506 static int
3507 tlp_al981_mii_writereg(device_t self, int phy, int reg, uint16_t val)
3508 {
3509 	struct tulip_softc *sc = device_private(self);
3510 
3511 	/* AL981 only has an internal PHY. */
3512 	if (phy != 0)
3513 		return -1;
3514 
3515 	if (reg >= tlp_al981_phy_regmap_size)
3516 		return -1;
3517 
3518 	bus_space_write_4(sc->sc_st, sc->sc_sh,
3519 	    tlp_al981_phy_regmap[reg], val);
3520 
3521 	return 0;
3522 }
3523 
3524 /*****************************************************************************
3525  * Chip-specific pre-init and reset functions.
3526  *****************************************************************************/
3527 
3528 /*
3529  * tlp_2114x_preinit:
3530  *
3531  *	Pre-init function shared by DECchip 21140, 21140A, 21142, and 21143.
3532  */
3533 static void
3534 tlp_2114x_preinit(struct tulip_softc *sc)
3535 {
3536 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
3537 	struct tulip_21x4x_media *tm = ife->ifm_aux;
3538 
3539 	/*
3540 	 * Whether or not we're in MII or SIA/SYM mode, the media info
3541 	 * contains the appropriate OPMODE bits.
3542 	 *
3543 	 * Also, we always set the Must-Be-One bit.
3544 	 */
3545 	sc->sc_opmode |= OPMODE_MBO | tm->tm_opmode;
3546 
3547 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3548 }
3549 
3550 /*
3551  * tlp_2114x_mii_preinit:
3552  *
3553  *	Pre-init function shared by DECchip 21140, 21140A, 21142, and 21143.
3554  *	This version is used by boards which only have MII and don't have
3555  *	an ISV SROM.
3556  */
3557 static void
3558 tlp_2114x_mii_preinit(struct tulip_softc *sc)
3559 {
3560 
3561 	/*
3562 	 * Always set the Must-Be-One bit, and Port Select (to select MII).
3563 	 * We'll never be called during a media change.
3564 	 */
3565 	sc->sc_opmode |= OPMODE_MBO | OPMODE_PS;
3566 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3567 }
3568 
3569 /*
3570  * tlp_pnic_preinit:
3571  *
3572  *	Pre-init function for the Lite-On 82c168 and 82c169.
3573  */
3574 static void
3575 tlp_pnic_preinit(struct tulip_softc *sc)
3576 {
3577 
3578 	if (sc->sc_flags & TULIPF_HAS_MII) {
3579 		/*
3580 		 * MII case: just set the port-select bit; we will never
3581 		 * be called during a media change.
3582 		 */
3583 		sc->sc_opmode |= OPMODE_PS;
3584 	} else {
3585 		/*
3586 		 * ENDEC/PCS/Nway mode; enable the Tx backoff counter.
3587 		 */
3588 		sc->sc_opmode |= OPMODE_PNIC_TBEN;
3589 	}
3590 }
3591 
3592 /*
3593  * tlp_asix_preinit:
3594  *
3595  * 	Pre-init function for the ASIX chipsets.
3596  */
3597 static void
3598 tlp_asix_preinit(struct tulip_softc *sc)
3599 {
3600 
3601 	switch (sc->sc_chip) {
3602 		case TULIP_CHIP_AX88140:
3603 		case TULIP_CHIP_AX88141:
3604 			/* XXX Handle PHY. */
3605 			sc->sc_opmode |= OPMODE_HBD | OPMODE_PS;
3606 			break;
3607 		default:
3608 			/* Nothing */
3609 			break;
3610 	}
3611 
3612 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3613 }
3614 
3615 /*
3616  * tlp_dm9102_preinit:
3617  *
3618  *	Pre-init function for the Davicom DM9102.
3619  */
3620 static void
3621 tlp_dm9102_preinit(struct tulip_softc *sc)
3622 {
3623 
3624 	switch (sc->sc_chip) {
3625 	case TULIP_CHIP_DM9102:
3626 		sc->sc_opmode |= OPMODE_MBO | OPMODE_HBD | OPMODE_PS;
3627 		break;
3628 
3629 	case TULIP_CHIP_DM9102A:
3630 		/*
3631 		 * XXX Figure out how to actually deal with the HomePNA
3632 		 * XXX portion of the DM9102A.
3633 		 */
3634 		sc->sc_opmode |= OPMODE_MBO | OPMODE_HBD;
3635 		break;
3636 
3637 	default:
3638 		/* Nothing. */
3639 		break;
3640 	}
3641 
3642 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
3643 }
3644 
3645 /*
3646  * tlp_21140_reset:
3647  *
3648  *	Issue a reset sequence on the 21140 via the GPIO facility.
3649  */
3650 static void
3651 tlp_21140_reset(struct tulip_softc *sc)
3652 {
3653 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
3654 	struct tulip_21x4x_media *tm = ife->ifm_aux;
3655 	int i;
3656 
3657 	/* First, set the direction on the GPIO pins. */
3658 	TULIP_WRITE(sc, CSR_GPP, GPP_GPC | sc->sc_gp_dir);
3659 
3660 	/* Now, issue the reset sequence. */
3661 	for (i = 0; i < tm->tm_reset_length; i++) {
3662 		delay(10);
3663 		TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_reset_offset + i]);
3664 	}
3665 
3666 	/* Now, issue the selection sequence. */
3667 	for (i = 0; i < tm->tm_gp_length; i++) {
3668 		delay(10);
3669 		TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_gp_offset + i]);
3670 	}
3671 
3672 	/* If there were no sequences, just lower the pins. */
3673 	if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) {
3674 		delay(10);
3675 		TULIP_WRITE(sc, CSR_GPP, 0);
3676 	}
3677 }
3678 
3679 /*
3680  * tlp_21142_reset:
3681  *
3682  *	Issue a reset sequence on the 21142 via the GPIO facility.
3683  */
3684 static void
3685 tlp_21142_reset(struct tulip_softc *sc)
3686 {
3687 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
3688 	struct tulip_21x4x_media *tm = ife->ifm_aux;
3689 	const uint8_t *cp;
3690 	int i;
3691 
3692 	cp = &sc->sc_srom[tm->tm_reset_offset];
3693 	for (i = 0; i < tm->tm_reset_length; i++, cp += 2) {
3694 		delay(10);
3695 		TULIP_WRITE(sc, CSR_SIAGEN, TULIP_ROM_GETW(cp, 0) << 16);
3696 	}
3697 
3698 	cp = &sc->sc_srom[tm->tm_gp_offset];
3699 	for (i = 0; i < tm->tm_gp_length; i++, cp += 2) {
3700 		delay(10);
3701 		TULIP_WRITE(sc, CSR_SIAGEN, TULIP_ROM_GETW(cp, 0) << 16);
3702 	}
3703 
3704 	/* If there were no sequences, just lower the pins. */
3705 	if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) {
3706 		delay(10);
3707 		TULIP_WRITE(sc, CSR_SIAGEN, 0);
3708 	}
3709 }
3710 
3711 /*
3712  * tlp_pmac_reset:
3713  *
3714  *	Reset routine for Macronix chips.
3715  */
3716 static void
3717 tlp_pmac_reset(struct tulip_softc *sc)
3718 {
3719 
3720 	switch (sc->sc_chip) {
3721 	case TULIP_CHIP_82C115:
3722 	case TULIP_CHIP_MX98715:
3723 	case TULIP_CHIP_MX98715A:
3724 	case TULIP_CHIP_MX98725:
3725 		/*
3726 		 * Set the LED operating mode.  This information is located
3727 		 * in the EEPROM at byte offset 0x77, per the MX98715A and
3728 		 * MX98725 application notes.
3729 		 */
3730 		TULIP_WRITE(sc, CSR_MIIROM, sc->sc_srom[0x77] << 24);
3731 		break;
3732 	case TULIP_CHIP_MX98715AEC_X:
3733 		/*
3734 		 * Set the LED operating mode.  This information is located
3735 		 * in the EEPROM at byte offset 0x76, per the MX98715AEC
3736 		 * application note.
3737 		 */
3738 		TULIP_WRITE(sc, CSR_MIIROM, ((0xf & sc->sc_srom[0x76]) << 28)
3739 		    | ((0xf0 & sc->sc_srom[0x76]) << 20));
3740 		break;
3741 
3742 	default:
3743 		/* Nothing. */
3744 		break;
3745 	}
3746 }
3747 
3748 #if 0
3749 /*
3750  * tlp_dm9102_reset:
3751  *
3752  *	Reset routine for the Davicom DM9102.
3753  */
3754 static void
3755 tlp_dm9102_reset(struct tulip_softc *sc)
3756 {
3757 
3758 	TULIP_WRITE(sc, CSR_DM_PHYSTAT, DM_PHYSTAT_GEPC | DM_PHYSTAT_GPED);
3759 	delay(100);
3760 	TULIP_WRITE(sc, CSR_DM_PHYSTAT, 0);
3761 }
3762 #endif
3763 
3764 /*****************************************************************************
3765  * Chip/board-specific media switches.  The ones here are ones that
3766  * are potentially common to multiple front-ends.
3767  *****************************************************************************/
3768 
3769 /*
3770  * This table is a common place for all sorts of media information,
3771  * keyed off of the SROM media code for that media.
3772  *
3773  * Note that we explicitly configure the 21142/21143 to always advertise
3774  * NWay capabilities when using the UTP port.
3775  * XXX Actually, we don't yet.
3776  */
3777 static const struct tulip_srom_to_ifmedia tulip_srom_to_ifmedia_table[] = {
3778 	{ TULIP_ROM_MB_MEDIA_TP,	IFM_10_T,	0,
3779 	  "10baseT",
3780 	  OPMODE_TTM,
3781 	  BMSR_10THDX,
3782 	  { SIACONN_21040_10BASET,
3783 	    SIATXRX_21040_10BASET,
3784 	    SIAGEN_21040_10BASET },
3785 
3786 	  { SIACONN_21041_10BASET,
3787 	    SIATXRX_21041_10BASET,
3788 	    SIAGEN_21041_10BASET },
3789 
3790 	  { SIACONN_21142_10BASET,
3791 	    SIATXRX_21142_10BASET,
3792 	    SIAGEN_21142_10BASET } },
3793 
3794 	{ TULIP_ROM_MB_MEDIA_BNC,	IFM_10_2,	0,
3795 	  "10base2",
3796 	  0,
3797 	  0,
3798 	  { 0,
3799 	    0,
3800 	    0 },
3801 
3802 	  { SIACONN_21041_BNC,
3803 	    SIATXRX_21041_BNC,
3804 	    SIAGEN_21041_BNC },
3805 
3806 	  { SIACONN_21142_BNC,
3807 	    SIATXRX_21142_BNC,
3808 	    SIAGEN_21142_BNC } },
3809 
3810 	{ TULIP_ROM_MB_MEDIA_AUI,	IFM_10_5,	0,
3811 	  "10base5",
3812 	  0,
3813 	  0,
3814 	  { SIACONN_21040_AUI,
3815 	    SIATXRX_21040_AUI,
3816 	    SIAGEN_21040_AUI },
3817 
3818 	  { SIACONN_21041_AUI,
3819 	    SIATXRX_21041_AUI,
3820 	    SIAGEN_21041_AUI },
3821 
3822 	  { SIACONN_21142_AUI,
3823 	    SIATXRX_21142_AUI,
3824 	    SIAGEN_21142_AUI } },
3825 
3826 	{ TULIP_ROM_MB_MEDIA_100TX,	IFM_100_TX,	0,
3827 	  "100baseTX",
3828 	  OPMODE_PS | OPMODE_PCS | OPMODE_SCR | OPMODE_HBD,
3829 	  BMSR_100TXHDX,
3830 	  { 0,
3831 	    0,
3832 	    0 },
3833 
3834 	  { 0,
3835 	    0,
3836 	    0 },
3837 
3838 	  { 0,
3839 	    0,
3840 	    SIAGEN_ABM } },
3841 
3842 	{ TULIP_ROM_MB_MEDIA_TP_FDX,	IFM_10_T,	IFM_FDX,
3843 	  "10baseT-FDX",
3844 	  OPMODE_TTM | OPMODE_FD | OPMODE_HBD,
3845 	  BMSR_10TFDX,
3846 	  { SIACONN_21040_10BASET_FDX,
3847 	    SIATXRX_21040_10BASET_FDX,
3848 	    SIAGEN_21040_10BASET_FDX },
3849 
3850 	  { SIACONN_21041_10BASET_FDX,
3851 	    SIATXRX_21041_10BASET_FDX,
3852 	    SIAGEN_21041_10BASET_FDX },
3853 
3854 	  { SIACONN_21142_10BASET_FDX,
3855 	    SIATXRX_21142_10BASET_FDX,
3856 	    SIAGEN_21142_10BASET_FDX } },
3857 
3858 	{ TULIP_ROM_MB_MEDIA_100TX_FDX,	IFM_100_TX,	IFM_FDX,
3859 	  "100baseTX-FDX",
3860 	  OPMODE_PS | OPMODE_PCS | OPMODE_SCR | OPMODE_FD | OPMODE_HBD,
3861 	  BMSR_100TXFDX,
3862 	  { 0,
3863 	    0,
3864 	    0 },
3865 
3866 	  { 0,
3867 	    0,
3868 	    0 },
3869 
3870 	  { 0,
3871 	    0,
3872 	    SIAGEN_ABM } },
3873 
3874 	{ TULIP_ROM_MB_MEDIA_100T4,	IFM_100_T4,	0,
3875 	  "100baseT4",
3876 	  OPMODE_PS | OPMODE_PCS | OPMODE_SCR | OPMODE_HBD,
3877 	  BMSR_100T4,
3878 	  { 0,
3879 	    0,
3880 	    0 },
3881 
3882 	  { 0,
3883 	    0,
3884 	    0 },
3885 
3886 	  { 0,
3887 	    0,
3888 	    SIAGEN_ABM } },
3889 
3890 	{ TULIP_ROM_MB_MEDIA_100FX,	IFM_100_FX,	0,
3891 	  "100baseFX",
3892 	  OPMODE_PS | OPMODE_PCS | OPMODE_HBD,
3893 	  0,
3894 	  { 0,
3895 	    0,
3896 	    0 },
3897 
3898 	  { 0,
3899 	    0,
3900 	    0 },
3901 
3902 	  { 0,
3903 	    0,
3904 	    SIAGEN_ABM } },
3905 
3906 	{ TULIP_ROM_MB_MEDIA_100FX_FDX,	IFM_100_FX,	IFM_FDX,
3907 	  "100baseFX-FDX",
3908 	  OPMODE_PS | OPMODE_PCS | OPMODE_FD | OPMODE_HBD,
3909 	  0,
3910 	  { 0,
3911 	    0,
3912 	    0 },
3913 
3914 	  { 0,
3915 	    0,
3916 	    0 },
3917 
3918 	  { 0,
3919 	    0,
3920 	    SIAGEN_ABM } },
3921 
3922 	{ 0,				0,		0,
3923 	  NULL,
3924 	  0,
3925 	  0,
3926 	  { 0,
3927 	    0,
3928 	    0 },
3929 
3930 	  { 0,
3931 	    0,
3932 	    0 },
3933 
3934 	  { 0,
3935 	    0,
3936 	    0 } },
3937 };
3938 
3939 static const struct tulip_srom_to_ifmedia *tlp_srom_to_ifmedia(uint8_t);
3940 static void	tlp_srom_media_info(struct tulip_softc *,
3941 		    const struct tulip_srom_to_ifmedia *,
3942 		    struct tulip_21x4x_media *);
3943 static void	tlp_add_srom_media(struct tulip_softc *, int,
3944 		    void (*)(struct tulip_softc *, struct ifmediareq *),
3945 		    int (*)(struct tulip_softc *), const uint8_t *, int);
3946 static void	tlp_print_media(struct tulip_softc *);
3947 static void	tlp_nway_activate(struct tulip_softc *, int);
3948 static void	tlp_get_minst(struct tulip_softc *);
3949 
3950 static const struct tulip_srom_to_ifmedia *
3951 tlp_srom_to_ifmedia(uint8_t sm)
3952 {
3953 	const struct tulip_srom_to_ifmedia *tsti;
3954 
3955 	for (tsti = tulip_srom_to_ifmedia_table;
3956 	     tsti->tsti_name != NULL; tsti++) {
3957 		if (tsti->tsti_srom == sm)
3958 			return tsti;
3959 	}
3960 
3961 	return NULL;
3962 }
3963 
3964 static void
3965 tlp_srom_media_info(struct tulip_softc *sc,
3966     const struct tulip_srom_to_ifmedia *tsti, struct tulip_21x4x_media *tm)
3967 {
3968 
3969 	tm->tm_name = tsti->tsti_name;
3970 	tm->tm_opmode = tsti->tsti_opmode;
3971 
3972 	sc->sc_sia_cap |= tsti->tsti_sia_cap;
3973 
3974 	switch (sc->sc_chip) {
3975 	case TULIP_CHIP_DE425:
3976 	case TULIP_CHIP_21040:
3977 		tm->tm_sia = tsti->tsti_21040;	/* struct assignment */
3978 		break;
3979 
3980 	case TULIP_CHIP_21041:
3981 		tm->tm_sia = tsti->tsti_21041;	/* struct assignment */
3982 		break;
3983 
3984 	case TULIP_CHIP_21142:
3985 	case TULIP_CHIP_21143:
3986 	case TULIP_CHIP_82C115:
3987 	case TULIP_CHIP_MX98715:
3988 	case TULIP_CHIP_MX98715A:
3989 	case TULIP_CHIP_MX98715AEC_X:
3990 	case TULIP_CHIP_MX98725:
3991 		tm->tm_sia = tsti->tsti_21142;	/* struct assignment */
3992 		break;
3993 
3994 	default:
3995 		/* Nothing. */
3996 		break;
3997 	}
3998 }
3999 
4000 static void
4001 tlp_add_srom_media(struct tulip_softc *sc, int type,
4002     void (*get)(struct tulip_softc *, struct ifmediareq *),
4003     int (*set)(struct tulip_softc *), const uint8_t *list,
4004     int cnt)
4005 {
4006 	struct tulip_21x4x_media *tm;
4007 	const struct tulip_srom_to_ifmedia *tsti;
4008 	int i;
4009 
4010 	for (i = 0; i < cnt; i++) {
4011 		tsti = tlp_srom_to_ifmedia(list[i]);
4012 		tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4013 		tlp_srom_media_info(sc, tsti, tm);
4014 		tm->tm_type = type;
4015 		tm->tm_get = get;
4016 		tm->tm_set = set;
4017 
4018 		ifmedia_add(&sc->sc_mii.mii_media,
4019 		    IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype,
4020 		    tsti->tsti_options, sc->sc_tlp_minst), 0, tm);
4021 	}
4022 }
4023 
4024 static void
4025 tlp_print_media(struct tulip_softc *sc)
4026 {
4027 	struct ifmedia_entry *ife;
4028 	struct tulip_21x4x_media *tm;
4029 	const char *sep = "";
4030 
4031 #define	PRINT(str)	aprint_normal("%s%s", sep, str); sep = ", "
4032 
4033 	aprint_normal_dev(sc->sc_dev, "");
4034 	TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, ifm_list) {
4035 		tm = ife->ifm_aux;
4036 		if (tm == NULL) {
4037 #ifdef DIAGNOSTIC
4038 			if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
4039 				panic("tlp_print_media");
4040 #endif
4041 			PRINT("auto");
4042 		} else if (tm->tm_type != TULIP_ROM_MB_21140_MII &&
4043 			   tm->tm_type != TULIP_ROM_MB_21142_MII) {
4044 			PRINT(tm->tm_name);
4045 		}
4046 	}
4047 	aprint_normal("\n");
4048 
4049 #undef PRINT
4050 }
4051 
4052 static void
4053 tlp_nway_activate(struct tulip_softc *sc, int media)
4054 {
4055 	struct ifmedia_entry *ife;
4056 
4057 	ife = ifmedia_match(&sc->sc_mii.mii_media, media, 0);
4058 #ifdef DIAGNOSTIC
4059 	if (ife == NULL)
4060 		panic("tlp_nway_activate");
4061 #endif
4062 	sc->sc_nway_active = ife;
4063 }
4064 
4065 static void
4066 tlp_get_minst(struct tulip_softc *sc)
4067 {
4068 
4069 	if ((sc->sc_media_seen &
4070 	    ~((1 << TULIP_ROM_MB_21140_MII) |
4071 	      (1 << TULIP_ROM_MB_21142_MII))) == 0) {
4072 		/*
4073 		 * We have not yet seen any SIA/SYM media (but are
4074 		 * about to; that's why we're called!), so assign
4075 		 * the current media instance to be the `internal media'
4076 		 * instance, and advance it so any MII media gets a
4077 		 * fresh one (used to selecting/isolating a PHY).
4078 		 */
4079 		sc->sc_tlp_minst = sc->sc_mii.mii_instance++;
4080 	}
4081 }
4082 
4083 /*
4084  * SIA Utility functions.
4085  */
4086 static void	tlp_sia_update_link(struct tulip_softc *);
4087 static void	tlp_sia_get(struct tulip_softc *, struct ifmediareq *);
4088 static int	tlp_sia_set(struct tulip_softc *);
4089 static int	tlp_sia_media(struct tulip_softc *, struct ifmedia_entry *);
4090 static void	tlp_sia_fixup(struct tulip_softc *);
4091 
4092 static void
4093 tlp_sia_update_link(struct tulip_softc *sc)
4094 {
4095 	struct ifmedia_entry *ife;
4096 	struct tulip_21x4x_media *tm;
4097 	uint32_t siastat;
4098 
4099 	ife = TULIP_CURRENT_MEDIA(sc);
4100 	tm = ife->ifm_aux;
4101 
4102 	sc->sc_flags &= ~(TULIPF_LINK_UP | TULIPF_LINK_VALID);
4103 
4104 	siastat = TULIP_READ(sc, CSR_SIASTAT);
4105 
4106 	/*
4107 	 * Note that when we do SIA link tests, we are assuming that
4108 	 * the chip is really in the mode that the current media setting
4109 	 * reflects.  If we're not, then the link tests will not be
4110 	 * accurate!
4111 	 */
4112 	switch (IFM_SUBTYPE(ife->ifm_media)) {
4113 	case IFM_10_T:
4114 		sc->sc_flags |= TULIPF_LINK_VALID;
4115 		if ((siastat & SIASTAT_LS10) == 0)
4116 			sc->sc_flags |= TULIPF_LINK_UP;
4117 		break;
4118 
4119 	case IFM_100_TX:
4120 	case IFM_100_T4:
4121 		sc->sc_flags |= TULIPF_LINK_VALID;
4122 		if ((siastat & SIASTAT_LS100) == 0)
4123 			sc->sc_flags |= TULIPF_LINK_UP;
4124 		break;
4125 	}
4126 
4127 	switch (sc->sc_chip) {
4128 	case TULIP_CHIP_21142:
4129 	case TULIP_CHIP_21143:
4130 		/*
4131 		 * On these chips, we can tell more information about
4132 		 * AUI/BNC.  Note that the AUI/BNC selection is made
4133 		 * in a different register; for our purpose, it's all
4134 		 * AUI.
4135 		 */
4136 		switch (IFM_SUBTYPE(ife->ifm_media)) {
4137 		case IFM_10_2:
4138 		case IFM_10_5:
4139 			sc->sc_flags |= TULIPF_LINK_VALID;
4140 			if (siastat & SIASTAT_ARA) {
4141 				TULIP_WRITE(sc, CSR_SIASTAT, SIASTAT_ARA);
4142 				sc->sc_flags |= TULIPF_LINK_UP;
4143 			}
4144 			break;
4145 
4146 		default:
4147 			/*
4148 			 * If we're SYM media and can detect the link
4149 			 * via the GPIO facility, prefer that status
4150 			 * over LS100.
4151 			 */
4152 			if (tm->tm_type == TULIP_ROM_MB_21143_SYM &&
4153 			    tm->tm_actmask != 0) {
4154 				sc->sc_flags = (sc->sc_flags &
4155 				    ~TULIPF_LINK_UP) | TULIPF_LINK_VALID;
4156 				if (TULIP_ISSET(sc, CSR_SIAGEN,
4157 				    tm->tm_actmask) == tm->tm_actdata)
4158 					sc->sc_flags |= TULIPF_LINK_UP;
4159 			}
4160 		}
4161 		break;
4162 
4163 	default:
4164 		/* Nothing. */
4165 		break;
4166 	}
4167 }
4168 
4169 static void
4170 tlp_sia_get(struct tulip_softc *sc, struct ifmediareq *ifmr)
4171 {
4172 	struct ifmedia_entry *ife;
4173 
4174 	ifmr->ifm_status = 0;
4175 
4176 	tlp_sia_update_link(sc);
4177 
4178 	ife = TULIP_CURRENT_MEDIA(sc);
4179 
4180 	if (sc->sc_flags & TULIPF_LINK_VALID)
4181 		ifmr->ifm_status |= IFM_AVALID;
4182 	if (sc->sc_flags & TULIPF_LINK_UP)
4183 		ifmr->ifm_status |= IFM_ACTIVE;
4184 	ifmr->ifm_active = ife->ifm_media;
4185 }
4186 
4187 static void
4188 tlp_sia_fixup(struct tulip_softc *sc)
4189 {
4190 	struct ifmedia_entry *ife;
4191 	struct tulip_21x4x_media *tm;
4192 	uint32_t siaconn, siatxrx, siagen;
4193 
4194 	switch (sc->sc_chip) {
4195 	case TULIP_CHIP_82C115:
4196 	case TULIP_CHIP_MX98713A:
4197 	case TULIP_CHIP_MX98715:
4198 	case TULIP_CHIP_MX98715A:
4199 	case TULIP_CHIP_MX98715AEC_X:
4200 	case TULIP_CHIP_MX98725:
4201 		siaconn = PMAC_SIACONN_MASK;
4202 		siatxrx = PMAC_SIATXRX_MASK;
4203 		siagen  = PMAC_SIAGEN_MASK;
4204 		break;
4205 
4206 	default:
4207 		/* No fixups required on any other chips. */
4208 		return;
4209 	}
4210 
4211 	TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, ifm_list) {
4212 		tm = ife->ifm_aux;
4213 		if (tm == NULL)
4214 			continue;
4215 
4216 		tm->tm_siaconn &= siaconn;
4217 		tm->tm_siatxrx &= siatxrx;
4218 		tm->tm_siagen  &= siagen;
4219 	}
4220 }
4221 
4222 static int
4223 tlp_sia_set(struct tulip_softc *sc)
4224 {
4225 
4226 	return tlp_sia_media(sc, TULIP_CURRENT_MEDIA(sc));
4227 }
4228 
4229 static int
4230 tlp_sia_media(struct tulip_softc *sc, struct ifmedia_entry *ife)
4231 {
4232 	struct tulip_21x4x_media *tm;
4233 
4234 	tm = ife->ifm_aux;
4235 
4236 	/*
4237 	 * XXX This appears to be necessary on a bunch of the clone chips.
4238 	 */
4239 	delay(20000);
4240 
4241 	/*
4242 	 * Idle the chip.
4243 	 */
4244 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
4245 
4246 	/*
4247 	 * Program the SIA.  It's important to write in this order,
4248 	 * resetting the SIA first.
4249 	 */
4250 	TULIP_WRITE(sc, CSR_SIACONN, 0);		/* SRL bit clear */
4251 	delay(1000);
4252 
4253 	TULIP_WRITE(sc, CSR_SIATXRX, tm->tm_siatxrx);
4254 
4255 	switch (sc->sc_chip) {
4256 	case TULIP_CHIP_21142:
4257 	case TULIP_CHIP_21143:
4258 		TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpctl);
4259 		TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpdata);
4260 		break;
4261 	default:
4262 		TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen);
4263 	}
4264 
4265 	TULIP_WRITE(sc, CSR_SIACONN, tm->tm_siaconn);
4266 
4267 	/*
4268 	 * Set the OPMODE bits for this media and write OPMODE.
4269 	 * This will resume the transmit and receive processes.
4270 	 */
4271 	sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode;
4272 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
4273 
4274 	return 0;
4275 }
4276 
4277 /*
4278  * 21140 GPIO utility functions.
4279  */
4280 static void	tlp_21140_gpio_update_link(struct tulip_softc *);
4281 
4282 static void
4283 tlp_21140_gpio_update_link(struct tulip_softc *sc)
4284 {
4285 	struct ifmedia_entry *ife;
4286 	struct tulip_21x4x_media *tm;
4287 
4288 	ife = TULIP_CURRENT_MEDIA(sc);
4289 	tm = ife->ifm_aux;
4290 
4291 	sc->sc_flags &= ~(TULIPF_LINK_UP | TULIPF_LINK_VALID);
4292 
4293 	if (tm->tm_actmask != 0) {
4294 		sc->sc_flags |= TULIPF_LINK_VALID;
4295 		if (TULIP_ISSET(sc, CSR_GPP, tm->tm_actmask) ==
4296 		    tm->tm_actdata)
4297 			sc->sc_flags |= TULIPF_LINK_UP;
4298 	}
4299 }
4300 
4301 void
4302 tlp_21140_gpio_get(struct tulip_softc *sc, struct ifmediareq *ifmr)
4303 {
4304 	struct ifmedia_entry *ife;
4305 
4306 	ifmr->ifm_status = 0;
4307 
4308 	tlp_21140_gpio_update_link(sc);
4309 
4310 	ife = TULIP_CURRENT_MEDIA(sc);
4311 
4312 	if (sc->sc_flags & TULIPF_LINK_VALID)
4313 		ifmr->ifm_status |= IFM_AVALID;
4314 	if (sc->sc_flags & TULIPF_LINK_UP)
4315 		ifmr->ifm_status |= IFM_ACTIVE;
4316 	ifmr->ifm_active = ife->ifm_media;
4317 }
4318 
4319 int
4320 tlp_21140_gpio_set(struct tulip_softc *sc)
4321 {
4322 	struct ifmedia_entry *ife;
4323 	struct tulip_21x4x_media *tm;
4324 
4325 	ife = TULIP_CURRENT_MEDIA(sc);
4326 	tm = ife->ifm_aux;
4327 
4328 	/*
4329 	 * Idle the chip.
4330 	 */
4331 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
4332 
4333 	/*
4334 	 * Set the GPIO pins for this media, to flip any
4335 	 * relays, etc.
4336 	 */
4337 	TULIP_WRITE(sc, CSR_GPP, GPP_GPC | sc->sc_gp_dir);
4338 	delay(10);
4339 	TULIP_WRITE(sc, CSR_GPP, tm->tm_gpdata);
4340 
4341 	/*
4342 	 * Set the OPMODE bits for this media and write OPMODE.
4343 	 * This will resume the transmit and receive processes.
4344 	 */
4345 	sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode;
4346 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
4347 
4348 	return 0;
4349 }
4350 
4351 /*
4352  * 21040 and 21041 media switches.
4353  */
4354 static void	tlp_21040_tmsw_init(struct tulip_softc *);
4355 static void	tlp_21040_tp_tmsw_init(struct tulip_softc *);
4356 static void	tlp_21040_auibnc_tmsw_init(struct tulip_softc *);
4357 static void	tlp_21041_tmsw_init(struct tulip_softc *);
4358 
4359 const struct tulip_mediasw tlp_21040_mediasw = {
4360 	tlp_21040_tmsw_init, tlp_sia_get, tlp_sia_set
4361 };
4362 
4363 const struct tulip_mediasw tlp_21040_tp_mediasw = {
4364 	tlp_21040_tp_tmsw_init, tlp_sia_get, tlp_sia_set
4365 };
4366 
4367 const struct tulip_mediasw tlp_21040_auibnc_mediasw = {
4368 	tlp_21040_auibnc_tmsw_init, tlp_sia_get, tlp_sia_set
4369 };
4370 
4371 const struct tulip_mediasw tlp_21041_mediasw = {
4372 	tlp_21041_tmsw_init, tlp_sia_get, tlp_sia_set
4373 };
4374 
4375 static void
4376 tlp_21040_tmsw_init(struct tulip_softc *sc)
4377 {
4378 	struct mii_data * const mii = &sc->sc_mii;
4379 	static const uint8_t media[] = {
4380 		TULIP_ROM_MB_MEDIA_TP,
4381 		TULIP_ROM_MB_MEDIA_TP_FDX,
4382 		TULIP_ROM_MB_MEDIA_AUI,
4383 	};
4384 	struct tulip_21x4x_media *tm;
4385 
4386 	sc->sc_ethercom.ec_mii = mii;
4387 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
4388 
4389 	tlp_add_srom_media(sc, 0, NULL, NULL, media, 3);
4390 
4391 	/*
4392 	 * No SROM type for External SIA.
4393 	 */
4394 	tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4395 	tm->tm_name = "manual";
4396 	tm->tm_opmode = 0;
4397 	tm->tm_siaconn = SIACONN_21040_EXTSIA;
4398 	tm->tm_siatxrx = SIATXRX_21040_EXTSIA;
4399 	tm->tm_siagen  = SIAGEN_21040_EXTSIA;
4400 	ifmedia_add(&mii->mii_media,
4401 	    IFM_MAKEWORD(IFM_ETHER, IFM_MANUAL, 0, sc->sc_tlp_minst), 0, tm);
4402 
4403 	/*
4404 	 * XXX Autosense not yet supported.
4405 	 */
4406 
4407 	/* XXX This should be auto-sense. */
4408 	ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_10_T);
4409 
4410 	tlp_print_media(sc);
4411 }
4412 
4413 static void
4414 tlp_21040_tp_tmsw_init(struct tulip_softc *sc)
4415 {
4416 	struct mii_data * const mii = &sc->sc_mii;
4417 	static const uint8_t media[] = {
4418 		TULIP_ROM_MB_MEDIA_TP,
4419 		TULIP_ROM_MB_MEDIA_TP_FDX,
4420 	};
4421 
4422 	sc->sc_ethercom.ec_mii = mii;
4423 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
4424 
4425 	tlp_add_srom_media(sc, 0, NULL, NULL, media, 2);
4426 
4427 	ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_10_T);
4428 
4429 	tlp_print_media(sc);
4430 }
4431 
4432 static void
4433 tlp_21040_auibnc_tmsw_init(struct tulip_softc *sc)
4434 {
4435 	struct mii_data * const mii = &sc->sc_mii;
4436 	static const uint8_t media[] = {
4437 		TULIP_ROM_MB_MEDIA_AUI,
4438 	};
4439 
4440 	sc->sc_ethercom.ec_mii = mii;
4441 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
4442 
4443 	tlp_add_srom_media(sc, 0, NULL, NULL, media, 1);
4444 
4445 	ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_10_5);
4446 
4447 	tlp_print_media(sc);
4448 }
4449 
4450 static void
4451 tlp_21041_tmsw_init(struct tulip_softc *sc)
4452 {
4453 	struct mii_data * const mii = &sc->sc_mii;
4454 	static const uint8_t media[] = {
4455 		TULIP_ROM_MB_MEDIA_TP,
4456 		TULIP_ROM_MB_MEDIA_TP_FDX,
4457 		TULIP_ROM_MB_MEDIA_BNC,
4458 		TULIP_ROM_MB_MEDIA_AUI,
4459 	};
4460 	int i, defmedia, devcnt, leaf_offset, mb_offset, m_cnt;
4461 	const struct tulip_srom_to_ifmedia *tsti;
4462 	struct tulip_21x4x_media *tm;
4463 	uint16_t romdef;
4464 	uint8_t mb;
4465 
4466 	sc->sc_ethercom.ec_mii = mii;
4467 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
4468 
4469 	if (tlp_isv_srom(sc->sc_srom) == 0) {
4470  not_isv_srom:
4471 		/*
4472 		 * If we have a board without the standard 21041 SROM format,
4473 		 * we just assume all media are present and try and pick a
4474 		 * reasonable default.
4475 		 */
4476 		tlp_add_srom_media(sc, 0, NULL, NULL, media, 4);
4477 
4478 		/*
4479 		 * XXX Autosense not yet supported.
4480 		 */
4481 
4482 		/* XXX This should be auto-sense. */
4483 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_10_T);
4484 
4485 		tlp_print_media(sc);
4486 		return;
4487 	}
4488 
4489 	devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT];
4490 	for (i = 0; i < devcnt; i++) {
4491 		if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1)
4492 			break;
4493 		if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] ==
4494 		    sc->sc_devno)
4495 			break;
4496 	}
4497 
4498 	if (i == devcnt)
4499 		goto not_isv_srom;
4500 
4501 	leaf_offset = TULIP_ROM_GETW(sc->sc_srom,
4502 	    TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i));
4503 	mb_offset = leaf_offset + TULIP_ROM_IL_MEDIAn_BLOCK_BASE;
4504 	m_cnt = sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT];
4505 
4506 	for (; m_cnt != 0;
4507 	     m_cnt--, mb_offset += TULIP_ROM_MB_SIZE(mb)) {
4508 		mb = sc->sc_srom[mb_offset];
4509 		tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4510 		switch (mb & TULIP_ROM_MB_MEDIA_CODE) {
4511 		case TULIP_ROM_MB_MEDIA_TP_FDX:
4512 		case TULIP_ROM_MB_MEDIA_TP:
4513 		case TULIP_ROM_MB_MEDIA_BNC:
4514 		case TULIP_ROM_MB_MEDIA_AUI:
4515 			tsti = tlp_srom_to_ifmedia(mb &
4516 			    TULIP_ROM_MB_MEDIA_CODE);
4517 
4518 			tlp_srom_media_info(sc, tsti, tm);
4519 
4520 			/*
4521 			 * Override our default SIA settings if the
4522 			 * SROM contains its own.
4523 			 */
4524 			if (mb & TULIP_ROM_MB_EXT) {
4525 				tm->tm_siaconn = TULIP_ROM_GETW(sc->sc_srom,
4526 				    mb_offset + TULIP_ROM_MB_CSR13);
4527 				tm->tm_siatxrx = TULIP_ROM_GETW(sc->sc_srom,
4528 				    mb_offset + TULIP_ROM_MB_CSR14);
4529 				tm->tm_siagen = TULIP_ROM_GETW(sc->sc_srom,
4530 				    mb_offset + TULIP_ROM_MB_CSR15);
4531 			}
4532 
4533 			ifmedia_add(&mii->mii_media,
4534 			    IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype,
4535 			    tsti->tsti_options, sc->sc_tlp_minst), 0, tm);
4536 			break;
4537 
4538 		default:
4539 			aprint_error_dev(sc->sc_dev,
4540 			    "unknown media code 0x%02x\n",
4541 			    mb & TULIP_ROM_MB_MEDIA_CODE);
4542 			free(tm, M_DEVBUF);
4543 		}
4544 	}
4545 
4546 	/*
4547 	 * XXX Autosense not yet supported.
4548 	 */
4549 
4550 	romdef = TULIP_ROM_GETW(sc->sc_srom, leaf_offset +
4551 	    TULIP_ROM_IL_SELECT_CONN_TYPE);
4552 	switch (romdef) {
4553 	case SELECT_CONN_TYPE_TP:
4554 	case SELECT_CONN_TYPE_TP_AUTONEG:
4555 	case SELECT_CONN_TYPE_TP_NOLINKPASS:
4556 		defmedia = IFM_ETHER | IFM_10_T;
4557 		break;
4558 
4559 	case SELECT_CONN_TYPE_TP_FDX:
4560 		defmedia = IFM_ETHER | IFM_10_T | IFM_FDX;
4561 		break;
4562 
4563 	case SELECT_CONN_TYPE_BNC:
4564 		defmedia = IFM_ETHER | IFM_10_2;
4565 		break;
4566 
4567 	case SELECT_CONN_TYPE_AUI:
4568 		defmedia = IFM_ETHER | IFM_10_5;
4569 		break;
4570 #if 0 /* XXX */
4571 	case SELECT_CONN_TYPE_ASENSE:
4572 	case SELECT_CONN_TYPE_ASENSE_AUTONEG:
4573 		defmedia = IFM_ETHER | IFM_AUTO;
4574 		break;
4575 #endif
4576 	default:
4577 		defmedia = 0;
4578 	}
4579 
4580 	if (defmedia == 0) {
4581 		/*
4582 		 * XXX We should default to auto-sense.
4583 		 */
4584 		defmedia = IFM_ETHER | IFM_10_T;
4585 	}
4586 
4587 	ifmedia_set(&mii->mii_media, defmedia);
4588 
4589 	tlp_print_media(sc);
4590 }
4591 
4592 /*
4593  * DECchip 2114x ISV media switch.
4594  */
4595 static void	tlp_2114x_isv_tmsw_init(struct tulip_softc *);
4596 static void	tlp_2114x_isv_tmsw_get(struct tulip_softc *,
4597 		    struct ifmediareq *);
4598 static int	tlp_2114x_isv_tmsw_set(struct tulip_softc *);
4599 
4600 const struct tulip_mediasw tlp_2114x_isv_mediasw = {
4601 	tlp_2114x_isv_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set
4602 };
4603 
4604 static void	tlp_2114x_nway_get(struct tulip_softc *, struct ifmediareq *);
4605 static int	tlp_2114x_nway_set(struct tulip_softc *);
4606 
4607 static void	tlp_2114x_nway_statchg(struct ifnet *);
4608 static int	tlp_2114x_nway_service(struct tulip_softc *, int);
4609 static void	tlp_2114x_nway_auto(struct tulip_softc *);
4610 static void	tlp_2114x_nway_status(struct tulip_softc *);
4611 
4612 static void
4613 tlp_2114x_isv_tmsw_init(struct tulip_softc *sc)
4614 {
4615 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
4616 	struct mii_data * const mii = &sc->sc_mii;
4617 	struct ifmedia_entry *ife;
4618 	struct mii_softc *phy;
4619 	struct tulip_21x4x_media *tm;
4620 	const struct tulip_srom_to_ifmedia *tsti;
4621 	int i, devcnt, leaf_offset, m_cnt, type, length;
4622 	int defmedia, miidef;
4623 	uint16_t word;
4624 	uint8_t *cp, *ncp;
4625 
4626 	defmedia = miidef = 0;
4627 
4628 	mii->mii_ifp = ifp;
4629 	mii->mii_readreg = tlp_bitbang_mii_readreg;
4630 	mii->mii_writereg = tlp_bitbang_mii_writereg;
4631 	mii->mii_statchg = sc->sc_statchg;
4632 	sc->sc_ethercom.ec_mii = mii;
4633 
4634 	/*
4635 	 * Ignore `instance'; we may get a mixture of SIA and MII
4636 	 * media, and `instance' is used to isolate or select the
4637 	 * PHY on the MII as appropriate.  Note that duplicate media
4638 	 * are disallowed, so ignoring `instance' is safe.
4639 	 */
4640 	ifmedia_init(&mii->mii_media, IFM_IMASK, tlp_mediachange,
4641 	    tlp_mediastatus);
4642 
4643 	devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT];
4644 	for (i = 0; i < devcnt; i++) {
4645 		if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1)
4646 			break;
4647 		if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] ==
4648 		    sc->sc_devno)
4649 			break;
4650 	}
4651 
4652 	if (i == devcnt) {
4653 		aprint_error_dev(sc->sc_dev,
4654 		    "unable to locate info leaf in SROM\n");
4655 		return;
4656 	}
4657 
4658 	leaf_offset = TULIP_ROM_GETW(sc->sc_srom,
4659 	    TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i));
4660 
4661 	/* XXX SELECT CONN TYPE */
4662 
4663 	cp = &sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT];
4664 
4665 	/*
4666 	 * On some chips, the first thing in the Info Leaf is the
4667 	 * GPIO pin direction data.
4668 	 */
4669 	switch (sc->sc_chip) {
4670 	case TULIP_CHIP_21140:
4671 	case TULIP_CHIP_21140A:
4672 	case TULIP_CHIP_MX98713:
4673 	case TULIP_CHIP_AX88140:
4674 	case TULIP_CHIP_AX88141:
4675 		sc->sc_gp_dir = *cp++;
4676 		break;
4677 
4678 	default:
4679 		/* Nothing. */
4680 		break;
4681 	}
4682 
4683 	/* Get the media count. */
4684 	m_cnt = *cp++;
4685 
4686 	if (m_cnt == 0) {
4687 		sc->sc_mediasw = &tlp_sio_mii_mediasw;
4688 		(*sc->sc_mediasw->tmsw_init)(sc);
4689 		return;
4690 	}
4691 
4692 	for (; m_cnt != 0; cp = ncp, m_cnt--) {
4693 		/*
4694 		 * Determine the type and length of this media block.
4695 		 * The 21143 is spec'd to always use extended format blocks,
4696 		 * but some cards don't set the bit to indicate this.
4697 		 * Hopefully there are no cards which really don't use
4698 		 * extended format blocks.
4699 		 */
4700 		if ((*cp & 0x80) == 0 && sc->sc_chip != TULIP_CHIP_21143) {
4701 			length = 4;
4702 			type = TULIP_ROM_MB_21140_GPR;
4703 		} else {
4704 			length = (*cp++ & 0x7f) - 1;
4705 			type = *cp++ & 0x3f;
4706 		}
4707 
4708 		/* Compute the start of the next block. */
4709 		ncp = cp + length;
4710 
4711 		/* Now, parse the block. */
4712 		switch (type) {
4713 		case TULIP_ROM_MB_21140_GPR:
4714 			tlp_get_minst(sc);
4715 			sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_GPR;
4716 
4717 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4718 
4719 			tm->tm_type = TULIP_ROM_MB_21140_GPR;
4720 			tm->tm_get = tlp_21140_gpio_get;
4721 			tm->tm_set = tlp_21140_gpio_set;
4722 
4723 			/* First is the media type code. */
4724 			tsti = tlp_srom_to_ifmedia(cp[0] &
4725 			    TULIP_ROM_MB_MEDIA_CODE);
4726 			if (tsti == NULL) {
4727 				/* Invalid media code. */
4728 				free(tm, M_DEVBUF);
4729 				break;
4730 			}
4731 
4732 			/* Get defaults. */
4733 			tlp_srom_media_info(sc, tsti, tm);
4734 
4735 			/* Next is any GPIO info for this media. */
4736 			tm->tm_gpdata = cp[1];
4737 
4738 			/*
4739 			 * Next is a word containing OPMODE information
4740 			 * and info on how to detect if this media is
4741 			 * active.
4742 			 */
4743 			word = TULIP_ROM_GETW(cp, 2);
4744 			tm->tm_opmode &= OPMODE_FD;
4745 			tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word);
4746 			if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) {
4747 				tm->tm_actmask =
4748 				    TULIP_ROM_MB_BITPOS(word);
4749 				tm->tm_actdata =
4750 				    (word & TULIP_ROM_MB_POLARITY) ?
4751 				    0 : tm->tm_actmask;
4752 			}
4753 
4754 			ifmedia_add(&mii->mii_media,
4755 			    IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype,
4756 			    tsti->tsti_options, sc->sc_tlp_minst), 0, tm);
4757 			break;
4758 
4759 		case TULIP_ROM_MB_21140_MII:
4760 			sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_MII;
4761 
4762 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4763 
4764 			tm->tm_type = TULIP_ROM_MB_21140_MII;
4765 			tm->tm_get = tlp_mii_getmedia;
4766 			tm->tm_set = tlp_mii_setmedia;
4767 			tm->tm_opmode = OPMODE_PS;
4768 
4769 			if (sc->sc_reset == NULL)
4770 				sc->sc_reset = tlp_21140_reset;
4771 
4772 			/* First is the PHY number. */
4773 			tm->tm_phyno = *cp++;
4774 
4775 			/* Next is the MII select sequence length and offset. */
4776 			tm->tm_gp_length = *cp++;
4777 			tm->tm_gp_offset = cp - &sc->sc_srom[0];
4778 			cp += tm->tm_gp_length;
4779 
4780 			/* Next is the MII reset sequence length and offset. */
4781 			tm->tm_reset_length = *cp++;
4782 			tm->tm_reset_offset = cp - &sc->sc_srom[0];
4783 			cp += tm->tm_reset_length;
4784 
4785 			/*
4786 			 * The following items are left in the media block
4787 			 * that we don't particularly care about:
4788 			 *
4789 			 *	capabilities		W
4790 			 *	advertisement		W
4791 			 *	full duplex		W
4792 			 *	tx threshold		W
4793 			 *
4794 			 * These appear to be bits in the PHY registers,
4795 			 * which our MII code handles on its own.
4796 			 */
4797 
4798 			/*
4799 			 * Before we probe the MII bus, we need to reset
4800 			 * it and issue the selection sequence.
4801 			 */
4802 
4803 			/* Set the direction of the pins... */
4804 			TULIP_WRITE(sc, CSR_GPP, GPP_GPC | sc->sc_gp_dir);
4805 
4806 			for (i = 0; i < tm->tm_reset_length; i++) {
4807 				delay(10);
4808 				TULIP_WRITE(sc, CSR_GPP,
4809 				    sc->sc_srom[tm->tm_reset_offset + i]);
4810 			}
4811 
4812 			for (i = 0; i < tm->tm_gp_length; i++) {
4813 				delay(10);
4814 				TULIP_WRITE(sc, CSR_GPP,
4815 				    sc->sc_srom[tm->tm_gp_offset + i]);
4816 			}
4817 
4818 			/* If there were no sequences, just lower the pins. */
4819 			if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) {
4820 				delay(10);
4821 				TULIP_WRITE(sc, CSR_GPP, 0);
4822 			}
4823 
4824 			/*
4825 			 * Now, probe the MII for the PHY.  Note, we know
4826 			 * the location of the PHY on the bus, but we don't
4827 			 * particularly care; the MII code just likes to
4828 			 * search the whole thing anyhow.
4829 			 */
4830 			mii_attach(sc->sc_dev, mii, 0xffffffff,
4831 			    MII_PHY_ANY, tm->tm_phyno, 0);
4832 
4833 			/*
4834 			 * Now, search for the PHY we hopefully just
4835 			 * configured.  If it's not configured into the
4836 			 * kernel, we lose.  The PHY's default media always
4837 			 * takes priority.
4838 			 */
4839 			LIST_FOREACH(phy, &mii->mii_phys, mii_list) {
4840 				if (phy->mii_offset == tm->tm_phyno)
4841 					break;
4842 			}
4843 			if (phy == NULL) {
4844 				aprint_error_dev(sc->sc_dev,
4845 				    "unable to configure MII\n");
4846 				break;
4847 			}
4848 
4849 			sc->sc_flags |= TULIPF_HAS_MII;
4850 			sc->sc_tick = tlp_mii_tick;
4851 			miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0,
4852 			    phy->mii_inst);
4853 
4854 			/*
4855 			 * Okay, now that we've found the PHY and the MII
4856 			 * layer has added all of the media associated
4857 			 * with that PHY, we need to traverse the media
4858 			 * list, and add our `tm' to each entry's `aux'
4859 			 * pointer.
4860 			 *
4861 			 * We do this by looking for media with our
4862 			 * PHY's `instance'.
4863 			 */
4864 			TAILQ_FOREACH(ife, &mii->mii_media.ifm_list,
4865 			      ifm_list) {
4866 				if (IFM_INST(ife->ifm_media) != phy->mii_inst)
4867 					continue;
4868 				ife->ifm_aux = tm;
4869 			}
4870 			break;
4871 
4872 		case TULIP_ROM_MB_21142_SIA:
4873 			tlp_get_minst(sc);
4874 			sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_SIA;
4875 
4876 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4877 
4878 			tm->tm_type = TULIP_ROM_MB_21142_SIA;
4879 			tm->tm_get = tlp_sia_get;
4880 			tm->tm_set = tlp_sia_set;
4881 
4882 			/* First is the media type code. */
4883 			tsti = tlp_srom_to_ifmedia(cp[0] &
4884 			    TULIP_ROM_MB_MEDIA_CODE);
4885 			if (tsti == NULL) {
4886 				/* Invalid media code. */
4887 				free(tm, M_DEVBUF);
4888 				break;
4889 			}
4890 
4891 			/* Get defaults. */
4892 			tlp_srom_media_info(sc, tsti, tm);
4893 
4894 			/*
4895 			 * Override our default SIA settings if the
4896 			 * SROM contains its own.
4897 			 */
4898 			if (cp[0] & 0x40) {
4899 				tm->tm_siaconn = TULIP_ROM_GETW(cp, 1);
4900 				tm->tm_siatxrx = TULIP_ROM_GETW(cp, 3);
4901 				tm->tm_siagen  = TULIP_ROM_GETW(cp, 5);
4902 				cp += 7;
4903 			} else
4904 				cp++;
4905 
4906 			/* Next is GPIO control/data. */
4907 			tm->tm_gpctl  = TULIP_ROM_GETW(cp, 0) << 16;
4908 			tm->tm_gpdata = TULIP_ROM_GETW(cp, 2) << 16;
4909 
4910 			ifmedia_add(&mii->mii_media,
4911 			    IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype,
4912 			    tsti->tsti_options, sc->sc_tlp_minst), 0, tm);
4913 			break;
4914 
4915 		case TULIP_ROM_MB_21142_MII:
4916 			sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_MII;
4917 
4918 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
4919 
4920 			tm->tm_type = TULIP_ROM_MB_21142_MII;
4921 			tm->tm_get = tlp_mii_getmedia;
4922 			tm->tm_set = tlp_mii_setmedia;
4923 			tm->tm_opmode = OPMODE_PS;
4924 
4925 			if (sc->sc_reset == NULL)
4926 				sc->sc_reset = tlp_21142_reset;
4927 
4928 			/* First is the PHY number. */
4929 			tm->tm_phyno = *cp++;
4930 
4931 			/* Next is the MII select sequence length and offset. */
4932 			tm->tm_gp_length = *cp++;
4933 			tm->tm_gp_offset = cp - &sc->sc_srom[0];
4934 			cp += tm->tm_gp_length * 2;
4935 
4936 			/* Next is the MII reset sequence length and offset. */
4937 			tm->tm_reset_length = *cp++;
4938 			tm->tm_reset_offset = cp - &sc->sc_srom[0];
4939 			cp += tm->tm_reset_length * 2;
4940 
4941 			/*
4942 			 * The following items are left in the media block
4943 			 * that we don't particularly care about:
4944 			 *
4945 			 *	capabilities		W
4946 			 *	advertisement		W
4947 			 *	full duplex		W
4948 			 *	tx threshold		W
4949 			 *	MII interrupt		W
4950 			 *
4951 			 * These appear to be bits in the PHY registers,
4952 			 * which our MII code handles on its own.
4953 			 */
4954 
4955 			/*
4956 			 * Before we probe the MII bus, we need to reset
4957 			 * it and issue the selection sequence.
4958 			 */
4959 
4960 			cp = &sc->sc_srom[tm->tm_reset_offset];
4961 			for (i = 0; i < tm->tm_reset_length; i++, cp += 2) {
4962 				delay(10);
4963 				TULIP_WRITE(sc, CSR_SIAGEN,
4964 				    TULIP_ROM_GETW(cp, 0) << 16);
4965 			}
4966 
4967 			cp = &sc->sc_srom[tm->tm_gp_offset];
4968 			for (i = 0; i < tm->tm_gp_length; i++, cp += 2) {
4969 				delay(10);
4970 				TULIP_WRITE(sc, CSR_SIAGEN,
4971 				    TULIP_ROM_GETW(cp, 0) << 16);
4972 			}
4973 
4974 			/* If there were no sequences, just lower the pins. */
4975 			if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) {
4976 				delay(10);
4977 				TULIP_WRITE(sc, CSR_SIAGEN, 0);
4978 			}
4979 
4980 			/*
4981 			 * Now, probe the MII for the PHY.  Note, we know
4982 			 * the location of the PHY on the bus, but we don't
4983 			 * particularly care; the MII code just likes to
4984 			 * search the whole thing anyhow.
4985 			 */
4986 			mii_attach(sc->sc_dev, mii, 0xffffffff,
4987 			    MII_PHY_ANY, tm->tm_phyno, 0);
4988 
4989 			/*
4990 			 * Now, search for the PHY we hopefully just
4991 			 * configured.  If it's not configured into the
4992 			 * kernel, we lose.  The PHY's default media always
4993 			 * takes priority.
4994 			 */
4995 			LIST_FOREACH(phy, &mii->mii_phys, mii_list) {
4996 				if (phy->mii_offset == tm->tm_phyno)
4997 					break;
4998 			}
4999 			if (phy == NULL) {
5000 				aprint_error_dev(sc->sc_dev,
5001 				    "unable to configure MII\n");
5002 				break;
5003 			}
5004 
5005 			sc->sc_flags |= TULIPF_HAS_MII;
5006 			sc->sc_tick = tlp_mii_tick;
5007 			miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0,
5008 			    phy->mii_inst);
5009 
5010 			/*
5011 			 * Okay, now that we've found the PHY and the MII
5012 			 * layer has added all of the media associated
5013 			 * with that PHY, we need to traverse the media
5014 			 * list, and add our `tm' to each entry's `aux'
5015 			 * pointer.
5016 			 *
5017 			 * We do this by looking for media with our
5018 			 * PHY's `instance'.
5019 			 */
5020 			TAILQ_FOREACH(ife, &mii->mii_media.ifm_list,
5021 			      ifm_list) {
5022 				if (IFM_INST(ife->ifm_media) != phy->mii_inst)
5023 					continue;
5024 				ife->ifm_aux = tm;
5025 			}
5026 			break;
5027 
5028 		case TULIP_ROM_MB_21143_SYM:
5029 			tlp_get_minst(sc);
5030 			sc->sc_media_seen |= 1 << TULIP_ROM_MB_21143_SYM;
5031 
5032 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
5033 
5034 			tm->tm_type = TULIP_ROM_MB_21143_SYM;
5035 			tm->tm_get = tlp_sia_get;
5036 			tm->tm_set = tlp_sia_set;
5037 
5038 			/* First is the media type code. */
5039 			tsti = tlp_srom_to_ifmedia(cp[0] &
5040 			    TULIP_ROM_MB_MEDIA_CODE);
5041 			if (tsti == NULL) {
5042 				/* Invalid media code. */
5043 				free(tm, M_DEVBUF);
5044 				break;
5045 			}
5046 
5047 			/* Get defaults. */
5048 			tlp_srom_media_info(sc, tsti, tm);
5049 
5050 			/* Next is GPIO control/data. */
5051 			tm->tm_gpctl  = TULIP_ROM_GETW(cp, 1) << 16;
5052 			tm->tm_gpdata = TULIP_ROM_GETW(cp, 3) << 16;
5053 
5054 			/*
5055 			 * Next is a word containing OPMODE information
5056 			 * and info on how to detect if this media is
5057 			 * active.
5058 			 */
5059 			word = TULIP_ROM_GETW(cp, 5);
5060 			tm->tm_opmode &= OPMODE_FD;
5061 			tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word);
5062 			if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) {
5063 				tm->tm_actmask =
5064 				    TULIP_ROM_MB_BITPOS(word);
5065 				tm->tm_actdata =
5066 				    (word & TULIP_ROM_MB_POLARITY) ?
5067 				    0 : tm->tm_actmask;
5068 			}
5069 
5070 			ifmedia_add(&mii->mii_media,
5071 			    IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype,
5072 			    tsti->tsti_options, sc->sc_tlp_minst), 0, tm);
5073 			break;
5074 
5075 		case TULIP_ROM_MB_21143_RESET:
5076 			aprint_normal_dev(sc->sc_dev, "21143 reset block\n");
5077 			break;
5078 
5079 		default:
5080 			aprint_error_dev(sc->sc_dev,
5081 			    "unknown ISV media block type 0x%02x\n", type);
5082 		}
5083 	}
5084 
5085 	/*
5086 	 * Deal with the case where no media is configured.
5087 	 */
5088 	if (TAILQ_FIRST(&mii->mii_media.ifm_list) == NULL) {
5089 		aprint_error_dev(sc->sc_dev, "no media found!\n");
5090 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
5091 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
5092 		return;
5093 	}
5094 
5095 	/*
5096 	 * Pick the default media.
5097 	 */
5098 	if (miidef != 0)
5099 		defmedia = miidef;
5100 	else {
5101 		switch (sc->sc_chip) {
5102 		case TULIP_CHIP_21140:
5103 		case TULIP_CHIP_21140A:
5104 			/* XXX should come from SROM */
5105 			defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0);
5106 			if (ifmedia_match(&mii->mii_media, defmedia,
5107 				mii->mii_media.ifm_mask) == NULL) {
5108 				/*
5109 				 * There is not a 10baseT media.
5110 				 * Fall back to the first found one.
5111 				 */
5112 				ife = TAILQ_FIRST(&mii->mii_media.ifm_list);
5113 				defmedia = ife->ifm_media;
5114 			}
5115 			break;
5116 
5117 		case TULIP_CHIP_21142:
5118 		case TULIP_CHIP_21143:
5119 		case TULIP_CHIP_MX98713A:
5120 		case TULIP_CHIP_MX98715:
5121 		case TULIP_CHIP_MX98715A:
5122 		case TULIP_CHIP_MX98715AEC_X:
5123 		case TULIP_CHIP_MX98725:
5124 			tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
5125 			tm->tm_name = "auto";
5126 			tm->tm_get = tlp_2114x_nway_get;
5127 			tm->tm_set = tlp_2114x_nway_set;
5128 
5129 			defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0);
5130 			ifmedia_add(&mii->mii_media, defmedia, 0, tm);
5131 
5132 			sc->sc_statchg = tlp_2114x_nway_statchg;
5133 			sc->sc_tick = tlp_2114x_nway_tick;
5134 			break;
5135 
5136 		default:
5137 			defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0);
5138 			break;
5139 		}
5140 	}
5141 
5142 	ifmedia_set(&mii->mii_media, defmedia);
5143 
5144 	/*
5145 	 * Display any non-MII media we've located.
5146 	 */
5147 	if (sc->sc_media_seen &
5148 	    ~((1 << TULIP_ROM_MB_21140_MII) | (1 << TULIP_ROM_MB_21142_MII)))
5149 		tlp_print_media(sc);
5150 
5151 	tlp_sia_fixup(sc);
5152 }
5153 
5154 static void
5155 tlp_2114x_nway_get(struct tulip_softc *sc, struct ifmediareq *ifmr)
5156 {
5157 
5158 	(void) tlp_2114x_nway_service(sc, MII_POLLSTAT);
5159 	ifmr->ifm_status = sc->sc_mii.mii_media_status;
5160 	ifmr->ifm_active = sc->sc_mii.mii_media_active;
5161 }
5162 
5163 static int
5164 tlp_2114x_nway_set(struct tulip_softc *sc)
5165 {
5166 
5167 	return tlp_2114x_nway_service(sc, MII_MEDIACHG);
5168 }
5169 
5170 static void
5171 tlp_2114x_nway_statchg(struct ifnet *ifp)
5172 {
5173 	struct tulip_softc *sc = ifp->if_softc;
5174 	struct mii_data *mii = &sc->sc_mii;
5175 	struct ifmedia_entry *ife;
5176 
5177 	if (IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE)
5178 		return;
5179 
5180 	if ((ife = ifmedia_match(&mii->mii_media, mii->mii_media_active,
5181 	    mii->mii_media.ifm_mask)) == NULL) {
5182 		printf("tlp_2114x_nway_statchg: no match for media 0x%x/0x%x\n",
5183 		    mii->mii_media_active, ~mii->mii_media.ifm_mask);
5184 		panic("tlp_2114x_nway_statchg");
5185 	}
5186 
5187 	tlp_sia_media(sc, ife);
5188 }
5189 
5190 static void
5191 tlp_2114x_nway_tick(void *arg)
5192 {
5193 	struct tulip_softc *sc = arg;
5194 	struct mii_data *mii = &sc->sc_mii;
5195 	int s, ticks;
5196 
5197 	if (!device_is_active(sc->sc_dev))
5198 		return;
5199 
5200 	s = splnet();
5201 	tlp_2114x_nway_service(sc, MII_TICK);
5202 	if ((sc->sc_flags & TULIPF_LINK_UP) == 0 &&
5203 	    (mii->mii_media_status & IFM_ACTIVE) != 0 &&
5204 	    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
5205 		sc->sc_flags |= TULIPF_LINK_UP;
5206 		tlp_start(&sc->sc_ethercom.ec_if);
5207 	} else if ((sc->sc_flags & TULIPF_LINK_UP) != 0 &&
5208 	    (mii->mii_media_status & IFM_ACTIVE) == 0) {
5209 		sc->sc_flags &= ~TULIPF_LINK_UP;
5210 	}
5211 	splx(s);
5212 
5213 	if ((sc->sc_flags & TULIPF_LINK_UP) == 0)
5214 		ticks = hz >> 3;
5215 	else
5216 		ticks = hz;
5217 	callout_reset(&sc->sc_tick_callout, ticks, tlp_2114x_nway_tick, sc);
5218 }
5219 
5220 /*
5221  * Support for the 2114X internal NWay block.  This is constructed
5222  * somewhat like a PHY driver for simplicity.
5223  */
5224 
5225 static int
5226 tlp_2114x_nway_service(struct tulip_softc *sc, int cmd)
5227 {
5228 	struct mii_data *mii = &sc->sc_mii;
5229 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
5230 
5231 	if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
5232 		return 0;
5233 
5234 	switch (cmd) {
5235 	case MII_POLLSTAT:
5236 		/* Nothing special to do here. */
5237 		break;
5238 
5239 	case MII_MEDIACHG:
5240 		switch (IFM_SUBTYPE(ife->ifm_media)) {
5241 		case IFM_AUTO:
5242 			goto restart;
5243 		default:
5244 			/* Manual setting doesn't go through here. */
5245 			printf("tlp_2114x_nway_service: oops!\n");
5246 			return EINVAL;
5247 		}
5248 		break;
5249 
5250 	case MII_TICK:
5251 		/*
5252 		 * Only used for autonegotiation.
5253 		 */
5254 		if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
5255 			break;
5256 
5257 		/*
5258 		 * Check to see if we have link.  If we do, we don't
5259 		 * need to restart the autonegotiation process.
5260 		 */
5261 #if 0
5262 		if (mii->mii_media_status & IFM_ACTIVE)
5263 #else
5264 		if (sc->sc_flags & TULIPF_LINK_UP)
5265 #endif
5266 			break;
5267 
5268 		/*
5269 		 * Only retry autonegotiation every 5 seconds.
5270 		 */
5271 		if (++sc->sc_nway_ticks != (5 << 3))
5272 			break;
5273 
5274 	restart:
5275 		sc->sc_nway_ticks = 0;
5276 		ife->ifm_data = IFM_NONE;
5277 		tlp_2114x_nway_auto(sc);
5278 		break;
5279 	}
5280 
5281 	/* Update the media status. */
5282 	tlp_2114x_nway_status(sc);
5283 
5284 	/*
5285 	 * Callback if something changed.  Manually configuration goes through
5286 	 * tlp_sia_set() anyway, so ignore that here.
5287 	 */
5288 	if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO &&
5289 	    ife->ifm_data != mii->mii_media_active) {
5290 		(*sc->sc_statchg)(mii->mii_ifp);
5291 		ife->ifm_data = mii->mii_media_active;
5292 	}
5293 	return 0;
5294 }
5295 
5296 static void
5297 tlp_2114x_nway_auto(struct tulip_softc *sc)
5298 {
5299 	uint32_t siastat, siatxrx;
5300 
5301 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
5302 
5303 	sc->sc_opmode &= ~(OPMODE_PS | OPMODE_PCS | OPMODE_SCR | OPMODE_FD);
5304 	sc->sc_opmode |= OPMODE_TTM | OPMODE_HBD;
5305 	siatxrx = 0xffbf;		/* XXX magic number */
5306 
5307 	/* Compute the link code word to advertise. */
5308 	if (sc->sc_sia_cap & BMSR_100T4)
5309 		siatxrx |= SIATXRX_T4;
5310 	if (sc->sc_sia_cap & BMSR_100TXFDX)
5311 		siatxrx |= SIATXRX_TXF;
5312 	if (sc->sc_sia_cap & BMSR_100TXHDX)
5313 		siatxrx |= SIATXRX_THX;
5314 	if (sc->sc_sia_cap & BMSR_10TFDX)
5315 		sc->sc_opmode |= OPMODE_FD;
5316 	if (sc->sc_sia_cap & BMSR_10THDX)
5317 		siatxrx |= SIATXRX_TH;
5318 
5319 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
5320 
5321 	TULIP_WRITE(sc, CSR_SIACONN, 0);
5322 	delay(1000);
5323 	TULIP_WRITE(sc, CSR_SIATXRX, siatxrx);
5324 	TULIP_WRITE(sc, CSR_SIACONN, SIACONN_SRL);
5325 
5326 	siastat = TULIP_READ(sc, CSR_SIASTAT);
5327 	siastat &= ~(SIASTAT_ANS | SIASTAT_LPC | SIASTAT_TRA | SIASTAT_ARA |
5328 		     SIASTAT_LS100 | SIASTAT_LS10 | SIASTAT_MRA);
5329 	siastat |= SIASTAT_ANS_TXDIS;
5330 	TULIP_WRITE(sc, CSR_SIASTAT, siastat);
5331 }
5332 
5333 static void
5334 tlp_2114x_nway_status(struct tulip_softc *sc)
5335 {
5336 	struct mii_data *mii = &sc->sc_mii;
5337 	uint32_t siatxrx, siastat, anlpar;
5338 
5339 	mii->mii_media_status = IFM_AVALID;
5340 	mii->mii_media_active = IFM_ETHER;
5341 
5342 	if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
5343 		return;
5344 
5345 	siastat = TULIP_READ(sc, CSR_SIASTAT);
5346 	siatxrx = TULIP_READ(sc, CSR_SIATXRX);
5347 
5348 	if (siatxrx & SIATXRX_ANE) {
5349 		if ((siastat & SIASTAT_ANS) != SIASTAT_ANS_FLPGOOD) {
5350 			/* Erg, still trying, I guess... */
5351 			mii->mii_media_active |= IFM_NONE;
5352 			return;
5353 		}
5354 
5355 		if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100))
5356 			mii->mii_media_status |= IFM_ACTIVE;
5357 
5358 		if (siastat & SIASTAT_LPN) {
5359 			anlpar = SIASTAT_GETLPC(siastat);
5360 			if (anlpar & ANLPAR_T4 &&
5361 			    sc->sc_sia_cap & BMSR_100T4)
5362 				mii->mii_media_active |= IFM_100_T4;
5363 			else if (anlpar & ANLPAR_TX_FD &&
5364 				 sc->sc_sia_cap & BMSR_100TXFDX)
5365 				mii->mii_media_active |= IFM_100_TX | IFM_FDX;
5366 			else if (anlpar & ANLPAR_TX &&
5367 				 sc->sc_sia_cap & BMSR_100TXHDX)
5368 				mii->mii_media_active |= IFM_100_TX;
5369 			else if (anlpar & ANLPAR_10_FD &&
5370 				 sc->sc_sia_cap & BMSR_10TFDX)
5371 				mii->mii_media_active |= IFM_10_T | IFM_FDX;
5372 			else if (anlpar & ANLPAR_10 &&
5373 				 sc->sc_sia_cap & BMSR_10THDX)
5374 				mii->mii_media_active |= IFM_10_T;
5375 			else
5376 				mii->mii_media_active |= IFM_NONE;
5377 		} else {
5378 			/*
5379 			 * If the other side doesn't support NWAY, then the
5380 			 * best we can do is determine if we have a 10Mbps or
5381 			 * 100Mbps link. There's no way to know if the link
5382 			 * is full or half duplex, so we default to half duplex
5383 			 * and hope that the user is clever enough to manually
5384 			 * change the media settings if we're wrong.
5385 			 */
5386 			if ((siastat & SIASTAT_LS100) == 0)
5387 				mii->mii_media_active |= IFM_100_TX;
5388 			else if ((siastat & SIASTAT_LS10) == 0)
5389 				mii->mii_media_active |= IFM_10_T;
5390 			else
5391 				mii->mii_media_active |= IFM_NONE;
5392 		}
5393 	} else {
5394 		if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100))
5395 			mii->mii_media_status |= IFM_ACTIVE;
5396 
5397 		if (sc->sc_opmode & OPMODE_TTM)
5398 			mii->mii_media_active |= IFM_10_T;
5399 		else
5400 			mii->mii_media_active |= IFM_100_TX;
5401 		if (sc->sc_opmode & OPMODE_FD)
5402 			mii->mii_media_active |= IFM_FDX;
5403 	}
5404 }
5405 
5406 static void
5407 tlp_2114x_isv_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr)
5408 {
5409 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
5410 	struct tulip_21x4x_media *tm = ife->ifm_aux;
5411 
5412 	(*tm->tm_get)(sc, ifmr);
5413 }
5414 
5415 static int
5416 tlp_2114x_isv_tmsw_set(struct tulip_softc *sc)
5417 {
5418 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
5419 	struct tulip_21x4x_media *tm = ife->ifm_aux;
5420 
5421 	/*
5422 	 * Check to see if we need to reset the chip, and do it.  The
5423 	 * reset path will get the OPMODE register right the next
5424 	 * time through.
5425 	 */
5426 	if (TULIP_MEDIA_NEEDSRESET(sc, tm->tm_opmode))
5427 		return tlp_init(&sc->sc_ethercom.ec_if);
5428 
5429 	return (*tm->tm_set)(sc);
5430 }
5431 
5432 /*
5433  * MII-on-SIO media switch.  Handles only MII attached to the SIO.
5434  */
5435 static void	tlp_sio_mii_tmsw_init(struct tulip_softc *);
5436 
5437 const struct tulip_mediasw tlp_sio_mii_mediasw = {
5438 	tlp_sio_mii_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia
5439 };
5440 
5441 static void
5442 tlp_sio_mii_tmsw_init(struct tulip_softc *sc)
5443 {
5444 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
5445 	struct mii_data * const mii = &sc->sc_mii;
5446 
5447 	/*
5448 	 * We don't attach any media info structures to the ifmedia
5449 	 * entries, so if we're using a pre-init function that needs
5450 	 * that info, override it to one that doesn't.
5451 	 */
5452 	if (sc->sc_preinit == tlp_2114x_preinit)
5453 		sc->sc_preinit = tlp_2114x_mii_preinit;
5454 
5455 	mii->mii_ifp = ifp;
5456 	mii->mii_readreg = tlp_bitbang_mii_readreg;
5457 	mii->mii_writereg = tlp_bitbang_mii_writereg;
5458 	mii->mii_statchg = sc->sc_statchg;
5459 	sc->sc_ethercom.ec_mii = mii;
5460 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
5461 	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
5462 	    MII_OFFSET_ANY, 0);
5463 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
5464 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
5465 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
5466 	} else {
5467 		sc->sc_flags |= TULIPF_HAS_MII;
5468 		sc->sc_tick = tlp_mii_tick;
5469 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5470 	}
5471 }
5472 
5473 /*
5474  * Lite-On PNIC media switch.  Must handle MII or internal NWAY.
5475  */
5476 static void	tlp_pnic_tmsw_init(struct tulip_softc *);
5477 static void	tlp_pnic_tmsw_get(struct tulip_softc *, struct ifmediareq *);
5478 static int	tlp_pnic_tmsw_set(struct tulip_softc *);
5479 
5480 const struct tulip_mediasw tlp_pnic_mediasw = {
5481 	tlp_pnic_tmsw_init, tlp_pnic_tmsw_get, tlp_pnic_tmsw_set
5482 };
5483 
5484 static void	tlp_pnic_nway_statchg(struct ifnet *);
5485 static void	tlp_pnic_nway_tick(void *);
5486 static int	tlp_pnic_nway_service(struct tulip_softc *, int);
5487 static void	tlp_pnic_nway_reset(struct tulip_softc *);
5488 static int	tlp_pnic_nway_auto(struct tulip_softc *, int);
5489 static void	tlp_pnic_nway_auto_timeout(void *);
5490 static void	tlp_pnic_nway_status(struct tulip_softc *);
5491 static void	tlp_pnic_nway_acomp(struct tulip_softc *);
5492 
5493 static void
5494 tlp_pnic_tmsw_init(struct tulip_softc *sc)
5495 {
5496 	struct mii_data * const mii = &sc->sc_mii;
5497 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
5498 	const char *sep = "";
5499 
5500 #define	ADD(m, c)	ifmedia_add(&mii->mii_media, (m), (c), NULL)
5501 #define	PRINT(str)	aprint_normal("%s%s", sep, str); sep = ", "
5502 
5503 	mii->mii_ifp = ifp;
5504 	mii->mii_readreg = tlp_pnic_mii_readreg;
5505 	mii->mii_writereg = tlp_pnic_mii_writereg;
5506 	mii->mii_statchg = sc->sc_statchg;
5507 	sc->sc_ethercom.ec_mii = mii;
5508 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
5509 	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
5510 	    MII_OFFSET_ANY, 0);
5511 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
5512 		/* XXX What about AUI/BNC support? */
5513 		aprint_normal_dev(sc->sc_dev, "");
5514 
5515 		tlp_pnic_nway_reset(sc);
5516 
5517 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0),
5518 		    PNIC_NWAY_TW | PNIC_NWAY_CAP10T);
5519 		PRINT("10baseT");
5520 
5521 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, 0),
5522 		    PNIC_NWAY_TW | PNIC_NWAY_FD | PNIC_NWAY_CAP10TFDX);
5523 		PRINT("10baseT-FDX");
5524 
5525 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, 0),
5526 		    PNIC_NWAY_TW | PNIC_NWAY_100 | PNIC_NWAY_CAP100TX);
5527 		PRINT("100baseTX");
5528 
5529 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, 0),
5530 		    PNIC_NWAY_TW | PNIC_NWAY_100 | PNIC_NWAY_FD |
5531 		    PNIC_NWAY_CAP100TXFDX);
5532 		PRINT("100baseTX-FDX");
5533 
5534 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0),
5535 		    PNIC_NWAY_TW | PNIC_NWAY_RN | PNIC_NWAY_NW |
5536 		    PNIC_NWAY_CAP10T | PNIC_NWAY_CAP10TFDX |
5537 		    PNIC_NWAY_CAP100TXFDX | PNIC_NWAY_CAP100TX);
5538 		PRINT("auto");
5539 
5540 		aprint_normal("\n");
5541 
5542 		sc->sc_statchg = tlp_pnic_nway_statchg;
5543 		sc->sc_tick = tlp_pnic_nway_tick;
5544 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5545 	} else {
5546 		sc->sc_flags |= TULIPF_HAS_MII;
5547 		sc->sc_tick = tlp_mii_tick;
5548 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5549 	}
5550 
5551 #undef ADD
5552 #undef PRINT
5553 }
5554 
5555 static void
5556 tlp_pnic_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr)
5557 {
5558 	struct mii_data *mii = &sc->sc_mii;
5559 
5560 	if (sc->sc_flags & TULIPF_HAS_MII)
5561 		tlp_mii_getmedia(sc, ifmr);
5562 	else {
5563 		mii->mii_media_status = 0;
5564 		mii->mii_media_active = IFM_NONE;
5565 		tlp_pnic_nway_service(sc, MII_POLLSTAT);
5566 		ifmr->ifm_status = mii->mii_media_status;
5567 		ifmr->ifm_active = mii->mii_media_active;
5568 	}
5569 }
5570 
5571 static int
5572 tlp_pnic_tmsw_set(struct tulip_softc *sc)
5573 {
5574 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
5575 	struct mii_data *mii = &sc->sc_mii;
5576 
5577 	if (sc->sc_flags & TULIPF_HAS_MII) {
5578 		/*
5579 		 * Make sure the built-in Tx jabber timer is disabled.
5580 		 */
5581 		TULIP_WRITE(sc, CSR_PNIC_ENDEC, PNIC_ENDEC_JDIS);
5582 
5583 		return tlp_mii_setmedia(sc);
5584 	}
5585 
5586 	if (ifp->if_flags & IFF_UP) {
5587 		mii->mii_media_status = 0;
5588 		mii->mii_media_active = IFM_NONE;
5589 		return tlp_pnic_nway_service(sc, MII_MEDIACHG);
5590 	}
5591 
5592 	return 0;
5593 }
5594 
5595 static void
5596 tlp_pnic_nway_statchg(struct ifnet *ifp)
5597 {
5598 	struct tulip_softc *sc = ifp->if_softc;
5599 
5600 	/* Idle the transmit and receive processes. */
5601 	tlp_idle(sc, OPMODE_ST | OPMODE_SR);
5602 
5603 	sc->sc_opmode &= ~(OPMODE_TTM | OPMODE_FD | OPMODE_PS | OPMODE_PCS |
5604 	    OPMODE_SCR | OPMODE_HBD);
5605 
5606 	if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) {
5607 		sc->sc_opmode |= OPMODE_TTM;
5608 		TULIP_WRITE(sc, CSR_GPP,
5609 		    GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 0) |
5610 		    GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1));
5611 	} else {
5612 		sc->sc_opmode |= OPMODE_PS |OPMODE_PCS |OPMODE_SCR |OPMODE_HBD;
5613 		TULIP_WRITE(sc, CSR_GPP,
5614 		    GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 1) |
5615 		    GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1));
5616 	}
5617 
5618 	if (sc->sc_mii.mii_media_active & IFM_FDX)
5619 		sc->sc_opmode |= OPMODE_FD | OPMODE_HBD;
5620 
5621 	/*
5622 	 * Write new OPMODE bits.  This also restarts the transmit
5623 	 * and receive processes.
5624 	 */
5625 	TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode);
5626 }
5627 
5628 static void
5629 tlp_pnic_nway_tick(void *arg)
5630 {
5631 	struct tulip_softc *sc = arg;
5632 	int s;
5633 
5634 	if (!device_is_active(sc->sc_dev))
5635 		return;
5636 
5637 	s = splnet();
5638 	tlp_pnic_nway_service(sc, MII_TICK);
5639 	splx(s);
5640 
5641 	callout_reset(&sc->sc_tick_callout, hz, tlp_pnic_nway_tick, sc);
5642 }
5643 
5644 /*
5645  * Support for the Lite-On PNIC internal NWay block.  This is constructed
5646  * somewhat like a PHY driver for simplicity.
5647  */
5648 
5649 static int
5650 tlp_pnic_nway_service(struct tulip_softc *sc, int cmd)
5651 {
5652 	struct mii_data *mii = &sc->sc_mii;
5653 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
5654 
5655 	if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
5656 		return 0;
5657 
5658 	switch (cmd) {
5659 	case MII_POLLSTAT:
5660 		/* Nothing special to do here. */
5661 		break;
5662 
5663 	case MII_MEDIACHG:
5664 		switch (IFM_SUBTYPE(ife->ifm_media)) {
5665 		case IFM_AUTO:
5666 			(void) tlp_pnic_nway_auto(sc, 1);
5667 			break;
5668 		case IFM_100_T4:
5669 			/*
5670 			 * XXX Not supported as a manual setting right now.
5671 			 */
5672 			return EINVAL;
5673 		default:
5674 			/*
5675 			 * NWAY register data is stored in the ifmedia entry.
5676 			 */
5677 			TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data);
5678 		}
5679 		break;
5680 
5681 	case MII_TICK:
5682 		/*
5683 		 * Only used for autonegotiation.
5684 		 */
5685 		if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
5686 			return 0;
5687 
5688 		/*
5689 		 * Check to see if we have link.  If we do, we don't
5690 		 * need to restart the autonegotiation process.
5691 		 */
5692 		if (sc->sc_flags & TULIPF_LINK_UP)
5693 			return 0;
5694 
5695 		/*
5696 		 * Only retry autonegotiation every 5 seconds.
5697 		 */
5698 		if (++sc->sc_nway_ticks != 5)
5699 			return 0;
5700 
5701 		sc->sc_nway_ticks = 0;
5702 		tlp_pnic_nway_reset(sc);
5703 		if (tlp_pnic_nway_auto(sc, 0) == EJUSTRETURN)
5704 			return 0;
5705 		break;
5706 	}
5707 
5708 	/* Update the media status. */
5709 	tlp_pnic_nway_status(sc);
5710 
5711 	/* Callback if something changed. */
5712 	if ((sc->sc_nway_active == NULL ||
5713 	     sc->sc_nway_active->ifm_media != mii->mii_media_active) ||
5714 	    cmd == MII_MEDIACHG) {
5715 		(*sc->sc_statchg)(mii->mii_ifp);
5716 		tlp_nway_activate(sc, mii->mii_media_active);
5717 	}
5718 	return 0;
5719 }
5720 
5721 static void
5722 tlp_pnic_nway_reset(struct tulip_softc *sc)
5723 {
5724 
5725 	TULIP_WRITE(sc, CSR_PNIC_NWAY, PNIC_NWAY_RS);
5726 	delay(100);
5727 	TULIP_WRITE(sc, CSR_PNIC_NWAY, 0);
5728 }
5729 
5730 static int
5731 tlp_pnic_nway_auto(struct tulip_softc *sc, int waitfor)
5732 {
5733 	struct mii_data *mii = &sc->sc_mii;
5734 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
5735 	uint32_t reg;
5736 	int i;
5737 
5738 	if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0)
5739 		TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data);
5740 
5741 	if (waitfor) {
5742 		/* Wait 500ms for it to complete. */
5743 		for (i = 0; i < 500; i++) {
5744 			reg = TULIP_READ(sc, CSR_PNIC_NWAY);
5745 			if (reg & PNIC_NWAY_LPAR_MASK) {
5746 				tlp_pnic_nway_acomp(sc);
5747 				return 0;
5748 			}
5749 			delay(1000);
5750 		}
5751 #if 0
5752 		if ((reg & PNIC_NWAY_LPAR_MASK) == 0)
5753 			aprint_error_dev(sc->sc_dev,
5754 			    "autonegotiation failed to complete\n");
5755 #endif
5756 
5757 		/*
5758 		 * Don't need to worry about clearing DOINGAUTO.
5759 		 * If that's set, a timeout is pending, and it will
5760 		 * clear the flag.
5761 		 */
5762 		return EIO;
5763 	}
5764 
5765 	/*
5766 	 * Just let it finish asynchronously.  This is for the benefit of
5767 	 * the tick handler driving autonegotiation.  Don't want 500ms
5768 	 * delays all the time while the system is running!
5769 	 */
5770 	if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) {
5771 		sc->sc_flags |= TULIPF_DOINGAUTO;
5772 		callout_reset(&sc->sc_nway_callout, hz >> 1,
5773 		    tlp_pnic_nway_auto_timeout, sc);
5774 	}
5775 	return EJUSTRETURN;
5776 }
5777 
5778 static void
5779 tlp_pnic_nway_auto_timeout(void *arg)
5780 {
5781 	struct tulip_softc *sc = arg;
5782 	/* uint32_t reg; */
5783 	int s;
5784 
5785 	s = splnet();
5786 	sc->sc_flags &= ~TULIPF_DOINGAUTO;
5787 	/* reg = */
5788 	TULIP_READ(sc, CSR_PNIC_NWAY);
5789 #if 0
5790 	if ((reg & PNIC_NWAY_LPAR_MASK) == 0)
5791 		aprint_error_dev(sc->sc_dev,
5792 		    "autonegotiation failed to complete\n");
5793 #endif
5794 
5795 	tlp_pnic_nway_acomp(sc);
5796 
5797 	/* Update the media status. */
5798 	(void)tlp_pnic_nway_service(sc, MII_POLLSTAT);
5799 	splx(s);
5800 }
5801 
5802 static void
5803 tlp_pnic_nway_status(struct tulip_softc *sc)
5804 {
5805 	struct mii_data *mii = &sc->sc_mii;
5806 	uint32_t reg;
5807 
5808 	mii->mii_media_status = IFM_AVALID;
5809 	mii->mii_media_active = IFM_ETHER;
5810 
5811 	reg = TULIP_READ(sc, CSR_PNIC_NWAY);
5812 
5813 	if (sc->sc_flags & TULIPF_LINK_UP)
5814 		mii->mii_media_status |= IFM_ACTIVE;
5815 
5816 	if (reg & PNIC_NWAY_NW) {
5817 		if ((reg & PNIC_NWAY_LPAR_MASK) == 0) {
5818 			/* Erg, still trying, I guess... */
5819 			mii->mii_media_active |= IFM_NONE;
5820 			return;
5821 		}
5822 
5823 #if 0
5824 		if (reg & PNIC_NWAY_LPAR100T4)
5825 			mii->mii_media_active |= IFM_100_T4;
5826 		else
5827 #endif
5828 		if (reg & PNIC_NWAY_LPAR100TXFDX)
5829 			mii->mii_media_active |= IFM_100_TX | IFM_FDX;
5830 		else if (reg & PNIC_NWAY_LPAR100TX)
5831 			mii->mii_media_active |= IFM_100_TX;
5832 		else if (reg & PNIC_NWAY_LPAR10TFDX)
5833 			mii->mii_media_active |= IFM_10_T | IFM_FDX;
5834 		else if (reg & PNIC_NWAY_LPAR10T)
5835 			mii->mii_media_active |= IFM_10_T;
5836 		else
5837 			mii->mii_media_active |= IFM_NONE;
5838 	} else {
5839 		if (reg & PNIC_NWAY_100)
5840 			mii->mii_media_active |= IFM_100_TX;
5841 		else
5842 			mii->mii_media_active |= IFM_10_T;
5843 		if (reg & PNIC_NWAY_FD)
5844 			mii->mii_media_active |= IFM_FDX;
5845 	}
5846 }
5847 
5848 static void
5849 tlp_pnic_nway_acomp(struct tulip_softc *sc)
5850 {
5851 	uint32_t reg;
5852 
5853 	reg = TULIP_READ(sc, CSR_PNIC_NWAY);
5854 	reg &= ~(PNIC_NWAY_FD | PNIC_NWAY_100 | PNIC_NWAY_RN);
5855 
5856 	if (reg & (PNIC_NWAY_LPAR100TXFDX | PNIC_NWAY_LPAR100TX))
5857 		reg |= PNIC_NWAY_100;
5858 	if (reg & (PNIC_NWAY_LPAR10TFDX | PNIC_NWAY_LPAR100TXFDX))
5859 		reg |= PNIC_NWAY_FD;
5860 
5861 	TULIP_WRITE(sc, CSR_PNIC_NWAY, reg);
5862 }
5863 
5864 /*
5865  * Macronix PMAC and Lite-On PNIC-II media switch:
5866  *
5867  *	MX98713 and MX98713A		21140-like MII or GPIO media.
5868  *
5869  *	MX98713A			21143-like MII or SIA/SYM media.
5870  *
5871  *	MX98715, MX98715A, MX98725,	21143-like SIA/SYM media.
5872  *	82C115, MX98715AEC-C, -E
5873  *
5874  * So, what we do here is fake MII-on-SIO or ISV media info, and
5875  * use the ISV media switch get/set functions to handle the rest.
5876  */
5877 
5878 static void	tlp_pmac_tmsw_init(struct tulip_softc *);
5879 
5880 const struct tulip_mediasw tlp_pmac_mediasw = {
5881 	tlp_pmac_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set
5882 };
5883 
5884 const struct tulip_mediasw tlp_pmac_mii_mediasw = {
5885 	tlp_pmac_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia
5886 };
5887 
5888 static void
5889 tlp_pmac_tmsw_init(struct tulip_softc *sc)
5890 {
5891 	struct mii_data * const mii = &sc->sc_mii;
5892 	static const uint8_t media[] = {
5893 		TULIP_ROM_MB_MEDIA_TP,
5894 		TULIP_ROM_MB_MEDIA_TP_FDX,
5895 		TULIP_ROM_MB_MEDIA_100TX,
5896 		TULIP_ROM_MB_MEDIA_100TX_FDX,
5897 	};
5898 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
5899 	struct tulip_21x4x_media *tm;
5900 
5901 	mii->mii_ifp = ifp;
5902 	mii->mii_readreg = tlp_bitbang_mii_readreg;
5903 	mii->mii_writereg = tlp_bitbang_mii_writereg;
5904 	mii->mii_statchg = sc->sc_statchg;
5905 	sc->sc_ethercom.ec_mii = mii;
5906 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
5907 	if (sc->sc_chip == TULIP_CHIP_MX98713 ||
5908 	    sc->sc_chip == TULIP_CHIP_MX98713A) {
5909 		mii_attach(sc->sc_dev, mii, 0xffffffff,
5910 		    MII_PHY_ANY, MII_OFFSET_ANY, 0);
5911 		if (LIST_FIRST(&mii->mii_phys) != NULL) {
5912 			sc->sc_flags |= TULIPF_HAS_MII;
5913 			sc->sc_tick = tlp_mii_tick;
5914 			sc->sc_preinit = tlp_2114x_mii_preinit;
5915 			sc->sc_mediasw = &tlp_pmac_mii_mediasw;
5916 			ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5917 			return;
5918 		}
5919 	}
5920 
5921 	switch (sc->sc_chip) {
5922 	case TULIP_CHIP_MX98713:
5923 		tlp_add_srom_media(sc, TULIP_ROM_MB_21140_GPR,
5924 		    tlp_21140_gpio_get, tlp_21140_gpio_set, media, 4);
5925 
5926 		/*
5927 		 * XXX Should implement auto-sense for this someday,
5928 		 * XXX when we do the same for the 21140.
5929 		 */
5930 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_10_T);
5931 		break;
5932 
5933 	default:
5934 		tlp_add_srom_media(sc, TULIP_ROM_MB_21142_SIA,
5935 		    tlp_sia_get, tlp_sia_set, media, 2);
5936 		tlp_add_srom_media(sc, TULIP_ROM_MB_21143_SYM,
5937 		    tlp_sia_get, tlp_sia_set, media + 2, 2);
5938 
5939 		tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK | M_ZERO);
5940 		tm->tm_name = "auto";
5941 		tm->tm_get = tlp_2114x_nway_get;
5942 		tm->tm_set = tlp_2114x_nway_set;
5943 		ifmedia_add(&mii->mii_media,
5944 		    IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 0, tm);
5945 
5946 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5947 		sc->sc_statchg = tlp_2114x_nway_statchg;
5948 		sc->sc_tick = tlp_2114x_nway_tick;
5949 		break;
5950 	}
5951 
5952 	tlp_print_media(sc);
5953 	tlp_sia_fixup(sc);
5954 
5955 	/* Set the LED modes. */
5956 	tlp_pmac_reset(sc);
5957 
5958 	sc->sc_reset = tlp_pmac_reset;
5959 }
5960 
5961 /*
5962  * ADMtek AL981 media switch.  Only has internal PHY.
5963  */
5964 static void	tlp_al981_tmsw_init(struct tulip_softc *);
5965 
5966 const struct tulip_mediasw tlp_al981_mediasw = {
5967 	tlp_al981_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia
5968 };
5969 
5970 static void
5971 tlp_al981_tmsw_init(struct tulip_softc *sc)
5972 {
5973 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
5974 	struct mii_data * const mii = &sc->sc_mii;
5975 
5976 	mii->mii_ifp = ifp;
5977 	mii->mii_readreg = tlp_al981_mii_readreg;
5978 	mii->mii_writereg = tlp_al981_mii_writereg;
5979 	mii->mii_statchg = sc->sc_statchg;
5980 	sc->sc_ethercom.ec_mii = mii;
5981 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
5982 	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
5983 	    MII_OFFSET_ANY, 0);
5984 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
5985 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
5986 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
5987 	} else {
5988 		sc->sc_flags |= TULIPF_HAS_MII;
5989 		sc->sc_tick = tlp_mii_tick;
5990 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
5991 	}
5992 }
5993 
5994 /*
5995  * ADMtek AN983/985 media switch.  Only has internal PHY, but
5996  * on an SIO-like interface.  Unfortunately, we can't use the
5997  * standard SIO media switch, because the AN985 "ghosts" the
5998  * singly PHY at every address.
5999  */
6000 static void	tlp_an985_tmsw_init(struct tulip_softc *);
6001 
6002 const struct tulip_mediasw tlp_an985_mediasw = {
6003 	tlp_an985_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia
6004 };
6005 
6006 static void
6007 tlp_an985_tmsw_init(struct tulip_softc *sc)
6008 {
6009 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
6010 	struct mii_data * const mii = &sc->sc_mii;
6011 
6012 	mii->mii_ifp = ifp;
6013 	mii->mii_readreg = tlp_bitbang_mii_readreg;
6014 	mii->mii_writereg = tlp_bitbang_mii_writereg;
6015 	mii->mii_statchg = sc->sc_statchg;
6016 	sc->sc_ethercom.ec_mii = mii;
6017 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
6018 	mii_attach(sc->sc_dev, mii, 0xffffffff, 1, MII_OFFSET_ANY, 0);
6019 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
6020 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
6021 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
6022 	} else {
6023 		sc->sc_flags |= TULIPF_HAS_MII;
6024 		sc->sc_tick = tlp_mii_tick;
6025 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
6026 	}
6027 }
6028 
6029 /*
6030  * Davicom DM9102 media switch.  Internal PHY and possibly HomePNA.
6031  */
6032 static void	tlp_dm9102_tmsw_init(struct tulip_softc *);
6033 static void	tlp_dm9102_tmsw_getmedia(struct tulip_softc *,
6034 		    struct ifmediareq *);
6035 static int	tlp_dm9102_tmsw_setmedia(struct tulip_softc *);
6036 
6037 const struct tulip_mediasw tlp_dm9102_mediasw = {
6038 	tlp_dm9102_tmsw_init, tlp_dm9102_tmsw_getmedia,
6039 	    tlp_dm9102_tmsw_setmedia
6040 };
6041 
6042 static void
6043 tlp_dm9102_tmsw_init(struct tulip_softc *sc)
6044 {
6045 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
6046 	struct mii_data * const mii = &sc->sc_mii;
6047 	uint32_t opmode;
6048 
6049 	mii->mii_ifp = ifp;
6050 	mii->mii_readreg = tlp_bitbang_mii_readreg;
6051 	mii->mii_writereg = tlp_bitbang_mii_writereg;
6052 	mii->mii_statchg = sc->sc_statchg;
6053 	sc->sc_ethercom.ec_mii = mii;
6054 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
6055 
6056 	/* PHY block already reset via tlp_reset(). */
6057 
6058 	/*
6059 	 * Configure OPMODE properly for the internal MII interface.
6060 	 */
6061 	switch (sc->sc_chip) {
6062 	case TULIP_CHIP_DM9102:
6063 		opmode = OPMODE_MBO | OPMODE_HBD | OPMODE_PS;
6064 		break;
6065 
6066 	case TULIP_CHIP_DM9102A:
6067 		opmode = OPMODE_MBO | OPMODE_HBD;
6068 		break;
6069 
6070 	default:
6071 		opmode = 0;
6072 		break;
6073 	}
6074 
6075 	TULIP_WRITE(sc, CSR_OPMODE, opmode);
6076 
6077 	/* Now, probe the internal MII for the internal PHY. */
6078 	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
6079 	    MII_OFFSET_ANY, 0);
6080 
6081 	/*
6082 	 * XXX Figure out what to do about the HomePNA portion
6083 	 * XXX of the DM9102A.
6084 	 */
6085 
6086 	if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
6087 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
6088 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
6089 	} else {
6090 		sc->sc_flags |= TULIPF_HAS_MII;
6091 		sc->sc_tick = tlp_mii_tick;
6092 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
6093 	}
6094 }
6095 
6096 static void
6097 tlp_dm9102_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr)
6098 {
6099 
6100 	/* XXX HomePNA on DM9102A. */
6101 	tlp_mii_getmedia(sc, ifmr);
6102 }
6103 
6104 static int
6105 tlp_dm9102_tmsw_setmedia(struct tulip_softc *sc)
6106 {
6107 
6108 	/* XXX HomePNA on DM9102A. */
6109 	return tlp_mii_setmedia(sc);
6110 }
6111 
6112 /*
6113  * ASIX AX88140A/AX88141 media switch. Internal PHY or MII.
6114  */
6115 
6116 static void	tlp_asix_tmsw_init(struct tulip_softc *);
6117 static void	tlp_asix_tmsw_getmedia(struct tulip_softc *,
6118 		    struct ifmediareq *);
6119 static int	tlp_asix_tmsw_setmedia(struct tulip_softc *);
6120 
6121 const struct tulip_mediasw tlp_asix_mediasw = {
6122 	tlp_asix_tmsw_init, tlp_asix_tmsw_getmedia,
6123 	tlp_asix_tmsw_setmedia
6124 };
6125 
6126 static void
6127 tlp_asix_tmsw_init(struct tulip_softc *sc)
6128 {
6129 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
6130 	struct mii_data * const mii = &sc->sc_mii;
6131 	uint32_t opmode;
6132 
6133 	mii->mii_ifp = ifp;
6134 	mii->mii_readreg = tlp_bitbang_mii_readreg;
6135 	mii->mii_writereg = tlp_bitbang_mii_writereg;
6136 	mii->mii_statchg = sc->sc_statchg;
6137 	sc->sc_ethercom.ec_mii = mii;
6138 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
6139 
6140 	/*
6141 	 * Configure OPMODE properly for the internal MII interface.
6142 	 */
6143 	switch (sc->sc_chip) {
6144 	case TULIP_CHIP_AX88140:
6145 	case TULIP_CHIP_AX88141:
6146 		opmode = OPMODE_HBD | OPMODE_PS;
6147 		break;
6148 	default:
6149 		opmode = 0;
6150 		break;
6151 	}
6152 
6153 	TULIP_WRITE(sc, CSR_OPMODE, opmode);
6154 
6155 	/* Now, probe the internal MII for the internal PHY. */
6156 	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
6157 	    MII_OFFSET_ANY, 0);
6158 
6159 	/* XXX Figure how to handle the PHY. */
6160 
6161 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
6162 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
6163 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
6164 	} else {
6165 		sc->sc_flags |= TULIPF_HAS_MII;
6166 		sc->sc_tick = tlp_mii_tick;
6167 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
6168 	}
6169 
6170 
6171 }
6172 
6173 static void
6174 tlp_asix_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr)
6175 {
6176 
6177 	/* XXX PHY handling. */
6178 	tlp_mii_getmedia(sc, ifmr);
6179 }
6180 
6181 static int
6182 tlp_asix_tmsw_setmedia(struct tulip_softc *sc)
6183 {
6184 
6185 	/* XXX PHY handling. */
6186 	return tlp_mii_setmedia(sc);
6187 }
6188 
6189 /*
6190  * RS7112 media switch.  Handles only MII attached to the SIO.
6191  * We only have a PHY at 1.
6192  */
6193 void   tlp_rs7112_tmsw_init(struct tulip_softc *);
6194 
6195 const struct tulip_mediasw tlp_rs7112_mediasw = {
6196 	tlp_rs7112_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia
6197 };
6198 
6199 void
6200 tlp_rs7112_tmsw_init(struct tulip_softc *sc)
6201 {
6202 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
6203 	struct mii_data * const mii = &sc->sc_mii;
6204 
6205 	/*
6206 	 * We don't attach any media info structures to the ifmedia
6207 	 * entries, so if we're using a pre-init function that needs
6208 	 * that info, override it to one that doesn't.
6209 	 */
6210 	if (sc->sc_preinit == tlp_2114x_preinit)
6211 		sc->sc_preinit = tlp_2114x_mii_preinit;
6212 
6213 	mii->mii_ifp = ifp;
6214 	mii->mii_readreg = tlp_bitbang_mii_readreg;
6215 	mii->mii_writereg = tlp_bitbang_mii_writereg;
6216 	mii->mii_statchg = sc->sc_statchg;
6217 	sc->sc_ethercom.ec_mii = mii;
6218 	ifmedia_init(&mii->mii_media, 0, tlp_mediachange, tlp_mediastatus);
6219 
6220 	/*
6221 	 * The RS7112 reports a PHY at 0 (possibly HomePNA?)
6222 	 * and 1 (ethernet). We attach ethernet only.
6223 	 */
6224 	mii_attach(sc->sc_dev, mii, 0xffffffff, 1, MII_OFFSET_ANY, 0);
6225 
6226 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
6227 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
6228 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
6229 	} else {
6230 		sc->sc_flags |= TULIPF_HAS_MII;
6231 		sc->sc_tick = tlp_mii_tick;
6232 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
6233 	}
6234 }
6235 
6236 const char *
6237 tlp_chip_name(tulip_chip_t t) {
6238 	if ((int)t < 0 || (int)t >= __arraycount(tlp_chip_names)) {
6239 		static char buf[256];
6240 		(void)snprintf(buf, sizeof(buf), "[unknown 0x%x]", t);
6241 		return buf;
6242 	}
6243 	return tlp_chip_names[t];
6244 }
6245