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