1 /* $NetBSD: tulip.c,v 1.26 1999/09/30 22:28:11 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9 * NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Device driver for the Digital Semiconductor ``Tulip'' (21x4x) 42 * Ethernet controller family, and a variety of clone chips. 43 */ 44 45 #include "opt_inet.h" 46 #include "opt_ns.h" 47 #include "bpfilter.h" 48 49 #include <sys/param.h> 50 #include <sys/systm.h> 51 #include <sys/mbuf.h> 52 #include <sys/malloc.h> 53 #include <sys/kernel.h> 54 #include <sys/socket.h> 55 #include <sys/ioctl.h> 56 #include <sys/errno.h> 57 #include <sys/device.h> 58 59 #include <vm/vm.h> /* for PAGE_SIZE */ 60 61 #include <net/if.h> 62 #include <net/if_dl.h> 63 #include <net/if_media.h> 64 #include <net/if_ether.h> 65 66 #if NBPFILTER > 0 67 #include <net/bpf.h> 68 #endif 69 70 #ifdef INET 71 #include <netinet/in.h> 72 #include <netinet/if_inarp.h> 73 #endif 74 75 #ifdef NS 76 #include <netns/ns.h> 77 #include <netns/ns_if.h> 78 #endif 79 80 #include <machine/bus.h> 81 #include <machine/intr.h> 82 83 #include <dev/mii/mii.h> 84 #include <dev/mii/miivar.h> 85 86 #include <dev/ic/tulipreg.h> 87 #include <dev/ic/tulipvar.h> 88 89 /* 90 * The following tables compute the transmit threshold mode. We start 91 * at index 0. When ever we get a transmit underrun, we increment our 92 * index, falling back if we encounter the NULL terminator. 93 * 94 * Note: Store and forward mode is only available on the 100mbps chips 95 * (21140 and higher). 96 */ 97 const struct tulip_txthresh_tab tlp_10_txthresh_tab[] = { 98 { OPMODE_TR_72, "72 bytes" }, 99 { OPMODE_TR_96, "96 bytes" }, 100 { OPMODE_TR_128, "128 bytes" }, 101 { OPMODE_TR_160, "160 bytes" }, 102 { 0, NULL }, 103 }; 104 105 const struct tulip_txthresh_tab tlp_10_100_txthresh_tab[] = { 106 { OPMODE_TR_72, "72/128 bytes" }, 107 { OPMODE_TR_96, "96/256 bytes" }, 108 { OPMODE_TR_128, "128/512 bytes" }, 109 { OPMODE_TR_160, "160/1024 bytes" }, 110 { OPMODE_SF, "store and forward mode" }, 111 { 0, NULL }, 112 }; 113 114 #define TXTH_72 0 115 #define TXTH_96 1 116 #define TXTH_128 2 117 #define TXTH_160 3 118 #define TXTH_SF 4 119 120 /* 121 * The Winbond 89C840F does transmit threshold control totally 122 * differently. It simply has a 7-bit field which indicates 123 * the threshold: 124 * 125 * txth = ((OPMODE & OPMODE_WINB_TTH) >> OPMODE_WINB_TTH_SHIFT) * 16; 126 * 127 * However, we just do Store-and-Forward mode on these chips, since 128 * the DMA engines seem to be flaky. 129 */ 130 const struct tulip_txthresh_tab tlp_winb_txthresh_tab[] = { 131 { 0, "store and forward mode" }, 132 { 0, NULL }, 133 }; 134 135 #define TXTH_WINB_SF 0 136 137 void tlp_start __P((struct ifnet *)); 138 void tlp_watchdog __P((struct ifnet *)); 139 int tlp_ioctl __P((struct ifnet *, u_long, caddr_t)); 140 141 void tlp_shutdown __P((void *)); 142 143 void tlp_reset __P((struct tulip_softc *)); 144 int tlp_init __P((struct tulip_softc *)); 145 void tlp_rxdrain __P((struct tulip_softc *)); 146 void tlp_stop __P((struct tulip_softc *, int)); 147 int tlp_add_rxbuf __P((struct tulip_softc *, int)); 148 void tlp_idle __P((struct tulip_softc *, u_int32_t)); 149 void tlp_srom_idle __P((struct tulip_softc *)); 150 151 void tlp_filter_setup __P((struct tulip_softc *)); 152 void tlp_winb_filter_setup __P((struct tulip_softc *)); 153 void tlp_al981_filter_setup __P((struct tulip_softc *)); 154 155 void tlp_rxintr __P((struct tulip_softc *)); 156 void tlp_txintr __P((struct tulip_softc *)); 157 158 void tlp_mii_tick __P((void *)); 159 void tlp_mii_statchg __P((struct device *)); 160 void tlp_winb_mii_statchg __P((struct device *)); 161 162 void tlp_mii_getmedia __P((struct tulip_softc *, struct ifmediareq *)); 163 int tlp_mii_setmedia __P((struct tulip_softc *)); 164 165 void tlp_sio_mii_sync __P((struct tulip_softc *)); 166 void tlp_sio_mii_sendbits __P((struct tulip_softc *, u_int32_t, int)); 167 int tlp_sio_mii_readreg __P((struct device *, int, int)); 168 void tlp_sio_mii_writereg __P((struct device *, int, int, int)); 169 170 int tlp_pnic_mii_readreg __P((struct device *, int, int)); 171 void tlp_pnic_mii_writereg __P((struct device *, int, int, int)); 172 173 int tlp_al981_mii_readreg __P((struct device *, int, int)); 174 void tlp_al981_mii_writereg __P((struct device *, int, int, int)); 175 176 void tlp_2114x_preinit __P((struct tulip_softc *)); 177 void tlp_pnic_preinit __P((struct tulip_softc *)); 178 179 void tlp_21140_reset __P((struct tulip_softc *)); 180 void tlp_pmac_reset __P((struct tulip_softc *)); 181 182 u_int32_t tlp_crc32 __P((const u_int8_t *, size_t)); 183 #define tlp_mchash(addr, sz) (tlp_crc32((addr), ETHER_ADDR_LEN) & ((sz) - 1)) 184 185 #ifdef TLP_DEBUG 186 #define DPRINTF(sc, x) if ((sc)->sc_ethercom.ec_if.if_flags & IFF_DEBUG) \ 187 printf x 188 #else 189 #define DPRINTF(sc, x) /* nothing */ 190 #endif 191 192 #ifdef TLP_STATS 193 void tlp_print_stats __P((struct tulip_softc *)); 194 #endif 195 196 /* 197 * tlp_attach: 198 * 199 * Attach a Tulip interface to the system. 200 */ 201 void 202 tlp_attach(sc, enaddr) 203 struct tulip_softc *sc; 204 const u_int8_t *enaddr; 205 { 206 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 207 int i, rseg, error; 208 bus_dma_segment_t seg; 209 210 /* 211 * NOTE: WE EXPECT THE FRONT-END TO INITIALIZE sc_regshift! 212 */ 213 214 /* 215 * Setup the transmit threshold table. 216 */ 217 switch (sc->sc_chip) { 218 case TULIP_CHIP_DE425: 219 case TULIP_CHIP_21040: 220 case TULIP_CHIP_21041: 221 sc->sc_txth = tlp_10_txthresh_tab; 222 break; 223 224 default: 225 sc->sc_txth = tlp_10_100_txthresh_tab; 226 break; 227 } 228 229 /* 230 * Setup the filter setup function. 231 */ 232 switch (sc->sc_chip) { 233 case TULIP_CHIP_WB89C840F: 234 sc->sc_filter_setup = tlp_winb_filter_setup; 235 break; 236 237 case TULIP_CHIP_AL981: 238 sc->sc_filter_setup = tlp_al981_filter_setup; 239 break; 240 241 default: 242 sc->sc_filter_setup = tlp_filter_setup; 243 break; 244 } 245 246 /* 247 * Set up the media status change function. 248 */ 249 switch (sc->sc_chip) { 250 case TULIP_CHIP_WB89C840F: 251 sc->sc_statchg = tlp_winb_mii_statchg; 252 break; 253 254 default: 255 /* 256 * We may override this if we have special media 257 * handling requirements (e.g. flipping GPIO pins). 258 * 259 * The pure-MII statchg function covers the basics. 260 */ 261 sc->sc_statchg = tlp_mii_statchg; 262 break; 263 } 264 265 /* 266 * Set up various chip-specific quirks. 267 */ 268 switch (sc->sc_chip) { 269 case TULIP_CHIP_21140: 270 case TULIP_CHIP_21140A: 271 case TULIP_CHIP_21142: 272 case TULIP_CHIP_21143: 273 sc->sc_preinit = tlp_2114x_preinit; 274 break; 275 276 case TULIP_CHIP_82C168: 277 case TULIP_CHIP_82C169: 278 sc->sc_preinit = tlp_pnic_preinit; 279 280 /* 281 * These chips seem to have busted DMA engines; just put them 282 * in Store-and-Forward mode from the get-go. 283 */ 284 sc->sc_txthresh = TXTH_SF; 285 break; 286 287 case TULIP_CHIP_WB89C840F: 288 sc->sc_flags |= TULIPF_IC_FS; 289 break; 290 291 default: 292 /* Nothing. */ 293 } 294 295 SIMPLEQ_INIT(&sc->sc_txfreeq); 296 SIMPLEQ_INIT(&sc->sc_txdirtyq); 297 298 /* 299 * Allocate the control data structures, and create and load the 300 * DMA map for it. 301 */ 302 if ((error = bus_dmamem_alloc(sc->sc_dmat, 303 sizeof(struct tulip_control_data), PAGE_SIZE, 0, &seg, 1, &rseg, 304 0)) != 0) { 305 printf("%s: unable to allocate control data, error = %d\n", 306 sc->sc_dev.dv_xname, error); 307 goto fail_0; 308 } 309 310 if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 311 sizeof(struct tulip_control_data), (caddr_t *)&sc->sc_control_data, 312 BUS_DMA_COHERENT)) != 0) { 313 printf("%s: unable to map control data, error = %d\n", 314 sc->sc_dev.dv_xname, error); 315 goto fail_1; 316 } 317 318 if ((error = bus_dmamap_create(sc->sc_dmat, 319 sizeof(struct tulip_control_data), 1, 320 sizeof(struct tulip_control_data), 0, 0, &sc->sc_cddmamap)) != 0) { 321 printf("%s: unable to create control data DMA map, " 322 "error = %d\n", sc->sc_dev.dv_xname, error); 323 goto fail_2; 324 } 325 326 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap, 327 sc->sc_control_data, sizeof(struct tulip_control_data), NULL, 328 0)) != 0) { 329 printf("%s: unable to load control data DMA map, error = %d\n", 330 sc->sc_dev.dv_xname, error); 331 goto fail_3; 332 } 333 334 /* 335 * Create the transmit buffer DMA maps. 336 */ 337 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 338 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 339 TULIP_NTXSEGS, MCLBYTES, 0, 0, 340 &sc->sc_txsoft[i].txs_dmamap)) != 0) { 341 printf("%s: unable to create tx DMA map %d, " 342 "error = %d\n", sc->sc_dev.dv_xname, i, error); 343 goto fail_4; 344 } 345 } 346 347 /* 348 * Create the recieve buffer DMA maps. 349 */ 350 for (i = 0; i < TULIP_NRXDESC; i++) { 351 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 352 MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) { 353 printf("%s: unable to create rx DMA map %d, " 354 "error = %d\n", sc->sc_dev.dv_xname, i, error); 355 goto fail_5; 356 } 357 sc->sc_rxsoft[i].rxs_mbuf = NULL; 358 } 359 360 /* 361 * Reset the chip to a known state. 362 */ 363 tlp_reset(sc); 364 365 /* Announce ourselves. */ 366 printf("%s: %s%sEthernet address %s\n", sc->sc_dev.dv_xname, 367 sc->sc_name[0] != '\0' ? sc->sc_name : "", 368 sc->sc_name[0] != '\0' ? ", " : "", 369 ether_sprintf(enaddr)); 370 371 /* 372 * Initialize our media structures. This may probe the MII, if 373 * present. 374 */ 375 (*sc->sc_mediasw->tmsw_init)(sc); 376 377 ifp = &sc->sc_ethercom.ec_if; 378 strcpy(ifp->if_xname, sc->sc_dev.dv_xname); 379 ifp->if_softc = sc; 380 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 381 ifp->if_ioctl = tlp_ioctl; 382 ifp->if_start = tlp_start; 383 ifp->if_watchdog = tlp_watchdog; 384 385 /* 386 * Attach the interface. 387 */ 388 if_attach(ifp); 389 ether_ifattach(ifp, enaddr); 390 #if NBPFILTER > 0 391 bpfattach(&sc->sc_ethercom.ec_if.if_bpf, ifp, DLT_EN10MB, 392 sizeof(struct ether_header)); 393 #endif 394 395 /* 396 * Make sure the interface is shutdown during reboot. 397 */ 398 sc->sc_sdhook = shutdownhook_establish(tlp_shutdown, sc); 399 if (sc->sc_sdhook == NULL) 400 printf("%s: WARNING: unable to establish shutdown hook\n", 401 sc->sc_dev.dv_xname); 402 return; 403 404 /* 405 * Free any resources we've allocated during the failed attach 406 * attempt. Do this in reverse order and fall through. 407 */ 408 fail_5: 409 for (i = 0; i < TULIP_NRXDESC; i++) { 410 if (sc->sc_rxsoft[i].rxs_dmamap != NULL) 411 bus_dmamap_destroy(sc->sc_dmat, 412 sc->sc_rxsoft[i].rxs_dmamap); 413 } 414 fail_4: 415 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 416 if (sc->sc_txsoft[i].txs_dmamap != NULL) 417 bus_dmamap_destroy(sc->sc_dmat, 418 sc->sc_txsoft[i].txs_dmamap); 419 } 420 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 421 fail_3: 422 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 423 fail_2: 424 bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_control_data, 425 sizeof(struct tulip_control_data)); 426 fail_1: 427 bus_dmamem_free(sc->sc_dmat, &seg, rseg); 428 fail_0: 429 return; 430 } 431 432 /* 433 * tlp_shutdown: 434 * 435 * Make sure the interface is stopped at reboot time. 436 */ 437 void 438 tlp_shutdown(arg) 439 void *arg; 440 { 441 struct tulip_softc *sc = arg; 442 443 tlp_stop(sc, 1); 444 } 445 446 /* 447 * tlp_start: [ifnet interface function] 448 * 449 * Start packet transmission on the interface. 450 */ 451 void 452 tlp_start(ifp) 453 struct ifnet *ifp; 454 { 455 struct tulip_softc *sc = ifp->if_softc; 456 struct mbuf *m0, *m; 457 struct tulip_txsoft *txs, *last_txs; 458 bus_dmamap_t dmamap; 459 int error, firsttx, nexttx, lasttx, ofree, seg; 460 461 DPRINTF(sc, ("%s: tlp_start: sc_flags 0x%08x, if_flags 0x%08x\n", 462 sc->sc_dev.dv_xname, sc->sc_flags, ifp->if_flags)); 463 464 /* 465 * If we want a filter setup, it means no more descriptors were 466 * available for the setup routine. Let it get a chance to wedge 467 * itself into the ring. 468 */ 469 if (sc->sc_flags & TULIPF_WANT_SETUP) 470 ifp->if_flags |= IFF_OACTIVE; 471 472 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING) 473 return; 474 475 /* 476 * Remember the previous number of free descriptors and 477 * the first descriptor we'll use. 478 */ 479 ofree = sc->sc_txfree; 480 firsttx = sc->sc_txnext; 481 482 DPRINTF(sc, ("%s: tlp_start: txfree %d, txnext %d\n", 483 sc->sc_dev.dv_xname, ofree, firsttx)); 484 485 /* 486 * Loop through the send queue, setting up transmit descriptors 487 * until we drain the queue, or use up all available transmit 488 * descriptors. 489 */ 490 while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL && 491 sc->sc_txfree != 0) { 492 /* 493 * Grab a packet off the queue. 494 */ 495 IF_DEQUEUE(&ifp->if_snd, m0); 496 if (m0 == NULL) 497 break; 498 499 dmamap = txs->txs_dmamap; 500 501 /* 502 * Load the DMA map. If this fails, the packet either 503 * didn't fit in the alloted number of segments, or we were 504 * short on resources. In this case, we'll copy and try 505 * again. 506 */ 507 if (bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 508 BUS_DMA_NOWAIT) != 0) { 509 MGETHDR(m, M_DONTWAIT, MT_DATA); 510 if (m == NULL) { 511 printf("%s: unable to allocate Tx mbuf\n", 512 sc->sc_dev.dv_xname); 513 IF_PREPEND(&ifp->if_snd, m0); 514 break; 515 } 516 if (m0->m_pkthdr.len > MHLEN) { 517 MCLGET(m, M_DONTWAIT); 518 if ((m->m_flags & M_EXT) == 0) { 519 printf("%s: unable to allocate Tx " 520 "cluster\n", sc->sc_dev.dv_xname); 521 m_freem(m); 522 IF_PREPEND(&ifp->if_snd, m0); 523 break; 524 } 525 } 526 m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t)); 527 m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len; 528 m_freem(m0); 529 m0 = m; 530 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, 531 m0, BUS_DMA_NOWAIT); 532 if (error) { 533 printf("%s: unable to load Tx buffer, " 534 "error = %d\n", sc->sc_dev.dv_xname, error); 535 IF_PREPEND(&ifp->if_snd, m0); 536 break; 537 } 538 } 539 540 /* 541 * Ensure we have enough descriptors free to describe 542 * the packet. 543 */ 544 if (dmamap->dm_nsegs > sc->sc_txfree) { 545 /* 546 * Not enough free descriptors to transmit this 547 * packet. We haven't committed to anything yet, 548 * so just unload the DMA map, put the packet 549 * back on the queue, and punt. Notify the upper 550 * layer that there are no more slots left. 551 * 552 * XXX We could allocate an mbuf and copy, but 553 * XXX it is worth it? 554 */ 555 ifp->if_flags |= IFF_OACTIVE; 556 bus_dmamap_unload(sc->sc_dmat, dmamap); 557 IF_PREPEND(&ifp->if_snd, m0); 558 break; 559 } 560 561 /* 562 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. 563 */ 564 565 /* Sync the DMA map. */ 566 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 567 BUS_DMASYNC_PREWRITE); 568 569 /* 570 * Initialize the transmit descriptors. 571 */ 572 for (nexttx = sc->sc_txnext, seg = 0; 573 seg < dmamap->dm_nsegs; 574 seg++, nexttx = TULIP_NEXTTX(nexttx)) { 575 /* 576 * If this is the first descriptor we're 577 * enqueueing, don't set the OWN bit just 578 * yet. That could cause a race condition. 579 * We'll do it below. 580 */ 581 sc->sc_txdescs[nexttx].td_status = 582 (nexttx == firsttx) ? 0 : TDSTAT_OWN; 583 sc->sc_txdescs[nexttx].td_bufaddr1 = 584 dmamap->dm_segs[seg].ds_addr; 585 sc->sc_txdescs[nexttx].td_ctl = 586 (dmamap->dm_segs[seg].ds_len << TDCTL_SIZE1_SHIFT) | 587 TDCTL_CH; 588 lasttx = nexttx; 589 } 590 591 /* Set `first segment' and `last segment' appropriately. */ 592 sc->sc_txdescs[sc->sc_txnext].td_ctl |= TDCTL_Tx_FS; 593 sc->sc_txdescs[lasttx].td_ctl |= TDCTL_Tx_LS; 594 595 #ifdef TLP_DEBUG 596 if (ifp->if_flags & IFF_DEBUG) { 597 printf(" txsoft %p trainsmit chain:\n", txs); 598 for (seg = sc->sc_txnext;; seg = TULIP_NEXTTX(seg)) { 599 printf(" descriptor %d:\n", seg); 600 printf(" td_status: 0x%08x\n", 601 sc->sc_txdescs[seg].td_status); 602 printf(" td_ctl: 0x%08x\n", 603 sc->sc_txdescs[seg].td_ctl); 604 printf(" td_bufaddr1: 0x%08x\n", 605 sc->sc_txdescs[seg].td_bufaddr1); 606 printf(" td_bufaddr2: 0x%08x\n", 607 sc->sc_txdescs[seg].td_bufaddr2); 608 if (seg == lasttx) 609 break; 610 } 611 } 612 #endif 613 614 /* Sync the descriptors we're using. */ 615 TULIP_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs, 616 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 617 618 /* 619 * Store a pointer to the packet so we can free it later, 620 * and remember what txdirty will be once the packet is 621 * done. 622 */ 623 txs->txs_mbuf = m0; 624 txs->txs_firstdesc = sc->sc_txnext; 625 txs->txs_lastdesc = lasttx; 626 627 /* Advance the tx pointer. */ 628 sc->sc_txfree -= dmamap->dm_nsegs; 629 sc->sc_txnext = nexttx; 630 631 SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs, txs_q); 632 SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q); 633 634 last_txs = txs; 635 636 #if NBPFILTER > 0 637 /* 638 * Pass the packet to any BPF listeners. 639 */ 640 if (ifp->if_bpf) 641 bpf_mtap(ifp->if_bpf, m0); 642 #endif /* NBPFILTER > 0 */ 643 } 644 645 if (txs == NULL || sc->sc_txfree == 0) { 646 /* No more slots left; notify upper layer. */ 647 ifp->if_flags |= IFF_OACTIVE; 648 } 649 650 if (sc->sc_txfree != ofree) { 651 DPRINTF(sc, ("%s: packets enqueued, IC on %d, OWN on %d\n", 652 sc->sc_dev.dv_xname, lasttx, firsttx)); 653 /* 654 * Cause a transmit interrupt to happen on the 655 * last packet we enqueued. 656 */ 657 sc->sc_txdescs[lasttx].td_ctl |= TDCTL_Tx_IC; 658 TULIP_CDTXSYNC(sc, lasttx, 1, 659 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 660 661 /* 662 * Some clone chips want IC on the *first* segment in 663 * the packet. Appease them. 664 */ 665 if ((sc->sc_flags & TULIPF_IC_FS) != 0 && 666 last_txs->txs_firstdesc != lasttx) { 667 sc->sc_txdescs[last_txs->txs_firstdesc].td_ctl |= 668 TDCTL_Tx_IC; 669 TULIP_CDTXSYNC(sc, last_txs->txs_firstdesc, 1, 670 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 671 } 672 673 /* 674 * The entire packet chain is set up. Give the 675 * first descriptor to the chip now. 676 */ 677 sc->sc_txdescs[firsttx].td_status |= TDSTAT_OWN; 678 TULIP_CDTXSYNC(sc, firsttx, 1, 679 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 680 681 /* Wake up the transmitter. */ 682 /* XXX USE AUTOPOLLING? */ 683 TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD); 684 685 /* Set a watchdog timer in case the chip flakes out. */ 686 ifp->if_timer = 5; 687 } 688 } 689 690 /* 691 * tlp_watchdog: [ifnet interface function] 692 * 693 * Watchdog timer handler. 694 */ 695 void 696 tlp_watchdog(ifp) 697 struct ifnet *ifp; 698 { 699 struct tulip_softc *sc = ifp->if_softc; 700 int doing_setup, doing_transmit; 701 702 doing_setup = (sc->sc_flags & TULIPF_DOING_SETUP); 703 doing_transmit = (SIMPLEQ_FIRST(&sc->sc_txdirtyq) != NULL); 704 705 if (doing_setup && doing_transmit) { 706 printf("%s: filter setup and transmit timeout\n", 707 sc->sc_dev.dv_xname); 708 ifp->if_oerrors++; 709 } else if (doing_transmit) { 710 printf("%s: transmit timeout\n", sc->sc_dev.dv_xname); 711 ifp->if_oerrors++; 712 } else if (doing_setup) 713 printf("%s: filter setup timeout\n", sc->sc_dev.dv_xname); 714 else 715 printf("%s: spurious watchdog timeout\n", sc->sc_dev.dv_xname); 716 717 (void) tlp_init(sc); 718 719 /* Try to get more packets going. */ 720 tlp_start(ifp); 721 } 722 723 /* 724 * tlp_ioctl: [ifnet interface function] 725 * 726 * Handle control requests from the operator. 727 */ 728 int 729 tlp_ioctl(ifp, cmd, data) 730 struct ifnet *ifp; 731 u_long cmd; 732 caddr_t data; 733 { 734 struct tulip_softc *sc = ifp->if_softc; 735 struct ifreq *ifr = (struct ifreq *)data; 736 struct ifaddr *ifa = (struct ifaddr *)data; 737 int s, error = 0; 738 739 s = splnet(); 740 741 switch (cmd) { 742 case SIOCSIFADDR: 743 ifp->if_flags |= IFF_UP; 744 745 switch (ifa->ifa_addr->sa_family) { 746 #ifdef INET 747 case AF_INET: 748 if ((error = tlp_init(sc)) != 0) 749 break; 750 arp_ifinit(ifp, ifa); 751 break; 752 #endif /* INET */ 753 #ifdef NS 754 case AF_NS: 755 { 756 struct ns_addr *ina = &IA_SNS(ifa)->sns_addr; 757 758 if (ns_nullhost(*ina)) 759 ina->x_host = *(union ns_host *) 760 LLADDR(ifp->if_sadl); 761 else 762 bcopy(ina->x_host.c_host, LLADDR(ifp->if_sadl), 763 ifp->if_addrlen); 764 /* Set new address. */ 765 error = tlp_init(sc); 766 break; 767 } 768 #endif /* NS */ 769 default: 770 error = tlp_init(sc); 771 break; 772 } 773 break; 774 775 case SIOCSIFMTU: 776 if (ifr->ifr_mtu > ETHERMTU) 777 error = EINVAL; 778 else 779 ifp->if_mtu = ifr->ifr_mtu; 780 break; 781 782 case SIOCSIFFLAGS: 783 #ifdef TLP_STATS 784 if (ifp->if_flags & IFF_DEBUG) 785 tlp_print_stats(sc); 786 #endif 787 if ((ifp->if_flags & IFF_UP) == 0 && 788 (ifp->if_flags & IFF_RUNNING) != 0) { 789 /* 790 * If interface is marked down and it is running, then 791 * stop it. 792 */ 793 tlp_stop(sc, 1); 794 } else if ((ifp->if_flags & IFF_UP) != 0 && 795 (ifp->if_flags & IFF_RUNNING) == 0) { 796 /* 797 * If interfase it marked up and it is stopped, then 798 * start it. 799 */ 800 error = tlp_init(sc); 801 } else if ((ifp->if_flags & IFF_UP) != 0) { 802 /* 803 * Reset the interface to pick up changes in any other 804 * flags that affect the hardware state. 805 */ 806 error = tlp_init(sc); 807 } 808 break; 809 810 case SIOCADDMULTI: 811 case SIOCDELMULTI: 812 error = (cmd == SIOCADDMULTI) ? 813 ether_addmulti(ifr, &sc->sc_ethercom) : 814 ether_delmulti(ifr, &sc->sc_ethercom); 815 816 if (error == ENETRESET) { 817 /* 818 * Multicast list has changed. Set the filter 819 * accordingly. 820 */ 821 (*sc->sc_filter_setup)(sc); 822 error = 0; 823 } 824 break; 825 826 case SIOCSIFMEDIA: 827 case SIOCGIFMEDIA: 828 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 829 break; 830 831 default: 832 error = EINVAL; 833 break; 834 } 835 836 /* Try to get more packets going. */ 837 tlp_start(ifp); 838 839 splx(s); 840 return (error); 841 } 842 843 /* 844 * tlp_intr: 845 * 846 * Interrupt service routine. 847 */ 848 int 849 tlp_intr(arg) 850 void *arg; 851 { 852 struct tulip_softc *sc = arg; 853 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 854 u_int32_t status, rxstatus, txstatus; 855 int handled = 0, txthresh; 856 857 DPRINTF(sc, ("%s: tlp_intr\n", sc->sc_dev.dv_xname)); 858 859 /* 860 * If the interface isn't running, the interrupt couldn't 861 * possibly have come from us. 862 */ 863 if ((ifp->if_flags & IFF_RUNNING) == 0) 864 return (0); 865 866 for (;;) { 867 status = TULIP_READ(sc, CSR_STATUS); 868 if (status) 869 TULIP_WRITE(sc, CSR_STATUS, status); 870 871 if ((status & sc->sc_inten) == 0) 872 break; 873 874 handled = 1; 875 876 rxstatus = status & sc->sc_rxint_mask; 877 txstatus = status & sc->sc_txint_mask; 878 879 if (rxstatus) { 880 /* Grab new any new packets. */ 881 tlp_rxintr(sc); 882 883 if (rxstatus & STATUS_RWT) 884 printf("%s: receive watchdog timeout\n", 885 sc->sc_dev.dv_xname); 886 887 if (rxstatus & STATUS_RU) { 888 printf("%s: receive ring overrun\n", 889 sc->sc_dev.dv_xname); 890 /* Get the receive process going again. */ 891 tlp_idle(sc, OPMODE_SR); 892 TULIP_WRITE(sc, CSR_RXLIST, 893 TULIP_CDRXADDR(sc, sc->sc_rxptr)); 894 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 895 TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD); 896 break; 897 } 898 } 899 900 if (txstatus) { 901 /* Sweep up transmit descriptors. */ 902 tlp_txintr(sc); 903 904 if (txstatus & STATUS_TJT) 905 printf("%s: transmit jabber timeout\n", 906 sc->sc_dev.dv_xname); 907 908 if (txstatus & STATUS_UNF) { 909 /* 910 * Increase our transmit threshold if 911 * another is available. 912 */ 913 txthresh = sc->sc_txthresh + 1; 914 if (sc->sc_txth[txthresh].txth_name != NULL) { 915 /* Idle the transmit process. */ 916 tlp_idle(sc, OPMODE_ST); 917 918 sc->sc_txthresh = txthresh; 919 sc->sc_opmode &= ~(OPMODE_TR|OPMODE_SF); 920 sc->sc_opmode |= 921 sc->sc_txth[txthresh].txth_opmode; 922 printf("%s: transmit underrun; new " 923 "threshold: %s\n", 924 sc->sc_dev.dv_xname, 925 sc->sc_txth[txthresh].txth_name); 926 927 /* 928 * Set the new threshold and restart 929 * the transmit process. 930 */ 931 TULIP_WRITE(sc, CSR_OPMODE, 932 sc->sc_opmode); 933 } 934 /* 935 * XXX Log every Nth underrun from 936 * XXX now on? 937 */ 938 } 939 } 940 941 if (status & (STATUS_TPS|STATUS_RPS)) { 942 if (status & STATUS_TPS) 943 printf("%s: transmit process stopped\n", 944 sc->sc_dev.dv_xname); 945 if (status & STATUS_RPS) 946 printf("%s: receive process stopped\n", 947 sc->sc_dev.dv_xname); 948 (void) tlp_init(sc); 949 break; 950 } 951 952 if (status & STATUS_SE) { 953 const char *str; 954 switch (status & STATUS_EB) { 955 case STATUS_EB_PARITY: 956 str = "parity error"; 957 break; 958 959 case STATUS_EB_MABT: 960 str = "master abort"; 961 break; 962 963 case STATUS_EB_TABT: 964 str = "target abort"; 965 break; 966 967 default: 968 str = "unknown error"; 969 break; 970 } 971 printf("%s: fatal system error: %s\n", 972 sc->sc_dev.dv_xname, str); 973 (void) tlp_init(sc); 974 break; 975 } 976 977 /* 978 * Not handled: 979 * 980 * Transmit buffer unavailable -- normal 981 * condition, nothing to do, really. 982 * 983 * General purpose timer experied -- we don't 984 * use the general purpose timer. 985 * 986 * Early receive interrupt -- not available on 987 * all chips, we just use RI. We also only 988 * use single-segment receive DMA, so this 989 * is mostly useless. 990 */ 991 } 992 993 /* Try to get more packets going. */ 994 tlp_start(ifp); 995 996 return (handled); 997 } 998 999 /* 1000 * tlp_rxintr: 1001 * 1002 * Helper; handle receive interrupts. 1003 */ 1004 void 1005 tlp_rxintr(sc) 1006 struct tulip_softc *sc; 1007 { 1008 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1009 struct ether_header *eh; 1010 struct tulip_rxsoft *rxs; 1011 struct mbuf *m; 1012 u_int32_t rxstat; 1013 int i, len; 1014 1015 for (i = sc->sc_rxptr;; i = TULIP_NEXTRX(i)) { 1016 rxs = &sc->sc_rxsoft[i]; 1017 1018 TULIP_CDRXSYNC(sc, i, 1019 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1020 1021 rxstat = sc->sc_rxdescs[i].td_status; 1022 1023 if (rxstat & TDSTAT_OWN) { 1024 /* 1025 * We have processed all of the receive buffers. 1026 */ 1027 break; 1028 } 1029 1030 /* 1031 * Make sure the packet fit in one buffer. This should 1032 * always be the case. But the Lite-On PNIC, rev 33 1033 * has an awful receive engine bug, which may require 1034 * a very icky work-around. 1035 */ 1036 if ((rxstat & (TDSTAT_Rx_FS|TDSTAT_Rx_LS)) != 1037 (TDSTAT_Rx_FS|TDSTAT_Rx_LS)) { 1038 printf("%s: incoming packet spilled, resetting\n", 1039 sc->sc_dev.dv_xname); 1040 (void) tlp_init(sc); 1041 return; 1042 } 1043 1044 /* 1045 * If any collisions were seen on the wire, count one. 1046 */ 1047 if (rxstat & TDSTAT_Rx_CS) 1048 ifp->if_collisions++; 1049 1050 /* 1051 * If an error occured, update stats, clear the status 1052 * word, and leave the packet buffer in place. It will 1053 * simply be reused the next time the ring comes around. 1054 */ 1055 if (rxstat & TDSTAT_ES) { 1056 #define PRINTERR(bit, str) \ 1057 if (rxstat & (bit)) \ 1058 printf("%s: receive error: %s\n", \ 1059 sc->sc_dev.dv_xname, str) 1060 ifp->if_ierrors++; 1061 PRINTERR(TDSTAT_Rx_DE, "descriptor error"); 1062 PRINTERR(TDSTAT_Rx_RF, "runt frame"); 1063 PRINTERR(TDSTAT_Rx_TL, "frame too long"); 1064 PRINTERR(TDSTAT_Rx_RE, "MII error"); 1065 PRINTERR(TDSTAT_Rx_DB, "dribbling bit"); 1066 PRINTERR(TDSTAT_Rx_CE, "CRC error"); 1067 #undef PRINTERR 1068 TULIP_INIT_RXDESC(sc, i); 1069 continue; 1070 } 1071 1072 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1073 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 1074 1075 /* 1076 * No errors; receive the packet. Note the Tulip 1077 * includes the CRC with every packet; trim it. 1078 */ 1079 len = TDSTAT_Rx_LENGTH(rxstat) - ETHER_CRC_LEN; 1080 1081 #ifdef __NO_STRICT_ALIGNMENT 1082 /* 1083 * Allocate a new mbuf cluster. If that fails, we are 1084 * out of memory, and must drop the packet and recycle 1085 * the buffer that's already attached to this descriptor. 1086 */ 1087 m = rxs->rxs_mbuf; 1088 if (tlp_add_rxbuf(sc, i) != 0) { 1089 ifp->if_ierrors++; 1090 TULIP_INIT_RXDESC(sc, i); 1091 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1092 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1093 continue; 1094 } 1095 #else 1096 /* 1097 * The Tulip's receive buffers must be 4-byte aligned. 1098 * But this means that the data after the Ethernet header 1099 * is misaligned. We must allocate a new buffer and 1100 * copy the data, shifted forward 2 bytes. 1101 */ 1102 MGETHDR(m, M_DONTWAIT, MT_DATA); 1103 if (m == NULL) { 1104 dropit: 1105 ifp->if_ierrors++; 1106 TULIP_INIT_RXDESC(sc, i); 1107 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1108 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1109 continue; 1110 } 1111 if (len > (MHLEN - 2)) { 1112 MCLGET(m, M_DONTWAIT); 1113 if ((m->m_flags & M_EXT) == 0) { 1114 m_freem(m); 1115 goto dropit; 1116 } 1117 } 1118 m->m_data += 2; 1119 1120 /* 1121 * Note that we use clusters for incoming frames, so the 1122 * buffer is virtually contiguous. 1123 */ 1124 memcpy(mtod(m, caddr_t), mtod(rxs->rxs_mbuf, caddr_t), len); 1125 1126 /* Allow the receive descriptor to continue using its mbuf. */ 1127 TULIP_INIT_RXDESC(sc, i); 1128 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1129 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1130 #endif /* __NO_STRICT_ALIGNMENT */ 1131 1132 ifp->if_ipackets++; 1133 eh = mtod(m, struct ether_header *); 1134 m->m_pkthdr.rcvif = ifp; 1135 m->m_pkthdr.len = m->m_len = len; 1136 1137 #if NBPFILTER > 0 1138 /* 1139 * Pass this up to any BPF listeners, but only 1140 * pass it up the stack if its for us. 1141 */ 1142 if (ifp->if_bpf) 1143 bpf_mtap(ifp->if_bpf, m); 1144 #endif /* NPBFILTER > 0 */ 1145 1146 /* 1147 * This test is outside the NBPFILTER block because 1148 * on the 21140 we have to use Hash-Only mode due to 1149 * a bug in the filter logic. 1150 */ 1151 if ((ifp->if_flags & IFF_PROMISC) != 0 || 1152 sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY) { 1153 if (memcmp(LLADDR(ifp->if_sadl), eh->ether_dhost, 1154 ETHER_ADDR_LEN) != 0 && 1155 ETHER_IS_MULTICAST(eh->ether_dhost) == 0) { 1156 m_freem(m); 1157 continue; 1158 } 1159 } 1160 1161 /* Pass it on. */ 1162 (*ifp->if_input)(ifp, m); 1163 } 1164 1165 /* Update the recieve pointer. */ 1166 sc->sc_rxptr = i; 1167 } 1168 1169 /* 1170 * tlp_txintr: 1171 * 1172 * Helper; handle transmit interrupts. 1173 */ 1174 void 1175 tlp_txintr(sc) 1176 struct tulip_softc *sc; 1177 { 1178 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1179 struct tulip_txsoft *txs; 1180 u_int32_t txstat; 1181 1182 DPRINTF(sc, ("%s: tlp_txintr: sc_flags 0x%08x\n", 1183 sc->sc_dev.dv_xname, sc->sc_flags)); 1184 1185 ifp->if_flags &= ~IFF_OACTIVE; 1186 1187 /* 1188 * If we were doing a filter setup, check to see if it completed. 1189 */ 1190 if (sc->sc_flags & TULIPF_DOING_SETUP) { 1191 TULIP_CDSDSYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1192 if ((sc->sc_setup_desc.td_status & TDSTAT_OWN) == 0) 1193 sc->sc_flags &= ~TULIPF_DOING_SETUP; 1194 } 1195 1196 /* 1197 * Go through our Tx list and free mbufs for those 1198 * frames that have been transmitted. 1199 */ 1200 while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) { 1201 TULIP_CDTXSYNC(sc, txs->txs_lastdesc, 1202 txs->txs_dmamap->dm_nsegs, 1203 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1204 1205 #ifdef TLP_DEBUG 1206 if (ifp->if_flags & IFF_DEBUG) { 1207 int i; 1208 printf(" txsoft %p trainsmit chain:\n", txs); 1209 for (i = txs->txs_firstdesc;; i = TULIP_NEXTTX(i)) { 1210 printf(" descriptor %d:\n", i); 1211 printf(" td_status: 0x%08x\n", 1212 sc->sc_txdescs[i].td_status); 1213 printf(" td_ctl: 0x%08x\n", 1214 sc->sc_txdescs[i].td_ctl); 1215 printf(" td_bufaddr1: 0x%08x\n", 1216 sc->sc_txdescs[i].td_bufaddr1); 1217 printf(" td_bufaddr2: 0x%08x\n", 1218 sc->sc_txdescs[i].td_bufaddr2); 1219 if (i == txs->txs_lastdesc) 1220 break; 1221 } 1222 } 1223 #endif 1224 1225 txstat = sc->sc_txdescs[txs->txs_lastdesc].td_status; 1226 if (txstat & TDSTAT_OWN) 1227 break; 1228 1229 SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs, txs_q); 1230 1231 sc->sc_txfree += txs->txs_dmamap->dm_nsegs; 1232 1233 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 1234 0, txs->txs_dmamap->dm_mapsize, 1235 BUS_DMASYNC_POSTWRITE); 1236 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 1237 m_freem(txs->txs_mbuf); 1238 txs->txs_mbuf = NULL; 1239 1240 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1241 1242 /* 1243 * Check for errors and collisions. 1244 */ 1245 #ifdef TLP_STATS 1246 if (txstat & TDSTAT_Tx_UF) 1247 sc->sc_stats.ts_tx_uf++; 1248 if (txstat & TDSTAT_Tx_TO) 1249 sc->sc_stats.ts_tx_to++; 1250 if (txstat & TDSTAT_Tx_EC) 1251 sc->sc_stats.ts_tx_ec++; 1252 if (txstat & TDSTAT_Tx_LC) 1253 sc->sc_stats.ts_tx_lc++; 1254 #endif 1255 1256 if (txstat & (TDSTAT_Tx_UF|TDSTAT_Tx_TO)) 1257 ifp->if_oerrors++; 1258 1259 if (txstat & TDSTAT_Tx_EC) 1260 ifp->if_collisions += 16; 1261 else 1262 ifp->if_collisions += TDSTAT_Tx_COLLISIONS(txstat); 1263 if (txstat & TDSTAT_Tx_LC) 1264 ifp->if_collisions++; 1265 1266 ifp->if_opackets++; 1267 } 1268 1269 /* 1270 * If there are no more pending transmissions, cancel the watchdog 1271 * timer. 1272 */ 1273 if (txs == NULL && (sc->sc_flags & TULIPF_DOING_SETUP) == 0) 1274 ifp->if_timer = 0; 1275 1276 /* 1277 * If we have a receive filter setup pending, do it now. 1278 */ 1279 if (sc->sc_flags & TULIPF_WANT_SETUP) 1280 (*sc->sc_filter_setup)(sc); 1281 } 1282 1283 #ifdef TLP_STATS 1284 void 1285 tlp_print_stats(sc) 1286 struct tulip_softc *sc; 1287 { 1288 1289 printf("%s: tx_uf %lu, tx_to %lu, tx_ec %lu, tx_lc %lu\n", 1290 sc->sc_dev.dv_xname, 1291 sc->sc_stats.ts_tx_uf, sc->sc_stats.ts_tx_to, 1292 sc->sc_stats.ts_tx_ec, sc->sc_stats.ts_tx_lc); 1293 } 1294 #endif 1295 1296 /* 1297 * tlp_reset: 1298 * 1299 * Perform a soft reset on the Tulip. 1300 */ 1301 void 1302 tlp_reset(sc) 1303 struct tulip_softc *sc; 1304 { 1305 int i; 1306 1307 TULIP_WRITE(sc, CSR_BUSMODE, BUSMODE_SWR); 1308 1309 for (i = 0; i < 1000; i++) { 1310 /* 1311 * Wait at least 50 PCI cycles for the reset to 1312 * complete before peeking at the Tulip again. 1313 * 10 uSec is a bit longer than 50 PCI cycles 1314 * (at 33MHz), but it doesn't hurt have the extra 1315 * wait. 1316 */ 1317 delay(10); 1318 if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR) == 0) 1319 break; 1320 } 1321 1322 if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR)) 1323 printf("%s: reset failed to complete\n", sc->sc_dev.dv_xname); 1324 1325 delay(1000); 1326 1327 /* 1328 * If the board has any GPIO reset sequences to issue, do them now. 1329 */ 1330 if (sc->sc_reset != NULL) 1331 (*sc->sc_reset)(sc); 1332 } 1333 1334 /* 1335 * tlp_init: 1336 * 1337 * Initialize the interface. Must be called at splnet(). 1338 */ 1339 int 1340 tlp_init(sc) 1341 struct tulip_softc *sc; 1342 { 1343 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1344 struct tulip_txsoft *txs; 1345 struct tulip_rxsoft *rxs; 1346 int i, error = 0; 1347 1348 /* 1349 * Cancel any pending I/O. 1350 */ 1351 tlp_stop(sc, 0); 1352 1353 /* 1354 * Initialize `opmode' to 0, and call the pre-init routine, if 1355 * any. This is required because the 2114x and some of the 1356 * clones require that the media-related bits in `opmode' be 1357 * set before performing a soft-reset in order to get internal 1358 * chip pathways are correct. Yay! 1359 */ 1360 sc->sc_opmode = 0; 1361 if (sc->sc_preinit != NULL) 1362 (*sc->sc_preinit)(sc); 1363 1364 /* 1365 * Reset the Tulip to a known state. 1366 */ 1367 tlp_reset(sc); 1368 1369 /* 1370 * Initialize the BUSMODE register. 1371 * 1372 * XXX What about read-multiple/read-line/write-line on 1373 * XXX the 21140 and up? 1374 */ 1375 sc->sc_busmode = BUSMODE_BAR; 1376 switch (sc->sc_cacheline) { 1377 default: 1378 /* 1379 * Note: We must *always* set these bits; a cache 1380 * alignment of 0 is RESERVED. 1381 */ 1382 case 8: 1383 sc->sc_busmode |= BUSMODE_CAL_8LW; 1384 break; 1385 case 16: 1386 sc->sc_busmode |= BUSMODE_CAL_16LW; 1387 break; 1388 case 32: 1389 sc->sc_busmode |= BUSMODE_CAL_32LW; 1390 break; 1391 } 1392 switch (sc->sc_chip) { 1393 case TULIP_CHIP_82C168: 1394 case TULIP_CHIP_82C169: 1395 sc->sc_busmode |= BUSMODE_PBL_16LW | BUSMODE_PNIC_MBO; 1396 break; 1397 default: 1398 sc->sc_busmode |= BUSMODE_PBL_DEFAULT; 1399 break; 1400 } 1401 #if BYTE_ORDER == BIG_ENDIAN 1402 /* 1403 * XXX There are reports that this doesn't work properly 1404 * in the old Tulip driver, but BUSMODE_DBO does. However, 1405 * BUSMODE_DBO is not available on the 21040, and requires 1406 * us to byte-swap the setup packet. What to do? 1407 */ 1408 sc->sc_busmode |= BUSMODE_BLE; 1409 #endif 1410 TULIP_WRITE(sc, CSR_BUSMODE, sc->sc_busmode); 1411 1412 /* 1413 * Initialize the OPMODE register. We don't write it until 1414 * we're ready to begin the transmit and receive processes. 1415 * 1416 * Media-related OPMODE bits are set in the media callbacks 1417 * for each specific chip/board. 1418 */ 1419 sc->sc_opmode |= OPMODE_SR | OPMODE_ST | 1420 sc->sc_txth[sc->sc_txthresh].txth_opmode; 1421 1422 /* 1423 * Magical mystery initialization on the Macronix chips. 1424 * The MX98713 uses its own magic value, the rest share 1425 * a common one. 1426 */ 1427 switch (sc->sc_chip) { 1428 case TULIP_CHIP_MX98713: 1429 TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98713); 1430 break; 1431 1432 case TULIP_CHIP_MX98713A: 1433 case TULIP_CHIP_MX98715: 1434 case TULIP_CHIP_MX98715A: 1435 case TULIP_CHIP_MX98725: 1436 TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98715); 1437 break; 1438 1439 default: 1440 /* Nothing. */ 1441 } 1442 1443 /* 1444 * Initialize the transmit descriptor ring. 1445 */ 1446 memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs)); 1447 for (i = 0; i < TULIP_NTXDESC; i++) { 1448 sc->sc_txdescs[i].td_ctl = TDCTL_CH; 1449 sc->sc_txdescs[i].td_bufaddr2 = 1450 TULIP_CDTXADDR(sc, TULIP_NEXTTX(i)); 1451 } 1452 TULIP_CDTXSYNC(sc, 0, TULIP_NTXDESC, 1453 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1454 sc->sc_txfree = TULIP_NTXDESC; 1455 sc->sc_txnext = 0; 1456 1457 /* 1458 * Initialize the transmit job descriptors. 1459 */ 1460 SIMPLEQ_INIT(&sc->sc_txfreeq); 1461 SIMPLEQ_INIT(&sc->sc_txdirtyq); 1462 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 1463 txs = &sc->sc_txsoft[i]; 1464 txs->txs_mbuf = NULL; 1465 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1466 } 1467 1468 /* 1469 * Initialize the receive descriptor and receive job 1470 * descriptor rings. 1471 */ 1472 for (i = 0; i < TULIP_NRXDESC; i++) { 1473 rxs = &sc->sc_rxsoft[i]; 1474 if (rxs->rxs_mbuf == NULL) { 1475 if ((error = tlp_add_rxbuf(sc, i)) != 0) { 1476 printf("%s: unable to allocate or map rx " 1477 "buffer %d, error = %d\n", 1478 sc->sc_dev.dv_xname, i, error); 1479 /* 1480 * XXX Should attempt to run with fewer receive 1481 * XXX buffers instead of just failing. 1482 */ 1483 tlp_rxdrain(sc); 1484 goto out; 1485 } 1486 } 1487 } 1488 sc->sc_rxptr = 0; 1489 1490 /* 1491 * Initialize the interrupt mask and enable interrupts. 1492 */ 1493 /* normal interrupts */ 1494 sc->sc_inten = STATUS_TI | STATUS_TU | STATUS_RI | STATUS_NIS; 1495 1496 /* abnormal interrupts */ 1497 sc->sc_inten |= STATUS_TPS | STATUS_TJT | STATUS_UNF | 1498 STATUS_RU | STATUS_RPS | STATUS_RWT | STATUS_SE | STATUS_AIS; 1499 1500 sc->sc_rxint_mask = STATUS_RI|STATUS_RU|STATUS_RWT; 1501 sc->sc_txint_mask = STATUS_TI|STATUS_UNF|STATUS_TJT; 1502 1503 switch (sc->sc_chip) { 1504 case TULIP_CHIP_WB89C840F: 1505 /* 1506 * Clear bits that we don't want that happen to 1507 * overlap or don't exist. 1508 */ 1509 sc->sc_inten &= ~(STATUS_WINB_REI|STATUS_RWT); 1510 break; 1511 1512 default: 1513 /* Nothing. */ 1514 } 1515 1516 sc->sc_rxint_mask &= sc->sc_inten; 1517 sc->sc_txint_mask &= sc->sc_inten; 1518 1519 TULIP_WRITE(sc, CSR_INTEN, sc->sc_inten); 1520 TULIP_WRITE(sc, CSR_STATUS, 0xffffffff); 1521 1522 /* 1523 * Give the transmit and receive rings to the Tulip. 1524 */ 1525 TULIP_WRITE(sc, CSR_TXLIST, TULIP_CDTXADDR(sc, sc->sc_txnext)); 1526 TULIP_WRITE(sc, CSR_RXLIST, TULIP_CDRXADDR(sc, sc->sc_rxptr)); 1527 1528 /* 1529 * On chips that do this differently, set the station address. 1530 */ 1531 switch (sc->sc_chip) { 1532 case TULIP_CHIP_WB89C840F: 1533 { 1534 /* XXX Do this with stream writes? */ 1535 bus_addr_t cpa = TULIP_CSR_OFFSET(sc, CSR_WINB_CPA0); 1536 1537 for (i = 0; i < ETHER_ADDR_LEN; i++) { 1538 bus_space_write_1(sc->sc_st, sc->sc_sh, 1539 cpa + i, LLADDR(ifp->if_sadl)[i]); 1540 } 1541 break; 1542 } 1543 1544 case TULIP_CHIP_AL981: 1545 { 1546 u_int32_t reg; 1547 u_int8_t *enaddr = LLADDR(ifp->if_sadl); 1548 1549 reg = enaddr[0] | 1550 (enaddr[1] << 8) | 1551 (enaddr[2] << 16) | 1552 (enaddr[3] << 24); 1553 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR0, reg); 1554 1555 reg = enaddr[4] | 1556 (enaddr[5] << 8); 1557 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR1, reg); 1558 } 1559 1560 default: 1561 /* Nothing. */ 1562 } 1563 1564 /* 1565 * Set the receive filter. This will start the transmit and 1566 * receive processes. 1567 */ 1568 (*sc->sc_filter_setup)(sc); 1569 1570 /* 1571 * Set the current media. 1572 */ 1573 (void) (*sc->sc_mediasw->tmsw_set)(sc); 1574 1575 /* 1576 * Start the receive process. 1577 */ 1578 TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD); 1579 1580 if (sc->sc_tick != NULL) { 1581 /* Start the one second clock. */ 1582 timeout(sc->sc_tick, sc, hz); 1583 } 1584 1585 /* 1586 * Note that the interface is now running. 1587 */ 1588 ifp->if_flags |= IFF_RUNNING; 1589 ifp->if_flags &= ~IFF_OACTIVE; 1590 1591 out: 1592 if (error) 1593 printf("%s: interface not running\n", sc->sc_dev.dv_xname); 1594 return (error); 1595 } 1596 1597 /* 1598 * tlp_rxdrain: 1599 * 1600 * Drain the receive queue. 1601 */ 1602 void 1603 tlp_rxdrain(sc) 1604 struct tulip_softc *sc; 1605 { 1606 struct tulip_rxsoft *rxs; 1607 int i; 1608 1609 for (i = 0; i < TULIP_NRXDESC; i++) { 1610 rxs = &sc->sc_rxsoft[i]; 1611 if (rxs->rxs_mbuf != NULL) { 1612 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 1613 m_freem(rxs->rxs_mbuf); 1614 rxs->rxs_mbuf = NULL; 1615 } 1616 } 1617 } 1618 1619 /* 1620 * tlp_stop: 1621 * 1622 * Stop transmission on the interface. 1623 */ 1624 void 1625 tlp_stop(sc, drain) 1626 struct tulip_softc *sc; 1627 int drain; 1628 { 1629 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1630 struct tulip_txsoft *txs; 1631 1632 if (sc->sc_tick != NULL) { 1633 /* Stop the one second clock. */ 1634 untimeout(sc->sc_tick, sc); 1635 } 1636 1637 /* Disable interrupts. */ 1638 TULIP_WRITE(sc, CSR_INTEN, 0); 1639 1640 /* Stop the transmit and receive processes. */ 1641 TULIP_WRITE(sc, CSR_OPMODE, 0); 1642 TULIP_WRITE(sc, CSR_RXLIST, 0); 1643 TULIP_WRITE(sc, CSR_TXLIST, 0); 1644 1645 /* 1646 * Release any queued transmit buffers. 1647 */ 1648 while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) { 1649 SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs, txs_q); 1650 if (txs->txs_mbuf != NULL) { 1651 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 1652 m_freem(txs->txs_mbuf); 1653 txs->txs_mbuf = NULL; 1654 } 1655 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1656 } 1657 1658 if (drain) { 1659 /* 1660 * Release the receive buffers. 1661 */ 1662 tlp_rxdrain(sc); 1663 } 1664 1665 sc->sc_flags &= ~(TULIPF_WANT_SETUP|TULIPF_DOING_SETUP); 1666 1667 /* 1668 * Mark the interface down and cancel the watchdog timer. 1669 */ 1670 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 1671 ifp->if_timer = 0; 1672 } 1673 1674 #define SROM_EMIT(sc, x) \ 1675 do { \ 1676 TULIP_WRITE((sc), CSR_MIIROM, (x)); \ 1677 delay(1); \ 1678 } while (0) 1679 1680 /* 1681 * tlp_srom_idle: 1682 * 1683 * Put the SROM in idle state. 1684 */ 1685 void 1686 tlp_srom_idle(sc) 1687 struct tulip_softc *sc; 1688 { 1689 u_int32_t miirom; 1690 int i; 1691 1692 miirom = MIIROM_SR; 1693 SROM_EMIT(sc, miirom); 1694 1695 miirom |= MIIROM_RD; 1696 SROM_EMIT(sc, miirom); 1697 1698 miirom |= MIIROM_SROMCS; 1699 SROM_EMIT(sc, miirom); 1700 1701 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 1702 1703 /* Strobe the clock 25 times. */ 1704 for (i = 0; i < 25; i++) { 1705 SROM_EMIT(sc, miirom); 1706 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 1707 } 1708 1709 SROM_EMIT(sc, miirom); 1710 1711 miirom &= ~MIIROM_SROMCS; 1712 SROM_EMIT(sc, miirom); 1713 1714 SROM_EMIT(sc, 0); 1715 } 1716 1717 /* 1718 * tlp_read_srom: 1719 * 1720 * Read the Tulip SROM. 1721 */ 1722 void 1723 tlp_read_srom(sc, word, wordcnt, data) 1724 struct tulip_softc *sc; 1725 int word, wordcnt; 1726 u_int8_t *data; 1727 { 1728 u_int32_t miirom; 1729 u_int16_t datain; 1730 int i, x; 1731 1732 tlp_srom_idle(sc); 1733 1734 /* Select the SROM. */ 1735 miirom = MIIROM_SR; 1736 SROM_EMIT(sc, miirom); 1737 1738 miirom |= MIIROM_RD; 1739 SROM_EMIT(sc, miirom); 1740 1741 for (i = 0; i < wordcnt; i++) { 1742 /* Send CHIP SELECT for one clock tick. */ 1743 miirom |= MIIROM_SROMCS; 1744 SROM_EMIT(sc, miirom); 1745 1746 /* Shift in the READ opcode. */ 1747 for (x = 3; x > 0; x--) { 1748 if (TULIP_SROM_OPC_READ & (1 << (x - 1))) 1749 miirom |= MIIROM_SROMDI; 1750 else 1751 miirom &= ~MIIROM_SROMDI; 1752 SROM_EMIT(sc, miirom); 1753 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 1754 SROM_EMIT(sc, miirom); 1755 } 1756 1757 /* Shift in address. */ 1758 for (x = 6; x > 0; x--) { 1759 if ((word + i) & (1 << (x - 1))) 1760 miirom |= MIIROM_SROMDI; 1761 else 1762 miirom &= ~MIIROM_SROMDI; 1763 SROM_EMIT(sc, miirom); 1764 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 1765 SROM_EMIT(sc, miirom); 1766 } 1767 1768 /* Shift out data. */ 1769 miirom &= ~MIIROM_SROMDI; 1770 datain = 0; 1771 for (x = 16; x > 0; x--) { 1772 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 1773 if (TULIP_ISSET(sc, CSR_MIIROM, MIIROM_SROMDO)) 1774 datain |= (1 << (x - 1)); 1775 SROM_EMIT(sc, miirom); 1776 } 1777 data[2 * i] = datain & 0xff; 1778 data[(2 * i) + 1] = datain >> 8; 1779 1780 /* Clear CHIP SELECT. */ 1781 miirom &= ~MIIROM_SROMCS; 1782 SROM_EMIT(sc, miirom); 1783 } 1784 1785 /* Deselect the SROM. */ 1786 SROM_EMIT(sc, 0); 1787 1788 /* ...and idle it. */ 1789 tlp_srom_idle(sc); 1790 } 1791 1792 #undef SROM_EMIT 1793 1794 /* 1795 * tlp_add_rxbuf: 1796 * 1797 * Add a receive buffer to the indicated descriptor. 1798 */ 1799 int 1800 tlp_add_rxbuf(sc, idx) 1801 struct tulip_softc *sc; 1802 int idx; 1803 { 1804 struct tulip_rxsoft *rxs = &sc->sc_rxsoft[idx]; 1805 struct mbuf *m; 1806 int error; 1807 1808 MGETHDR(m, M_DONTWAIT, MT_DATA); 1809 if (m == NULL) 1810 return (ENOBUFS); 1811 1812 MCLGET(m, M_DONTWAIT); 1813 if ((m->m_flags & M_EXT) == 0) { 1814 m_freem(m); 1815 return (ENOBUFS); 1816 } 1817 1818 if (rxs->rxs_mbuf != NULL) 1819 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 1820 1821 rxs->rxs_mbuf = m; 1822 1823 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, 1824 m->m_ext.ext_buf, m->m_ext.ext_size, NULL, BUS_DMA_NOWAIT); 1825 if (error) { 1826 printf("%s: can't load rx DMA map %d, error = %d\n", 1827 sc->sc_dev.dv_xname, idx, error); 1828 panic("tlp_add_rxbuf"); /* XXX */ 1829 } 1830 1831 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1832 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1833 1834 TULIP_INIT_RXDESC(sc, idx); 1835 1836 return (0); 1837 } 1838 1839 /* 1840 * tlp_crc32: 1841 * 1842 * Compute the 32-bit CRC of the provided buffer. 1843 */ 1844 u_int32_t 1845 tlp_crc32(buf, len) 1846 const u_int8_t *buf; 1847 size_t len; 1848 { 1849 static const u_int32_t crctab[] = { 1850 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 1851 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 1852 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 1853 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c 1854 }; 1855 u_int32_t crc; 1856 int i; 1857 1858 crc = 0xffffffff; 1859 for (i = 0; i < len; i++) { 1860 crc ^= buf[i]; 1861 crc = (crc >> 4) ^ crctab[crc & 0xf]; 1862 crc = (crc >> 4) ^ crctab[crc & 0xf]; 1863 } 1864 return (crc); 1865 } 1866 1867 /* 1868 * tlp_srom_crcok: 1869 * 1870 * Check the CRC of the Tulip SROM. 1871 */ 1872 int 1873 tlp_srom_crcok(romdata) 1874 const u_int8_t *romdata; 1875 { 1876 u_int32_t crc; 1877 1878 crc = tlp_crc32(romdata, TULIP_ROM_CRC32_CHECKSUM); 1879 crc = (crc & 0xffff) ^ 0xffff; 1880 if (crc == TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM)) 1881 return (1); 1882 return (0); 1883 } 1884 1885 /* 1886 * tlp_isv_srom: 1887 * 1888 * Check to see if the SROM is in the new standardized format. 1889 */ 1890 int 1891 tlp_isv_srom(romdata) 1892 const u_int8_t *romdata; 1893 { 1894 int i; 1895 u_int16_t cksum; 1896 1897 if (tlp_srom_crcok(romdata)) { 1898 /* 1899 * SROM CRC checks out; must be in the new format. 1900 */ 1901 return (1); 1902 } 1903 1904 cksum = TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM); 1905 if (cksum == 0xffff || cksum == 0) { 1906 /* 1907 * No checksum present. Check the SROM ID; 18 bytes of 0 1908 * followed by 1 (version) followed by the number of 1909 * adapters which use this SROM (should be non-zero). 1910 */ 1911 for (i = 0; i < TULIP_ROM_SROM_FORMAT_VERION; i++) { 1912 if (romdata[i] != 0) 1913 return (0); 1914 } 1915 if (romdata[TULIP_ROM_SROM_FORMAT_VERION] != 1) 1916 return (0); 1917 if (romdata[TULIP_ROM_CHIP_COUNT] == 0) 1918 return (0); 1919 return (1); 1920 } 1921 1922 return (0); 1923 } 1924 1925 /* 1926 * tlp_isv_srom_enaddr: 1927 * 1928 * Get the Ethernet address from an ISV SROM. 1929 */ 1930 int 1931 tlp_isv_srom_enaddr(sc, enaddr) 1932 struct tulip_softc *sc; 1933 u_int8_t *enaddr; 1934 { 1935 int i, devcnt; 1936 1937 if (tlp_isv_srom(sc->sc_srom) == 0) 1938 return (0); 1939 1940 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 1941 for (i = 0; i < devcnt; i++) { 1942 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 1943 break; 1944 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 1945 sc->sc_devno) 1946 break; 1947 } 1948 1949 if (i == devcnt) 1950 return (0); 1951 1952 memcpy(enaddr, &sc->sc_srom[TULIP_ROM_IEEE_NETWORK_ADDRESS], 1953 ETHER_ADDR_LEN); 1954 enaddr[5] += i; 1955 1956 return (1); 1957 } 1958 1959 /* 1960 * tlp_parse_old_srom: 1961 * 1962 * Parse old-format SROMs. 1963 * 1964 * This routine is largely lifted from Matt Thomas's `de' driver. 1965 */ 1966 int 1967 tlp_parse_old_srom(sc, enaddr) 1968 struct tulip_softc *sc; 1969 u_int8_t *enaddr; 1970 { 1971 static const u_int8_t testpat[] = 1972 { 0xff, 0, 0x55, 0xaa, 0xff, 0, 0x55, 0xaa }; 1973 int i; 1974 u_int32_t cksum; 1975 1976 if (memcmp(&sc->sc_srom[0], &sc->sc_srom[16], 8) != 0) { 1977 /* 1978 * Some vendors (e.g. ZNYX) don't use the standard 1979 * DEC Address ROM format, but rather just have an 1980 * Ethernet address in the first 6 bytes, maybe a 1981 * 2 byte checksum, and then all 0xff's. 1982 */ 1983 for (i = 8; i < 32; i++) { 1984 if (sc->sc_srom[i] != 0xff) 1985 return (0); 1986 } 1987 1988 /* 1989 * Sanity check the Ethernet address: 1990 * 1991 * - Make sure it's not multicast or locally 1992 * assigned 1993 * - Make sure it has a non-0 OUI 1994 */ 1995 if (sc->sc_srom[0] & 3) 1996 return (0); 1997 if (sc->sc_srom[0] == 0 && sc->sc_srom[1] == 0 && 1998 sc->sc_srom[2] == 0) 1999 return (0); 2000 2001 memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN); 2002 return (1); 2003 } 2004 2005 /* 2006 * Standard DEC Address ROM test. 2007 */ 2008 2009 if (memcmp(&sc->sc_srom[24], testpat, 8) != 0) 2010 return (0); 2011 2012 for (i = 0; i < 8; i++) { 2013 if (sc->sc_srom[i] != sc->sc_srom[15 - i]) 2014 return (0); 2015 } 2016 2017 memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN); 2018 2019 cksum = *(u_int16_t *) &enaddr[0]; 2020 2021 cksum <<= 1; 2022 if (cksum > 0xffff) 2023 cksum -= 0xffff; 2024 2025 cksum += *(u_int16_t *) &enaddr[2]; 2026 if (cksum > 0xffff) 2027 cksum -= 0xffff; 2028 2029 cksum <<= 1; 2030 if (cksum > 0xffff) 2031 cksum -= 0xffff; 2032 2033 cksum += *(u_int16_t *) &enaddr[4]; 2034 if (cksum >= 0xffff) 2035 cksum -= 0xffff; 2036 2037 if (cksum != *(u_int16_t *) &sc->sc_srom[6]) 2038 return (0); 2039 2040 return (1); 2041 } 2042 2043 /* 2044 * tlp_filter_setup: 2045 * 2046 * Set the Tulip's receive filter. 2047 */ 2048 void 2049 tlp_filter_setup(sc) 2050 struct tulip_softc *sc; 2051 { 2052 struct ethercom *ec = &sc->sc_ethercom; 2053 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2054 struct ether_multi *enm; 2055 struct ether_multistep step; 2056 __volatile u_int32_t *sp; 2057 u_int8_t enaddr[ETHER_ADDR_LEN]; 2058 u_int32_t hash, hashsize; 2059 int cnt; 2060 2061 DPRINTF(sc, ("%s: tlp_filter_setup: sc_flags 0x%08x\n", 2062 sc->sc_dev.dv_xname, sc->sc_flags)); 2063 2064 memcpy(enaddr, LLADDR(ifp->if_sadl), ETHER_ADDR_LEN); 2065 2066 /* 2067 * If there are transmissions pending, wait until they have 2068 * completed. 2069 */ 2070 if (SIMPLEQ_FIRST(&sc->sc_txdirtyq) != NULL || 2071 (sc->sc_flags & TULIPF_DOING_SETUP) != 0) { 2072 sc->sc_flags |= TULIPF_WANT_SETUP; 2073 DPRINTF(sc, ("%s: tlp_filter_setup: deferring\n", 2074 sc->sc_dev.dv_xname)); 2075 return; 2076 } 2077 sc->sc_flags &= ~TULIPF_WANT_SETUP; 2078 2079 switch (sc->sc_chip) { 2080 case TULIP_CHIP_82C115: 2081 hashsize = TULIP_PNICII_HASHSIZE; 2082 break; 2083 2084 default: 2085 hashsize = TULIP_MCHASHSIZE; 2086 } 2087 2088 /* 2089 * If we're running, idle the transmit and receive engines. If 2090 * we're NOT running, we're being called from tlp_init(), and our 2091 * writing OPMODE will start the transmit and receive processes 2092 * in motion. 2093 */ 2094 if (ifp->if_flags & IFF_RUNNING) { 2095 /* 2096 * Actually, some chips seem to need a really hard 2097 * kick in the head for this to work. The genuine 2098 * DEC chips can just be idled, but some of the 2099 * clones seem to REALLY want a reset here. Doing 2100 * the reset will end up here again, but with 2101 * IFF_RUNNING cleared. 2102 */ 2103 switch (sc->sc_chip) { 2104 case TULIP_CHIP_82C168: 2105 case TULIP_CHIP_82C169: 2106 tlp_init(sc); 2107 return; 2108 2109 default: 2110 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 2111 } 2112 } 2113 2114 sc->sc_opmode &= ~(OPMODE_PR|OPMODE_PM); 2115 2116 if (ifp->if_flags & IFF_PROMISC) { 2117 sc->sc_opmode |= OPMODE_PR; 2118 goto allmulti; 2119 } 2120 2121 /* 2122 * Try Perfect filtering first. 2123 */ 2124 2125 sc->sc_filtmode = TDCTL_Tx_FT_PERFECT; 2126 sp = TULIP_CDSP(sc); 2127 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2128 cnt = 0; 2129 ETHER_FIRST_MULTI(step, ec, enm); 2130 while (enm != NULL) { 2131 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2132 /* 2133 * We must listen to a range of multicast addresses. 2134 * For now, just accept all multicasts, rather than 2135 * trying to set only those filter bits needed to match 2136 * the range. (At this time, the only use of address 2137 * ranges is for IP multicast routing, for which the 2138 * range is big enough to require all bits set.) 2139 */ 2140 goto allmulti; 2141 } 2142 if (cnt == (TULIP_MAXADDRS - 2)) { 2143 /* 2144 * We already have our multicast limit (still need 2145 * our station address and broadcast). Go to 2146 * Hash-Perfect mode. 2147 */ 2148 goto hashperfect; 2149 } 2150 *sp++ = ((u_int16_t *) enm->enm_addrlo)[0]; 2151 *sp++ = ((u_int16_t *) enm->enm_addrlo)[1]; 2152 *sp++ = ((u_int16_t *) enm->enm_addrlo)[2]; 2153 ETHER_NEXT_MULTI(step, enm); 2154 } 2155 2156 if (ifp->if_flags & IFF_BROADCAST) { 2157 /* ...and the broadcast address. */ 2158 cnt++; 2159 *sp++ = 0xffff; 2160 *sp++ = 0xffff; 2161 *sp++ = 0xffff; 2162 } 2163 2164 /* Pad the rest with our station address. */ 2165 for (; cnt < TULIP_MAXADDRS; cnt++) { 2166 *sp++ = ((u_int16_t *) enaddr)[0]; 2167 *sp++ = ((u_int16_t *) enaddr)[1]; 2168 *sp++ = ((u_int16_t *) enaddr)[2]; 2169 } 2170 ifp->if_flags &= ~IFF_ALLMULTI; 2171 goto setit; 2172 2173 hashperfect: 2174 /* 2175 * Try Hash-Perfect mode. 2176 */ 2177 2178 /* 2179 * Some 21140 chips have broken Hash-Perfect modes. On these 2180 * chips, we simply use Hash-Only mode, and put our station 2181 * address into the filter. 2182 */ 2183 if (sc->sc_chip == TULIP_CHIP_21140) 2184 sc->sc_filtmode = TDCTL_Tx_FT_HASHONLY; 2185 else 2186 sc->sc_filtmode = TDCTL_Tx_FT_HASH; 2187 sp = TULIP_CDSP(sc); 2188 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2189 ETHER_FIRST_MULTI(step, ec, enm); 2190 while (enm != NULL) { 2191 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2192 /* 2193 * We must listen to a range of multicast addresses. 2194 * For now, just accept all multicasts, rather than 2195 * trying to set only those filter bits needed to match 2196 * the range. (At this time, the only use of address 2197 * ranges is for IP multicast routing, for which the 2198 * range is big enough to require all bits set.) 2199 */ 2200 goto allmulti; 2201 } 2202 hash = tlp_mchash(enm->enm_addrlo, hashsize); 2203 sp[hash >> 4] |= 1 << (hash & 0xf); 2204 ETHER_NEXT_MULTI(step, enm); 2205 } 2206 2207 if (ifp->if_flags & IFF_BROADCAST) { 2208 /* ...and the broadcast address. */ 2209 hash = tlp_mchash(etherbroadcastaddr, hashsize); 2210 sp[hash >> 4] |= 1 << (hash & 0xf); 2211 } 2212 2213 if (sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY) { 2214 /* ...and our station address. */ 2215 hash = tlp_mchash(enaddr, hashsize); 2216 sp[hash >> 4] |= 1 << (hash & 0xf); 2217 } else { 2218 /* 2219 * Hash-Perfect mode; put our station address after 2220 * the hash table. 2221 */ 2222 sp[39] = ((u_int16_t *) enaddr)[0]; 2223 sp[40] = ((u_int16_t *) enaddr)[1]; 2224 sp[41] = ((u_int16_t *) enaddr)[2]; 2225 } 2226 ifp->if_flags &= ~IFF_ALLMULTI; 2227 goto setit; 2228 2229 allmulti: 2230 /* 2231 * Use Perfect filter mode. First address is the broadcast address, 2232 * and pad the rest with our station address. We'll set Pass-all- 2233 * multicast in OPMODE below. 2234 */ 2235 sc->sc_filtmode = TDCTL_Tx_FT_PERFECT; 2236 sp = TULIP_CDSP(sc); 2237 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2238 cnt = 0; 2239 if (ifp->if_flags & IFF_BROADCAST) { 2240 cnt++; 2241 *sp++ = 0xffff; 2242 *sp++ = 0xffff; 2243 *sp++ = 0xffff; 2244 } 2245 for (; cnt < TULIP_MAXADDRS; cnt++) { 2246 *sp++ = ((u_int16_t *) enaddr)[0]; 2247 *sp++ = ((u_int16_t *) enaddr)[1]; 2248 *sp++ = ((u_int16_t *) enaddr)[2]; 2249 } 2250 ifp->if_flags |= IFF_ALLMULTI; 2251 2252 setit: 2253 if (ifp->if_flags & IFF_ALLMULTI) 2254 sc->sc_opmode |= OPMODE_PM; 2255 2256 /* Sync the setup packet buffer. */ 2257 TULIP_CDSPSYNC(sc, BUS_DMASYNC_PREWRITE); 2258 2259 /* 2260 * Fill in the setup packet descriptor. 2261 */ 2262 sc->sc_setup_desc.td_bufaddr1 = TULIP_CDSPADDR(sc); 2263 sc->sc_setup_desc.td_bufaddr2 = TULIP_CDTXADDR(sc, sc->sc_txnext); 2264 sc->sc_setup_desc.td_ctl = 2265 (TULIP_SETUP_PACKET_LEN << TDCTL_SIZE1_SHIFT) | 2266 sc->sc_filtmode | TDCTL_Tx_SET | TDCTL_Tx_FS | TDCTL_Tx_LS | 2267 TDCTL_Tx_IC | TDCTL_CH; 2268 sc->sc_setup_desc.td_status = TDSTAT_OWN; 2269 TULIP_CDSDSYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 2270 2271 /* 2272 * Write the address of the setup descriptor. This also has 2273 * the side effect of giving the transmit ring to the chip, 2274 * since the setup descriptor points to the next available 2275 * descriptor in the ring. 2276 */ 2277 TULIP_WRITE(sc, CSR_TXLIST, TULIP_CDSDADDR(sc)); 2278 2279 /* 2280 * Set the OPMODE register. This will also resume the 2281 * transmit transmit process we idled above. 2282 */ 2283 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2284 2285 sc->sc_flags |= TULIPF_DOING_SETUP; 2286 2287 /* 2288 * Kick the transmitter; this will cause the Tulip to 2289 * read the setup descriptor. 2290 */ 2291 /* XXX USE AUTOPOLLING? */ 2292 TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD); 2293 2294 /* Set up a watchdog timer in case the chip flakes out. */ 2295 ifp->if_timer = 5; 2296 2297 DPRINTF(sc, ("%s: tlp_filter_setup: returning\n", sc->sc_dev.dv_xname)); 2298 } 2299 2300 /* 2301 * tlp_winb_filter_setup: 2302 * 2303 * Set the Winbond 89C840F's receive filter. 2304 */ 2305 void 2306 tlp_winb_filter_setup(sc) 2307 struct tulip_softc *sc; 2308 { 2309 struct ethercom *ec = &sc->sc_ethercom; 2310 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2311 struct ether_multi *enm; 2312 struct ether_multistep step; 2313 u_int32_t hash, mchash[2]; 2314 2315 DPRINTF(sc, ("%s: tlp_winb_filter_setup: sc_flags 0x%08x\n", 2316 sc->sc_dev.dv_xname, sc->sc_flags)); 2317 2318 sc->sc_opmode &= ~(OPMODE_WINB_APP|OPMODE_WINB_AMP|OPMODE_WINB_ABP); 2319 2320 if (ifp->if_flags & IFF_MULTICAST) 2321 sc->sc_opmode |= OPMODE_WINB_AMP; 2322 2323 if (ifp->if_flags & IFF_BROADCAST) 2324 sc->sc_opmode |= OPMODE_WINB_ABP; 2325 2326 if (ifp->if_flags & IFF_PROMISC) { 2327 sc->sc_opmode |= OPMODE_WINB_APP; 2328 goto allmulti; 2329 } 2330 2331 mchash[0] = mchash[1] = 0; 2332 2333 ETHER_FIRST_MULTI(step, ec, enm); 2334 while (enm != NULL) { 2335 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2336 /* 2337 * We must listen to a range of multicast addresses. 2338 * For now, just accept all multicasts, rather than 2339 * trying to set only those filter bits needed to match 2340 * the range. (At this time, the only use of address 2341 * ranges is for IP multicast routing, for which the 2342 * range is big enough to require all bits set.) 2343 */ 2344 goto allmulti; 2345 } 2346 2347 /* 2348 * According to the FreeBSD `wb' driver, yes, you 2349 * really do invert the hash. 2350 */ 2351 hash = (~(tlp_crc32(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26)) 2352 & 0x3f; 2353 mchash[hash >> 5] |= 1 << (hash & 0x1f); 2354 ETHER_NEXT_MULTI(step, enm); 2355 } 2356 ifp->if_flags &= ~IFF_ALLMULTI; 2357 goto setit; 2358 2359 allmulti: 2360 ifp->if_flags |= IFF_ALLMULTI; 2361 mchash[0] = mchash[1] = 0xffffffff; 2362 2363 setit: 2364 TULIP_WRITE(sc, CSR_WINB_CMA0, mchash[0]); 2365 TULIP_WRITE(sc, CSR_WINB_CMA1, mchash[1]); 2366 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2367 DPRINTF(sc, ("%s: tlp_winb_filter_setup: returning\n", 2368 sc->sc_dev.dv_xname)); 2369 } 2370 2371 /* 2372 * tlp_al981_filter_setup: 2373 * 2374 * Set the ADMtek AL981's receive filter. 2375 */ 2376 void 2377 tlp_al981_filter_setup(sc) 2378 struct tulip_softc *sc; 2379 { 2380 struct ethercom *ec = &sc->sc_ethercom; 2381 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2382 struct ether_multi *enm; 2383 struct ether_multistep step; 2384 u_int32_t hash, mchash[2]; 2385 2386 DPRINTF(sc, ("%s: tlp_al981_filter_setup: sc_flags 0x%08x\n", 2387 sc->sc_dev.dv_xname, sc->sc_flags)); 2388 2389 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 2390 2391 sc->sc_opmode &= ~(OPMODE_PR|OPMODE_PM); 2392 2393 if (ifp->if_flags & IFF_PROMISC) { 2394 sc->sc_opmode |= OPMODE_PR; 2395 goto allmulti; 2396 } 2397 2398 mchash[0] = mchash[1] = 0; 2399 2400 ETHER_FIRST_MULTI(step, ec, enm); 2401 while (enm != NULL) { 2402 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2403 /* 2404 * We must listen to a range of multicast addresses. 2405 * For now, just accept all multicasts, rather than 2406 * trying to set only those filter bits needed to match 2407 * the range. (At this time, the only use of address 2408 * ranges is for IP multicast routing, for which the 2409 * range is big enough to require all bits set.) 2410 */ 2411 goto allmulti; 2412 } 2413 2414 hash = (tlp_crc32(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26) 2415 & 0x3f; 2416 mchash[hash >> 5] |= 1 << (hash & 0x1f); 2417 ETHER_NEXT_MULTI(step, enm); 2418 } 2419 ifp->if_flags &= ~IFF_ALLMULTI; 2420 goto setit; 2421 2422 allmulti: 2423 ifp->if_flags |= IFF_ALLMULTI; 2424 mchash[0] = mchash[1] = 0xffffffff; 2425 2426 setit: 2427 TULIP_WRITE(sc, CSR_ADM_MAR0, mchash[0]); 2428 TULIP_WRITE(sc, CSR_ADM_MAR1, mchash[1]); 2429 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2430 DPRINTF(sc, ("%s: tlp_al981_filter_setup: returning\n", 2431 sc->sc_dev.dv_xname)); 2432 } 2433 2434 /* 2435 * tlp_idle: 2436 * 2437 * Cause the transmit and/or receive processes to go idle. 2438 */ 2439 void 2440 tlp_idle(sc, bits) 2441 struct tulip_softc *sc; 2442 u_int32_t bits; 2443 { 2444 static const char *tx_state_names[] = { 2445 "STOPPED", 2446 "RUNNING - FETCH", 2447 "RUNNING - WAIT", 2448 "RUNNING - READING", 2449 "-- RESERVED --", 2450 "RUNNING - SETUP", 2451 "SUSPENDED", 2452 "RUNNING - CLOSE", 2453 }; 2454 static const char *rx_state_names[] = { 2455 "STOPPED", 2456 "RUNNING - FETCH", 2457 "RUNNING - CHECK", 2458 "RUNNING - WAIT", 2459 "SUSPENDED", 2460 "RUNNING - CLOSE", 2461 "RUNNING - FLUSH", 2462 "RUNNING - QUEUE", 2463 }; 2464 u_int32_t csr, ackmask = 0; 2465 int i; 2466 2467 if (bits & OPMODE_ST) 2468 ackmask |= STATUS_TPS; 2469 2470 if (bits & OPMODE_SR) 2471 ackmask |= STATUS_RPS; 2472 2473 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode & ~bits); 2474 2475 for (i = 0; i < 1000; i++) { 2476 if (TULIP_ISSET(sc, CSR_STATUS, ackmask) == ackmask) 2477 break; 2478 delay(10); 2479 } 2480 2481 csr = TULIP_READ(sc, CSR_STATUS); 2482 if ((csr & ackmask) != ackmask) { 2483 if ((bits & OPMODE_ST) != 0 && (csr & STATUS_TPS) == 0 && 2484 (csr & STATUS_TS) != STATUS_TS_STOPPED) 2485 printf("%s: transmit process failed to idle: " 2486 "state %s\n", sc->sc_dev.dv_xname, 2487 tx_state_names[(csr & STATUS_TS) >> 20]); 2488 if ((bits & OPMODE_SR) != 0 && (csr & STATUS_RPS) == 0 && 2489 (csr & STATUS_RS) != STATUS_RS_STOPPED) 2490 printf("%s: receive process failed to idle: " 2491 "state %s\n", sc->sc_dev.dv_xname, 2492 rx_state_names[(csr & STATUS_RS) >> 17]); 2493 } 2494 TULIP_WRITE(sc, CSR_STATUS, ackmask); 2495 } 2496 2497 /***************************************************************************** 2498 * Generic media support functions. 2499 *****************************************************************************/ 2500 2501 /* 2502 * tlp_mediastatus: [ifmedia interface function] 2503 * 2504 * Query the current media. 2505 */ 2506 void 2507 tlp_mediastatus(ifp, ifmr) 2508 struct ifnet *ifp; 2509 struct ifmediareq *ifmr; 2510 { 2511 struct tulip_softc *sc = ifp->if_softc; 2512 2513 (*sc->sc_mediasw->tmsw_get)(sc, ifmr); 2514 } 2515 2516 /* 2517 * tlp_mediachange: [ifmedia interface function] 2518 * 2519 * Update the current media. 2520 */ 2521 int 2522 tlp_mediachange(ifp) 2523 struct ifnet *ifp; 2524 { 2525 struct tulip_softc *sc = ifp->if_softc; 2526 2527 return ((*sc->sc_mediasw->tmsw_set)(sc)); 2528 } 2529 2530 /***************************************************************************** 2531 * Support functions for MII-attached media. 2532 *****************************************************************************/ 2533 2534 /* 2535 * tlp_mii_tick: 2536 * 2537 * One second timer, used to tick the MII. 2538 */ 2539 void 2540 tlp_mii_tick(arg) 2541 void *arg; 2542 { 2543 struct tulip_softc *sc = arg; 2544 int s; 2545 2546 s = splnet(); 2547 mii_tick(&sc->sc_mii); 2548 splx(s); 2549 2550 timeout(sc->sc_tick, sc, hz); 2551 } 2552 2553 /* 2554 * tlp_mii_statchg: [mii interface function] 2555 * 2556 * Callback from PHY when media changes. 2557 */ 2558 void 2559 tlp_mii_statchg(self) 2560 struct device *self; 2561 { 2562 struct tulip_softc *sc = (struct tulip_softc *)self; 2563 2564 /* Idle the transmit and receive processes. */ 2565 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 2566 2567 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_HBD); 2568 2569 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) 2570 sc->sc_opmode |= OPMODE_TTM; 2571 else 2572 sc->sc_opmode |= OPMODE_HBD; 2573 2574 if (sc->sc_mii.mii_media_active & IFM_FDX) 2575 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 2576 2577 /* 2578 * Write new OPMODE bits. This also restarts the transmit 2579 * and receive processes. 2580 */ 2581 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2582 2583 /* XXX Update ifp->if_baudrate */ 2584 } 2585 2586 /* 2587 * tlp_winb_mii_statchg: [mii interface function] 2588 * 2589 * Callback from PHY when media changes. This version is 2590 * for the Winbond 89C840F, which has different OPMODE bits. 2591 */ 2592 void 2593 tlp_winb_mii_statchg(self) 2594 struct device *self; 2595 { 2596 struct tulip_softc *sc = (struct tulip_softc *)self; 2597 2598 /* Idle the transmit and receive processes. */ 2599 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 2600 2601 sc->sc_opmode &= ~(OPMODE_WINB_FES|OPMODE_FD); 2602 2603 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_100_TX) 2604 sc->sc_opmode |= OPMODE_WINB_FES; 2605 2606 if (sc->sc_mii.mii_media_active & IFM_FDX) 2607 sc->sc_opmode |= OPMODE_FD; 2608 2609 /* 2610 * Write new OPMODE bits. This also restarts the transmit 2611 * and receive processes. 2612 */ 2613 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2614 2615 /* XXX Update ifp->if_baudrate */ 2616 } 2617 2618 /* 2619 * tlp_mii_getmedia: 2620 * 2621 * Callback from ifmedia to request current media status. 2622 */ 2623 void 2624 tlp_mii_getmedia(sc, ifmr) 2625 struct tulip_softc *sc; 2626 struct ifmediareq *ifmr; 2627 { 2628 2629 mii_pollstat(&sc->sc_mii); 2630 ifmr->ifm_status = sc->sc_mii.mii_media_status; 2631 ifmr->ifm_active = sc->sc_mii.mii_media_active; 2632 } 2633 2634 /* 2635 * tlp_mii_setmedia: 2636 * 2637 * Callback from ifmedia to request new media setting. 2638 */ 2639 int 2640 tlp_mii_setmedia(sc) 2641 struct tulip_softc *sc; 2642 { 2643 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2644 2645 if (ifp->if_flags & IFF_UP) 2646 mii_mediachg(&sc->sc_mii); 2647 return (0); 2648 } 2649 2650 #define MII_EMIT(sc, x) \ 2651 do { \ 2652 TULIP_WRITE((sc), CSR_MIIROM, (x)); \ 2653 delay(1); \ 2654 } while (0) 2655 2656 /* 2657 * tlp_sio_mii_sync: 2658 * 2659 * Synchronize the SIO-attached MII. 2660 */ 2661 void 2662 tlp_sio_mii_sync(sc) 2663 struct tulip_softc *sc; 2664 { 2665 u_int32_t miirom; 2666 int i; 2667 2668 miirom = MIIROM_MDO; 2669 2670 MII_EMIT(sc, miirom); 2671 for (i = 0; i < 32; i++) { 2672 MII_EMIT(sc, miirom | MIIROM_MDC); 2673 MII_EMIT(sc, miirom); 2674 } 2675 } 2676 2677 /* 2678 * tlp_sio_mii_sendbits: 2679 * 2680 * Send a series of bits out the SIO to the MII. 2681 */ 2682 void 2683 tlp_sio_mii_sendbits(sc, data, nbits) 2684 struct tulip_softc *sc; 2685 u_int32_t data; 2686 int nbits; 2687 { 2688 u_int32_t miirom, i; 2689 2690 miirom = 0; 2691 MII_EMIT(sc, miirom); 2692 2693 for (i = 1 << (nbits - 1); i != 0; i >>= 1) { 2694 if (data & i) 2695 miirom |= MIIROM_MDO; 2696 else 2697 miirom &= ~MIIROM_MDO; 2698 MII_EMIT(sc, miirom); 2699 MII_EMIT(sc, miirom|MIIROM_MDC); 2700 MII_EMIT(sc, miirom); 2701 } 2702 } 2703 2704 /* 2705 * tlp_sio_mii_readreg: 2706 * 2707 * Read a PHY register via SIO-attached MII. 2708 */ 2709 int 2710 tlp_sio_mii_readreg(self, phy, reg) 2711 struct device *self; 2712 int phy, reg; 2713 { 2714 struct tulip_softc *sc = (void *) self; 2715 int val = 0, err = 0, i; 2716 2717 tlp_sio_mii_sync(sc); 2718 2719 tlp_sio_mii_sendbits(sc, MII_COMMAND_START, 2); 2720 tlp_sio_mii_sendbits(sc, MII_COMMAND_READ, 2); 2721 tlp_sio_mii_sendbits(sc, phy, 5); 2722 tlp_sio_mii_sendbits(sc, reg, 5); 2723 2724 /* Switch direction to PHY->host, without a clock transition. */ 2725 MII_EMIT(sc, MIIROM_MIIDIR); 2726 2727 MII_EMIT(sc, MIIROM_MIIDIR|MIIROM_MDC); 2728 MII_EMIT(sc, MIIROM_MIIDIR); 2729 2730 err = TULIP_ISSET(sc, CSR_MIIROM, MIIROM_MDI); 2731 2732 MII_EMIT(sc, MIIROM_MIIDIR|MIIROM_MDC); 2733 MII_EMIT(sc, MIIROM_MIIDIR); 2734 2735 for (i = 0; i < 16; i++) { 2736 val <<= 1; 2737 /* Read data prior to clock low-high transition. */ 2738 if (err == 0 && TULIP_ISSET(sc, CSR_MIIROM, MIIROM_MDI)) 2739 val |= 1; 2740 2741 MII_EMIT(sc, MIIROM_MIIDIR|MIIROM_MDC); 2742 MII_EMIT(sc, MIIROM_MIIDIR); 2743 } 2744 2745 /* Set direction to host->PHY, without a clock transition. */ 2746 MII_EMIT(sc, 0); 2747 2748 return (err ? 0 : val); 2749 } 2750 2751 /* 2752 * tlp_sio_mii_writereg: 2753 * 2754 * Write a PHY register via SIO-attached MII. 2755 */ 2756 void 2757 tlp_sio_mii_writereg(self, phy, reg, val) 2758 struct device *self; 2759 int phy, reg, val; 2760 { 2761 struct tulip_softc *sc = (void *) self; 2762 2763 tlp_sio_mii_sync(sc); 2764 2765 tlp_sio_mii_sendbits(sc, MII_COMMAND_START, 2); 2766 tlp_sio_mii_sendbits(sc, MII_COMMAND_WRITE, 2); 2767 tlp_sio_mii_sendbits(sc, phy, 5); 2768 tlp_sio_mii_sendbits(sc, reg, 5); 2769 tlp_sio_mii_sendbits(sc, MII_COMMAND_ACK, 2); 2770 tlp_sio_mii_sendbits(sc, val, 16); 2771 2772 MII_EMIT(sc, 0); 2773 } 2774 2775 #undef MII_EMIT 2776 2777 /* 2778 * tlp_pnic_mii_readreg: 2779 * 2780 * Read a PHY register on the Lite-On PNIC. 2781 */ 2782 int 2783 tlp_pnic_mii_readreg(self, phy, reg) 2784 struct device *self; 2785 int phy, reg; 2786 { 2787 struct tulip_softc *sc = (void *) self; 2788 u_int32_t val; 2789 int i; 2790 2791 TULIP_WRITE(sc, CSR_PNIC_MII, 2792 PNIC_MII_MBO | PNIC_MII_RESERVED | 2793 PNIC_MII_READ | (phy << PNIC_MII_PHYSHIFT) | 2794 (reg << PNIC_MII_REGSHIFT)); 2795 2796 for (i = 0; i < 1000; i++) { 2797 delay(10); 2798 val = TULIP_READ(sc, CSR_PNIC_MII); 2799 if ((val & PNIC_MII_BUSY) == 0) { 2800 if ((val & PNIC_MII_DATA) == PNIC_MII_DATA) 2801 return (0); 2802 else 2803 return (val & PNIC_MII_DATA); 2804 } 2805 } 2806 printf("%s: MII read timed out\n", sc->sc_dev.dv_xname); 2807 return (0); 2808 } 2809 2810 /* 2811 * tlp_pnic_mii_writereg: 2812 * 2813 * Write a PHY register on the Lite-On PNIC. 2814 */ 2815 void 2816 tlp_pnic_mii_writereg(self, phy, reg, val) 2817 struct device *self; 2818 int phy, reg, val; 2819 { 2820 struct tulip_softc *sc = (void *) self; 2821 int i; 2822 2823 TULIP_WRITE(sc, CSR_PNIC_MII, 2824 PNIC_MII_MBO | PNIC_MII_RESERVED | 2825 PNIC_MII_WRITE | (phy << PNIC_MII_PHYSHIFT) | 2826 (reg << PNIC_MII_REGSHIFT) | val); 2827 2828 for (i = 0; i < 1000; i++) { 2829 delay(10); 2830 if (TULIP_ISSET(sc, CSR_PNIC_MII, PNIC_MII_BUSY) == 0) 2831 return; 2832 } 2833 printf("%s: MII write timed out\n", sc->sc_dev.dv_xname); 2834 } 2835 2836 bus_addr_t tlp_al981_phy_regmap[] = { 2837 CSR_ADM_BMCR, 2838 CSR_ADM_BMSR, 2839 CSR_ADM_PHYIDR1, 2840 CSR_ADM_PHYIDR2, 2841 CSR_ADM_ANAR, 2842 CSR_ADM_ANLPAR, 2843 CSR_ADM_ANER, 2844 2845 CSR_ADM_XMC, 2846 CSR_ADM_XCIIS, 2847 CSR_ADM_XIE, 2848 CSR_ADM_100CTR, 2849 }; 2850 const int tlp_al981_phy_regmap_size = sizeof(tlp_al981_phy_regmap) / 2851 sizeof(tlp_al981_phy_regmap[0]); 2852 2853 /* 2854 * tlp_al981_mii_readreg: 2855 * 2856 * Read a PHY register on the ADMtek AL981. 2857 */ 2858 int 2859 tlp_al981_mii_readreg(self, phy, reg) 2860 struct device *self; 2861 int phy, reg; 2862 { 2863 struct tulip_softc *sc = (struct tulip_softc *)self; 2864 2865 /* AL981 only has an internal PHY. */ 2866 if (phy != 0) 2867 return (0); 2868 2869 if (reg >= tlp_al981_phy_regmap_size) 2870 return (0); 2871 2872 return (bus_space_read_4(sc->sc_st, sc->sc_sh, 2873 tlp_al981_phy_regmap[reg]) & 0xffff); 2874 } 2875 2876 /* 2877 * tlp_al981_mii_writereg: 2878 * 2879 * Write a PHY register on the ADMtek AL981. 2880 */ 2881 void 2882 tlp_al981_mii_writereg(self, phy, reg, val) 2883 struct device *self; 2884 int phy, reg, val; 2885 { 2886 struct tulip_softc *sc = (struct tulip_softc *)self; 2887 2888 /* AL981 only has an internal PHY. */ 2889 if (phy != 0) 2890 return; 2891 2892 if (reg >= tlp_al981_phy_regmap_size) 2893 return; 2894 2895 bus_space_write_4(sc->sc_st, sc->sc_sh, 2896 tlp_al981_phy_regmap[reg], val); 2897 } 2898 2899 /***************************************************************************** 2900 * Chip-specific pre-init and reset functions. 2901 *****************************************************************************/ 2902 2903 /* 2904 * tlp_2114x_preinit: 2905 * 2906 * Pre-init function shared by DECchip 21140, 21140A, 21142, and 21143. 2907 */ 2908 void 2909 tlp_2114x_preinit(sc) 2910 struct tulip_softc *sc; 2911 { 2912 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 2913 struct tulip_2114x_media *tm = ife->ifm_aux; 2914 2915 /* 2916 * Always set the Must-Be-One bit. 2917 */ 2918 sc->sc_opmode |= OPMODE_MBO; 2919 2920 /* 2921 * If `tm' is NULL, we must be doing pure MII-over-SIO. 2922 */ 2923 if (tm == NULL || 2924 (tm->tm_type == TULIP_ROM_MB_21140_MII || 2925 tm->tm_type == TULIP_ROM_MB_21142_MII)) { 2926 /* 2927 * MII case: just set the port-select bit; we will never 2928 * be called during a media change. 2929 */ 2930 sc->sc_opmode |= OPMODE_PS; 2931 goto set_opmode; 2932 } 2933 2934 /* 2935 * ENDEC/PCS mode; set according to selected media type. 2936 * XXX Auto-sense not supported yet. 2937 */ 2938 sc->sc_opmode |= tm->tm_opmode; 2939 2940 set_opmode: 2941 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2942 } 2943 2944 /* 2945 * tlp_pnic_preinit: 2946 * 2947 * Pre-init function for the Lite-On 82c168 and 82c169. 2948 */ 2949 void 2950 tlp_pnic_preinit(sc) 2951 struct tulip_softc *sc; 2952 { 2953 2954 if (sc->sc_flags & TULIPF_HAS_MII) { 2955 /* 2956 * MII case: just set the port-select bit; we will never 2957 * be called during a media change. 2958 */ 2959 sc->sc_opmode |= OPMODE_PS; 2960 } else { 2961 /* 2962 * ENDEC/PCS/Nway mode; enable the Tx backoff counter. 2963 */ 2964 sc->sc_opmode |= OPMODE_PNIC_TBEN; 2965 } 2966 } 2967 2968 /* 2969 * tlp_21140_reset: 2970 * 2971 * Issue a reset sequence on the 21140 via the GPIO facility. 2972 */ 2973 void 2974 tlp_21140_reset(sc) 2975 struct tulip_softc *sc; 2976 { 2977 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 2978 struct tulip_2114x_media *tm = ife->ifm_aux; 2979 int i; 2980 2981 /* First, set the direction on the GPIO pins. */ 2982 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 2983 2984 /* Now, issue the reset sequence. */ 2985 for (i = 0; i < tm->tm_reset_length; i++) { 2986 delay(10); 2987 TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_reset_offset + i]); 2988 } 2989 2990 /* Now, issue the selection sequence. */ 2991 for (i = 0; i < tm->tm_gp_length; i++) { 2992 delay(10); 2993 TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_gp_offset + i]); 2994 } 2995 2996 /* If there were no sequences, just lower the pins. */ 2997 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) 2998 TULIP_WRITE(sc, CSR_GPP, 0); 2999 } 3000 3001 /* 3002 * tlp_pmac_reset: 3003 * 3004 * Reset routine for Macronix chips. 3005 */ 3006 void 3007 tlp_pmac_reset(sc) 3008 struct tulip_softc *sc; 3009 { 3010 3011 switch (sc->sc_chip) { 3012 case TULIP_CHIP_82C115: 3013 case TULIP_CHIP_MX98715: 3014 case TULIP_CHIP_MX98715A: 3015 case TULIP_CHIP_MX98725: 3016 /* 3017 * Set the LED operating mode. This information is located 3018 * in the EEPROM at byte offset 0x77, per the MX98715A and 3019 * MX98725 application notes. 3020 */ 3021 TULIP_WRITE(sc, CSR_MIIROM, sc->sc_srom[0x77] << 24); 3022 break; 3023 3024 default: 3025 /* Nothing. */ 3026 } 3027 } 3028 3029 /***************************************************************************** 3030 * Chip/board-specific media switches. The ones here are ones that 3031 * are potentially common to multiple front-ends. 3032 *****************************************************************************/ 3033 3034 const struct tulip_srom_to_ifmedia tulip_srom_to_ifmedia_table[] = { 3035 { TULIP_ROM_MB_MEDIA_TP, IFM_10_T, 0, 3036 "10baseT", SIACONN_21041_10BASET, 3037 SIATXRX_21041_10BASET, SIAGEN_21041_10BASET }, 3038 3039 { TULIP_ROM_MB_MEDIA_BNC, IFM_10_2, 0, 3040 "10base2", SIACONN_21041_BNC, 3041 SIATXRX_21041_BNC, SIAGEN_21041_BNC }, 3042 3043 { TULIP_ROM_MB_MEDIA_AUI, IFM_10_5, 0, 3044 "10base5", SIACONN_21041_AUI, 3045 SIATXRX_21041_AUI, SIAGEN_21041_AUI }, 3046 3047 { TULIP_ROM_MB_MEDIA_100TX, IFM_100_TX, 0, 3048 "100baseTX", 0, 3049 0, 0 }, 3050 3051 { TULIP_ROM_MB_MEDIA_TP_FDX, IFM_10_T, IFM_FDX, 3052 "10baseT-FDX", SIACONN_21041_10BASET_FDX, 3053 SIATXRX_21041_10BASET_FDX, SIAGEN_21041_10BASET_FDX }, 3054 3055 { TULIP_ROM_MB_MEDIA_100TX_FDX, IFM_100_TX, IFM_FDX, 3056 "100baseTX-FDX", 0, 3057 0, 0 }, 3058 3059 { TULIP_ROM_MB_MEDIA_100T4, IFM_100_T4, 0, 3060 "100baseT4", 0, 3061 0, 0 }, 3062 3063 { TULIP_ROM_MB_MEDIA_100FX, IFM_100_FX, 0, 3064 "100baseFX", 0, 3065 0, 0 }, 3066 3067 { TULIP_ROM_MB_MEDIA_100FX_FDX, IFM_100_FX, IFM_FDX, 3068 "100baseFX-FDX", 0, 3069 0, 0 }, 3070 3071 { 0, 0, 0, 3072 NULL, 0, 3073 0, 0 }, 3074 }; 3075 3076 const struct tulip_srom_to_ifmedia *tulip_srom_to_ifmedia __P((u_int8_t)); 3077 3078 const struct tulip_srom_to_ifmedia * 3079 tulip_srom_to_ifmedia(sm) 3080 u_int8_t sm; 3081 { 3082 const struct tulip_srom_to_ifmedia *tsti; 3083 3084 for (tsti = tulip_srom_to_ifmedia_table; 3085 tsti->tsti_name != NULL; tsti++) { 3086 if (tsti->tsti_srom == sm) 3087 return (tsti); 3088 } 3089 3090 return (NULL); 3091 } 3092 3093 /* 3094 * 21040 and 21041 media switches. 3095 */ 3096 void tlp_21040_tmsw_init __P((struct tulip_softc *)); 3097 void tlp_21040_tp_tmsw_init __P((struct tulip_softc *)); 3098 void tlp_21040_auibnc_tmsw_init __P((struct tulip_softc *)); 3099 void tlp_21041_tmsw_init __P((struct tulip_softc *)); 3100 void tlp_21040_21041_tmsw_get __P((struct tulip_softc *, 3101 struct ifmediareq *)); 3102 int tlp_21040_21041_tmsw_set __P((struct tulip_softc *)); 3103 3104 const struct tulip_mediasw tlp_21040_mediasw = { 3105 tlp_21040_tmsw_init, tlp_21040_21041_tmsw_get, tlp_21040_21041_tmsw_set 3106 }; 3107 3108 const struct tulip_mediasw tlp_21040_tp_mediasw = { 3109 tlp_21040_tp_tmsw_init, tlp_21040_21041_tmsw_get, 3110 tlp_21040_21041_tmsw_set 3111 }; 3112 3113 const struct tulip_mediasw tlp_21040_auibnc_mediasw = { 3114 tlp_21040_auibnc_tmsw_init, tlp_21040_21041_tmsw_get, 3115 tlp_21040_21041_tmsw_set 3116 }; 3117 3118 const struct tulip_mediasw tlp_21041_mediasw = { 3119 tlp_21041_tmsw_init, tlp_21040_21041_tmsw_get, tlp_21040_21041_tmsw_set 3120 }; 3121 3122 #define ADD(m, t) ifmedia_add(&sc->sc_mii.mii_media, (m), 0, (t)) 3123 #define PRINT(s) printf("%s%s", sep, s); sep = ", " 3124 3125 void 3126 tlp_21040_tmsw_init(sc) 3127 struct tulip_softc *sc; 3128 { 3129 struct tulip_21040_21041_sia_media *tsm; 3130 const char *sep = ""; 3131 3132 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3133 tlp_mediastatus); 3134 3135 printf("%s: ", sc->sc_dev.dv_xname); 3136 3137 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3138 M_WAITOK); 3139 tsm->tsm_siaconn = SIACONN_21040_10BASET; 3140 tsm->tsm_siatxrx = SIATXRX_21040_10BASET; 3141 tsm->tsm_siagen = SIAGEN_21040_10BASET; 3142 ADD(IFM_ETHER|IFM_10_T, tsm); 3143 PRINT("10baseT"); 3144 3145 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3146 M_WAITOK); 3147 tsm->tsm_siaconn = SIACONN_21040_10BASET_FDX; 3148 tsm->tsm_siatxrx = SIATXRX_21040_10BASET_FDX; 3149 tsm->tsm_siagen = SIAGEN_21040_10BASET_FDX; 3150 ADD(IFM_ETHER|IFM_10_T|IFM_FDX, tsm); 3151 PRINT("10baseT-FDX"); 3152 3153 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3154 M_WAITOK); 3155 tsm->tsm_siaconn = SIACONN_21040_AUI; 3156 tsm->tsm_siatxrx = SIATXRX_21040_AUI; 3157 tsm->tsm_siagen = SIAGEN_21040_AUI; 3158 ADD(IFM_ETHER|IFM_10_5, tsm); 3159 PRINT("10base5"); 3160 3161 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3162 M_WAITOK); 3163 tsm->tsm_siaconn = SIACONN_21040_EXTSIA; 3164 tsm->tsm_siatxrx = SIATXRX_21040_EXTSIA; 3165 tsm->tsm_siagen = SIAGEN_21040_EXTSIA; 3166 ADD(IFM_ETHER|IFM_MANUAL, tsm); 3167 PRINT("manual"); 3168 3169 /* 3170 * XXX Autosense not yet supported. 3171 */ 3172 3173 /* XXX This should be auto-sense. */ 3174 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 3175 printf(", default 10baseT"); 3176 3177 printf("\n"); 3178 } 3179 3180 void 3181 tlp_21040_tp_tmsw_init(sc) 3182 struct tulip_softc *sc; 3183 { 3184 struct tulip_21040_21041_sia_media *tsm; 3185 const char *sep = ""; 3186 3187 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3188 tlp_mediastatus); 3189 3190 printf("%s: ", sc->sc_dev.dv_xname); 3191 3192 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3193 M_WAITOK); 3194 tsm->tsm_siaconn = SIACONN_21040_10BASET; 3195 tsm->tsm_siatxrx = SIATXRX_21040_10BASET; 3196 tsm->tsm_siagen = SIAGEN_21040_10BASET; 3197 ADD(IFM_ETHER|IFM_10_T, tsm); 3198 PRINT("10baseT"); 3199 3200 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3201 M_WAITOK); 3202 tsm->tsm_siaconn = SIACONN_21040_10BASET_FDX; 3203 tsm->tsm_siatxrx = SIATXRX_21040_10BASET_FDX; 3204 tsm->tsm_siagen = SIAGEN_21040_10BASET_FDX; 3205 ADD(IFM_ETHER|IFM_10_T|IFM_FDX, tsm); 3206 PRINT("10baseT-FDX"); 3207 3208 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 3209 printf(", default 10baseT"); 3210 3211 printf("\n"); 3212 } 3213 3214 void 3215 tlp_21040_auibnc_tmsw_init(sc) 3216 struct tulip_softc *sc; 3217 { 3218 struct tulip_21040_21041_sia_media *tsm; 3219 const char *sep = ""; 3220 3221 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3222 tlp_mediastatus); 3223 3224 printf("%s: ", sc->sc_dev.dv_xname); 3225 3226 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3227 M_WAITOK); 3228 tsm->tsm_siaconn = SIACONN_21040_AUI; 3229 tsm->tsm_siatxrx = SIATXRX_21040_AUI; 3230 tsm->tsm_siagen = SIAGEN_21040_AUI; 3231 ADD(IFM_ETHER|IFM_10_5, tsm); 3232 PRINT("10base5"); 3233 3234 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_5); 3235 3236 printf("\n"); 3237 } 3238 3239 void 3240 tlp_21041_tmsw_init(sc) 3241 struct tulip_softc *sc; 3242 { 3243 int i, defmedia, devcnt, leaf_offset, mb_offset, m_cnt; 3244 const struct tulip_srom_to_ifmedia *tsti; 3245 struct tulip_21040_21041_sia_media *tsm; 3246 const char *sep = "", *defstr; 3247 u_int16_t romdef; 3248 u_int8_t mb; 3249 3250 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3251 tlp_mediastatus); 3252 3253 printf("%s: ", sc->sc_dev.dv_xname); 3254 3255 if (tlp_isv_srom(sc->sc_srom) == 0) 3256 goto not_isv_srom; 3257 3258 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 3259 for (i = 0; i < devcnt; i++) { 3260 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 3261 break; 3262 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 3263 sc->sc_devno) 3264 break; 3265 } 3266 3267 if (i == devcnt) 3268 goto not_isv_srom; 3269 3270 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 3271 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 3272 mb_offset = leaf_offset + TULIP_ROM_IL_MEDIAn_BLOCK_BASE; 3273 m_cnt = sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 3274 3275 for (; m_cnt != 0; 3276 m_cnt--, mb_offset += TULIP_ROM_MB_SIZE(mb)) { 3277 mb = sc->sc_srom[mb_offset]; 3278 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), 3279 M_DEVBUF, M_WAITOK); 3280 switch (mb & TULIP_ROM_MB_MEDIA_CODE) { 3281 case TULIP_ROM_MB_MEDIA_TP: 3282 case TULIP_ROM_MB_MEDIA_BNC: 3283 case TULIP_ROM_MB_MEDIA_AUI: 3284 case TULIP_ROM_MB_MEDIA_TP_FDX: 3285 tsti = tulip_srom_to_ifmedia(mb & 3286 TULIP_ROM_MB_MEDIA_CODE); 3287 3288 tsm->tsm_siaconn = (mb & TULIP_ROM_MB_EXT) ? 3289 TULIP_ROM_GETW(sc->sc_srom, 3290 mb_offset + TULIP_ROM_MB_CSR13) : 3291 tsti->tsti_21041_siaconn; 3292 tsm->tsm_siatxrx = (mb & TULIP_ROM_MB_EXT) ? 3293 TULIP_ROM_GETW(sc->sc_srom, 3294 mb_offset + TULIP_ROM_MB_CSR14) : 3295 tsti->tsti_21041_siatxrx; 3296 tsm->tsm_siagen = (mb & TULIP_ROM_MB_EXT) ? 3297 TULIP_ROM_GETW(sc->sc_srom, 3298 mb_offset + TULIP_ROM_MB_CSR15) : 3299 tsti->tsti_21041_siagen; 3300 3301 ifmedia_add(&sc->sc_mii.mii_media, 3302 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 3303 tsti->tsti_options, 0), 0, tsm); 3304 PRINT(tsti->tsti_name); 3305 break; 3306 3307 default: 3308 printf("%s<unknown 0x%02x>", sep, 3309 (mb & TULIP_ROM_MB_MEDIA_CODE)); 3310 sep = ", "; 3311 free(tsm, M_DEVBUF); 3312 } 3313 } 3314 3315 /* 3316 * XXX Autosense not yet supported. 3317 */ 3318 3319 romdef = TULIP_ROM_GETW(sc->sc_srom, leaf_offset + 3320 TULIP_ROM_IL_SELECT_CONN_TYPE); 3321 switch (romdef) { 3322 case SELECT_CONN_TYPE_TP: 3323 case SELECT_CONN_TYPE_TP_AUTONEG: 3324 case SELECT_CONN_TYPE_TP_NOLINKPASS: 3325 defmedia = IFM_ETHER|IFM_10_T; 3326 defstr = "10baseT"; 3327 break; 3328 3329 case SELECT_CONN_TYPE_TP_FDX: 3330 defmedia = IFM_ETHER|IFM_10_T|IFM_FDX; 3331 defstr = "10baseT-FDX"; 3332 break; 3333 3334 case SELECT_CONN_TYPE_BNC: 3335 defmedia = IFM_ETHER|IFM_10_2; 3336 defstr = "10base2"; 3337 break; 3338 3339 case SELECT_CONN_TYPE_AUI: 3340 defmedia = IFM_ETHER|IFM_10_5; 3341 defstr = "10base5"; 3342 break; 3343 #if 0 /* XXX */ 3344 case SELECT_CONN_TYPE_ASENSE: 3345 case SELECT_CONN_TYPE_ASENSE_AUTONEG: 3346 defmedia = IFM_ETHER|IFM_AUTO; 3347 defstr = "auto"; 3348 break; 3349 #endif 3350 default: 3351 defmedia = 0; 3352 defstr = NULL; 3353 } 3354 3355 if (defmedia != 0) 3356 printf(", default %s\n", defstr); 3357 else { 3358 /* 3359 * XXX We should default to auto-sense. 3360 */ 3361 defmedia = IFM_ETHER|IFM_10_T; 3362 defstr = "10baseT"; 3363 3364 printf("\n%s: unknown default media in SROM (0x%04x), " 3365 "using %s\n", sc->sc_dev.dv_xname, romdef, defstr); 3366 } 3367 3368 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 3369 return; 3370 3371 not_isv_srom: 3372 /* 3373 * If we have a board without the standard 21041 SROM format, 3374 * we just assume all media are present and try and pick a 3375 * reasonable default. 3376 */ 3377 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3378 M_WAITOK); 3379 tsm->tsm_siaconn = SIACONN_21041_10BASET; 3380 tsm->tsm_siatxrx = SIATXRX_21041_10BASET; 3381 tsm->tsm_siagen = SIAGEN_21041_10BASET; 3382 ADD(IFM_ETHER|IFM_10_T, tsm); 3383 PRINT("10baseT"); 3384 3385 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3386 M_WAITOK); 3387 tsm->tsm_siaconn = SIACONN_21041_10BASET_FDX; 3388 tsm->tsm_siatxrx = SIATXRX_21041_10BASET_FDX; 3389 tsm->tsm_siagen = SIAGEN_21041_10BASET_FDX; 3390 ADD(IFM_ETHER|IFM_10_T|IFM_FDX, tsm); 3391 PRINT("10baseT-FDX"); 3392 3393 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3394 M_WAITOK); 3395 tsm->tsm_siaconn = SIACONN_21041_BNC; 3396 tsm->tsm_siatxrx = SIATXRX_21041_BNC; 3397 tsm->tsm_siagen = SIAGEN_21041_BNC; 3398 ADD(IFM_ETHER|IFM_10_2|IFM_FDX, tsm); 3399 PRINT("10base2"); 3400 3401 tsm = malloc(sizeof(struct tulip_21040_21041_sia_media), M_DEVBUF, 3402 M_WAITOK); 3403 tsm->tsm_siaconn = SIACONN_21041_AUI; 3404 tsm->tsm_siatxrx = SIATXRX_21041_AUI; 3405 tsm->tsm_siagen = SIAGEN_21041_AUI; 3406 ADD(IFM_ETHER|IFM_10_5|IFM_FDX, tsm); 3407 PRINT("10base5"); 3408 3409 /* 3410 * XXX Autosense not yet supported. 3411 */ 3412 3413 /* XXX This should be auto-sense. */ 3414 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 3415 printf(", default 10baseT"); 3416 3417 printf("\n"); 3418 } 3419 3420 #undef ADD 3421 #undef PRINT 3422 3423 void 3424 tlp_21040_21041_tmsw_get(sc, ifmr) 3425 struct tulip_softc *sc; 3426 struct ifmediareq *ifmr; 3427 { 3428 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3429 3430 ifmr->ifm_status = 0; 3431 3432 switch (IFM_SUBTYPE(ife->ifm_media)) { 3433 case IFM_AUTO: 3434 /* 3435 * XXX Implement autosensing case. 3436 */ 3437 break; 3438 3439 case IFM_10_T: 3440 /* 3441 * We're able to detect link directly on twisted pair. 3442 */ 3443 ifmr->ifm_status = IFM_AVALID; 3444 if (TULIP_ISSET(sc, CSR_SIASTAT, SIASTAT_LKF) == 0) 3445 ifmr->ifm_status |= IFM_ACTIVE; 3446 /* FALLTHROUGH */ 3447 default: 3448 /* 3449 * If not autosensing, active media is the currently 3450 * selected media. 3451 */ 3452 ifmr->ifm_active = ife->ifm_media; 3453 } 3454 } 3455 3456 int 3457 tlp_21040_21041_tmsw_set(sc) 3458 struct tulip_softc *sc; 3459 { 3460 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3461 struct tulip_21040_21041_sia_media *tsm; 3462 3463 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) { 3464 /* 3465 * If not autosensing, just pull the SIA settings out 3466 * of the media entry. 3467 */ 3468 tsm = ife->ifm_aux; 3469 TULIP_WRITE(sc, CSR_SIACONN, SIACONN_SRL); 3470 TULIP_WRITE(sc, CSR_SIATXRX, tsm->tsm_siatxrx); 3471 TULIP_WRITE(sc, CSR_SIAGEN, tsm->tsm_siagen); 3472 TULIP_WRITE(sc, CSR_SIACONN, tsm->tsm_siaconn); 3473 3474 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 3475 sc->sc_opmode &= ~OPMODE_FD; 3476 if (ife->ifm_media & IFM_FDX) 3477 sc->sc_opmode |= OPMODE_FD; 3478 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3479 } else { 3480 /* 3481 * XXX Implement autosensing case. 3482 */ 3483 } 3484 3485 return (0); 3486 } 3487 3488 /* 3489 * DECchip 2114x ISV media switch. 3490 * XXX Currently only handles 21140[A] GPR and MII. 3491 */ 3492 void tlp_2114x_isv_tmsw_init __P((struct tulip_softc *)); 3493 void tlp_2114x_isv_tmsw_get __P((struct tulip_softc *, struct ifmediareq *)); 3494 int tlp_2114x_isv_tmsw_set __P((struct tulip_softc *)); 3495 3496 const struct tulip_mediasw tlp_2114x_isv_mediasw = { 3497 tlp_2114x_isv_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set 3498 }; 3499 3500 void tlp_21140_gpr_getmedia __P((struct tulip_softc *sc, 3501 struct ifmediareq *ifmr)); 3502 int tlp_21140_gpr_setmedia __P((struct tulip_softc *sc)); 3503 3504 void 3505 tlp_2114x_isv_tmsw_init(sc) 3506 struct tulip_softc *sc; 3507 { 3508 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3509 struct ifmedia_entry *ife; 3510 struct mii_softc *phy; 3511 struct tulip_2114x_media *tm; 3512 const struct tulip_srom_to_ifmedia *tsti; 3513 int i, devcnt, leaf_offset, m_cnt, type, length, seen, defmedia, minst; 3514 u_int16_t word; 3515 u_int8_t *cp, *ncp; 3516 3517 seen = defmedia = 0; 3518 3519 sc->sc_mii.mii_ifp = ifp; 3520 sc->sc_mii.mii_readreg = tlp_sio_mii_readreg; 3521 sc->sc_mii.mii_writereg = tlp_sio_mii_writereg; 3522 sc->sc_mii.mii_statchg = sc->sc_statchg; 3523 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3524 tlp_mediastatus); 3525 3526 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 3527 for (i = 0; i < devcnt; i++) { 3528 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 3529 break; 3530 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 3531 sc->sc_devno) 3532 break; 3533 } 3534 3535 if (i == devcnt) { 3536 printf("%s: unable to locate info leaf in SROM\n", 3537 sc->sc_dev.dv_xname); 3538 return; 3539 } 3540 3541 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 3542 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 3543 3544 /* XXX SELECT CONN TYPE */ 3545 3546 cp = &sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 3547 3548 /* 3549 * On some chips, the first thing in the Info Leaf is the 3550 * GPIO pin direction data. 3551 */ 3552 switch (sc->sc_chip) { 3553 case TULIP_CHIP_21140: 3554 case TULIP_CHIP_21140A: 3555 case TULIP_CHIP_MX98713: 3556 case TULIP_CHIP_AX88140: 3557 case TULIP_CHIP_AX88141: 3558 sc->sc_gp_dir = *cp++; 3559 break; 3560 3561 default: 3562 /* Nothing. */ 3563 } 3564 3565 /* Get the media count. */ 3566 m_cnt = *cp++; 3567 3568 for (; m_cnt != 0; cp = ncp, m_cnt--) { 3569 /* 3570 * Determine the type and length of this media block. 3571 */ 3572 if ((*cp & 0x80) == 0) { 3573 length = 4; 3574 type = TULIP_ROM_MB_21140_GPR; 3575 } else { 3576 length = (*cp++ & 0x7f) - 1; 3577 type = *cp++ & 0x3f; 3578 } 3579 3580 /* Compute the start of the next block. */ 3581 ncp = cp + length; 3582 3583 /* Now, parse the block. */ 3584 switch (type) { 3585 case TULIP_ROM_MB_21140_GPR: 3586 seen |= 1 << TULIP_ROM_MB_21140_GPR; 3587 3588 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK); 3589 memset(tm, 0, sizeof(*tm)); 3590 3591 tm->tm_type = TULIP_ROM_MB_21140_GPR; 3592 tm->tm_get = tlp_21140_gpr_getmedia; 3593 tm->tm_set = tlp_21140_gpr_setmedia; 3594 3595 minst = 0; /* XXX compute new instance */ 3596 3597 /* First is the media type code. */ 3598 tsti = tulip_srom_to_ifmedia(cp[0] & 3599 TULIP_ROM_MB_MEDIA_CODE); 3600 if (tsti == NULL) { 3601 /* Invalid media code. */ 3602 free(tm, M_DEVBUF); 3603 break; 3604 } 3605 tm->tm_name = tsti->tsti_name; 3606 3607 /* Next is any GPIO info for this media. */ 3608 tm->tm_gpdata = cp[1]; 3609 3610 /* 3611 * Next is a word containing OPMODE information 3612 * and info on how to detect if this media is 3613 * active. 3614 */ 3615 word = TULIP_ROM_GETW(cp, 2); 3616 tm->tm_opmode = TULIP_ROM_MB_OPMODE(word); 3617 if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) { 3618 tm->tm_actmask = 3619 TULIP_ROM_MB_BITPOS(word); 3620 tm->tm_actdata = 3621 (word & TULIP_ROM_MB_POLARITY) ? 3622 0 : tm->tm_actmask; 3623 } 3624 3625 /* 3626 * Now, add the media to our list. We will 3627 * print them out later. 3628 */ 3629 ifmedia_add(&sc->sc_mii.mii_media, 3630 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 3631 tsti->tsti_options, minst), 0, tm); 3632 break; 3633 3634 case TULIP_ROM_MB_21140_MII: 3635 seen |= 1 << TULIP_ROM_MB_21140_MII; 3636 3637 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK); 3638 memset(tm, 0, sizeof(*tm)); 3639 3640 tm->tm_type = TULIP_ROM_MB_21140_MII; 3641 tm->tm_get = tlp_mii_getmedia; 3642 tm->tm_set = tlp_mii_setmedia; 3643 3644 if (sc->sc_reset == NULL) 3645 sc->sc_reset = tlp_21140_reset; 3646 3647 /* First is the PHY number. */ 3648 tm->tm_phyno = *cp++; 3649 3650 /* Next is the MII select sequence length and offset. */ 3651 tm->tm_gp_length = *cp++; 3652 tm->tm_gp_offset = cp - &sc->sc_srom[0]; 3653 cp += tm->tm_gp_length; 3654 3655 /* Next is the MII reset sequence length and offset. */ 3656 tm->tm_reset_length = *cp++; 3657 tm->tm_reset_offset = cp - &sc->sc_srom[0]; 3658 cp += tm->tm_reset_length; 3659 3660 /* 3661 * The following items are left in the media block 3662 * that we don't particularly care about: 3663 * 3664 * capabilities W 3665 * advertisement W 3666 * full duplex W 3667 * tx threshold W 3668 * 3669 * These appear to be bits in the PHY registers, 3670 * which our MII code handles on its own. 3671 */ 3672 3673 /* 3674 * Before we probe the MII bus, we need to reset 3675 * it and issue the selection sequence. 3676 */ 3677 3678 /* Set the direction of the pins... */ 3679 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 3680 3681 for (i = 0; i < tm->tm_reset_length; i++) { 3682 delay(10); 3683 TULIP_WRITE(sc, CSR_GPP, 3684 sc->sc_srom[tm->tm_reset_offset + i]); 3685 } 3686 3687 for (i = 0; i < tm->tm_gp_length; i++) { 3688 delay(10); 3689 TULIP_WRITE(sc, CSR_GPP, 3690 sc->sc_srom[tm->tm_gp_offset + i]); 3691 } 3692 3693 /* If there were no sequences, just lower the pins. */ 3694 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 3695 delay(10); 3696 TULIP_WRITE(sc, CSR_GPP, 0); 3697 } 3698 3699 /* 3700 * Now, probe the MII for the PHY. Note, we know 3701 * the location of the PHY on the bus, but we don't 3702 * particularly care; the MII code just likes to 3703 * search the whole thing anyhow. 3704 */ 3705 mii_phy_probe(&sc->sc_dev, &sc->sc_mii, 0xffffffff); 3706 3707 /* 3708 * Now, search for the PHY we hopefully just 3709 * configured. If it's not configured into the 3710 * kernel, we lose. The PHY's default media always 3711 * takes priority. 3712 */ 3713 for (phy = LIST_FIRST(&sc->sc_mii.mii_phys); 3714 phy != NULL; 3715 phy = LIST_NEXT(phy, mii_list)) 3716 if (phy->mii_offset == tm->tm_phyno) 3717 break; 3718 if (phy == NULL) { 3719 printf("%s: unable to configure MII\n", 3720 sc->sc_dev.dv_xname); 3721 break; 3722 } 3723 3724 sc->sc_flags |= TULIPF_HAS_MII; 3725 sc->sc_tick = tlp_mii_tick; 3726 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 3727 phy->mii_inst); 3728 3729 /* 3730 * Okay, now that we've found the PHY and the MII 3731 * layer has added all of the media associated 3732 * with that PHY, we need to traverse the media 3733 * list, and add our `tm' to each entry's `aux' 3734 * pointer. 3735 * 3736 * We do this by looking for media with our 3737 * PHY's `instance'. 3738 */ 3739 for (ife = LIST_FIRST(&sc->sc_mii.mii_media.ifm_list); 3740 ife != NULL; 3741 ife = LIST_NEXT(ife, ifm_list)) { 3742 if (IFM_INST(ife->ifm_media) != phy->mii_inst) 3743 continue; 3744 ife->ifm_aux = tm; 3745 } 3746 break; 3747 3748 case TULIP_ROM_MB_21142_SIA: 3749 printf("%s: 21142 SIA block\n", sc->sc_dev.dv_xname); 3750 break; 3751 3752 case TULIP_ROM_MB_21142_MII: 3753 printf("%s: 21142 MII block\n", sc->sc_dev.dv_xname); 3754 break; 3755 3756 case TULIP_ROM_MB_21143_SYM: 3757 printf("%s: 21143 SYM block\n", sc->sc_dev.dv_xname); 3758 break; 3759 3760 case TULIP_ROM_MB_21143_RESET: 3761 printf("%s: 21143 reset block\n", sc->sc_dev.dv_xname); 3762 break; 3763 3764 default: 3765 printf("%s: unknown ISV media block type 0x%02x\n", 3766 sc->sc_dev.dv_xname, type); 3767 } 3768 } 3769 3770 /* 3771 * Deal with the case where no media is configured. 3772 */ 3773 if (LIST_FIRST(&sc->sc_mii.mii_media.ifm_list) == NULL) { 3774 printf("%s: no media found!\n", sc->sc_dev.dv_xname); 3775 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 3776 defmedia = IFM_ETHER|IFM_NONE; 3777 goto set_default; 3778 } 3779 3780 #define PRINT(s) printf("%s%s", sep, s); sep = ", " 3781 3782 /* 3783 * Display any non-MII media we've located. 3784 */ 3785 if (seen & (1 << TULIP_ROM_MB_21140_GPR)) { 3786 const char *sep = ""; 3787 printf("%s: GPR media: ", sc->sc_dev.dv_xname); 3788 for (ife = LIST_FIRST(&sc->sc_mii.mii_media.ifm_list); 3789 ife != NULL; 3790 ife = LIST_NEXT(ife, ifm_list)) { 3791 minst = IFM_INST(ife->ifm_media); 3792 tm = ife->ifm_aux; 3793 if (tm->tm_type != TULIP_ROM_MB_21140_GPR) 3794 continue; 3795 PRINT(tm->tm_name); 3796 } 3797 3798 /* 3799 * XXX Pick a better default. Should come 3800 * XXX from SROM on 21140[A], and should 3801 * XXX be "auto" on Macronix chips (which 3802 * XXX have an internal NWay block). 3803 */ 3804 if (defmedia == 0) { 3805 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 3806 minst); 3807 printf(", default 10baseT"); 3808 } 3809 printf("\n"); 3810 } 3811 3812 if (seen & (1 << TULIP_ROM_MB_21142_SIA)) { 3813 printf("%s: SIA media: ", sc->sc_dev.dv_xname); 3814 /* XXX */ 3815 printf("\n"); 3816 } 3817 3818 if (seen & (1 << TULIP_ROM_MB_21143_SYM)) { 3819 printf("%s: SYM media: ", sc->sc_dev.dv_xname); 3820 /* XXX */ 3821 printf("\n"); 3822 } 3823 3824 /* 3825 * XXX Display default media if not MII. 3826 */ 3827 3828 #undef PRINT 3829 3830 set_default: 3831 /* 3832 * Set the default media. 3833 * 3834 * XXX Should make some attempt to care about the SROM default 3835 * setting, but we don't. 3836 */ 3837 #ifdef DIAGNOSTIC 3838 if (defmedia == 0) 3839 panic("tlp_2114x_isv_tmsw_init: no default media"); 3840 #endif 3841 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 3842 } 3843 3844 void 3845 tlp_2114x_isv_tmsw_get(sc, ifmr) 3846 struct tulip_softc *sc; 3847 struct ifmediareq *ifmr; 3848 { 3849 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3850 struct tulip_2114x_media *tm = ife->ifm_aux; 3851 3852 (*tm->tm_get)(sc, ifmr); 3853 } 3854 3855 int 3856 tlp_2114x_isv_tmsw_set(sc) 3857 struct tulip_softc *sc; 3858 { 3859 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3860 struct tulip_2114x_media *tm = ife->ifm_aux; 3861 3862 return ((*tm->tm_set)(sc)); 3863 } 3864 3865 void 3866 tlp_21140_gpr_getmedia(sc, ifmr) 3867 struct tulip_softc *sc; 3868 struct ifmediareq *ifmr; 3869 { 3870 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3871 struct tulip_2114x_media *tm = ife->ifm_aux; 3872 3873 ifmr->ifm_status = 0; 3874 3875 switch (IFM_SUBTYPE(ife->ifm_media)) { 3876 case IFM_AUTO: 3877 /* 3878 * XXX Implement autosensing case. 3879 */ 3880 break; 3881 3882 default: 3883 /* 3884 * If not autosensing, active media is the currently 3885 * selected media. 3886 */ 3887 ifmr->ifm_active = ife->ifm_media; 3888 3889 /* 3890 * If we can sense the active status of the link, 3891 * so do. 3892 */ 3893 if (tm->tm_actmask != 0) { 3894 ifmr->ifm_status |= IFM_AVALID; 3895 if (TULIP_ISSET(sc, CSR_GPP, tm->tm_actmask) == 3896 tm->tm_actdata) 3897 ifmr->ifm_status |= IFM_ACTIVE; 3898 } 3899 } 3900 } 3901 3902 int 3903 tlp_21140_gpr_setmedia(sc) 3904 struct tulip_softc *sc; 3905 { 3906 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3907 struct tulip_2114x_media *tm = ife->ifm_aux; 3908 3909 switch (IFM_SUBTYPE(ife->ifm_media)) { 3910 case IFM_AUTO: 3911 /* 3912 * XXX Implement autosensing case. 3913 */ 3914 break; 3915 3916 default: 3917 /* 3918 * The ifmedia entry contains the OPMODE bits necessary 3919 * to enable this media type. It may be necessary to 3920 * perform a reset of the chip; see tlp_21140_reset(). 3921 */ 3922 if ((tm->tm_opmode & OPMODE_MEDIA_BITS) != 3923 (sc->sc_opmode & OPMODE_MEDIA_BITS)) { 3924 /* 3925 * We have to reset the chip. Note that we 3926 * won't recurse into this path again as 3927 * the OPMODE bits will be correct this 3928 * next time through. 3929 */ 3930 return (tlp_init(sc)); 3931 } 3932 3933 /* 3934 * Set new OPMODE bits and write the OPMODE register. 3935 */ 3936 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 3937 sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | 3938 tm->tm_opmode; 3939 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3940 3941 /* 3942 * Set the GPIO pins for this media, to flip any 3943 * relays, etc. 3944 */ 3945 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 3946 delay(10); 3947 TULIP_WRITE(sc, CSR_GPP, tm->tm_gpdata); 3948 break; 3949 } 3950 3951 return (0); 3952 } 3953 3954 /* 3955 * MII-on-SIO media switch. Handles only MII attached to the SIO. 3956 */ 3957 void tlp_sio_mii_tmsw_init __P((struct tulip_softc *)); 3958 3959 const struct tulip_mediasw tlp_sio_mii_mediasw = { 3960 tlp_sio_mii_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 3961 }; 3962 3963 void 3964 tlp_sio_mii_tmsw_init(sc) 3965 struct tulip_softc *sc; 3966 { 3967 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3968 3969 sc->sc_mii.mii_ifp = ifp; 3970 sc->sc_mii.mii_readreg = tlp_sio_mii_readreg; 3971 sc->sc_mii.mii_writereg = tlp_sio_mii_writereg; 3972 sc->sc_mii.mii_statchg = sc->sc_statchg; 3973 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 3974 tlp_mediastatus); 3975 mii_phy_probe(&sc->sc_dev, &sc->sc_mii, 0xffffffff); 3976 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 3977 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 3978 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 3979 } else { 3980 sc->sc_flags |= TULIPF_HAS_MII; 3981 sc->sc_tick = tlp_mii_tick; 3982 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 3983 } 3984 } 3985 3986 /* 3987 * Lite-On PNIC media switch. Must handle MII or internal NWAY. 3988 */ 3989 void tlp_pnic_tmsw_init __P((struct tulip_softc *)); 3990 void tlp_pnic_tmsw_get __P((struct tulip_softc *, struct ifmediareq *)); 3991 int tlp_pnic_tmsw_set __P((struct tulip_softc *)); 3992 3993 const struct tulip_mediasw tlp_pnic_mediasw = { 3994 tlp_pnic_tmsw_init, tlp_pnic_tmsw_get, tlp_pnic_tmsw_set 3995 }; 3996 3997 void tlp_pnic_nway_statchg __P((struct device *)); 3998 void tlp_pnic_nway_tick __P((void *)); 3999 int tlp_pnic_nway_service __P((struct tulip_softc *, int)); 4000 void tlp_pnic_nway_reset __P((struct tulip_softc *)); 4001 int tlp_pnic_nway_auto __P((struct tulip_softc *, int)); 4002 void tlp_pnic_nway_auto_timeout __P((void *)); 4003 void tlp_pnic_nway_status __P((struct tulip_softc *)); 4004 void tlp_pnic_nway_acomp __P((struct tulip_softc *)); 4005 4006 void 4007 tlp_pnic_tmsw_init(sc) 4008 struct tulip_softc *sc; 4009 { 4010 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4011 const char *sep = ""; 4012 4013 #define ADD(m, c) ifmedia_add(&sc->sc_mii.mii_media, (m), (c), NULL) 4014 #define PRINT(s) printf("%s%s", sep, s); sep = ", " 4015 4016 sc->sc_mii.mii_ifp = ifp; 4017 sc->sc_mii.mii_readreg = tlp_pnic_mii_readreg; 4018 sc->sc_mii.mii_writereg = tlp_pnic_mii_writereg; 4019 sc->sc_mii.mii_statchg = sc->sc_statchg; 4020 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4021 tlp_mediastatus); 4022 mii_phy_probe(&sc->sc_dev, &sc->sc_mii, 0xffffffff); 4023 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 4024 /* XXX What about AUI/BNC support? */ 4025 printf("%s: ", sc->sc_dev.dv_xname); 4026 4027 tlp_pnic_nway_reset(sc); 4028 4029 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), 4030 PNIC_NWAY_TW|PNIC_NWAY_CAP10T); 4031 PRINT("10baseT"); 4032 4033 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, 0), 4034 PNIC_NWAY_TW|PNIC_NWAY_FD|PNIC_NWAY_CAP10TFDX); 4035 PRINT("10baseT-FDX"); 4036 4037 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, 0), 4038 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_CAP100TX); 4039 PRINT("100baseTX"); 4040 4041 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, 0), 4042 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_FD| 4043 PNIC_NWAY_CAP100TXFDX); 4044 PRINT("100baseTX-FDX"); 4045 4046 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 4047 PNIC_NWAY_TW|PNIC_NWAY_RN|PNIC_NWAY_NW| 4048 PNIC_NWAY_CAP10T|PNIC_NWAY_CAP10TFDX| 4049 PNIC_NWAY_CAP100TXFDX|PNIC_NWAY_CAP100TX); 4050 PRINT("auto"); 4051 4052 printf("\n"); 4053 4054 sc->sc_statchg = tlp_pnic_nway_statchg; 4055 sc->sc_tick = tlp_pnic_nway_tick; 4056 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 4057 } else { 4058 sc->sc_flags |= TULIPF_HAS_MII; 4059 sc->sc_tick = tlp_mii_tick; 4060 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 4061 } 4062 4063 #undef ADD 4064 #undef PRINT 4065 } 4066 4067 void 4068 tlp_pnic_tmsw_get(sc, ifmr) 4069 struct tulip_softc *sc; 4070 struct ifmediareq *ifmr; 4071 { 4072 struct mii_data *mii = &sc->sc_mii; 4073 4074 if (sc->sc_flags & TULIPF_HAS_MII) 4075 tlp_mii_getmedia(sc, ifmr); 4076 else { 4077 mii->mii_media_status = 0; 4078 mii->mii_media_active = IFM_NONE; 4079 tlp_pnic_nway_service(sc, MII_POLLSTAT); 4080 ifmr->ifm_status = sc->sc_mii.mii_media_status; 4081 ifmr->ifm_active = sc->sc_mii.mii_media_active; 4082 } 4083 } 4084 4085 int 4086 tlp_pnic_tmsw_set(sc) 4087 struct tulip_softc *sc; 4088 { 4089 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4090 struct mii_data *mii = &sc->sc_mii; 4091 4092 if (sc->sc_flags & TULIPF_HAS_MII) { 4093 /* 4094 * Make sure the built-in Tx jabber timer is disabled. 4095 */ 4096 TULIP_WRITE(sc, CSR_PNIC_ENDEC, PNIC_ENDEC_JDIS); 4097 4098 return (tlp_mii_setmedia(sc)); 4099 } 4100 4101 if (ifp->if_flags & IFF_UP) { 4102 mii->mii_media_status = 0; 4103 mii->mii_media_active = IFM_NONE; 4104 return (tlp_pnic_nway_service(sc, MII_MEDIACHG)); 4105 } 4106 4107 return (0); 4108 } 4109 4110 void 4111 tlp_pnic_nway_statchg(self) 4112 struct device *self; 4113 { 4114 struct tulip_softc *sc = (struct tulip_softc *)self; 4115 4116 /* Idle the transmit and receive processes. */ 4117 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4118 4119 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_PS|OPMODE_PCS| 4120 OPMODE_SCR|OPMODE_HBD); 4121 4122 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) { 4123 sc->sc_opmode |= OPMODE_TTM; 4124 TULIP_WRITE(sc, CSR_GPP, 4125 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 0) | 4126 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 4127 } else { 4128 sc->sc_opmode |= OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD; 4129 TULIP_WRITE(sc, CSR_GPP, 4130 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 1) | 4131 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 4132 } 4133 4134 if (sc->sc_mii.mii_media_active & IFM_FDX) 4135 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 4136 4137 /* 4138 * Write new OPMODE bits. This also restarts the transmit 4139 * and receive processes. 4140 */ 4141 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4142 4143 /* XXX Update ifp->if_baudrate */ 4144 } 4145 4146 void 4147 tlp_pnic_nway_tick(arg) 4148 void *arg; 4149 { 4150 struct tulip_softc *sc = arg; 4151 int s; 4152 4153 s = splnet(); 4154 tlp_pnic_nway_service(sc, MII_TICK); 4155 splx(s); 4156 4157 timeout(tlp_pnic_nway_tick, sc, hz); 4158 } 4159 4160 /* 4161 * Support for the Lite-On PNIC internal NWay block. This is constructed 4162 * somewhat like a PHY driver for simplicity. 4163 */ 4164 4165 int 4166 tlp_pnic_nway_service(sc, cmd) 4167 struct tulip_softc *sc; 4168 int cmd; 4169 { 4170 struct mii_data *mii = &sc->sc_mii; 4171 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 4172 4173 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 4174 return (0); 4175 4176 switch (cmd) { 4177 case MII_POLLSTAT: 4178 /* Nothing special to do here. */ 4179 break; 4180 4181 case MII_MEDIACHG: 4182 switch (IFM_SUBTYPE(ife->ifm_media)) { 4183 case IFM_AUTO: 4184 (void) tlp_pnic_nway_auto(sc, 1); 4185 break; 4186 case IFM_100_T4: 4187 /* 4188 * XXX Not supported as a manual setting right now. 4189 */ 4190 return (EINVAL); 4191 default: 4192 /* 4193 * NWAY register data is stored in the ifmedia entry. 4194 */ 4195 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 4196 } 4197 break; 4198 4199 case MII_TICK: 4200 /* 4201 * Only used for autonegotiation. 4202 */ 4203 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 4204 return (0); 4205 4206 /* 4207 * Check to see if we have link. If we do, we don't 4208 * need to restart the autonegotiation process. 4209 */ 4210 if (sc->sc_flags & TULIPF_LINK_UP) 4211 return (0); 4212 4213 /* 4214 * Only retry autonegotiation every 5 seconds. 4215 */ 4216 if (++sc->sc_nway_ticks != 5) 4217 return (0); 4218 4219 sc->sc_nway_ticks = 0; 4220 tlp_pnic_nway_reset(sc); 4221 if (tlp_pnic_nway_auto(sc, 0) == EJUSTRETURN) 4222 return (0); 4223 break; 4224 } 4225 4226 /* Update the media status. */ 4227 tlp_pnic_nway_status(sc); 4228 4229 /* Callback if something changed. */ 4230 if (sc->sc_nway_active != mii->mii_media_active || 4231 cmd == MII_MEDIACHG) { 4232 (*sc->sc_statchg)(&sc->sc_dev); 4233 sc->sc_nway_active = mii->mii_media_active; 4234 } 4235 return (0); 4236 } 4237 4238 void 4239 tlp_pnic_nway_reset(sc) 4240 struct tulip_softc *sc; 4241 { 4242 4243 TULIP_WRITE(sc, CSR_PNIC_NWAY, PNIC_NWAY_RS); 4244 delay(100); 4245 TULIP_WRITE(sc, CSR_PNIC_NWAY, 0); 4246 } 4247 4248 int 4249 tlp_pnic_nway_auto(sc, waitfor) 4250 struct tulip_softc *sc; 4251 int waitfor; 4252 { 4253 struct mii_data *mii = &sc->sc_mii; 4254 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 4255 u_int32_t reg; 4256 int i; 4257 4258 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) 4259 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 4260 4261 if (waitfor) { 4262 /* Wait 500ms for it to complete. */ 4263 for (i = 0; i < 500; i++) { 4264 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 4265 if (reg & PNIC_NWAY_LPAR_MASK) { 4266 tlp_pnic_nway_acomp(sc); 4267 return (0); 4268 } 4269 delay(1000); 4270 } 4271 #if 0 4272 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 4273 printf("%s: autonegotiation failed to complete\n", 4274 sc->sc_dev.dv_xname); 4275 #endif 4276 4277 /* 4278 * Don't need to worry about clearing DOINGAUTO. 4279 * If that's set, a timeout is pending, and it will 4280 * clear the flag. 4281 */ 4282 return (EIO); 4283 } 4284 4285 /* 4286 * Just let it finish asynchronously. This is for the benefit of 4287 * the tick handler driving autonegotiation. Don't want 500ms 4288 * delays all the time while the system is running! 4289 */ 4290 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) { 4291 sc->sc_flags |= TULIPF_DOINGAUTO; 4292 timeout(tlp_pnic_nway_auto_timeout, sc, hz >> 1); 4293 } 4294 return (EJUSTRETURN); 4295 } 4296 4297 void 4298 tlp_pnic_nway_auto_timeout(arg) 4299 void *arg; 4300 { 4301 struct tulip_softc *sc = arg; 4302 u_int32_t reg; 4303 int s; 4304 4305 s = splnet(); 4306 sc->sc_flags &= ~TULIPF_DOINGAUTO; 4307 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 4308 #if 0 4309 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 4310 printf("%s: autonegotiation failed to complete\n", 4311 sc->sc_dev.dv_xname); 4312 #endif 4313 4314 tlp_pnic_nway_acomp(sc); 4315 4316 /* Update the media status. */ 4317 (void) tlp_pnic_nway_service(sc, MII_POLLSTAT); 4318 splx(s); 4319 } 4320 4321 void 4322 tlp_pnic_nway_status(sc) 4323 struct tulip_softc *sc; 4324 { 4325 struct mii_data *mii = &sc->sc_mii; 4326 u_int32_t reg; 4327 4328 mii->mii_media_status = IFM_AVALID; 4329 mii->mii_media_active = IFM_ETHER; 4330 4331 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 4332 4333 if (sc->sc_flags & TULIPF_LINK_UP) 4334 mii->mii_media_status |= IFM_ACTIVE; 4335 4336 if (reg & PNIC_NWAY_NW) { 4337 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) { 4338 /* Erg, still trying, I guess... */ 4339 mii->mii_media_active |= IFM_NONE; 4340 return; 4341 } 4342 4343 #if 0 4344 if (reg & PNIC_NWAY_LPAR100T4) 4345 mii->mii_media_active |= IFM_100_T4; 4346 else 4347 #endif 4348 if (reg & PNIC_NWAY_LPAR100TXFDX) 4349 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 4350 else if (reg & PNIC_NWAY_LPAR100TX) 4351 mii->mii_media_active |= IFM_100_TX; 4352 else if (reg & PNIC_NWAY_LPAR10TFDX) 4353 mii->mii_media_active |= IFM_10_T|IFM_FDX; 4354 else if (reg & PNIC_NWAY_LPAR10T) 4355 mii->mii_media_active |= IFM_10_T; 4356 else 4357 mii->mii_media_active |= IFM_NONE; 4358 } else { 4359 if (reg & PNIC_NWAY_100) 4360 mii->mii_media_active |= IFM_100_TX; 4361 else 4362 mii->mii_media_active |= IFM_10_T; 4363 if (reg & PNIC_NWAY_FD) 4364 mii->mii_media_active |= IFM_FDX; 4365 } 4366 } 4367 4368 void 4369 tlp_pnic_nway_acomp(sc) 4370 struct tulip_softc *sc; 4371 { 4372 u_int32_t reg; 4373 4374 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 4375 reg &= ~(PNIC_NWAY_FD|PNIC_NWAY_100|PNIC_NWAY_RN); 4376 4377 if (reg & (PNIC_NWAY_LPAR100TXFDX|PNIC_NWAY_LPAR100TX)) 4378 reg |= PNIC_NWAY_100; 4379 if (reg & (PNIC_NWAY_LPAR10TFDX|PNIC_NWAY_LPAR100TXFDX)) 4380 reg |= PNIC_NWAY_FD; 4381 4382 TULIP_WRITE(sc, CSR_PNIC_NWAY, reg); 4383 } 4384 4385 /* 4386 * Macronix PMAC media switch. MX98713 and MX98713A have MII. 4387 * All have GPR media. MX98713A, MX98715, MX98725 have internal 4388 * Nway blocks for autonegotiation. 4389 */ 4390 void tlp_pmac_tmsw_init __P((struct tulip_softc *)); 4391 void tlp_pmac_tmsw_get __P((struct tulip_softc *, struct ifmediareq *)); 4392 int tlp_pmac_tmsw_set __P((struct tulip_softc *)); 4393 4394 const struct tulip_mediasw tlp_pmac_mediasw = { 4395 tlp_pmac_tmsw_init, tlp_pmac_tmsw_get, tlp_pmac_tmsw_set 4396 }; 4397 4398 void tlp_pmac_nway_statchg __P((struct device *)); 4399 void tlp_pmac_nway_tick __P((void *)); 4400 int tlp_pmac_nway_service __P((struct tulip_softc *, int)); 4401 void tlp_pmac_nway_reset __P((struct tulip_softc *)); 4402 int tlp_pmac_nway_auto __P((struct tulip_softc *, int)); 4403 void tlp_pmac_nway_auto_timeout __P((void *)); 4404 void tlp_pmac_nway_status __P((struct tulip_softc *)); 4405 void tlp_pmac_nway_acomp __P((struct tulip_softc *)); 4406 4407 void tlp_pmac_check_link __P((struct tulip_softc *)); 4408 4409 void 4410 tlp_pmac_tmsw_init(sc) 4411 struct tulip_softc *sc; 4412 { 4413 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4414 const char *sep = ""; 4415 4416 #define ADD(m, c) ifmedia_add(&sc->sc_mii.mii_media, (m), (c), NULL) 4417 #define PRINT(s) printf("%s%s", sep, s); sep = ", " 4418 4419 sc->sc_mii.mii_ifp = ifp; 4420 sc->sc_mii.mii_readreg = tlp_sio_mii_readreg; 4421 sc->sc_mii.mii_writereg = tlp_sio_mii_writereg; 4422 sc->sc_mii.mii_statchg = sc->sc_statchg; 4423 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4424 tlp_mediastatus); 4425 if (sc->sc_chip == TULIP_CHIP_MX98713 || 4426 sc->sc_chip == TULIP_CHIP_MX98713A) { 4427 mii_phy_probe(&sc->sc_dev, &sc->sc_mii, 0xffffffff); 4428 if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL) { 4429 sc->sc_flags |= TULIPF_HAS_MII; 4430 sc->sc_tick = tlp_mii_tick; 4431 sc->sc_preinit = tlp_2114x_preinit; 4432 ifmedia_set(&sc->sc_mii.mii_media, 4433 IFM_ETHER|IFM_AUTO); 4434 return; 4435 } 4436 } 4437 4438 printf("%s: ", sc->sc_dev.dv_xname); 4439 4440 tlp_pmac_nway_reset(sc); 4441 4442 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), 4443 PMAC_10TCTL_LTE|PMAC_10TCTL_HDE); 4444 PRINT("10baseT"); 4445 4446 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, 0), 4447 PMAC_10TCTL_LTE); 4448 PRINT("10baseT-FDX"); 4449 4450 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, 0), 4451 PMAC_10TCTL_LTE|PMAC_10TCTL_TXH); 4452 PRINT("100baseTX"); 4453 4454 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, 0), 4455 PMAC_10TCTL_LTE|PMAC_10TCTL_TXF); 4456 PRINT("100baseTX-FDX"); 4457 4458 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 4459 PMAC_10TCTL_LTE|PMAC_10TCTL_HDE|PMAC_10TCTL_TXH|PMAC_10TCTL_TXF| 4460 PMAC_10TCTL_ANE); 4461 PRINT("auto"); 4462 4463 printf("\n"); 4464 4465 /* Set the LED modes. */ 4466 tlp_pmac_reset(sc); 4467 4468 sc->sc_reset = tlp_pmac_reset; 4469 sc->sc_statchg = tlp_pmac_nway_statchg; 4470 sc->sc_tick = tlp_pmac_nway_tick; 4471 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 4472 4473 #undef ADD 4474 #undef PRINT 4475 } 4476 4477 void 4478 tlp_pmac_tmsw_get(sc, ifmr) 4479 struct tulip_softc *sc; 4480 struct ifmediareq *ifmr; 4481 { 4482 struct mii_data *mii = &sc->sc_mii; 4483 4484 if (sc->sc_flags & TULIPF_HAS_MII) 4485 tlp_mii_getmedia(sc, ifmr); 4486 else { 4487 mii->mii_media_status = 0; 4488 mii->mii_media_active = IFM_NONE; 4489 tlp_pmac_nway_service(sc, MII_POLLSTAT); 4490 ifmr->ifm_status = sc->sc_mii.mii_media_status; 4491 ifmr->ifm_active = sc->sc_mii.mii_media_active; 4492 } 4493 } 4494 4495 int 4496 tlp_pmac_tmsw_set(sc) 4497 struct tulip_softc *sc; 4498 { 4499 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4500 struct mii_data *mii = &sc->sc_mii; 4501 4502 if (sc->sc_flags & TULIPF_HAS_MII) 4503 return (tlp_mii_setmedia(sc)); 4504 4505 if (ifp->if_flags & IFF_UP) { 4506 mii->mii_media_status = 0; 4507 mii->mii_media_active = IFM_NONE; 4508 return (tlp_pmac_nway_service(sc, MII_MEDIACHG)); 4509 } 4510 4511 return (0); 4512 } 4513 4514 void 4515 tlp_pmac_nway_statchg(self) 4516 struct device *self; 4517 { 4518 struct tulip_softc *sc = (struct tulip_softc *)self; 4519 4520 /* Idle the transmit and receive processes. */ 4521 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4522 4523 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_PS|OPMODE_PCS| 4524 OPMODE_SCR|OPMODE_HBD); 4525 4526 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) 4527 sc->sc_opmode |= OPMODE_TTM; 4528 else 4529 sc->sc_opmode |= OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD; 4530 4531 if (sc->sc_mii.mii_media_active & IFM_FDX) 4532 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 4533 4534 /* 4535 * Write new OPMODE bits. This also restarts the transmit 4536 * and receive processes. 4537 */ 4538 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4539 4540 /* XXX Update ifp->if_baudrate */ 4541 } 4542 4543 void 4544 tlp_pmac_nway_tick(arg) 4545 void *arg; 4546 { 4547 struct tulip_softc *sc = arg; 4548 int s; 4549 4550 s = splnet(); 4551 tlp_pmac_nway_service(sc, MII_TICK); 4552 splx(s); 4553 4554 timeout(tlp_pmac_nway_tick, sc, hz); 4555 } 4556 4557 /* 4558 * Support for the Macronix PMAC internal NWay block. This is constructed 4559 * somewhat like a PHY driver for simplicity. 4560 */ 4561 4562 int 4563 tlp_pmac_nway_service(sc, cmd) 4564 struct tulip_softc *sc; 4565 int cmd; 4566 { 4567 struct mii_data *mii = &sc->sc_mii; 4568 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 4569 4570 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 4571 return (0); 4572 4573 tlp_pmac_check_link(sc); 4574 4575 switch (cmd) { 4576 case MII_POLLSTAT: 4577 /* Nothing special to do here. */ 4578 break; 4579 4580 case MII_MEDIACHG: 4581 switch (IFM_SUBTYPE(ife->ifm_media)) { 4582 case IFM_AUTO: 4583 (void) tlp_pnic_nway_auto(sc, 1); 4584 break; 4585 case IFM_100_T4: 4586 /* 4587 * XXX Not supported as a manual setting right now. 4588 */ 4589 return (EINVAL); 4590 default: 4591 /* Nothing to do in this case. */ 4592 break; 4593 } 4594 break; 4595 4596 case MII_TICK: 4597 /* 4598 * Only used for autonegotiation. 4599 */ 4600 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 4601 return (0); 4602 4603 /* 4604 * Check to see if we have link. If we do, we don't 4605 * need to restart the autonegotiation process. 4606 */ 4607 if (sc->sc_flags & TULIPF_LINK_UP) 4608 return (0); 4609 4610 /* 4611 * Only retry autonegotiation every 5 seconds. 4612 */ 4613 if (++sc->sc_nway_ticks != 5) 4614 return (0); 4615 4616 sc->sc_nway_ticks = 0; 4617 tlp_pmac_nway_reset(sc); 4618 if (tlp_pmac_nway_auto(sc, 0) == EJUSTRETURN) 4619 return (0); 4620 break; 4621 } 4622 4623 /* Update the media status. */ 4624 tlp_pmac_nway_status(sc); 4625 4626 /* Callback if something changed. */ 4627 if (sc->sc_nway_active != mii->mii_media_active || 4628 cmd == MII_MEDIACHG) { 4629 (*sc->sc_statchg)(&sc->sc_dev); 4630 sc->sc_nway_active = mii->mii_media_active; 4631 } 4632 4633 tlp_pmac_check_link(sc); 4634 4635 return (0); 4636 } 4637 4638 void 4639 tlp_pmac_nway_reset(sc) 4640 struct tulip_softc *sc; 4641 { 4642 4643 TULIP_WRITE(sc, CSR_PMAC_NWAYRESET, 0); 4644 delay(1000); 4645 } 4646 4647 int 4648 tlp_pmac_nway_auto(sc, waitfor) 4649 struct tulip_softc *sc; 4650 int waitfor; 4651 { 4652 int i; 4653 4654 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) { 4655 TULIP_WRITE(sc, CSR_STATUS, STATUS_LNPANC); 4656 TULIP_SET(sc, CSR_PMAC_10TCTL, PMAC_10TCTL_ANE); 4657 } 4658 4659 if (waitfor) { 4660 /* Wait 500ms for it to complete. */ 4661 for (i = 0; i < 500; i++) { 4662 if (TULIP_ISSET(sc, CSR_STATUS, STATUS_LNPANC)) { 4663 tlp_pmac_nway_acomp(sc); 4664 return (0); 4665 } 4666 delay(1000); 4667 } 4668 #if 0 4669 if (TULIP_ISSET(sc, CSR_STATUS, STATUS_LNPANC) == 0) 4670 printf("%s: autonegotiation faild to complete\n", 4671 sc->sc_dev.dv_xname); 4672 #endif 4673 4674 /* 4675 * Don't need to worry about clearing DOINGAUTO. 4676 * If that's set, a timeout is pending, and it will 4677 * clear the flag. 4678 */ 4679 return (EIO); 4680 } 4681 4682 /* 4683 * Just let it finish asynchronously. This is for the benefit of 4684 * the tick handler driving autonegotiation. Don't want 500ms 4685 * delays all the time while the system us running! 4686 */ 4687 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) { 4688 sc->sc_flags |= TULIPF_DOINGAUTO; 4689 timeout(tlp_pmac_nway_auto_timeout, sc, hz >> 1); 4690 } 4691 return (EJUSTRETURN); 4692 } 4693 4694 void 4695 tlp_pmac_nway_auto_timeout(arg) 4696 void *arg; 4697 { 4698 struct tulip_softc *sc = arg; 4699 int s; 4700 4701 s = splnet(); 4702 sc->sc_flags &= ~TULIPF_DOINGAUTO; 4703 #if 0 4704 if (TULIP_ISSET(sc, CSR_STATUS, STATUS_LNPANC) == 0) 4705 printf("%s: autonegotiation failed to complete\n", 4706 sc->sc_dev.dv_xname); 4707 #endif 4708 4709 tlp_pmac_nway_acomp(sc); 4710 4711 /* Update the media status. */ 4712 (void) tlp_pmac_nway_service(sc, MII_POLLSTAT); 4713 splx(s); 4714 } 4715 4716 void 4717 tlp_pmac_nway_status(sc) 4718 struct tulip_softc *sc; 4719 { 4720 struct mii_data *mii = &sc->sc_mii; 4721 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 4722 u_int32_t reg; 4723 4724 mii->mii_media_status = IFM_AVALID; 4725 mii->mii_media_active = IFM_ETHER; 4726 4727 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 4728 if (TULIP_ISSET(sc, CSR_STATUS, STATUS_LNPANC) == 0) { 4729 /* Erg, still trying, I guess... */ 4730 mii->mii_media_active |= IFM_NONE; 4731 sc->sc_flags &= ~TULIPF_LINK_UP; 4732 return; 4733 } 4734 4735 reg = TULIP_READ(sc, CSR_PMAC_NWAYSTAT); 4736 4737 #if 0 4738 if (reg & PMAC_NWAYSTAT_T4) 4739 mii->mii_media_active |= IFM_100_T4; 4740 else 4741 #endif 4742 if (reg & PMAC_NWAYSTAT_100TXF) 4743 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 4744 else if (reg & PMAC_NWAYSTAT_100TXH) 4745 mii->mii_media_active |= IFM_100_TX; 4746 else if (reg & PMAC_NWAYSTAT_10TXF) 4747 mii->mii_media_active |= IFM_10_T|IFM_FDX; 4748 else if (reg & PMAC_NWAYSTAT_10TXH) 4749 mii->mii_media_active |= IFM_10_T; 4750 else 4751 mii->mii_media_active |= IFM_NONE; 4752 } else { 4753 /* 4754 * Non-autosensing case; currently selected media 4755 * is the active media. 4756 */ 4757 mii->mii_media_active = ife->ifm_media; 4758 } 4759 } 4760 4761 void 4762 tlp_pmac_check_link(sc) 4763 struct tulip_softc *sc; 4764 { 4765 u_int32_t reg; 4766 4767 reg = TULIP_READ(sc, CSR_PMAC_10TSTAT); 4768 if (IFM_SUBTYPE(sc->sc_nway_active) == IFM_10_T && 4769 (reg & PMAC_10TSTAT_LS10) == 0) 4770 sc->sc_flags |= TULIPF_LINK_UP; 4771 else if (IFM_SUBTYPE(sc->sc_nway_active) == IFM_100_TX && 4772 (reg & PMAC_10TSTAT_LS100) == 0) 4773 sc->sc_flags |= TULIPF_LINK_UP; 4774 else 4775 sc->sc_flags &= ~TULIPF_LINK_UP; 4776 4777 sc->sc_mii.mii_media_status = IFM_AVALID; 4778 if (sc->sc_flags & TULIPF_LINK_UP) 4779 sc->sc_mii.mii_media_status |= IFM_ACTIVE; 4780 } 4781 4782 void 4783 tlp_pmac_nway_acomp(sc) 4784 struct tulip_softc *sc; 4785 { 4786 4787 TULIP_CLR(sc, CSR_PMAC_10TCTL, PMAC_10TCTL_ANE); 4788 } 4789 4790 /* 4791 * ADMtek AL981 media switch. Only has internal PHY. 4792 */ 4793 void tlp_al981_tmsw_init __P((struct tulip_softc *)); 4794 4795 const struct tulip_mediasw tlp_al981_mediasw = { 4796 tlp_al981_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 4797 }; 4798 4799 void 4800 tlp_al981_tmsw_init(sc) 4801 struct tulip_softc *sc; 4802 { 4803 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4804 4805 sc->sc_mii.mii_ifp = ifp; 4806 sc->sc_mii.mii_readreg = tlp_al981_mii_readreg; 4807 sc->sc_mii.mii_writereg = tlp_al981_mii_writereg; 4808 sc->sc_mii.mii_statchg = sc->sc_statchg; 4809 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4810 tlp_mediastatus); 4811 mii_phy_probe(&sc->sc_dev, &sc->sc_mii, 0xffffffff); 4812 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 4813 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 4814 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 4815 } else { 4816 sc->sc_flags |= TULIPF_HAS_MII; 4817 sc->sc_tick = tlp_mii_tick; 4818 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 4819 } 4820 } 4821