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