xref: /netbsd-src/sys/dev/pci/if_wm.c (revision 04e61f8526dc919e1c004e02c39dea35e7c0f042)
1 /*	$NetBSD: if_wm.c,v 1.7 2002/05/08 21:43:10 thorpej Exp $	*/
2 
3 /*
4  * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5  * All rights reserved.
6  *
7  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *	This product includes software developed for the NetBSD Project by
20  *	Wasabi Systems, Inc.
21  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22  *    or promote products derived from this software without specific prior
23  *    written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 /*
39  * Device driver for the Intel i82542 (``Wiseman''), i82543 (``Livengood''),
40  * and i82544 (``Cordova'') Gigabit Ethernet chips.
41  *
42  * TODO (in order of importance):
43  *
44  *	- Fix hw VLAN assist.
45  *
46  *	- Make GMII work on the Livengood.
47  *
48  *	- Fix out-bound IP header checksums.
49  *
50  *	- Fix UDP checksums.
51  *
52  *	- Jumbo frames -- requires changes to network stack due to
53  *	  lame buffer length handling on chip.
54  *
55  * ...and, of course, performance tuning.
56  */
57 
58 #include "bpfilter.h"
59 
60 #include <sys/param.h>
61 #include <sys/systm.h>
62 #include <sys/callout.h>
63 #include <sys/mbuf.h>
64 #include <sys/malloc.h>
65 #include <sys/kernel.h>
66 #include <sys/socket.h>
67 #include <sys/ioctl.h>
68 #include <sys/errno.h>
69 #include <sys/device.h>
70 #include <sys/queue.h>
71 
72 #include <uvm/uvm_extern.h>		/* for PAGE_SIZE */
73 
74 #include <net/if.h>
75 #include <net/if_dl.h>
76 #include <net/if_media.h>
77 #include <net/if_ether.h>
78 
79 #if NBPFILTER > 0
80 #include <net/bpf.h>
81 #endif
82 
83 #include <netinet/in.h>			/* XXX for struct ip */
84 #include <netinet/in_systm.h>		/* XXX for struct ip */
85 #include <netinet/ip.h>			/* XXX for struct ip */
86 
87 #include <machine/bus.h>
88 #include <machine/intr.h>
89 #include <machine/endian.h>
90 
91 #include <dev/mii/mii.h>
92 #include <dev/mii/miivar.h>
93 #include <dev/mii/mii_bitbang.h>
94 
95 #include <dev/pci/pcireg.h>
96 #include <dev/pci/pcivar.h>
97 #include <dev/pci/pcidevs.h>
98 
99 #include <dev/pci/if_wmreg.h>
100 
101 #ifdef WM_DEBUG
102 #define	WM_DEBUG_LINK		0x01
103 #define	WM_DEBUG_TX		0x02
104 #define	WM_DEBUG_RX		0x04
105 #define	WM_DEBUG_GMII		0x08
106 int	wm_debug = WM_DEBUG_TX|WM_DEBUG_RX|WM_DEBUG_LINK;
107 
108 #define	DPRINTF(x, y)	if (wm_debug & (x)) printf y
109 #else
110 #define	DPRINTF(x, y)	/* nothing */
111 #endif /* WM_DEBUG */
112 
113 /*
114  * Transmit descriptor list size.  Due to errata, we can only have
115  * 256 hardware descriptors in the ring.  We tell the upper layers
116  * that they can queue a lot of packets, and we go ahead and mange
117  * up to 32 of them at a time.  We allow up to 16 DMA segments per
118  * packet.
119  */
120 #define	WM_NTXSEGS		16
121 #define	WM_IFQUEUELEN		256
122 #define	WM_TXQUEUELEN		32
123 #define	WM_TXQUEUELEN_MASK	(WM_TXQUEUELEN - 1)
124 #define	WM_NTXDESC		256
125 #define	WM_NTXDESC_MASK		(WM_NTXDESC - 1)
126 #define	WM_NEXTTX(x)		(((x) + 1) & WM_NTXDESC_MASK)
127 #define	WM_NEXTTXS(x)		(((x) + 1) & WM_TXQUEUELEN_MASK)
128 
129 /*
130  * The interrupt mitigation feature of the Wiseman is pretty cool -- as
131  * long as you're transmitting, you don't have to take an interrupt at
132  * all.  However, we force an interrupt to happen every N + 1 packets
133  * in order to kick us in a reasonable amount of time when we run out
134  * of descriptors.
135  */
136 #define	WM_TXINTR_MASK		7
137 
138 /*
139  * Receive descriptor list size.  We have one Rx buffer for normal
140  * sized packets.  Jumbo packets consume 5 Rx buffers for a full-sized
141  * packet.  We allocate 128 receive descriptors, each with a 2k
142  * buffer (MCLBYTES), which gives us room for 25 jumbo packets.
143  */
144 #define	WM_NRXDESC		128
145 #define	WM_NRXDESC_MASK		(WM_NRXDESC - 1)
146 #define	WM_NEXTRX(x)		(((x) + 1) & WM_NRXDESC_MASK)
147 #define	WM_PREVRX(x)		(((x) - 1) & WM_NRXDESC_MASK)
148 
149 /*
150  * Control structures are DMA'd to the i82542 chip.  We allocate them in
151  * a single clump that maps to a single DMA segment to make serveral things
152  * easier.
153  */
154 struct wm_control_data {
155 	/*
156 	 * The transmit descriptors.
157 	 */
158 	wiseman_txdesc_t wcd_txdescs[WM_NTXDESC];
159 
160 	/*
161 	 * The receive descriptors.
162 	 */
163 	wiseman_rxdesc_t wcd_rxdescs[WM_NRXDESC];
164 };
165 
166 #define	WM_CDOFF(x)	offsetof(struct wm_control_data, x)
167 #define	WM_CDTXOFF(x)	WM_CDOFF(wcd_txdescs[(x)])
168 #define	WM_CDRXOFF(x)	WM_CDOFF(wcd_rxdescs[(x)])
169 
170 /*
171  * Software state for transmit jobs.
172  */
173 struct wm_txsoft {
174 	struct mbuf *txs_mbuf;		/* head of our mbuf chain */
175 	bus_dmamap_t txs_dmamap;	/* our DMA map */
176 	int txs_firstdesc;		/* first descriptor in packet */
177 	int txs_lastdesc;		/* last descriptor in packet */
178 	int txs_ndesc;			/* # of descriptors used */
179 };
180 
181 /*
182  * Software state for receive buffers.  Each descriptor gets a
183  * 2k (MCLBYTES) buffer and a DMA map.  For packets which fill
184  * more than one buffer, we chain them together.
185  */
186 struct wm_rxsoft {
187 	struct mbuf *rxs_mbuf;		/* head of our mbuf chain */
188 	bus_dmamap_t rxs_dmamap;	/* our DMA map */
189 };
190 
191 /*
192  * Software state per device.
193  */
194 struct wm_softc {
195 	struct device sc_dev;		/* generic device information */
196 	bus_space_tag_t sc_st;		/* bus space tag */
197 	bus_space_handle_t sc_sh;	/* bus space handle */
198 	bus_dma_tag_t sc_dmat;		/* bus DMA tag */
199 	struct ethercom sc_ethercom;	/* ethernet common data */
200 	void *sc_sdhook;		/* shutdown hook */
201 
202 	int sc_type;			/* chip type; see below */
203 	int sc_flags;			/* flags; see below */
204 
205 	void *sc_ih;			/* interrupt cookie */
206 
207 	struct mii_data sc_mii;		/* MII/media information */
208 
209 	struct callout sc_tick_ch;	/* tick callout */
210 
211 	bus_dmamap_t sc_cddmamap;	/* control data DMA map */
212 #define	sc_cddma	sc_cddmamap->dm_segs[0].ds_addr
213 
214 	/*
215 	 * Software state for the transmit and receive descriptors.
216 	 */
217 	struct wm_txsoft sc_txsoft[WM_TXQUEUELEN];
218 	struct wm_rxsoft sc_rxsoft[WM_NRXDESC];
219 
220 	/*
221 	 * Control data structures.
222 	 */
223 	struct wm_control_data *sc_control_data;
224 #define	sc_txdescs	sc_control_data->wcd_txdescs
225 #define	sc_rxdescs	sc_control_data->wcd_rxdescs
226 
227 #ifdef WM_EVENT_COUNTERS
228 	/* Event counters. */
229 	struct evcnt sc_ev_txsstall;	/* Tx stalled due to no txs */
230 	struct evcnt sc_ev_txdstall;	/* Tx stalled due to no txd */
231 	struct evcnt sc_ev_txdw;	/* Tx descriptor interrupts */
232 	struct evcnt sc_ev_txqe;	/* Tx queue empty interrupts */
233 	struct evcnt sc_ev_rxintr;	/* Rx interrupts */
234 	struct evcnt sc_ev_linkintr;	/* Link interrupts */
235 
236 	struct evcnt sc_ev_rxipsum;	/* IP checksums checked in-bound */
237 	struct evcnt sc_ev_rxtusum;	/* TCP/UDP cksums checked in-bound */
238 	struct evcnt sc_ev_txipsum;	/* IP checksums comp. out-bound */
239 	struct evcnt sc_ev_txtusum;	/* TCP/UDP cksums comp. out-bound */
240 
241 	struct evcnt sc_ev_txctx_init;	/* Tx cksum context cache initialized */
242 	struct evcnt sc_ev_txctx_hit;	/* Tx cksum context cache hit */
243 	struct evcnt sc_ev_txctx_miss;	/* Tx cksum context cache miss */
244 
245 	struct evcnt sc_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
246 	struct evcnt sc_ev_txdrop;	/* Tx packets dropped (too many segs) */
247 
248 	struct evcnt sc_ev_tu;		/* Tx underrun */
249 #endif /* WM_EVENT_COUNTERS */
250 
251 	bus_addr_t sc_tdt_reg;		/* offset of TDT register */
252 
253 	int	sc_txfree;		/* number of free Tx descriptors */
254 	int	sc_txnext;		/* next ready Tx descriptor */
255 	int	sc_txwin;		/* Tx descriptors since last Tx int */
256 
257 	int	sc_txsfree;		/* number of free Tx jobs */
258 	int	sc_txsnext;		/* next free Tx job */
259 	int	sc_txsdirty;		/* dirty Tx jobs */
260 
261 	uint32_t sc_txctx_ipcs;		/* cached Tx IP cksum ctx */
262 	uint32_t sc_txctx_tucs;		/* cached Tx TCP/UDP cksum ctx */
263 
264 	bus_addr_t sc_rdt_reg;		/* offset of RDT register */
265 
266 	int	sc_rxptr;		/* next ready Rx descriptor/queue ent */
267 	int	sc_rxdiscard;
268 	int	sc_rxlen;
269 	struct mbuf *sc_rxhead;
270 	struct mbuf *sc_rxtail;
271 	struct mbuf **sc_rxtailp;
272 
273 	uint32_t sc_ctrl;		/* prototype CTRL register */
274 #if 0
275 	uint32_t sc_ctrl_ext;		/* prototype CTRL_EXT register */
276 #endif
277 	uint32_t sc_icr;		/* prototype interrupt bits */
278 	uint32_t sc_tctl;		/* prototype TCTL register */
279 	uint32_t sc_rctl;		/* prototype RCTL register */
280 	uint32_t sc_txcw;		/* prototype TXCW register */
281 	uint32_t sc_tipg;		/* prototype TIPG register */
282 
283 	int sc_tbi_linkup;		/* TBI link status */
284 	int sc_tbi_anstate;		/* autonegotiation state */
285 
286 	int sc_mchash_type;		/* multicast filter offset */
287 };
288 
289 #define	WM_RXCHAIN_RESET(sc)						\
290 do {									\
291 	(sc)->sc_rxtailp = &(sc)->sc_rxhead;				\
292 	*(sc)->sc_rxtailp = NULL;					\
293 	(sc)->sc_rxlen = 0;						\
294 } while (/*CONSTCOND*/0)
295 
296 #define	WM_RXCHAIN_LINK(sc, m)						\
297 do {									\
298 	*(sc)->sc_rxtailp = (sc)->sc_rxtail = (m);			\
299 	(sc)->sc_rxtailp = &(m)->m_next;				\
300 } while (/*CONSTCOND*/0)
301 
302 /* sc_type */
303 #define	WM_T_WISEMAN_2_0	0	/* Wiseman (i82542) 2.0 (really old) */
304 #define	WM_T_WISEMAN_2_1	1	/* Wiseman (i82542) 2.1+ (old) */
305 #define	WM_T_LIVENGOOD		2	/* Livengood (i82543) */
306 #define	WM_T_CORDOVA		3	/* Cordova (i82544) */
307 
308 /* sc_flags */
309 #define	WM_F_HAS_MII		0x01	/* has MII */
310 
311 #ifdef WM_EVENT_COUNTERS
312 #define	WM_EVCNT_INCR(ev)	(ev)->ev_count++
313 #else
314 #define	WM_EVCNT_INCR(ev)	/* nothing */
315 #endif
316 
317 #define	CSR_READ(sc, reg)						\
318 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
319 #define	CSR_WRITE(sc, reg, val)						\
320 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
321 
322 #define	WM_CDTXADDR(sc, x)	((sc)->sc_cddma + WM_CDTXOFF((x)))
323 #define	WM_CDRXADDR(sc, x)	((sc)->sc_cddma + WM_CDRXOFF((x)))
324 
325 #define	WM_CDTXSYNC(sc, x, n, ops)					\
326 do {									\
327 	int __x, __n;							\
328 									\
329 	__x = (x);							\
330 	__n = (n);							\
331 									\
332 	/* If it will wrap around, sync to the end of the ring. */	\
333 	if ((__x + __n) > WM_NTXDESC) {					\
334 		bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,	\
335 		    WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) *		\
336 		    (WM_NTXDESC - __x), (ops));				\
337 		__n -= (WM_NTXDESC - __x);				\
338 		__x = 0;						\
339 	}								\
340 									\
341 	/* Now sync whatever is left. */				\
342 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
343 	    WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) * __n, (ops));	\
344 } while (/*CONSTCOND*/0)
345 
346 #define	WM_CDRXSYNC(sc, x, ops)						\
347 do {									\
348 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
349 	   WM_CDRXOFF((x)), sizeof(wiseman_rxdesc_t), (ops));		\
350 } while (/*CONSTCOND*/0)
351 
352 #define	WM_INIT_RXDESC(sc, x)						\
353 do {									\
354 	struct wm_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)];		\
355 	wiseman_rxdesc_t *__rxd = &(sc)->sc_rxdescs[(x)];		\
356 	struct mbuf *__m = __rxs->rxs_mbuf;				\
357 									\
358 	/*								\
359 	 * Note: We scoot the packet forward 2 bytes in the buffer	\
360 	 * so that the payload after the Ethernet header is aligned	\
361 	 * to a 4-byte boundary.					\
362 	 *								\
363 	 * XXX BRAINDAMAGE ALERT!					\
364 	 * The stupid chip uses the same size for every buffer, which	\
365 	 * is set in the Receive Control register.  We are using the 2K	\
366 	 * size option, but what we REALLY want is (2K - 2)!  For this	\
367 	 * reason, we can't accept packets longer than the standard	\
368 	 * Ethernet MTU, without incurring a big penalty to copy every	\
369 	 * incoming packet to a new, suitably aligned buffer.		\
370 	 *								\
371 	 * We'll need to make some changes to the layer 3/4 parts of	\
372 	 * the stack (to copy the headers to a new buffer if not	\
373 	 * aligned) in order to support large MTU on this chip.  Lame.	\
374 	 */								\
375 	__m->m_data = __m->m_ext.ext_buf + 2;				\
376 									\
377 	__rxd->wrx_addr.wa_low =					\
378 	    htole32(__rxs->rxs_dmamap->dm_segs[0].ds_addr + 2);		\
379 	__rxd->wrx_addr.wa_high = 0;					\
380 	__rxd->wrx_len = 0;						\
381 	__rxd->wrx_cksum = 0;						\
382 	__rxd->wrx_status = 0;						\
383 	__rxd->wrx_errors = 0;						\
384 	__rxd->wrx_special = 0;						\
385 	WM_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
386 									\
387 	CSR_WRITE((sc), (sc)->sc_rdt_reg, (x));				\
388 } while (/*CONSTCOND*/0)
389 
390 void	wm_start(struct ifnet *);
391 void	wm_watchdog(struct ifnet *);
392 int	wm_ioctl(struct ifnet *, u_long, caddr_t);
393 int	wm_init(struct ifnet *);
394 void	wm_stop(struct ifnet *, int);
395 
396 void	wm_shutdown(void *);
397 
398 void	wm_reset(struct wm_softc *);
399 void	wm_rxdrain(struct wm_softc *);
400 int	wm_add_rxbuf(struct wm_softc *, int);
401 void	wm_read_eeprom(struct wm_softc *, int, int, u_int16_t *);
402 void	wm_tick(void *);
403 
404 void	wm_set_filter(struct wm_softc *);
405 
406 int	wm_intr(void *);
407 void	wm_txintr(struct wm_softc *);
408 void	wm_rxintr(struct wm_softc *);
409 void	wm_linkintr(struct wm_softc *, uint32_t);
410 
411 void	wm_tbi_mediainit(struct wm_softc *);
412 int	wm_tbi_mediachange(struct ifnet *);
413 void	wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
414 
415 void	wm_tbi_set_linkled(struct wm_softc *);
416 void	wm_tbi_check_link(struct wm_softc *);
417 
418 void	wm_gmii_reset(struct wm_softc *);
419 
420 int	wm_gmii_livengood_readreg(struct device *, int, int);
421 void	wm_gmii_livengood_writereg(struct device *, int, int, int);
422 
423 int	wm_gmii_cordova_readreg(struct device *, int, int);
424 void	wm_gmii_cordova_writereg(struct device *, int, int, int);
425 
426 void	wm_gmii_statchg(struct device *);
427 
428 void	wm_gmii_mediainit(struct wm_softc *);
429 int	wm_gmii_mediachange(struct ifnet *);
430 void	wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
431 
432 int	wm_match(struct device *, struct cfdata *, void *);
433 void	wm_attach(struct device *, struct device *, void *);
434 
435 int	wm_copy_small = 0;
436 
437 struct cfattach wm_ca = {
438 	sizeof(struct wm_softc), wm_match, wm_attach,
439 };
440 
441 /*
442  * Devices supported by this driver.
443  */
444 const struct wm_product {
445 	pci_vendor_id_t		wmp_vendor;
446 	pci_product_id_t	wmp_product;
447 	const char		*wmp_name;
448 	int			wmp_type;
449 	int			wmp_flags;
450 #define	WMP_F_1000X		0x01
451 #define	WMP_F_1000T		0x02
452 } wm_products[] = {
453 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82542,
454 	  "Intel i82542 1000BASE-X Ethernet",
455 	  WM_T_WISEMAN_2_1,	WMP_F_1000X },
456 
457 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82543_FIBER,
458 	  "Intel i82543 1000BASE-X Ethernet",
459 	  WM_T_LIVENGOOD,	WMP_F_1000X },
460 
461 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82543_SC,
462 	  "Intel i82543-SC 1000BASE-X Ethernet",
463 	  WM_T_LIVENGOOD,	WMP_F_1000X },
464 
465 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82543_COPPER,
466 	  "Intel i82543 1000BASE-T Ethernet",
467 	  WM_T_LIVENGOOD,	WMP_F_1000T },
468 
469 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544_XT,
470 	  "Intel i82544 1000BASE-T Ethernet",
471 	  WM_T_CORDOVA,		WMP_F_1000T },
472 
473 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544_XF,
474 	  "Intel i82544 1000BASE-X Ethernet",
475 	  WM_T_CORDOVA,		WMP_F_1000X },
476 
477 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544GC,
478 	  "Intel i82544GC 1000BASE-T Ethernet",
479 	  WM_T_CORDOVA,		WMP_F_1000T },
480 
481 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544GC_64,
482 	  "Intel i82544GC 1000BASE-T Ethernet",
483 	  WM_T_CORDOVA,		WMP_F_1000T },
484 
485 	{ 0,			0,
486 	  NULL,
487 	  0,			0 },
488 };
489 
490 #ifdef WM_EVENT_COUNTERS
491 #if WM_NTXSEGS != 16
492 #error Update wm_txseg_evcnt_names
493 #endif
494 static const char *wm_txseg_evcnt_names[WM_NTXSEGS] = {
495 	"txseg1",
496 	"txseg2",
497 	"txseg3",
498 	"txseg4",
499 	"txseg5",
500 	"txseg6",
501 	"txseg7",
502 	"txseg8",
503 	"txseg9",
504 	"txseg10",
505 	"txseg11",
506 	"txseg12",
507 	"txseg13",
508 	"txseg14",
509 	"txseg15",
510 	"txseg16",
511 };
512 #endif /* WM_EVENT_COUNTERS */
513 
514 static const struct wm_product *
515 wm_lookup(const struct pci_attach_args *pa)
516 {
517 	const struct wm_product *wmp;
518 
519 	for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
520 		if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
521 		    PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
522 			return (wmp);
523 	}
524 	return (NULL);
525 }
526 
527 int
528 wm_match(struct device *parent, struct cfdata *cf, void *aux)
529 {
530 	struct pci_attach_args *pa = aux;
531 
532 	if (wm_lookup(pa) != NULL)
533 		return (1);
534 
535 	return (0);
536 }
537 
538 void
539 wm_attach(struct device *parent, struct device *self, void *aux)
540 {
541 	struct wm_softc *sc = (void *) self;
542 	struct pci_attach_args *pa = aux;
543 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
544 	pci_chipset_tag_t pc = pa->pa_pc;
545 	pci_intr_handle_t ih;
546 	const char *intrstr = NULL;
547 	bus_space_tag_t memt;
548 	bus_space_handle_t memh;
549 	bus_dma_segment_t seg;
550 	int memh_valid;
551 	int i, rseg, error;
552 	const struct wm_product *wmp;
553 	uint8_t enaddr[ETHER_ADDR_LEN];
554 	uint16_t myea[ETHER_ADDR_LEN / 2], cfg1, cfg2, swdpin;
555 	pcireg_t preg, memtype;
556 	int pmreg;
557 
558 	callout_init(&sc->sc_tick_ch);
559 
560 	wmp = wm_lookup(pa);
561 	if (wmp == NULL) {
562 		printf("\n");
563 		panic("wm_attach: impossible");
564 	}
565 
566 	sc->sc_dmat = pa->pa_dmat;
567 
568 	preg = PCI_REVISION(pci_conf_read(pc, pa->pa_tag, PCI_CLASS_REG));
569 	printf(": %s, rev. %d\n", wmp->wmp_name, preg);
570 
571 	sc->sc_type = wmp->wmp_type;
572 	if (sc->sc_type < WM_T_LIVENGOOD) {
573 		if (preg < 2) {
574 			printf("%s: Wiseman must be at least rev. 2\n",
575 			    sc->sc_dev.dv_xname);
576 			return;
577 		}
578 		if (preg < 3)
579 			sc->sc_type = WM_T_WISEMAN_2_0;
580 	}
581 
582 	/*
583 	 * Map the device.
584 	 */
585 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
586 	switch (memtype) {
587 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
588 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
589 		memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
590 		    memtype, 0, &memt, &memh, NULL, NULL) == 0);
591 		break;
592 	default:
593 		memh_valid = 0;
594 	}
595 
596 	if (memh_valid) {
597 		sc->sc_st = memt;
598 		sc->sc_sh = memh;
599 	} else {
600 		printf("%s: unable to map device registers\n",
601 		    sc->sc_dev.dv_xname);
602 		return;
603 	}
604 
605 	/* Enable bus mastering.  Disable MWI on the Wiseman 2.0. */
606 	preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
607 	preg |= PCI_COMMAND_MASTER_ENABLE;
608 	if (sc->sc_type < WM_T_WISEMAN_2_1)
609 		preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
610 	pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
611 
612 	/* Get it out of power save mode, if needed. */
613 	if (pci_get_capability(pc, pa->pa_tag, PCI_CAP_PWRMGMT, &pmreg, 0)) {
614 		preg = pci_conf_read(pc, pa->pa_tag, pmreg + 4) & 0x3;
615 		if (preg == 3) {
616 			/*
617 			 * The card has lost all configuration data in
618 			 * this state, so punt.
619 			 */
620 			printf("%s: unable to wake from power state D3\n",
621 			    sc->sc_dev.dv_xname);
622 			return;
623 		}
624 		if (preg != 0) {
625 			printf("%s: waking up from power state D%d\n",
626 			    sc->sc_dev.dv_xname, preg);
627 			pci_conf_write(pc, pa->pa_tag, pmreg + 4, 0);
628 		}
629 	}
630 
631 	/*
632 	 * Map and establish our interrupt.
633 	 */
634 	if (pci_intr_map(pa, &ih)) {
635 		printf("%s: unable to map interrupt\n", sc->sc_dev.dv_xname);
636 		return;
637 	}
638 	intrstr = pci_intr_string(pc, ih);
639 	sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, wm_intr, sc);
640 	if (sc->sc_ih == NULL) {
641 		printf("%s: unable to establish interrupt",
642 		    sc->sc_dev.dv_xname);
643 		if (intrstr != NULL)
644 			printf(" at %s", intrstr);
645 		printf("\n");
646 		return;
647 	}
648 	printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
649 
650 	/*
651 	 * Allocate the control data structures, and create and load the
652 	 * DMA map for it.
653 	 */
654 	if ((error = bus_dmamem_alloc(sc->sc_dmat,
655 	    sizeof(struct wm_control_data), PAGE_SIZE, 0, &seg, 1, &rseg,
656 	    0)) != 0) {
657 		printf("%s: unable to allocate control data, error = %d\n",
658 		    sc->sc_dev.dv_xname, error);
659 		goto fail_0;
660 	}
661 
662 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
663 	    sizeof(struct wm_control_data), (caddr_t *)&sc->sc_control_data,
664 	    BUS_DMA_COHERENT)) != 0) {
665 		printf("%s: unable to map control data, error = %d\n",
666 		    sc->sc_dev.dv_xname, error);
667 		goto fail_1;
668 	}
669 
670 	if ((error = bus_dmamap_create(sc->sc_dmat,
671 	    sizeof(struct wm_control_data), 1,
672 	    sizeof(struct wm_control_data), 0, 0, &sc->sc_cddmamap)) != 0) {
673 		printf("%s: unable to create control data DMA map, "
674 		    "error = %d\n", sc->sc_dev.dv_xname, error);
675 		goto fail_2;
676 	}
677 
678 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
679 	    sc->sc_control_data, sizeof(struct wm_control_data), NULL,
680 	    0)) != 0) {
681 		printf("%s: unable to load control data DMA map, error = %d\n",
682 		    sc->sc_dev.dv_xname, error);
683 		goto fail_3;
684 	}
685 
686 	/*
687 	 * Create the transmit buffer DMA maps.
688 	 */
689 	for (i = 0; i < WM_TXQUEUELEN; i++) {
690 		if ((error = bus_dmamap_create(sc->sc_dmat, ETHER_MAX_LEN_JUMBO,
691 		    WM_NTXSEGS, MCLBYTES, 0, 0,
692 		    &sc->sc_txsoft[i].txs_dmamap)) != 0) {
693 			printf("%s: unable to create Tx DMA map %d, "
694 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
695 			goto fail_4;
696 		}
697 	}
698 
699 	/*
700 	 * Create the receive buffer DMA maps.
701 	 */
702 	for (i = 0; i < WM_NRXDESC; i++) {
703 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
704 		    MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
705 			printf("%s: unable to create Rx DMA map %d, "
706 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
707 			goto fail_5;
708 		}
709 		sc->sc_rxsoft[i].rxs_mbuf = NULL;
710 	}
711 
712 	/*
713 	 * Reset the chip to a known state.
714 	 */
715 	wm_reset(sc);
716 
717 	/*
718 	 * Read the Ethernet address from the EEPROM.
719 	 */
720 	wm_read_eeprom(sc, EEPROM_OFF_MACADDR,
721 	    sizeof(myea) / sizeof(myea[0]), myea);
722 	enaddr[0] = myea[0] & 0xff;
723 	enaddr[1] = myea[0] >> 8;
724 	enaddr[2] = myea[1] & 0xff;
725 	enaddr[3] = myea[1] >> 8;
726 	enaddr[4] = myea[2] & 0xff;
727 	enaddr[5] = myea[2] >> 8;
728 
729 	printf("%s: Ethernet address %s\n", sc->sc_dev.dv_xname,
730 	    ether_sprintf(enaddr));
731 
732 	/*
733 	 * Read the config info from the EEPROM, and set up various
734 	 * bits in the control registers based on their contents.
735 	 */
736 	wm_read_eeprom(sc, EEPROM_OFF_CFG1, 1, &cfg1);
737 	wm_read_eeprom(sc, EEPROM_OFF_CFG2, 1, &cfg2);
738 	if (sc->sc_type >= WM_T_CORDOVA)
739 		wm_read_eeprom(sc, EEPROM_OFF_SWDPIN, 1, &swdpin);
740 
741 	if (cfg1 & EEPROM_CFG1_ILOS)
742 		sc->sc_ctrl |= CTRL_ILOS;
743 	if (sc->sc_type >= WM_T_CORDOVA) {
744 		sc->sc_ctrl |=
745 		    ((swdpin >> EEPROM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
746 		    CTRL_SWDPIO_SHIFT;
747 		sc->sc_ctrl |=
748 		    ((swdpin >> EEPROM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
749 		    CTRL_SWDPINS_SHIFT;
750 	} else {
751 		sc->sc_ctrl |=
752 		    ((cfg1 >> EEPROM_CFG1_SWDPIO_SHIFT) & 0xf) <<
753 		    CTRL_SWDPIO_SHIFT;
754 	}
755 
756 #if 0
757 	if (sc->sc_type >= WM_T_CORDOVA) {
758 		if (cfg1 & EEPROM_CFG1_IPS0)
759 			sc->sc_ctrl_ext |= CTRL_EXT_IPS;
760 		if (cfg1 & EEPROM_CFG1_IPS1)
761 			sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
762 		sc->sc_ctrl_ext |=
763 		    ((swdpin >> (EEPROM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
764 		    CTRL_EXT_SWDPIO_SHIFT;
765 		sc->sc_ctrl_ext |=
766 		    ((swdpin >> (EEPROM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
767 		    CTRL_EXT_SWDPINS_SHIFT;
768 	} else {
769 		sc->sc_ctrl_ext |=
770 		    ((cfg2 >> EEPROM_CFG2_SWDPIO_SHIFT) & 0xf) <<
771 		    CTRL_EXT_SWDPIO_SHIFT;
772 	}
773 #endif
774 
775 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
776 #if 0
777 	CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
778 #endif
779 
780 	/*
781 	 * Set up some register offsets that are different between
782 	 * the Wiseman and the Livengood and later chips.
783 	 */
784 	if (sc->sc_type < WM_T_LIVENGOOD) {
785 		sc->sc_rdt_reg = WMREG_OLD_RDT0;
786 		sc->sc_tdt_reg = WMREG_OLD_TDT;
787 	} else {
788 		sc->sc_rdt_reg = WMREG_RDT;
789 		sc->sc_tdt_reg = WMREG_TDT;
790 	}
791 
792 	/*
793 	 * Determine if we should use flow control.  We should
794 	 * always use it, unless we're on a Wiseman < 2.1.
795 	 */
796 	if (sc->sc_type >= WM_T_WISEMAN_2_1)
797 		sc->sc_ctrl |= CTRL_TFCE | CTRL_RFCE;
798 
799 	/*
800 	 * Determine if we're TBI or GMII mode, and initialize the
801 	 * media structures accordingly.
802 	 */
803 	if (sc->sc_type < WM_T_LIVENGOOD ||
804 	    (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
805 		if (wmp->wmp_flags & WMP_F_1000T)
806 			printf("%s: WARNING: TBIMODE set on 1000BASE-T "
807 			    "product!\n", sc->sc_dev.dv_xname);
808 		wm_tbi_mediainit(sc);
809 	} else {
810 		if (wmp->wmp_flags & WMP_F_1000X)
811 			printf("%s: WARNING: TBIMODE clear on 1000BASE-X "
812 			    "product!\n", sc->sc_dev.dv_xname);
813 		wm_gmii_mediainit(sc);
814 	}
815 
816 	ifp = &sc->sc_ethercom.ec_if;
817 	strcpy(ifp->if_xname, sc->sc_dev.dv_xname);
818 	ifp->if_softc = sc;
819 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
820 	ifp->if_ioctl = wm_ioctl;
821 	ifp->if_start = wm_start;
822 	ifp->if_watchdog = wm_watchdog;
823 	ifp->if_init = wm_init;
824 	ifp->if_stop = wm_stop;
825 	IFQ_SET_MAXLEN(&ifp->if_snd, WM_IFQUEUELEN);
826 	IFQ_SET_READY(&ifp->if_snd);
827 
828 	/*
829 	 * If we're a Livengood or greater, we can support VLANs.
830 	 */
831 	if (sc->sc_type >= WM_T_LIVENGOOD)
832 		sc->sc_ethercom.ec_capabilities |=
833 		    ETHERCAP_VLAN_MTU /* XXXJRT | ETHERCAP_VLAN_HWTAGGING */;
834 
835 	/*
836 	 * We can perform TCPv4 and UDPv4 checkums in-bound.  Only
837 	 * on Livengood and later.
838 	 */
839 	if (sc->sc_type >= WM_T_LIVENGOOD)
840 		ifp->if_capabilities |=
841 		    IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
842 
843 	/*
844 	 * Attach the interface.
845 	 */
846 	if_attach(ifp);
847 	ether_ifattach(ifp, enaddr);
848 
849 #ifdef WM_EVENT_COUNTERS
850 	/* Attach event counters. */
851 	evcnt_attach_dynamic(&sc->sc_ev_txsstall, EVCNT_TYPE_MISC,
852 	    NULL, sc->sc_dev.dv_xname, "txsstall");
853 	evcnt_attach_dynamic(&sc->sc_ev_txdstall, EVCNT_TYPE_MISC,
854 	    NULL, sc->sc_dev.dv_xname, "txdstall");
855 	evcnt_attach_dynamic(&sc->sc_ev_txdw, EVCNT_TYPE_INTR,
856 	    NULL, sc->sc_dev.dv_xname, "txdw");
857 	evcnt_attach_dynamic(&sc->sc_ev_txqe, EVCNT_TYPE_INTR,
858 	    NULL, sc->sc_dev.dv_xname, "txqe");
859 	evcnt_attach_dynamic(&sc->sc_ev_rxintr, EVCNT_TYPE_INTR,
860 	    NULL, sc->sc_dev.dv_xname, "rxintr");
861 	evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
862 	    NULL, sc->sc_dev.dv_xname, "linkintr");
863 
864 	evcnt_attach_dynamic(&sc->sc_ev_rxipsum, EVCNT_TYPE_MISC,
865 	    NULL, sc->sc_dev.dv_xname, "rxipsum");
866 	evcnt_attach_dynamic(&sc->sc_ev_rxtusum, EVCNT_TYPE_MISC,
867 	    NULL, sc->sc_dev.dv_xname, "rxtusum");
868 	evcnt_attach_dynamic(&sc->sc_ev_txipsum, EVCNT_TYPE_MISC,
869 	    NULL, sc->sc_dev.dv_xname, "txipsum");
870 	evcnt_attach_dynamic(&sc->sc_ev_txtusum, EVCNT_TYPE_MISC,
871 	    NULL, sc->sc_dev.dv_xname, "txtusum");
872 
873 	evcnt_attach_dynamic(&sc->sc_ev_txctx_init, EVCNT_TYPE_MISC,
874 	    NULL, sc->sc_dev.dv_xname, "txctx init");
875 	evcnt_attach_dynamic(&sc->sc_ev_txctx_hit, EVCNT_TYPE_MISC,
876 	    NULL, sc->sc_dev.dv_xname, "txctx hit");
877 	evcnt_attach_dynamic(&sc->sc_ev_txctx_miss, EVCNT_TYPE_MISC,
878 	    NULL, sc->sc_dev.dv_xname, "txctx miss");
879 
880 	for (i = 0; i < WM_NTXSEGS; i++)
881 		evcnt_attach_dynamic(&sc->sc_ev_txseg[i], EVCNT_TYPE_MISC,
882 		    NULL, sc->sc_dev.dv_xname, wm_txseg_evcnt_names[i]);
883 
884 	evcnt_attach_dynamic(&sc->sc_ev_txdrop, EVCNT_TYPE_MISC,
885 	    NULL, sc->sc_dev.dv_xname, "txdrop");
886 
887 	evcnt_attach_dynamic(&sc->sc_ev_tu, EVCNT_TYPE_MISC,
888 	    NULL, sc->sc_dev.dv_xname, "tu");
889 #endif /* WM_EVENT_COUNTERS */
890 
891 	/*
892 	 * Make sure the interface is shutdown during reboot.
893 	 */
894 	sc->sc_sdhook = shutdownhook_establish(wm_shutdown, sc);
895 	if (sc->sc_sdhook == NULL)
896 		printf("%s: WARNING: unable to establish shutdown hook\n",
897 		    sc->sc_dev.dv_xname);
898 	return;
899 
900 	/*
901 	 * Free any resources we've allocated during the failed attach
902 	 * attempt.  Do this in reverse order and fall through.
903 	 */
904  fail_5:
905 	for (i = 0; i < WM_NRXDESC; i++) {
906 		if (sc->sc_rxsoft[i].rxs_dmamap != NULL)
907 			bus_dmamap_destroy(sc->sc_dmat,
908 			    sc->sc_rxsoft[i].rxs_dmamap);
909 	}
910  fail_4:
911 	for (i = 0; i < WM_TXQUEUELEN; i++) {
912 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
913 			bus_dmamap_destroy(sc->sc_dmat,
914 			    sc->sc_txsoft[i].txs_dmamap);
915 	}
916 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
917  fail_3:
918 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
919  fail_2:
920 	bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_control_data,
921 	    sizeof(struct wm_control_data));
922  fail_1:
923 	bus_dmamem_free(sc->sc_dmat, &seg, rseg);
924  fail_0:
925 	return;
926 }
927 
928 /*
929  * wm_shutdown:
930  *
931  *	Make sure the interface is stopped at reboot time.
932  */
933 void
934 wm_shutdown(void *arg)
935 {
936 	struct wm_softc *sc = arg;
937 
938 	wm_stop(&sc->sc_ethercom.ec_if, 1);
939 }
940 
941 /*
942  * wm_tx_cksum:
943  *
944  *	Set up TCP/IP checksumming parameters for the
945  *	specified packet.
946  */
947 static int
948 wm_tx_cksum(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
949     uint32_t *fieldsp)
950 {
951 	struct mbuf *m0 = txs->txs_mbuf;
952 	struct livengood_tcpip_ctxdesc *t;
953 	uint32_t fields = 0, ipcs, tucs;
954 	struct ip *ip;
955 	int offset, iphl;
956 
957 	/*
958 	 * XXX It would be nice if the mbuf pkthdr had offset
959 	 * fields for the protocol headers.
960 	 */
961 
962 	/* XXX Assumes normal Ethernet encap. */
963 	offset = ETHER_HDR_LEN;
964 
965 	/* XXX */
966 	if (m0->m_len < (offset + sizeof(struct ip))) {
967 		printf("%s: wm_tx_cksum: need to m_pullup, "
968 		    "packet dropped\n", sc->sc_dev.dv_xname);
969 		return (EINVAL);
970 	}
971 
972 	ip = (struct ip *) (mtod(m0, caddr_t) + offset);
973 	iphl = ip->ip_hl << 2;
974 
975 	if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
976 		WM_EVCNT_INCR(&sc->sc_ev_txipsum);
977 		fields |= htole32(WTX_IXSM);
978 		ipcs = htole32(WTX_TCPIP_IPCSS(offset) |
979 		    WTX_TCPIP_IPCSO(offsetof(struct ip, ip_sum)) |
980 		    WTX_TCPIP_IPCSE(offset + iphl - 1));
981 	} else
982 		ipcs = 0;
983 
984 	offset += iphl;
985 
986 	if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_UDPv4)) {
987 		WM_EVCNT_INCR(&sc->sc_ev_txtusum);
988 		fields |= htole32(WTX_TXSM);
989 		tucs = htole32(WTX_TCPIP_TUCSS(offset) |
990 		    WTX_TCPIP_TUCSO(offset + m0->m_pkthdr.csum_data) |
991 		    WTX_TCPIP_TUCSE(0) /* rest of packet */);
992 	} else
993 		tucs = 0;
994 
995 	if (sc->sc_txctx_ipcs == ipcs &&
996 	    sc->sc_txctx_tucs == tucs) {
997 		/* Cached context is fine. */
998 		WM_EVCNT_INCR(&sc->sc_ev_txctx_hit);
999 	} else {
1000 		/* Fill in the context descriptor. */
1001 #ifdef WM_EVENT_COUNTERS
1002 		if (sc->sc_txctx_ipcs == 0xffffffff &&
1003 		    sc->sc_txctx_tucs == 0xffffffff)
1004 			WM_EVCNT_INCR(&sc->sc_ev_txctx_init);
1005 		else
1006 			WM_EVCNT_INCR(&sc->sc_ev_txctx_miss);
1007 #endif
1008 		t = (struct livengood_tcpip_ctxdesc *)
1009 		    &sc->sc_txdescs[sc->sc_txnext];
1010 		t->tcpip_ipcs = ipcs;
1011 		t->tcpip_tucs = tucs;
1012 		t->tcpip_cmdlen =
1013 		    htole32(WTX_CMD_DEXT | WTX_DTYP_C);
1014 		t->tcpip_seg = 0;
1015 		WM_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE);
1016 
1017 		sc->sc_txctx_ipcs = ipcs;
1018 		sc->sc_txctx_tucs = tucs;
1019 
1020 		sc->sc_txnext = WM_NEXTTX(sc->sc_txnext);
1021 		txs->txs_ndesc++;
1022 		sc->sc_txwin++;
1023 	}
1024 
1025 	*cmdp = WTX_CMD_DEXT | WTC_DTYP_D;
1026 	*fieldsp = fields;
1027 
1028 	return (0);
1029 }
1030 
1031 /*
1032  * wm_start:		[ifnet interface function]
1033  *
1034  *	Start packet transmission on the interface.
1035  */
1036 void
1037 wm_start(struct ifnet *ifp)
1038 {
1039 	struct wm_softc *sc = ifp->if_softc;
1040 	struct mbuf *m0/*, *m*/;
1041 	struct wm_txsoft *txs;
1042 	bus_dmamap_t dmamap;
1043 	int error, nexttx, lasttx, ofree, seg;
1044 	uint32_t cksumcmd, cksumfields;
1045 
1046 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
1047 		return;
1048 
1049 	/*
1050 	 * Remember the previous number of free descriptors.
1051 	 */
1052 	ofree = sc->sc_txfree;
1053 
1054 	/*
1055 	 * Loop through the send queue, setting up transmit descriptors
1056 	 * until we drain the queue, or use up all available transmit
1057 	 * descriptors.
1058 	 */
1059 	for (;;) {
1060 		/* Grab a packet off the queue. */
1061 		IFQ_POLL(&ifp->if_snd, m0);
1062 		if (m0 == NULL)
1063 			break;
1064 
1065 		DPRINTF(WM_DEBUG_TX,
1066 		    ("%s: TX: have packet to transmit: %p\n",
1067 		    sc->sc_dev.dv_xname, m0));
1068 
1069 		/* Get a work queue entry. */
1070 		if (sc->sc_txsfree == 0) {
1071 			DPRINTF(WM_DEBUG_TX,
1072 			    ("%s: TX: no free job descriptors\n",
1073 				sc->sc_dev.dv_xname));
1074 			WM_EVCNT_INCR(&sc->sc_ev_txsstall);
1075 			break;
1076 		}
1077 
1078 		txs = &sc->sc_txsoft[sc->sc_txsnext];
1079 		dmamap = txs->txs_dmamap;
1080 
1081 		/*
1082 		 * Load the DMA map.  If this fails, the packet either
1083 		 * didn't fit in the allotted number of segments, or we
1084 		 * were short on resources.  For the too-many-segments
1085 		 * case, we simply report an error and drop the packet,
1086 		 * since we can't sanely copy a jumbo packet to a single
1087 		 * buffer.
1088 		 */
1089 		error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
1090 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT);
1091 		if (error) {
1092 			if (error == EFBIG) {
1093 				WM_EVCNT_INCR(&sc->sc_ev_txdrop);
1094 				printf("%s: Tx packet consumes too many "
1095 				    "DMA segments, dropping...\n",
1096 				    sc->sc_dev.dv_xname);
1097 				IFQ_DEQUEUE(&ifp->if_snd, m0);
1098 				m_freem(m0);
1099 				continue;
1100 			}
1101 			/*
1102 			 * Short on resources, just stop for now.
1103 			 */
1104 			DPRINTF(WM_DEBUG_TX,
1105 			    ("%s: TX: dmamap load failed: %d\n",
1106 			    sc->sc_dev.dv_xname, error));
1107 			break;
1108 		}
1109 
1110 		/*
1111 		 * Ensure we have enough descriptors free to describe
1112 		 * the packet.  Note, we always reserve one descriptor
1113 		 * at the end of the ring due to the semantics of the
1114 		 * TDT register, plus one more in the event we need
1115 		 * to re-load checksum offload context.
1116 		 */
1117 		if (dmamap->dm_nsegs > (sc->sc_txfree - 2)) {
1118 			/*
1119 			 * Not enough free descriptors to transmit this
1120 			 * packet.  We haven't committed anything yet,
1121 			 * so just unload the DMA map, put the packet
1122 			 * pack on the queue, and punt.  Notify the upper
1123 			 * layer that there are no more slots left.
1124 			 */
1125 			DPRINTF(WM_DEBUG_TX,
1126 			    ("%s: TX: need %d descriptors, have %d\n",
1127 			    sc->sc_dev.dv_xname, dmamap->dm_nsegs,
1128 			    sc->sc_txfree - 1));
1129 			ifp->if_flags |= IFF_OACTIVE;
1130 			bus_dmamap_unload(sc->sc_dmat, dmamap);
1131 			WM_EVCNT_INCR(&sc->sc_ev_txdstall);
1132 			break;
1133 		}
1134 
1135 		IFQ_DEQUEUE(&ifp->if_snd, m0);
1136 
1137 		/*
1138 		 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
1139 		 */
1140 
1141 		/* Sync the DMA map. */
1142 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
1143 		    BUS_DMASYNC_PREWRITE);
1144 
1145 		DPRINTF(WM_DEBUG_TX,
1146 		    ("%s: TX: packet has %d DMA segments\n",
1147 		    sc->sc_dev.dv_xname, dmamap->dm_nsegs));
1148 
1149 		WM_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]);
1150 
1151 		/*
1152 		 * Store a pointer to the packet so that we can free it
1153 		 * later.
1154 		 *
1155 		 * Initially, we consider the number of descriptors the
1156 		 * packet uses the number of DMA segments.  This may be
1157 		 * incremented by 1 if we do checksum offload (a descriptor
1158 		 * is used to set the checksum context).
1159 		 */
1160 		txs->txs_mbuf = m0;
1161 		txs->txs_firstdesc = sc->sc_txnext;
1162 		txs->txs_ndesc = dmamap->dm_nsegs;
1163 
1164 		/*
1165 		 * Set up checksum offload parameters for
1166 		 * this packet.
1167 		 */
1168 		if (m0->m_pkthdr.csum_flags &
1169 		    (M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4)) {
1170 			if (wm_tx_cksum(sc, txs, &cksumcmd,
1171 					&cksumfields) != 0) {
1172 				/* Error message already displayed. */
1173 				m_freem(m0);
1174 				bus_dmamap_unload(sc->sc_dmat, dmamap);
1175 				txs->txs_mbuf = NULL;
1176 				continue;
1177 			}
1178 		} else {
1179 			cksumcmd = 0;
1180 			cksumfields = 0;
1181 		}
1182 
1183 		cksumcmd |= htole32(WTX_CMD_IDE);
1184 
1185 		/*
1186 		 * Initialize the transmit descriptor.
1187 		 */
1188 		for (nexttx = sc->sc_txnext, seg = 0;
1189 		     seg < dmamap->dm_nsegs;
1190 		     seg++, nexttx = WM_NEXTTX(nexttx)) {
1191 			/*
1192 			 * Note: we currently only use 32-bit DMA
1193 			 * addresses.
1194 			 */
1195 			sc->sc_txdescs[nexttx].wtx_addr.wa_low =
1196 			    htole32(dmamap->dm_segs[seg].ds_addr);
1197 			sc->sc_txdescs[nexttx].wtx_cmdlen = cksumcmd |
1198 			    htole32(dmamap->dm_segs[seg].ds_len);
1199 			sc->sc_txdescs[nexttx].wtx_fields.wtxu_bits =
1200 			    cksumfields;
1201 			lasttx = nexttx;
1202 
1203 			sc->sc_txwin++;
1204 
1205 			DPRINTF(WM_DEBUG_TX,
1206 			    ("%s: TX: desc %d: low 0x%08x, len 0x%04x\n",
1207 			    sc->sc_dev.dv_xname, nexttx,
1208 			    (uint32_t) dmamap->dm_segs[seg].ds_addr,
1209 			    (uint32_t) dmamap->dm_segs[seg].ds_len));
1210 		}
1211 
1212 		/*
1213 		 * Set up the command byte on the last descriptor of
1214 		 * the packet.  If we're in the interrupt delay window,
1215 		 * delay the interrupt.
1216 		 */
1217 		sc->sc_txdescs[lasttx].wtx_cmdlen |=
1218 		    htole32(WTX_CMD_EOP | WTX_CMD_IFCS | WTX_CMD_RS);
1219 		if (sc->sc_txwin < (WM_NTXDESC * 2 / 3))
1220 			sc->sc_txdescs[lasttx].wtx_cmdlen |=
1221 			    htole32(WTX_CMD_IDE);
1222 		else
1223 			sc->sc_txwin = 0;
1224 
1225 #if 0 /* XXXJRT */
1226 		/*
1227 		 * If VLANs are enabled and the packet has a VLAN tag, set
1228 		 * up the descriptor to encapsulate the packet for us.
1229 		 *
1230 		 * This is only valid on the last descriptor of the packet.
1231 		 */
1232 		if (sc->sc_ethercom.ec_nvlans != 0 &&
1233 		    (m = m_aux_find(m0, AF_LINK, ETHERTYPE_VLAN)) != NULL) {
1234 			sc->sc_txdescs[lasttx].wtx_cmdlen |=
1235 			    htole32(WTX_CMD_VLE);
1236 			sc->sc_txdescs[lasttx].wtx_fields.wtxu_fields.wtxu_vlan
1237 			    = htole16(*mtod(m, int *) & 0xffff);
1238 		}
1239 #endif /* XXXJRT */
1240 
1241 		txs->txs_lastdesc = lasttx;
1242 
1243 		DPRINTF(WM_DEBUG_TX,
1244 		    ("%s: TX: desc %d: cmdlen 0x%08x\n", sc->sc_dev.dv_xname,
1245 		    lasttx, sc->sc_txdescs[lasttx].wtx_cmdlen));
1246 
1247 		/* Sync the descriptors we're using. */
1248 		WM_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs,
1249 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1250 
1251 		/* Give the packet to the chip. */
1252 		CSR_WRITE(sc, sc->sc_tdt_reg, nexttx);
1253 
1254 		DPRINTF(WM_DEBUG_TX,
1255 		    ("%s: TX: TDT -> %d\n", sc->sc_dev.dv_xname, nexttx));
1256 
1257 		DPRINTF(WM_DEBUG_TX,
1258 		    ("%s: TX: finished transmitting packet, job %d\n",
1259 		    sc->sc_dev.dv_xname, sc->sc_txsnext));
1260 
1261 		/* Advance the tx pointer. */
1262 		sc->sc_txfree -= txs->txs_ndesc;
1263 		sc->sc_txnext = nexttx;
1264 
1265 		sc->sc_txsfree--;
1266 		sc->sc_txsnext = WM_NEXTTXS(sc->sc_txsnext);
1267 
1268 #if NBPFILTER > 0
1269 		/* Pass the packet to any BPF listeners. */
1270 		if (ifp->if_bpf)
1271 			bpf_mtap(ifp->if_bpf, m0);
1272 #endif /* NBPFILTER > 0 */
1273 	}
1274 
1275 	if (sc->sc_txsfree == 0 || sc->sc_txfree <= 2) {
1276 		/* No more slots; notify upper layer. */
1277 		ifp->if_flags |= IFF_OACTIVE;
1278 	}
1279 
1280 	if (sc->sc_txfree != ofree) {
1281 		/* Set a watchdog timer in case the chip flakes out. */
1282 		ifp->if_timer = 5;
1283 	}
1284 }
1285 
1286 /*
1287  * wm_watchdog:		[ifnet interface function]
1288  *
1289  *	Watchdog timer handler.
1290  */
1291 void
1292 wm_watchdog(struct ifnet *ifp)
1293 {
1294 	struct wm_softc *sc = ifp->if_softc;
1295 
1296 	/*
1297 	 * Since we're using delayed interrupts, sweep up
1298 	 * before we report an error.
1299 	 */
1300 	wm_txintr(sc);
1301 
1302 	if (sc->sc_txfree != WM_NTXDESC) {
1303 		printf("%s: device timeout (txfree %d txsfree %d txnext %d)\n",
1304 		    sc->sc_dev.dv_xname, sc->sc_txfree, sc->sc_txsfree,
1305 		    sc->sc_txnext);
1306 		ifp->if_oerrors++;
1307 
1308 		/* Reset the interface. */
1309 		(void) wm_init(ifp);
1310 	}
1311 
1312 	/* Try to get more packets going. */
1313 	wm_start(ifp);
1314 }
1315 
1316 /*
1317  * wm_ioctl:		[ifnet interface function]
1318  *
1319  *	Handle control requests from the operator.
1320  */
1321 int
1322 wm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1323 {
1324 	struct wm_softc *sc = ifp->if_softc;
1325 	struct ifreq *ifr = (struct ifreq *) data;
1326 	int s, error;
1327 
1328 	s = splnet();
1329 
1330 	switch (cmd) {
1331 	case SIOCSIFMEDIA:
1332 	case SIOCGIFMEDIA:
1333 		error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
1334 		break;
1335 
1336 	default:
1337 		error = ether_ioctl(ifp, cmd, data);
1338 		if (error == ENETRESET) {
1339 			/*
1340 			 * Multicast list has changed; set the hardware filter
1341 			 * accordingly.
1342 			 */
1343 			wm_set_filter(sc);
1344 			error = 0;
1345 		}
1346 		break;
1347 	}
1348 
1349 	/* Try to get more packets going. */
1350 	wm_start(ifp);
1351 
1352 	splx(s);
1353 	return (error);
1354 }
1355 
1356 /*
1357  * wm_intr:
1358  *
1359  *	Interrupt service routine.
1360  */
1361 int
1362 wm_intr(void *arg)
1363 {
1364 	struct wm_softc *sc = arg;
1365 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1366 	uint32_t icr;
1367 	int wantinit, handled = 0;
1368 
1369 	for (wantinit = 0; wantinit == 0;) {
1370 		icr = CSR_READ(sc, WMREG_ICR);
1371 		if ((icr & sc->sc_icr) == 0)
1372 			break;
1373 
1374 		handled = 1;
1375 
1376 		if (icr & (ICR_RXDMT0|ICR_RXT0)) {
1377 			DPRINTF(WM_DEBUG_RX,
1378 			    ("%s: RX: got Rx intr 0x%08x\n",
1379 			    sc->sc_dev.dv_xname,
1380 			    icr & (ICR_RXDMT0|ICR_RXT0)));
1381 			WM_EVCNT_INCR(&sc->sc_ev_rxintr);
1382 			wm_rxintr(sc);
1383 		}
1384 
1385 		if (icr & (ICR_TXDW|ICR_TXQE)) {
1386 			DPRINTF(WM_DEBUG_TX,
1387 			    ("%s: TX: got TDXW|TXQE interrupt\n",
1388 			    sc->sc_dev.dv_xname));
1389 #ifdef WM_EVENT_COUNTERS
1390 			if (icr & ICR_TXDW)
1391 				WM_EVCNT_INCR(&sc->sc_ev_txdw);
1392 			else if (icr & ICR_TXQE)
1393 				WM_EVCNT_INCR(&sc->sc_ev_txqe);
1394 #endif
1395 			wm_txintr(sc);
1396 		}
1397 
1398 		if (icr & (ICR_LSC|ICR_RXSEQ|ICR_RXCFG)) {
1399 			WM_EVCNT_INCR(&sc->sc_ev_linkintr);
1400 			wm_linkintr(sc, icr);
1401 		}
1402 
1403 		if (icr & ICR_RXO) {
1404 			printf("%s: Receive overrun\n", sc->sc_dev.dv_xname);
1405 			wantinit = 1;
1406 		}
1407 	}
1408 
1409 	if (handled) {
1410 		if (wantinit)
1411 			wm_init(ifp);
1412 
1413 		/* Try to get more packets going. */
1414 		wm_start(ifp);
1415 	}
1416 
1417 	return (handled);
1418 }
1419 
1420 /*
1421  * wm_txintr:
1422  *
1423  *	Helper; handle transmit interrupts.
1424  */
1425 void
1426 wm_txintr(struct wm_softc *sc)
1427 {
1428 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1429 	struct wm_txsoft *txs;
1430 	uint8_t status;
1431 	int i;
1432 
1433 	ifp->if_flags &= ~IFF_OACTIVE;
1434 
1435 	/*
1436 	 * Go through the Tx list and free mbufs for those
1437 	 * frams which have been transmitted.
1438 	 */
1439 	for (i = sc->sc_txsdirty; sc->sc_txsfree != WM_TXQUEUELEN;
1440 	     i = WM_NEXTTXS(i), sc->sc_txsfree++) {
1441 		txs = &sc->sc_txsoft[i];
1442 
1443 		DPRINTF(WM_DEBUG_TX,
1444 		    ("%s: TX: checking job %d\n", sc->sc_dev.dv_xname, i));
1445 
1446 		WM_CDTXSYNC(sc, txs->txs_firstdesc, txs->txs_dmamap->dm_nsegs,
1447 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1448 
1449 		status = le32toh(sc->sc_txdescs[
1450 		    txs->txs_lastdesc].wtx_fields.wtxu_bits);
1451 		if ((status & WTX_ST_DD) == 0)
1452 			break;
1453 
1454 		DPRINTF(WM_DEBUG_TX,
1455 		    ("%s: TX: job %d done: descs %d..%d\n",
1456 		    sc->sc_dev.dv_xname, i, txs->txs_firstdesc,
1457 		    txs->txs_lastdesc));
1458 
1459 		/*
1460 		 * XXX We should probably be using the statistics
1461 		 * XXX registers, but I don't know if they exist
1462 		 * XXX on chips before the Cordova.
1463 		 */
1464 
1465 #ifdef WM_EVENT_COUNTERS
1466 		if (status & WTX_ST_TU)
1467 			WM_EVCNT_INCR(&sc->sc_ev_tu);
1468 #endif /* WM_EVENT_COUNTERS */
1469 
1470 		if (status & (WTX_ST_EC|WTX_ST_LC)) {
1471 			ifp->if_oerrors++;
1472 			if (status & WTX_ST_LC)
1473 				printf("%s: late collision\n",
1474 				    sc->sc_dev.dv_xname);
1475 			else if (status & WTX_ST_EC) {
1476 				ifp->if_collisions += 16;
1477 				printf("%s: excessive collisions\n",
1478 				    sc->sc_dev.dv_xname);
1479 			}
1480 		} else
1481 			ifp->if_opackets++;
1482 
1483 		sc->sc_txfree += txs->txs_ndesc;
1484 		bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
1485 		    0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1486 		bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
1487 		m_freem(txs->txs_mbuf);
1488 		txs->txs_mbuf = NULL;
1489 	}
1490 
1491 	/* Update the dirty transmit buffer pointer. */
1492 	sc->sc_txsdirty = i;
1493 	DPRINTF(WM_DEBUG_TX,
1494 	    ("%s: TX: txsdirty -> %d\n", sc->sc_dev.dv_xname, i));
1495 
1496 	/*
1497 	 * If there are no more pending transmissions, cancel the watchdog
1498 	 * timer.
1499 	 */
1500 	if (sc->sc_txsfree == WM_TXQUEUELEN)
1501 		ifp->if_timer = 0;
1502 	if (sc->sc_txfree == WM_NTXDESC)
1503 		sc->sc_txwin = 0;
1504 }
1505 
1506 /*
1507  * wm_rxintr:
1508  *
1509  *	Helper; handle receive interrupts.
1510  */
1511 void
1512 wm_rxintr(struct wm_softc *sc)
1513 {
1514 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1515 	struct wm_rxsoft *rxs;
1516 	struct mbuf *m;
1517 	int i, len;
1518 	uint8_t status, errors;
1519 
1520 	for (i = sc->sc_rxptr;; i = WM_NEXTRX(i)) {
1521 		rxs = &sc->sc_rxsoft[i];
1522 
1523 		DPRINTF(WM_DEBUG_RX,
1524 		    ("%s: RX: checking descriptor %d\n",
1525 		    sc->sc_dev.dv_xname, i));
1526 
1527 		WM_CDRXSYNC(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1528 
1529 		status = sc->sc_rxdescs[i].wrx_status;
1530 		errors = sc->sc_rxdescs[i].wrx_errors;
1531 		len = le16toh(sc->sc_rxdescs[i].wrx_len);
1532 
1533 		if ((status & WRX_ST_DD) == 0) {
1534 			/*
1535 			 * We have processed all of the receive descriptors.
1536 			 */
1537 			break;
1538 		}
1539 
1540 		if (__predict_false(sc->sc_rxdiscard)) {
1541 			DPRINTF(WM_DEBUG_RX,
1542 			    ("%s: RX: discarding contents of descriptor %d\n",
1543 			    sc->sc_dev.dv_xname, i));
1544 			WM_INIT_RXDESC(sc, i);
1545 			if (status & WRX_ST_EOP) {
1546 				/* Reset our state. */
1547 				DPRINTF(WM_DEBUG_RX,
1548 				    ("%s: RX: resetting rxdiscard -> 0\n",
1549 				    sc->sc_dev.dv_xname));
1550 				sc->sc_rxdiscard = 0;
1551 			}
1552 			continue;
1553 		}
1554 
1555 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1556 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
1557 
1558 		m = rxs->rxs_mbuf;
1559 
1560 		/*
1561 		 * Add a new receive buffer to the ring.
1562 		 */
1563 		if (wm_add_rxbuf(sc, i) != 0) {
1564 			/*
1565 			 * Failed, throw away what we've done so
1566 			 * far, and discard the rest of the packet.
1567 			 */
1568 			ifp->if_ierrors++;
1569 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
1570 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1571 			WM_INIT_RXDESC(sc, i);
1572 			if ((status & WRX_ST_EOP) == 0)
1573 				sc->sc_rxdiscard = 1;
1574 			if (sc->sc_rxhead != NULL)
1575 				m_freem(sc->sc_rxhead);
1576 			WM_RXCHAIN_RESET(sc);
1577 			DPRINTF(WM_DEBUG_RX,
1578 			    ("%s: RX: Rx buffer allocation failed, "
1579 			    "dropping packet%s\n", sc->sc_dev.dv_xname,
1580 			    sc->sc_rxdiscard ? " (discard)" : ""));
1581 			continue;
1582 		}
1583 
1584 		WM_RXCHAIN_LINK(sc, m);
1585 
1586 		m->m_len = len;
1587 
1588 		DPRINTF(WM_DEBUG_RX,
1589 		    ("%s: RX: buffer at %p len %d\n",
1590 		    sc->sc_dev.dv_xname, m->m_data, len));
1591 
1592 		/*
1593 		 * If this is not the end of the packet, keep
1594 		 * looking.
1595 		 */
1596 		if ((status & WRX_ST_EOP) == 0) {
1597 			sc->sc_rxlen += len;
1598 			DPRINTF(WM_DEBUG_RX,
1599 			    ("%s: RX: not yet EOP, rxlen -> %d\n",
1600 			    sc->sc_dev.dv_xname, sc->sc_rxlen));
1601 			continue;
1602 		}
1603 
1604 		/*
1605 		 * Okay, we have the entire packet now...
1606 		 */
1607 		*sc->sc_rxtailp = NULL;
1608 		m = sc->sc_rxhead;
1609 		len += sc->sc_rxlen;
1610 
1611 		WM_RXCHAIN_RESET(sc);
1612 
1613 		DPRINTF(WM_DEBUG_RX,
1614 		    ("%s: RX: have entire packet, len -> %d\n",
1615 		    sc->sc_dev.dv_xname, len));
1616 
1617 		/*
1618 		 * If an error occurred, update stats and drop the packet.
1619 		 */
1620 		if (errors &
1621 		     (WRX_ER_CE|WRX_ER_SE|WRX_ER_SEQ|WRX_ER_CXE|WRX_ER_RXE)) {
1622 			ifp->if_ierrors++;
1623 			if (errors & WRX_ER_SE)
1624 				printf("%s: symbol error\n",
1625 				    sc->sc_dev.dv_xname);
1626 			else if (errors & WRX_ER_SEQ)
1627 				printf("%s: receive sequence error\n",
1628 				    sc->sc_dev.dv_xname);
1629 			else if (errors & WRX_ER_CE)
1630 				printf("%s: CRC error\n",
1631 				    sc->sc_dev.dv_xname);
1632 			m_freem(m);
1633 			continue;
1634 		}
1635 
1636 		/*
1637 		 * No errors.  Receive the packet.
1638 		 *
1639 		 * Note, we have configured the chip to include the
1640 		 * CRC with every packet.
1641 		 */
1642 		m->m_flags |= M_HASFCS;
1643 		m->m_pkthdr.rcvif = ifp;
1644 		m->m_pkthdr.len = len;
1645 
1646 #if 0 /* XXXJRT */
1647 		/*
1648 		 * If VLANs are enabled, VLAN packets have been unwrapped
1649 		 * for us.  Associate the tag with the packet.
1650 		 */
1651 		if (sc->sc_ethercom.ec_nvlans != 0 &&
1652 		    (status & WRX_ST_VP) != 0) {
1653 			struct mbuf *vtag;
1654 
1655 			vtag = m_aux_add(m, AF_LINK, ETHERTYPE_VLAN);
1656 			if (vtag == NULL) {
1657 				ifp->if_ierrors++;
1658 				printf("%s: unable to allocate VLAN tag\n",
1659 				    sc->sc_dev.dv_xname);
1660 				m_freem(m);
1661 				continue;
1662 			}
1663 
1664 			*mtod(m, int *) =
1665 			    le16toh(sc->sc_rxdescs[i].wrx_special);
1666 			vtag->m_len = sizeof(int);
1667 		}
1668 #endif /* XXXJRT */
1669 
1670 		/*
1671 		 * Set up checksum info for this packet.
1672 		 */
1673 		if (status & WRX_ST_IPCS) {
1674 			WM_EVCNT_INCR(&sc->sc_ev_rxipsum);
1675 			m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
1676 			if (errors & WRX_ER_IPE)
1677 				m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
1678 		}
1679 		if (status & WRX_ST_TCPCS) {
1680 			/*
1681 			 * Note: we don't know if this was TCP or UDP,
1682 			 * so we just set both bits, and expect the
1683 			 * upper layers to deal.
1684 			 */
1685 			WM_EVCNT_INCR(&sc->sc_ev_rxtusum);
1686 			m->m_pkthdr.csum_flags |= M_CSUM_TCPv4|M_CSUM_UDPv4;
1687 			if (errors & WRX_ER_TCPE)
1688 				m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
1689 		}
1690 
1691 		ifp->if_ipackets++;
1692 
1693 #if NBPFILTER > 0
1694 		/* Pass this up to any BPF listeners. */
1695 		if (ifp->if_bpf)
1696 			bpf_mtap(ifp->if_bpf, m);
1697 #endif /* NBPFILTER > 0 */
1698 
1699 		/* Pass it on. */
1700 		(*ifp->if_input)(ifp, m);
1701 	}
1702 
1703 	/* Update the receive pointer. */
1704 	sc->sc_rxptr = i;
1705 
1706 	DPRINTF(WM_DEBUG_RX,
1707 	    ("%s: RX: rxptr -> %d\n", sc->sc_dev.dv_xname, i));
1708 }
1709 
1710 /*
1711  * wm_linkintr:
1712  *
1713  *	Helper; handle link interrupts.
1714  */
1715 void
1716 wm_linkintr(struct wm_softc *sc, uint32_t icr)
1717 {
1718 	uint32_t status;
1719 
1720 	/*
1721 	 * If we get a link status interrupt on a 1000BASE-T
1722 	 * device, just fall into the normal MII tick path.
1723 	 */
1724 	if (sc->sc_flags & WM_F_HAS_MII) {
1725 		if (icr & ICR_LSC) {
1726 			DPRINTF(WM_DEBUG_LINK,
1727 			    ("%s: LINK: LSC -> mii_tick\n",
1728 			    sc->sc_dev.dv_xname));
1729 			mii_tick(&sc->sc_mii);
1730 		} else if (icr & ICR_RXSEQ) {
1731 			DPRINTF(WM_DEBUG_LINK,
1732 			    ("%s: LINK Receive sequence error\n",
1733 			    sc->sc_dev.dv_xname));
1734 		}
1735 		return;
1736 	}
1737 
1738 	/*
1739 	 * If we are now receiving /C/, check for link again in
1740 	 * a couple of link clock ticks.
1741 	 */
1742 	if (icr & ICR_RXCFG) {
1743 		DPRINTF(WM_DEBUG_LINK, ("%s: LINK: receiving /C/\n",
1744 		    sc->sc_dev.dv_xname));
1745 		sc->sc_tbi_anstate = 2;
1746 	}
1747 
1748 	if (icr & ICR_LSC) {
1749 		status = CSR_READ(sc, WMREG_STATUS);
1750 		if (status & STATUS_LU) {
1751 			DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
1752 			    sc->sc_dev.dv_xname,
1753 			    (status & STATUS_FD) ? "FDX" : "HDX"));
1754 			sc->sc_tctl &= ~TCTL_COLD(0x3ff);
1755 			if (status & STATUS_FD)
1756 				sc->sc_tctl |=
1757 				    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
1758 			else
1759 				sc->sc_tctl |=
1760 				    TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
1761 			CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
1762 			sc->sc_tbi_linkup = 1;
1763 		} else {
1764 			DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
1765 			    sc->sc_dev.dv_xname));
1766 			sc->sc_tbi_linkup = 0;
1767 		}
1768 		sc->sc_tbi_anstate = 2;
1769 		wm_tbi_set_linkled(sc);
1770 	} else if (icr & ICR_RXSEQ) {
1771 		DPRINTF(WM_DEBUG_LINK,
1772 		    ("%s: LINK: Receive sequence error\n",
1773 		    sc->sc_dev.dv_xname));
1774 	}
1775 }
1776 
1777 /*
1778  * wm_tick:
1779  *
1780  *	One second timer, used to check link status, sweep up
1781  *	completed transmit jobs, etc.
1782  */
1783 void
1784 wm_tick(void *arg)
1785 {
1786 	struct wm_softc *sc = arg;
1787 	int s;
1788 
1789 	s = splnet();
1790 
1791 	if (sc->sc_flags & WM_F_HAS_MII)
1792 		mii_tick(&sc->sc_mii);
1793 	else
1794 		wm_tbi_check_link(sc);
1795 
1796 	splx(s);
1797 
1798 	callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
1799 }
1800 
1801 /*
1802  * wm_reset:
1803  *
1804  *	Reset the i82542 chip.
1805  */
1806 void
1807 wm_reset(struct wm_softc *sc)
1808 {
1809 	int i;
1810 
1811 	CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
1812 	delay(10000);
1813 
1814 	for (i = 0; i < 1000; i++) {
1815 		if ((CSR_READ(sc, WMREG_CTRL) & CTRL_RST) == 0)
1816 			return;
1817 		delay(20);
1818 	}
1819 
1820 	if (CSR_READ(sc, WMREG_CTRL) & CTRL_RST)
1821 		printf("%s: WARNING: reset failed to complete\n",
1822 		    sc->sc_dev.dv_xname);
1823 }
1824 
1825 /*
1826  * wm_init:		[ifnet interface function]
1827  *
1828  *	Initialize the interface.  Must be called at splnet().
1829  */
1830 int
1831 wm_init(struct ifnet *ifp)
1832 {
1833 	struct wm_softc *sc = ifp->if_softc;
1834 	struct wm_rxsoft *rxs;
1835 	int i, error = 0;
1836 	uint32_t reg;
1837 
1838 	/* Cancel any pending I/O. */
1839 	wm_stop(ifp, 0);
1840 
1841 	/* Reset the chip to a known state. */
1842 	wm_reset(sc);
1843 
1844 	/* Initialize the transmit descriptor ring. */
1845 	memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
1846 	WM_CDTXSYNC(sc, 0, WM_NTXDESC,
1847 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1848 	sc->sc_txfree = WM_NTXDESC;
1849 	sc->sc_txnext = 0;
1850 	sc->sc_txwin = 0;
1851 
1852 	sc->sc_txctx_ipcs = 0xffffffff;
1853 	sc->sc_txctx_tucs = 0xffffffff;
1854 
1855 	if (sc->sc_type < WM_T_LIVENGOOD) {
1856 		CSR_WRITE(sc, WMREG_OLD_TBDAH, 0);
1857 		CSR_WRITE(sc, WMREG_OLD_TBDAL, WM_CDTXADDR(sc, 0));
1858 		CSR_WRITE(sc, WMREG_OLD_TDLEN, sizeof(sc->sc_txdescs));
1859 		CSR_WRITE(sc, WMREG_OLD_TDH, 0);
1860 		CSR_WRITE(sc, WMREG_OLD_TDT, 0);
1861 		CSR_WRITE(sc, WMREG_OLD_TIDV, 64);
1862 	} else {
1863 		CSR_WRITE(sc, WMREG_TBDAH, 0);
1864 		CSR_WRITE(sc, WMREG_TBDAL, WM_CDTXADDR(sc, 0));
1865 		CSR_WRITE(sc, WMREG_TDLEN, sizeof(sc->sc_txdescs));
1866 		CSR_WRITE(sc, WMREG_TDH, 0);
1867 		CSR_WRITE(sc, WMREG_TDT, 0);
1868 		CSR_WRITE(sc, WMREG_TIDV, 64);
1869 
1870 		CSR_WRITE(sc, WMREG_TXDCTL, TXDCTL_PTHRESH(0) |
1871 		    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
1872 		CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_PTHRESH(0) |
1873 		    RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
1874 	}
1875 	CSR_WRITE(sc, WMREG_TQSA_LO, 0);
1876 	CSR_WRITE(sc, WMREG_TQSA_HI, 0);
1877 
1878 	/* Initialize the transmit job descriptors. */
1879 	for (i = 0; i < WM_TXQUEUELEN; i++)
1880 		sc->sc_txsoft[i].txs_mbuf = NULL;
1881 	sc->sc_txsfree = WM_TXQUEUELEN;
1882 	sc->sc_txsnext = 0;
1883 	sc->sc_txsdirty = 0;
1884 
1885 	/*
1886 	 * Initialize the receive descriptor and receive job
1887 	 * descriptor rings.
1888 	 */
1889 	if (sc->sc_type < WM_T_LIVENGOOD) {
1890 		CSR_WRITE(sc, WMREG_OLD_RDBAH0, 0);
1891 		CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR(sc, 0));
1892 		CSR_WRITE(sc, WMREG_OLD_RDLEN0, sizeof(sc->sc_rxdescs));
1893 		CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
1894 		CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
1895 		CSR_WRITE(sc, WMREG_OLD_RDTR0, 64 | RDTR_FPD);
1896 
1897 		CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
1898 		CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
1899 		CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
1900 		CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
1901 		CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
1902 		CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
1903 	} else {
1904 		CSR_WRITE(sc, WMREG_RDBAH, 0);
1905 		CSR_WRITE(sc, WMREG_RDBAL, WM_CDRXADDR(sc, 0));
1906 		CSR_WRITE(sc, WMREG_RDLEN, sizeof(sc->sc_rxdescs));
1907 		CSR_WRITE(sc, WMREG_RDH, 0);
1908 		CSR_WRITE(sc, WMREG_RDT, 0);
1909 		CSR_WRITE(sc, WMREG_RDTR, 64 | RDTR_FPD);
1910 	}
1911 	for (i = 0; i < WM_NRXDESC; i++) {
1912 		rxs = &sc->sc_rxsoft[i];
1913 		if (rxs->rxs_mbuf == NULL) {
1914 			if ((error = wm_add_rxbuf(sc, i)) != 0) {
1915 				printf("%s: unable to allocate or map rx "
1916 				    "buffer %d, error = %d\n",
1917 				    sc->sc_dev.dv_xname, i, error);
1918 				/*
1919 				 * XXX Should attempt to run with fewer receive
1920 				 * XXX buffers instead of just failing.
1921 				 */
1922 				wm_rxdrain(sc);
1923 				goto out;
1924 			}
1925 		} else
1926 			WM_INIT_RXDESC(sc, i);
1927 	}
1928 	sc->sc_rxptr = 0;
1929 	sc->sc_rxdiscard = 0;
1930 	WM_RXCHAIN_RESET(sc);
1931 
1932 	/*
1933 	 * Clear out the VLAN table -- we don't use it (yet).
1934 	 */
1935 	CSR_WRITE(sc, WMREG_VET, 0);
1936 	for (i = 0; i < WM_VLAN_TABSIZE; i++)
1937 		CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
1938 
1939 	/*
1940 	 * Set up flow-control parameters.
1941 	 *
1942 	 * XXX Values could probably stand some tuning.
1943 	 */
1944 	if (sc->sc_ctrl & (CTRL_RFCE|CTRL_TFCE)) {
1945 		CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
1946 		CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
1947 		CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
1948 
1949 		if (sc->sc_type < WM_T_LIVENGOOD) {
1950 			CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
1951 			CSR_WRITE(sc, WMREG_OLD_FCRTL, FCRTL_DFLT);
1952 		} else {
1953 			CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
1954 			CSR_WRITE(sc, WMREG_FCRTL, FCRTL_DFLT);
1955 		}
1956 		CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
1957 	}
1958 
1959 #if 0 /* XXXJRT */
1960 	/* Deal with VLAN enables. */
1961 	if (sc->sc_ethercom.ec_nvlans != 0)
1962 		sc->sc_ctrl |= CTRL_VME;
1963 	else
1964 #endif /* XXXJRT */
1965 		sc->sc_ctrl &= ~CTRL_VME;
1966 
1967 	/* Write the control registers. */
1968 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
1969 #if 0
1970 	CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
1971 #endif
1972 
1973 	/*
1974 	 * Set up checksum offload parameters.
1975 	 */
1976 	reg = CSR_READ(sc, WMREG_RXCSUM);
1977 	if (ifp->if_capenable & IFCAP_CSUM_IPv4)
1978 		reg |= RXCSUM_IPOFL;
1979 	else
1980 		reg &= ~RXCSUM_IPOFL;
1981 	if (ifp->if_capenable & (IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4))
1982 		reg |= RXCSUM_TUOFL;
1983 	else
1984 		reg &= ~RXCSUM_TUOFL;
1985 	CSR_WRITE(sc, WMREG_RXCSUM, reg);
1986 
1987 	/*
1988 	 * Set up the interrupt registers.
1989 	 */
1990 	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
1991 	sc->sc_icr = ICR_TXDW | ICR_TXQE | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
1992 	    ICR_RXO | ICR_RXT0;
1993 	if ((sc->sc_flags & WM_F_HAS_MII) == 0)
1994 		sc->sc_icr |= ICR_RXCFG;
1995 	CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
1996 
1997 	/* Set up the inter-packet gap. */
1998 	CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
1999 
2000 #if 0 /* XXXJRT */
2001 	/* Set the VLAN ethernetype. */
2002 	CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
2003 #endif
2004 
2005 	/*
2006 	 * Set up the transmit control register; we start out with
2007 	 * a collision distance suitable for FDX, but update it whe
2008 	 * we resolve the media type.
2009 	 */
2010 	sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_CT(TX_COLLISION_THRESHOLD) |
2011 	    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
2012 	CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
2013 
2014 	/* Set the media. */
2015 	(void) (*sc->sc_mii.mii_media.ifm_change)(ifp);
2016 
2017 	/*
2018 	 * Set up the receive control register; we actually program
2019 	 * the register when we set the receive filter.  Use multicast
2020 	 * address offset type 0.
2021 	 *
2022 	 * Only the Cordova has the ability to strip the incoming
2023 	 * CRC, so we don't enable that feature.
2024 	 */
2025 	sc->sc_mchash_type = 0;
2026 	sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_2k |
2027 	    RCTL_DPF | RCTL_MO(sc->sc_mchash_type);
2028 
2029 	/* Set the receive filter. */
2030 	wm_set_filter(sc);
2031 
2032 	/* Start the one second link check clock. */
2033 	callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
2034 
2035 	/* ...all done! */
2036 	ifp->if_flags |= IFF_RUNNING;
2037 	ifp->if_flags &= ~IFF_OACTIVE;
2038 
2039  out:
2040 	if (error)
2041 		printf("%s: interface not running\n", sc->sc_dev.dv_xname);
2042 	return (error);
2043 }
2044 
2045 /*
2046  * wm_rxdrain:
2047  *
2048  *	Drain the receive queue.
2049  */
2050 void
2051 wm_rxdrain(struct wm_softc *sc)
2052 {
2053 	struct wm_rxsoft *rxs;
2054 	int i;
2055 
2056 	for (i = 0; i < WM_NRXDESC; i++) {
2057 		rxs = &sc->sc_rxsoft[i];
2058 		if (rxs->rxs_mbuf != NULL) {
2059 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2060 			m_freem(rxs->rxs_mbuf);
2061 			rxs->rxs_mbuf = NULL;
2062 		}
2063 	}
2064 }
2065 
2066 /*
2067  * wm_stop:		[ifnet interface function]
2068  *
2069  *	Stop transmission on the interface.
2070  */
2071 void
2072 wm_stop(struct ifnet *ifp, int disable)
2073 {
2074 	struct wm_softc *sc = ifp->if_softc;
2075 	struct wm_txsoft *txs;
2076 	int i;
2077 
2078 	/* Stop the one second clock. */
2079 	callout_stop(&sc->sc_tick_ch);
2080 
2081 	if (sc->sc_flags & WM_F_HAS_MII) {
2082 		/* Down the MII. */
2083 		mii_down(&sc->sc_mii);
2084 	}
2085 
2086 	/* Stop the transmit and receive processes. */
2087 	CSR_WRITE(sc, WMREG_TCTL, 0);
2088 	CSR_WRITE(sc, WMREG_RCTL, 0);
2089 
2090 	/* Release any queued transmit buffers. */
2091 	for (i = 0; i < WM_TXQUEUELEN; i++) {
2092 		txs = &sc->sc_txsoft[i];
2093 		if (txs->txs_mbuf != NULL) {
2094 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
2095 			m_freem(txs->txs_mbuf);
2096 			txs->txs_mbuf = NULL;
2097 		}
2098 	}
2099 
2100 	if (disable)
2101 		wm_rxdrain(sc);
2102 
2103 	/* Mark the interface as down and cancel the watchdog timer. */
2104 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2105 	ifp->if_timer = 0;
2106 }
2107 
2108 /*
2109  * wm_read_eeprom:
2110  *
2111  *	Read data from the serial EEPROM.
2112  */
2113 void
2114 wm_read_eeprom(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
2115 {
2116 	uint32_t reg;
2117 	int i, x;
2118 
2119 	for (i = 0; i < wordcnt; i++) {
2120 		/* Send CHIP SELECT for one clock tick. */
2121 		CSR_WRITE(sc, WMREG_EECD, EECD_CS);
2122 		delay(2);
2123 
2124 		/* Shift in the READ command. */
2125 		for (x = 3; x > 0; x--) {
2126 			reg = EECD_CS;
2127 			if (UWIRE_OPC_READ & (1 << (x - 1)))
2128 				reg |= EECD_DI;
2129 			CSR_WRITE(sc, WMREG_EECD, reg);
2130 			delay(2);
2131 			CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
2132 			delay(2);
2133 			CSR_WRITE(sc, WMREG_EECD, reg);
2134 			delay(2);
2135 		}
2136 
2137 		/* Shift in address. */
2138 		for (x = 6; x > 0; x--) {
2139 			reg = EECD_CS;
2140 			if ((word + i) & (1 << (x - 1)))
2141 				reg |= EECD_DI;
2142 			CSR_WRITE(sc, WMREG_EECD, reg);
2143 			delay(2);
2144 			CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
2145 			delay(2);
2146 			CSR_WRITE(sc, WMREG_EECD, reg);
2147 			delay(2);
2148 		}
2149 
2150 		/* Shift out the data. */
2151 		reg = EECD_CS;
2152 		data[i] = 0;
2153 		for (x = 16; x > 0; x--) {
2154 			CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
2155 			delay(2);
2156 			if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
2157 				data[i] |= (1 << (x - 1));
2158 			CSR_WRITE(sc, WMREG_EECD, reg);
2159 			delay(2);
2160 		}
2161 
2162 		/* Clear CHIP SELECT. */
2163 		CSR_WRITE(sc, WMREG_EECD, 0);
2164 	}
2165 }
2166 
2167 /*
2168  * wm_add_rxbuf:
2169  *
2170  *	Add a receive buffer to the indiciated descriptor.
2171  */
2172 int
2173 wm_add_rxbuf(struct wm_softc *sc, int idx)
2174 {
2175 	struct wm_rxsoft *rxs = &sc->sc_rxsoft[idx];
2176 	struct mbuf *m;
2177 	int error;
2178 
2179 	MGETHDR(m, M_DONTWAIT, MT_DATA);
2180 	if (m == NULL)
2181 		return (ENOBUFS);
2182 
2183 	MCLGET(m, M_DONTWAIT);
2184 	if ((m->m_flags & M_EXT) == 0) {
2185 		m_freem(m);
2186 		return (ENOBUFS);
2187 	}
2188 
2189 	if (rxs->rxs_mbuf != NULL)
2190 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2191 
2192 	rxs->rxs_mbuf = m;
2193 
2194 	error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap,
2195 	    m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
2196 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
2197 	if (error) {
2198 		printf("%s: unable to load rx DMA map %d, error = %d\n",
2199 		    sc->sc_dev.dv_xname, idx, error);
2200 		panic("wm_add_rxbuf");	/* XXX XXX XXX */
2201 	}
2202 
2203 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
2204 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
2205 
2206 	WM_INIT_RXDESC(sc, idx);
2207 
2208 	return (0);
2209 }
2210 
2211 /*
2212  * wm_set_ral:
2213  *
2214  *	Set an entery in the receive address list.
2215  */
2216 static void
2217 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
2218 {
2219 	uint32_t ral_lo, ral_hi;
2220 
2221 	if (enaddr != NULL) {
2222 		ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
2223 		    (enaddr[3] << 24);
2224 		ral_hi = enaddr[4] | (enaddr[5] << 8);
2225 		ral_hi |= RAL_AV;
2226 	} else {
2227 		ral_lo = 0;
2228 		ral_hi = 0;
2229 	}
2230 
2231 	if (sc->sc_type >= WM_T_CORDOVA) {
2232 		CSR_WRITE(sc, WMREG_RAL_LO(WMREG_CORDOVA_RAL_BASE, idx),
2233 		    ral_lo);
2234 		CSR_WRITE(sc, WMREG_RAL_HI(WMREG_CORDOVA_RAL_BASE, idx),
2235 		    ral_hi);
2236 	} else {
2237 		CSR_WRITE(sc, WMREG_RAL_LO(WMREG_RAL_BASE, idx), ral_lo);
2238 		CSR_WRITE(sc, WMREG_RAL_HI(WMREG_RAL_BASE, idx), ral_hi);
2239 	}
2240 }
2241 
2242 /*
2243  * wm_mchash:
2244  *
2245  *	Compute the hash of the multicast address for the 4096-bit
2246  *	multicast filter.
2247  */
2248 static uint32_t
2249 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
2250 {
2251 	static const int lo_shift[4] = { 4, 3, 2, 0 };
2252 	static const int hi_shift[4] = { 4, 5, 6, 8 };
2253 	uint32_t hash;
2254 
2255 	hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
2256 	    (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
2257 
2258 	return (hash & 0xfff);
2259 }
2260 
2261 /*
2262  * wm_set_filter:
2263  *
2264  *	Set up the receive filter.
2265  */
2266 void
2267 wm_set_filter(struct wm_softc *sc)
2268 {
2269 	struct ethercom *ec = &sc->sc_ethercom;
2270 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2271 	struct ether_multi *enm;
2272 	struct ether_multistep step;
2273 	bus_addr_t mta_reg;
2274 	uint32_t hash, reg, bit;
2275 	int i;
2276 
2277 	if (sc->sc_type >= WM_T_CORDOVA)
2278 		mta_reg = WMREG_CORDOVA_MTA;
2279 	else
2280 		mta_reg = WMREG_MTA;
2281 
2282 	sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
2283 
2284 	if (ifp->if_flags & IFF_BROADCAST)
2285 		sc->sc_rctl |= RCTL_BAM;
2286 	if (ifp->if_flags & IFF_PROMISC) {
2287 		sc->sc_rctl |= RCTL_UPE;
2288 		goto allmulti;
2289 	}
2290 
2291 	/*
2292 	 * Set the station address in the first RAL slot, and
2293 	 * clear the remaining slots.
2294 	 */
2295 	wm_set_ral(sc, LLADDR(ifp->if_sadl), 0);
2296 	for (i = 1; i < WM_RAL_TABSIZE; i++)
2297 		wm_set_ral(sc, NULL, i);
2298 
2299 	/* Clear out the multicast table. */
2300 	for (i = 0; i < WM_MC_TABSIZE; i++)
2301 		CSR_WRITE(sc, mta_reg + (i << 2), 0);
2302 
2303 	ETHER_FIRST_MULTI(step, ec, enm);
2304 	while (enm != NULL) {
2305 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
2306 			/*
2307 			 * We must listen to a range of multicast addresses.
2308 			 * For now, just accept all multicasts, rather than
2309 			 * trying to set only those filter bits needed to match
2310 			 * the range.  (At this time, the only use of address
2311 			 * ranges is for IP multicast routing, for which the
2312 			 * range is big enough to require all bits set.)
2313 			 */
2314 			goto allmulti;
2315 		}
2316 
2317 		hash = wm_mchash(sc, enm->enm_addrlo);
2318 
2319 		reg = (hash >> 5) & 0x7f;
2320 		bit = hash & 0x1f;
2321 
2322 		hash = CSR_READ(sc, mta_reg + (reg << 2));
2323 		hash |= 1U << bit;
2324 
2325 		/* XXX Hardware bug?? */
2326 		if (sc->sc_type == WM_T_CORDOVA && (reg & 0xe) == 1) {
2327 			bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
2328 			CSR_WRITE(sc, mta_reg + (reg << 2), hash);
2329 			CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
2330 		} else
2331 			CSR_WRITE(sc, mta_reg + (reg << 2), hash);
2332 
2333 		ETHER_NEXT_MULTI(step, enm);
2334 	}
2335 
2336 	ifp->if_flags &= ~IFF_ALLMULTI;
2337 	goto setit;
2338 
2339  allmulti:
2340 	ifp->if_flags |= IFF_ALLMULTI;
2341 	sc->sc_rctl |= RCTL_MPE;
2342 
2343  setit:
2344 	CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
2345 }
2346 
2347 /*
2348  * wm_tbi_mediainit:
2349  *
2350  *	Initialize media for use on 1000BASE-X devices.
2351  */
2352 void
2353 wm_tbi_mediainit(struct wm_softc *sc)
2354 {
2355 	const char *sep = "";
2356 
2357 	if (sc->sc_type < WM_T_LIVENGOOD)
2358 		sc->sc_tipg = TIPG_WM_DFLT;
2359 	else
2360 		sc->sc_tipg = TIPG_LG_DFLT;
2361 
2362 	ifmedia_init(&sc->sc_mii.mii_media, 0, wm_tbi_mediachange,
2363 	    wm_tbi_mediastatus);
2364 
2365 	/*
2366 	 * SWD Pins:
2367 	 *
2368 	 *	0 = Link LED (output)
2369 	 *	1 = Loss Of Signal (input)
2370 	 */
2371 	sc->sc_ctrl |= CTRL_SWDPIO(0);
2372 	sc->sc_ctrl &= ~CTRL_SWDPIO(1);
2373 
2374 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2375 
2376 #define	ADD(s, m, d)							\
2377 do {									\
2378 	printf("%s%s", sep, s);						\
2379 	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|(m), (d), NULL);	\
2380 	sep = ", ";							\
2381 } while (/*CONSTCOND*/0)
2382 
2383 	printf("%s: ", sc->sc_dev.dv_xname);
2384 	ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
2385 	ADD("1000baseSX-FDX", IFM_1000_SX|IFM_FDX, ANAR_X_FD);
2386 	ADD("auto", IFM_AUTO, ANAR_X_FD|ANAR_X_HD);
2387 	printf("\n");
2388 
2389 #undef ADD
2390 
2391 	ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
2392 }
2393 
2394 /*
2395  * wm_tbi_mediastatus:	[ifmedia interface function]
2396  *
2397  *	Get the current interface media status on a 1000BASE-X device.
2398  */
2399 void
2400 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
2401 {
2402 	struct wm_softc *sc = ifp->if_softc;
2403 
2404 	ifmr->ifm_status = IFM_AVALID;
2405 	ifmr->ifm_active = IFM_ETHER;
2406 
2407 	if (sc->sc_tbi_linkup == 0) {
2408 		ifmr->ifm_active |= IFM_NONE;
2409 		return;
2410 	}
2411 
2412 	ifmr->ifm_status |= IFM_ACTIVE;
2413 	ifmr->ifm_active |= IFM_1000_SX;
2414 	if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
2415 		ifmr->ifm_active |= IFM_FDX;
2416 }
2417 
2418 /*
2419  * wm_tbi_mediachange:	[ifmedia interface function]
2420  *
2421  *	Set hardware to newly-selected media on a 1000BASE-X device.
2422  */
2423 int
2424 wm_tbi_mediachange(struct ifnet *ifp)
2425 {
2426 	struct wm_softc *sc = ifp->if_softc;
2427 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
2428 	uint32_t status;
2429 	int i;
2430 
2431 	sc->sc_txcw = ife->ifm_data;
2432 	if (sc->sc_ctrl & CTRL_RFCE)
2433 		sc->sc_txcw |= ANAR_X_PAUSE_TOWARDS;
2434 	if (sc->sc_ctrl & CTRL_TFCE)
2435 		sc->sc_txcw |= ANAR_X_PAUSE_ASYM;
2436 	sc->sc_txcw |= TXCW_ANE;
2437 
2438 	CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
2439 	delay(10000);
2440 
2441 	sc->sc_tbi_anstate = 0;
2442 
2443 	if ((CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1)) == 0) {
2444 		/* Have signal; wait for the link to come up. */
2445 		for (i = 0; i < 50; i++) {
2446 			delay(10000);
2447 			if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
2448 				break;
2449 		}
2450 
2451 		status = CSR_READ(sc, WMREG_STATUS);
2452 		if (status & STATUS_LU) {
2453 			/* Link is up. */
2454 			DPRINTF(WM_DEBUG_LINK,
2455 			    ("%s: LINK: set media -> link up %s\n",
2456 			    sc->sc_dev.dv_xname,
2457 			    (status & STATUS_FD) ? "FDX" : "HDX"));
2458 			sc->sc_tctl &= ~TCTL_COLD(0x3ff);
2459 			if (status & STATUS_FD)
2460 				sc->sc_tctl |=
2461 				    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
2462 			else
2463 				sc->sc_tctl |=
2464 				    TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
2465 			CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
2466 			sc->sc_tbi_linkup = 1;
2467 		} else {
2468 			/* Link is down. */
2469 			DPRINTF(WM_DEBUG_LINK,
2470 			    ("%s: LINK: set media -> link down\n",
2471 			    sc->sc_dev.dv_xname));
2472 			sc->sc_tbi_linkup = 0;
2473 		}
2474 	} else {
2475 		DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
2476 		    sc->sc_dev.dv_xname));
2477 		sc->sc_tbi_linkup = 0;
2478 	}
2479 
2480 	wm_tbi_set_linkled(sc);
2481 
2482 	return (0);
2483 }
2484 
2485 /*
2486  * wm_tbi_set_linkled:
2487  *
2488  *	Update the link LED on 1000BASE-X devices.
2489  */
2490 void
2491 wm_tbi_set_linkled(struct wm_softc *sc)
2492 {
2493 
2494 	if (sc->sc_tbi_linkup)
2495 		sc->sc_ctrl |= CTRL_SWDPIN(0);
2496 	else
2497 		sc->sc_ctrl &= ~CTRL_SWDPIN(0);
2498 
2499 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2500 }
2501 
2502 /*
2503  * wm_tbi_check_link:
2504  *
2505  *	Check the link on 1000BASE-X devices.
2506  */
2507 void
2508 wm_tbi_check_link(struct wm_softc *sc)
2509 {
2510 	uint32_t rxcw, ctrl, status;
2511 
2512 	if (sc->sc_tbi_anstate == 0)
2513 		return;
2514 	else if (sc->sc_tbi_anstate > 1) {
2515 		DPRINTF(WM_DEBUG_LINK,
2516 		    ("%s: LINK: anstate %d\n", sc->sc_dev.dv_xname,
2517 		    sc->sc_tbi_anstate));
2518 		sc->sc_tbi_anstate--;
2519 		return;
2520 	}
2521 
2522 	sc->sc_tbi_anstate = 0;
2523 
2524 	rxcw = CSR_READ(sc, WMREG_RXCW);
2525 	ctrl = CSR_READ(sc, WMREG_CTRL);
2526 	status = CSR_READ(sc, WMREG_STATUS);
2527 
2528 	if ((status & STATUS_LU) == 0) {
2529 		DPRINTF(WM_DEBUG_LINK,
2530 		    ("%s: LINK: checklink -> down\n", sc->sc_dev.dv_xname));
2531 		sc->sc_tbi_linkup = 0;
2532 	} else {
2533 		DPRINTF(WM_DEBUG_LINK,
2534 		    ("%s: LINK: checklink -> up %s\n", sc->sc_dev.dv_xname,
2535 		    (status & STATUS_FD) ? "FDX" : "HDX"));
2536 		sc->sc_tctl &= ~TCTL_COLD(0x3ff);
2537 		if (status & STATUS_FD)
2538 			sc->sc_tctl |=
2539 			    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
2540 		else
2541 			sc->sc_tctl |=
2542 			    TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
2543 		CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
2544 		sc->sc_tbi_linkup = 1;
2545 	}
2546 
2547 	wm_tbi_set_linkled(sc);
2548 }
2549 
2550 /*
2551  * wm_gmii_reset:
2552  *
2553  *	Reset the PHY.
2554  */
2555 void
2556 wm_gmii_reset(struct wm_softc *sc)
2557 {
2558 	uint32_t reg;
2559 
2560 	if (sc->sc_type >= WM_T_CORDOVA) {
2561 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
2562 		delay(20000);
2563 
2564 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2565 		delay(20000);
2566 	} else {
2567 		/* The PHY reset pin is active-low. */
2568 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
2569 		reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
2570 		    CTRL_EXT_SWDPIN(4));
2571 		reg |= CTRL_EXT_SWDPIO(4);
2572 
2573 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
2574 		delay(10);
2575 
2576 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2577 		delay(10);
2578 
2579 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
2580 		delay(10);
2581 #if 0
2582 		sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
2583 #endif
2584 	}
2585 }
2586 
2587 /*
2588  * wm_gmii_mediainit:
2589  *
2590  *	Initialize media for use on 1000BASE-T devices.
2591  */
2592 void
2593 wm_gmii_mediainit(struct wm_softc *sc)
2594 {
2595 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2596 
2597 	/* We have MII. */
2598 	sc->sc_flags |= WM_F_HAS_MII;
2599 
2600 	sc->sc_tipg = TIPG_1000T_DFLT;
2601 
2602 	/*
2603 	 * Let the chip set speed/duplex on its own based on
2604 	 * signals from the PHY.
2605 	 */
2606 	sc->sc_ctrl |= CTRL_SLU | CTRL_ASDE;
2607 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2608 
2609 	/* Initialize our media structures and probe the GMII. */
2610 	sc->sc_mii.mii_ifp = ifp;
2611 
2612 	if (sc->sc_type >= WM_T_CORDOVA) {
2613 		sc->sc_mii.mii_readreg = wm_gmii_cordova_readreg;
2614 		sc->sc_mii.mii_writereg = wm_gmii_cordova_writereg;
2615 	} else {
2616 		sc->sc_mii.mii_readreg = wm_gmii_livengood_readreg;
2617 		sc->sc_mii.mii_writereg = wm_gmii_livengood_writereg;
2618 	}
2619 	sc->sc_mii.mii_statchg = wm_gmii_statchg;
2620 
2621 	wm_gmii_reset(sc);
2622 
2623 	ifmedia_init(&sc->sc_mii.mii_media, 0, wm_gmii_mediachange,
2624 	    wm_gmii_mediastatus);
2625 
2626 	mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
2627 	    MII_OFFSET_ANY, 0);
2628 	if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
2629 		ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL);
2630 		ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE);
2631 	} else
2632 		ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
2633 }
2634 
2635 /*
2636  * wm_gmii_mediastatus:	[ifmedia interface function]
2637  *
2638  *	Get the current interface media status on a 1000BASE-T device.
2639  */
2640 void
2641 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
2642 {
2643 	struct wm_softc *sc = ifp->if_softc;
2644 
2645 	mii_pollstat(&sc->sc_mii);
2646 	ifmr->ifm_status = sc->sc_mii.mii_media_status;
2647 	ifmr->ifm_active = sc->sc_mii.mii_media_active;
2648 }
2649 
2650 /*
2651  * wm_gmii_mediachange:	[ifmedia interface function]
2652  *
2653  *	Set hardware to newly-selected media on a 1000BASE-T device.
2654  */
2655 int
2656 wm_gmii_mediachange(struct ifnet *ifp)
2657 {
2658 	struct wm_softc *sc = ifp->if_softc;
2659 
2660 	if (ifp->if_flags & IFF_UP)
2661 		mii_mediachg(&sc->sc_mii);
2662 	return (0);
2663 }
2664 
2665 #define	MDI_IO		CTRL_SWDPIN(2)
2666 #define	MDI_DIR		CTRL_SWDPIO(2)	/* host -> PHY */
2667 #define	MDI_CLK		CTRL_SWDPIN(3)
2668 
2669 static void
2670 livengood_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
2671 {
2672 	uint32_t i, v;
2673 
2674 	v = CSR_READ(sc, WMREG_CTRL);
2675 	v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
2676 	v |= MDI_DIR | CTRL_SWDPIO(3);
2677 
2678 	for (i = 1 << (nbits - 1); i != 0; i >>= 1) {
2679 		if (data & i)
2680 			v |= MDI_IO;
2681 		else
2682 			v &= ~MDI_IO;
2683 		CSR_WRITE(sc, WMREG_CTRL, v);
2684 		delay(10);
2685 		CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
2686 		delay(10);
2687 		CSR_WRITE(sc, WMREG_CTRL, v);
2688 		delay(10);
2689 	}
2690 }
2691 
2692 static uint32_t
2693 livengood_mii_recvbits(struct wm_softc *sc)
2694 {
2695 	uint32_t v, i, data = 0;
2696 
2697 	v = CSR_READ(sc, WMREG_CTRL);
2698 	v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
2699 	v |= CTRL_SWDPIO(3);
2700 
2701 	CSR_WRITE(sc, WMREG_CTRL, v);
2702 	delay(10);
2703 	CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
2704 	delay(10);
2705 	CSR_WRITE(sc, WMREG_CTRL, v);
2706 	delay(10);
2707 
2708 	for (i = 0; i < 16; i++) {
2709 		data <<= 1;
2710 		CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
2711 		delay(10);
2712 		if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
2713 			data |= 1;
2714 		CSR_WRITE(sc, WMREG_CTRL, v);
2715 		delay(10);
2716 	}
2717 
2718 	CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
2719 	delay(10);
2720 	CSR_WRITE(sc, WMREG_CTRL, v);
2721 	delay(10);
2722 
2723 	return (data);
2724 }
2725 
2726 #undef MDI_IO
2727 #undef MDI_DIR
2728 #undef MDI_CLK
2729 
2730 /*
2731  * wm_gmii_livengood_readreg:	[mii interface function]
2732  *
2733  *	Read a PHY register on the GMII (Livengood version).
2734  */
2735 int
2736 wm_gmii_livengood_readreg(struct device *self, int phy, int reg)
2737 {
2738 	struct wm_softc *sc = (void *) self;
2739 	int rv;
2740 
2741 	livengood_mii_sendbits(sc, 0xffffffffU, 32);
2742 	livengood_mii_sendbits(sc, reg | (phy << 5) |
2743 	    (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
2744 	rv = livengood_mii_recvbits(sc) & 0xffff;
2745 
2746 	DPRINTF(WM_DEBUG_GMII,
2747 	    ("%s: GMII: read phy %d reg %d -> 0x%04x\n",
2748 	    sc->sc_dev.dv_xname, phy, reg, rv));
2749 
2750 	return (rv);
2751 }
2752 
2753 /*
2754  * wm_gmii_livengood_writereg:	[mii interface function]
2755  *
2756  *	Write a PHY register on the GMII (Livengood version).
2757  */
2758 void
2759 wm_gmii_livengood_writereg(struct device *self, int phy, int reg, int val)
2760 {
2761 	struct wm_softc *sc = (void *) self;
2762 
2763 	livengood_mii_sendbits(sc, 0xffffffffU, 32);
2764 	livengood_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
2765 	    (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
2766 	    (MII_COMMAND_START << 30), 32);
2767 }
2768 
2769 /*
2770  * wm_gmii_cordova_readreg:	[mii interface function]
2771  *
2772  *	Read a PHY register on the GMII.
2773  */
2774 int
2775 wm_gmii_cordova_readreg(struct device *self, int phy, int reg)
2776 {
2777 	struct wm_softc *sc = (void *) self;
2778 	uint32_t mdic;
2779 	int i, rv;
2780 
2781 	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
2782 	    MDIC_REGADD(reg));
2783 
2784 	for (i = 0; i < 100; i++) {
2785 		mdic = CSR_READ(sc, WMREG_MDIC);
2786 		if (mdic & MDIC_READY)
2787 			break;
2788 		delay(10);
2789 	}
2790 
2791 	if ((mdic & MDIC_READY) == 0) {
2792 		printf("%s: MDIC read timed out: phy %d reg %d\n",
2793 		    sc->sc_dev.dv_xname, phy, reg);
2794 		rv = 0;
2795 	} else if (mdic & MDIC_E) {
2796 #if 0 /* This is normal if no PHY is present. */
2797 		printf("%s: MDIC read error: phy %d reg %d\n",
2798 		    sc->sc_dev.dv_xname, phy, reg);
2799 #endif
2800 		rv = 0;
2801 	} else {
2802 		rv = MDIC_DATA(mdic);
2803 		if (rv == 0xffff)
2804 			rv = 0;
2805 	}
2806 
2807 	return (rv);
2808 }
2809 
2810 /*
2811  * wm_gmii_cordova_writereg:	[mii interface function]
2812  *
2813  *	Write a PHY register on the GMII.
2814  */
2815 void
2816 wm_gmii_cordova_writereg(struct device *self, int phy, int reg, int val)
2817 {
2818 	struct wm_softc *sc = (void *) self;
2819 	uint32_t mdic;
2820 	int i;
2821 
2822 	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
2823 	    MDIC_REGADD(reg) | MDIC_DATA(val));
2824 
2825 	for (i = 0; i < 100; i++) {
2826 		mdic = CSR_READ(sc, WMREG_MDIC);
2827 		if (mdic & MDIC_READY)
2828 			break;
2829 		delay(10);
2830 	}
2831 
2832 	if ((mdic & MDIC_READY) == 0)
2833 		printf("%s: MDIC write timed out: phy %d reg %d\n",
2834 		    sc->sc_dev.dv_xname, phy, reg);
2835 	else if (mdic & MDIC_E)
2836 		printf("%s: MDIC write error: phy %d reg %d\n",
2837 		    sc->sc_dev.dv_xname, phy, reg);
2838 }
2839 
2840 /*
2841  * wm_gmii_statchg:	[mii interface function]
2842  *
2843  *	Callback from MII layer when media changes.
2844  */
2845 void
2846 wm_gmii_statchg(struct device *self)
2847 {
2848 	struct wm_softc *sc = (void *) self;
2849 
2850 	sc->sc_tctl &= ~TCTL_COLD(0x3ff);
2851 
2852 	if (sc->sc_mii.mii_media_active & IFM_FDX) {
2853 		DPRINTF(WM_DEBUG_LINK,
2854 		    ("%s: LINK: statchg: FDX\n", sc->sc_dev.dv_xname));
2855 		sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
2856 	} else  {
2857 		DPRINTF(WM_DEBUG_LINK,
2858 		    ("%s: LINK: statchg: HDX\n", sc->sc_dev.dv_xname));
2859 		sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
2860 	}
2861 
2862 	CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
2863 }
2864