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