1 /* $NetBSD: tulip.c,v 1.171 2009/09/01 21:46:52 jmcneill Exp $ */ 2 3 /*- 4 * Copyright (c) 1998, 1999, 2000, 2002 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; and by Charles M. Hannum. 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 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * Device driver for the Digital Semiconductor ``Tulip'' (21x4x) 35 * Ethernet controller family, and a variety of clone chips. 36 */ 37 38 #include <sys/cdefs.h> 39 __KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.171 2009/09/01 21:46:52 jmcneill Exp $"); 40 41 #include "bpfilter.h" 42 43 #include <sys/param.h> 44 #include <sys/systm.h> 45 #include <sys/callout.h> 46 #include <sys/mbuf.h> 47 #include <sys/malloc.h> 48 #include <sys/kernel.h> 49 #include <sys/socket.h> 50 #include <sys/ioctl.h> 51 #include <sys/errno.h> 52 #include <sys/device.h> 53 54 #include <machine/endian.h> 55 56 #include <uvm/uvm_extern.h> 57 58 #include <net/if.h> 59 #include <net/if_dl.h> 60 #include <net/if_media.h> 61 #include <net/if_ether.h> 62 63 #if NBPFILTER > 0 64 #include <net/bpf.h> 65 #endif 66 67 #include <sys/bus.h> 68 #include <sys/intr.h> 69 70 #include <dev/mii/mii.h> 71 #include <dev/mii/miivar.h> 72 #include <dev/mii/mii_bitbang.h> 73 74 #include <dev/ic/tulipreg.h> 75 #include <dev/ic/tulipvar.h> 76 77 const char * const tlp_chip_names[] = TULIP_CHIP_NAMES; 78 79 static const struct tulip_txthresh_tab tlp_10_txthresh_tab[] = 80 TLP_TXTHRESH_TAB_10; 81 82 static const struct tulip_txthresh_tab tlp_10_100_txthresh_tab[] = 83 TLP_TXTHRESH_TAB_10_100; 84 85 static const struct tulip_txthresh_tab tlp_winb_txthresh_tab[] = 86 TLP_TXTHRESH_TAB_WINB; 87 88 static const struct tulip_txthresh_tab tlp_dm9102_txthresh_tab[] = 89 TLP_TXTHRESH_TAB_DM9102; 90 91 static void tlp_start(struct ifnet *); 92 static void tlp_watchdog(struct ifnet *); 93 static int tlp_ioctl(struct ifnet *, u_long, void *); 94 static int tlp_init(struct ifnet *); 95 static void tlp_stop(struct ifnet *, int); 96 static int tlp_ifflags_cb(struct ethercom *); 97 98 static void tlp_rxdrain(struct tulip_softc *); 99 static int tlp_add_rxbuf(struct tulip_softc *, int); 100 static void tlp_srom_idle(struct tulip_softc *); 101 static int tlp_srom_size(struct tulip_softc *); 102 103 static int tlp_enable(struct tulip_softc *); 104 static void tlp_disable(struct tulip_softc *); 105 106 static void tlp_filter_setup(struct tulip_softc *); 107 static void tlp_winb_filter_setup(struct tulip_softc *); 108 static void tlp_al981_filter_setup(struct tulip_softc *); 109 static void tlp_asix_filter_setup(struct tulip_softc *); 110 111 static void tlp_rxintr(struct tulip_softc *); 112 static void tlp_txintr(struct tulip_softc *); 113 114 static void tlp_mii_tick(void *); 115 static void tlp_mii_statchg(device_t); 116 static void tlp_winb_mii_statchg(device_t); 117 static void tlp_dm9102_mii_statchg(device_t); 118 119 static void tlp_mii_getmedia(struct tulip_softc *, struct ifmediareq *); 120 static int tlp_mii_setmedia(struct tulip_softc *); 121 122 static int tlp_bitbang_mii_readreg(device_t, int, int); 123 static void tlp_bitbang_mii_writereg(device_t, int, int, int); 124 125 static int tlp_pnic_mii_readreg(device_t, int, int); 126 static void tlp_pnic_mii_writereg(device_t, int, int, int); 127 128 static int tlp_al981_mii_readreg(device_t, int, int); 129 static void tlp_al981_mii_writereg(device_t, int, int, int); 130 131 static void tlp_2114x_preinit(struct tulip_softc *); 132 static void tlp_2114x_mii_preinit(struct tulip_softc *); 133 static void tlp_pnic_preinit(struct tulip_softc *); 134 static void tlp_dm9102_preinit(struct tulip_softc *); 135 static void tlp_asix_preinit(struct tulip_softc *); 136 137 static void tlp_21140_reset(struct tulip_softc *); 138 static void tlp_21142_reset(struct tulip_softc *); 139 static void tlp_pmac_reset(struct tulip_softc *); 140 #if 0 141 static void tlp_dm9102_reset(struct tulip_softc *); 142 #endif 143 144 static void tlp_2114x_nway_tick(void *); 145 146 #define tlp_mchash(addr, sz) \ 147 (ether_crc32_le((addr), ETHER_ADDR_LEN) & ((sz) - 1)) 148 149 /* 150 * MII bit-bang glue. 151 */ 152 static uint32_t tlp_sio_mii_bitbang_read(device_t); 153 static void tlp_sio_mii_bitbang_write(device_t, uint32_t); 154 155 static const struct mii_bitbang_ops tlp_sio_mii_bitbang_ops = { 156 tlp_sio_mii_bitbang_read, 157 tlp_sio_mii_bitbang_write, 158 { 159 MIIROM_MDO, /* MII_BIT_MDO */ 160 MIIROM_MDI, /* MII_BIT_MDI */ 161 MIIROM_MDC, /* MII_BIT_MDC */ 162 0, /* MII_BIT_DIR_HOST_PHY */ 163 MIIROM_MIIDIR, /* MII_BIT_DIR_PHY_HOST */ 164 } 165 }; 166 167 #ifdef TLP_DEBUG 168 #define DPRINTF(sc, x) if ((sc)->sc_ethercom.ec_if.if_flags & IFF_DEBUG) \ 169 printf x 170 #else 171 #define DPRINTF(sc, x) /* nothing */ 172 #endif 173 174 #ifdef TLP_STATS 175 static void tlp_print_stats(struct tulip_softc *); 176 #endif 177 178 /* 179 * Can be used to debug the SROM-related things, including contents. 180 * Initialized so that it's patchable. 181 */ 182 int tlp_srom_debug = 0; 183 184 /* 185 * tlp_attach: 186 * 187 * Attach a Tulip interface to the system. 188 */ 189 int 190 tlp_attach(struct tulip_softc *sc, const uint8_t *enaddr) 191 { 192 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 193 device_t self = sc->sc_dev; 194 int i, error; 195 196 callout_init(&sc->sc_nway_callout, 0); 197 callout_init(&sc->sc_tick_callout, 0); 198 199 /* 200 * NOTE: WE EXPECT THE FRONT-END TO INITIALIZE sc_regshift! 201 */ 202 203 /* 204 * Setup the transmit threshold table. 205 */ 206 switch (sc->sc_chip) { 207 case TULIP_CHIP_DE425: 208 case TULIP_CHIP_21040: 209 case TULIP_CHIP_21041: 210 sc->sc_txth = tlp_10_txthresh_tab; 211 break; 212 213 case TULIP_CHIP_DM9102: 214 case TULIP_CHIP_DM9102A: 215 sc->sc_txth = tlp_dm9102_txthresh_tab; 216 break; 217 218 default: 219 sc->sc_txth = tlp_10_100_txthresh_tab; 220 break; 221 } 222 223 /* 224 * Setup the filter setup function. 225 */ 226 switch (sc->sc_chip) { 227 case TULIP_CHIP_WB89C840F: 228 sc->sc_filter_setup = tlp_winb_filter_setup; 229 break; 230 231 case TULIP_CHIP_AL981: 232 case TULIP_CHIP_AN983: 233 case TULIP_CHIP_AN985: 234 sc->sc_filter_setup = tlp_al981_filter_setup; 235 break; 236 237 case TULIP_CHIP_AX88140: 238 case TULIP_CHIP_AX88141: 239 sc->sc_filter_setup = tlp_asix_filter_setup; 240 break; 241 242 default: 243 sc->sc_filter_setup = tlp_filter_setup; 244 break; 245 } 246 247 /* 248 * Set up the media status change function. 249 */ 250 switch (sc->sc_chip) { 251 case TULIP_CHIP_WB89C840F: 252 sc->sc_statchg = tlp_winb_mii_statchg; 253 break; 254 255 case TULIP_CHIP_DM9102: 256 case TULIP_CHIP_DM9102A: 257 sc->sc_statchg = tlp_dm9102_mii_statchg; 258 break; 259 260 default: 261 /* 262 * We may override this if we have special media 263 * handling requirements (e.g. flipping GPIO pins). 264 * 265 * The pure-MII statchg function covers the basics. 266 */ 267 sc->sc_statchg = tlp_mii_statchg; 268 break; 269 } 270 271 /* 272 * Default to no FS|LS in setup packet descriptors. They're 273 * supposed to be zero according to the 21040 and 21143 274 * manuals, and some chips fall over badly if they're 275 * included. Yet, other chips seem to require them. Sigh. 276 */ 277 switch (sc->sc_chip) { 278 case TULIP_CHIP_X3201_3: 279 sc->sc_setup_fsls = TDCTL_Tx_FS|TDCTL_Tx_LS; 280 break; 281 282 default: 283 sc->sc_setup_fsls = 0; 284 } 285 286 /* 287 * Set up various chip-specific quirks. 288 * 289 * Note that wherever we can, we use the "ring" option for 290 * transmit and receive descriptors. This is because some 291 * clone chips apparently have problems when using chaining, 292 * although some *only* support chaining. 293 * 294 * What we do is always program the "next" pointer, and then 295 * conditionally set the TDCTL_CH and TDCTL_ER bits in the 296 * appropriate places. 297 */ 298 switch (sc->sc_chip) { 299 case TULIP_CHIP_21140: 300 case TULIP_CHIP_21140A: 301 case TULIP_CHIP_21142: 302 case TULIP_CHIP_21143: 303 case TULIP_CHIP_82C115: /* 21143-like */ 304 case TULIP_CHIP_MX98713: /* 21140-like */ 305 case TULIP_CHIP_MX98713A: /* 21143-like */ 306 case TULIP_CHIP_MX98715: /* 21143-like */ 307 case TULIP_CHIP_MX98715A: /* 21143-like */ 308 case TULIP_CHIP_MX98715AEC_X: /* 21143-like */ 309 case TULIP_CHIP_MX98725: /* 21143-like */ 310 case TULIP_CHIP_RS7112: /* 21143-like */ 311 /* 312 * Run these chips in ring mode. 313 */ 314 sc->sc_tdctl_ch = 0; 315 sc->sc_tdctl_er = TDCTL_ER; 316 sc->sc_preinit = tlp_2114x_preinit; 317 break; 318 319 case TULIP_CHIP_82C168: 320 case TULIP_CHIP_82C169: 321 /* 322 * Run these chips in ring mode. 323 */ 324 sc->sc_tdctl_ch = 0; 325 sc->sc_tdctl_er = TDCTL_ER; 326 sc->sc_preinit = tlp_pnic_preinit; 327 328 /* 329 * These chips seem to have busted DMA engines; just put them 330 * in Store-and-Forward mode from the get-go. 331 */ 332 sc->sc_txthresh = TXTH_SF; 333 break; 334 335 case TULIP_CHIP_WB89C840F: 336 /* 337 * Run this chip in chained mode. 338 */ 339 sc->sc_tdctl_ch = TDCTL_CH; 340 sc->sc_tdctl_er = 0; 341 sc->sc_flags |= TULIPF_IC_FS; 342 break; 343 344 case TULIP_CHIP_DM9102: 345 case TULIP_CHIP_DM9102A: 346 /* 347 * Run these chips in chained mode. 348 */ 349 sc->sc_tdctl_ch = TDCTL_CH; 350 sc->sc_tdctl_er = 0; 351 sc->sc_preinit = tlp_dm9102_preinit; 352 353 /* 354 * These chips have a broken bus interface, so we 355 * can't use any optimized bus commands. For this 356 * reason, we tend to underrun pretty quickly, so 357 * just to Store-and-Forward mode from the get-go. 358 */ 359 sc->sc_txthresh = TXTH_DM9102_SF; 360 break; 361 362 case TULIP_CHIP_AX88140: 363 case TULIP_CHIP_AX88141: 364 /* 365 * Run these chips in ring mode. 366 */ 367 sc->sc_tdctl_ch = 0; 368 sc->sc_tdctl_er = TDCTL_ER; 369 sc->sc_preinit = tlp_asix_preinit; 370 break; 371 372 default: 373 /* 374 * Default to running in ring mode. 375 */ 376 sc->sc_tdctl_ch = 0; 377 sc->sc_tdctl_er = TDCTL_ER; 378 } 379 380 /* 381 * Set up the MII bit-bang operations. 382 */ 383 switch (sc->sc_chip) { 384 case TULIP_CHIP_WB89C840F: /* XXX direction bit different? */ 385 sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops; 386 break; 387 388 default: 389 sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops; 390 } 391 392 SIMPLEQ_INIT(&sc->sc_txfreeq); 393 SIMPLEQ_INIT(&sc->sc_txdirtyq); 394 395 /* 396 * Allocate the control data structures, and create and load the 397 * DMA map for it. 398 */ 399 if ((error = bus_dmamem_alloc(sc->sc_dmat, 400 sizeof(struct tulip_control_data), PAGE_SIZE, 0, &sc->sc_cdseg, 401 1, &sc->sc_cdnseg, 0)) != 0) { 402 aprint_error_dev(self, "unable to allocate control data, error = %d\n", 403 error); 404 goto fail_0; 405 } 406 407 if ((error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg, 408 sizeof(struct tulip_control_data), (void **)&sc->sc_control_data, 409 BUS_DMA_COHERENT)) != 0) { 410 aprint_error_dev(self, "unable to map control data, error = %d\n", 411 error); 412 goto fail_1; 413 } 414 415 if ((error = bus_dmamap_create(sc->sc_dmat, 416 sizeof(struct tulip_control_data), 1, 417 sizeof(struct tulip_control_data), 0, 0, &sc->sc_cddmamap)) != 0) { 418 sc->sc_cddmamap = NULL; 419 aprint_error_dev(self, "unable to create control data DMA map, " 420 "error = %d\n", error); 421 goto fail_2; 422 } 423 424 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap, 425 sc->sc_control_data, sizeof(struct tulip_control_data), NULL, 426 0)) != 0) { 427 aprint_error_dev(self, "unable to load control data DMA map, error = %d\n", 428 error); 429 goto fail_3; 430 } 431 432 /* 433 * Create the transmit buffer DMA maps. 434 * 435 * Note that on the Xircom clone, transmit buffers must be 436 * 4-byte aligned. We're almost guaranteed to have to copy 437 * the packet in that case, so we just limit ourselves to 438 * one segment. 439 * 440 * On the DM9102, the transmit logic can only handle one 441 * DMA segment. 442 */ 443 switch (sc->sc_chip) { 444 case TULIP_CHIP_X3201_3: 445 case TULIP_CHIP_DM9102: 446 case TULIP_CHIP_DM9102A: 447 case TULIP_CHIP_AX88140: 448 case TULIP_CHIP_AX88141: 449 sc->sc_ntxsegs = 1; 450 break; 451 452 default: 453 sc->sc_ntxsegs = TULIP_NTXSEGS; 454 } 455 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 456 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 457 sc->sc_ntxsegs, MCLBYTES, 0, 0, 458 &sc->sc_txsoft[i].txs_dmamap)) != 0) { 459 sc->sc_txsoft[i].txs_dmamap = NULL; 460 aprint_error_dev(self, "unable to create tx DMA map %d, " 461 "error = %d\n", i, error); 462 goto fail_4; 463 } 464 } 465 466 /* 467 * Create the receive buffer DMA maps. 468 */ 469 for (i = 0; i < TULIP_NRXDESC; i++) { 470 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 471 MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) { 472 sc->sc_rxsoft[i].rxs_dmamap = NULL; 473 aprint_error_dev(self, "unable to create rx DMA map %d, " 474 "error = %d\n", i, error); 475 goto fail_5; 476 } 477 sc->sc_rxsoft[i].rxs_mbuf = NULL; 478 } 479 480 /* 481 * From this point forward, the attachment cannot fail. A failure 482 * before this point releases all resources that may have been 483 * allocated. 484 */ 485 sc->sc_flags |= TULIPF_ATTACHED; 486 487 /* 488 * Reset the chip to a known state. 489 */ 490 tlp_reset(sc); 491 492 /* Announce ourselves. */ 493 aprint_normal_dev(self, "%s%sEthernet address %s\n", 494 sc->sc_name[0] != '\0' ? sc->sc_name : "", 495 sc->sc_name[0] != '\0' ? ", " : "", 496 ether_sprintf(enaddr)); 497 498 /* 499 * Check to see if we're the simulated Ethernet on Connectix 500 * Virtual PC. 501 */ 502 if (enaddr[0] == 0x00 && enaddr[1] == 0x03 && enaddr[2] == 0xff) 503 sc->sc_flags |= TULIPF_VPC; 504 505 /* 506 * Initialize our media structures. This may probe the MII, if 507 * present. 508 */ 509 (*sc->sc_mediasw->tmsw_init)(sc); 510 511 strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); 512 ifp->if_softc = sc; 513 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 514 sc->sc_if_flags = ifp->if_flags; 515 ifp->if_ioctl = tlp_ioctl; 516 ifp->if_start = tlp_start; 517 ifp->if_watchdog = tlp_watchdog; 518 ifp->if_init = tlp_init; 519 ifp->if_stop = tlp_stop; 520 IFQ_SET_READY(&ifp->if_snd); 521 522 /* 523 * We can support 802.1Q VLAN-sized frames. 524 */ 525 sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU; 526 527 /* 528 * Attach the interface. 529 */ 530 if_attach(ifp); 531 ether_ifattach(ifp, enaddr); 532 ether_set_ifflags_cb(&sc->sc_ethercom, tlp_ifflags_cb); 533 #if NRND > 0 534 rnd_attach_source(&sc->sc_rnd_source, device_xname(self), 535 RND_TYPE_NET, 0); 536 #endif 537 538 if (!pmf_device_register(self, NULL, NULL)) 539 aprint_error_dev(self, "couldn't establish power handler\n"); 540 else 541 pmf_class_network_register(self, ifp); 542 543 return 0; 544 545 /* 546 * Free any resources we've allocated during the failed attach 547 * attempt. Do this in reverse order and fall through. 548 */ 549 fail_5: 550 for (i = 0; i < TULIP_NRXDESC; i++) { 551 if (sc->sc_rxsoft[i].rxs_dmamap != NULL) 552 bus_dmamap_destroy(sc->sc_dmat, 553 sc->sc_rxsoft[i].rxs_dmamap); 554 } 555 fail_4: 556 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 557 if (sc->sc_txsoft[i].txs_dmamap != NULL) 558 bus_dmamap_destroy(sc->sc_dmat, 559 sc->sc_txsoft[i].txs_dmamap); 560 } 561 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 562 fail_3: 563 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 564 fail_2: 565 bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data, 566 sizeof(struct tulip_control_data)); 567 fail_1: 568 bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg); 569 fail_0: 570 return error; 571 } 572 573 /* 574 * tlp_activate: 575 * 576 * Handle device activation/deactivation requests. 577 */ 578 int 579 tlp_activate(device_t self, enum devact act) 580 { 581 struct tulip_softc *sc = device_private(self); 582 int s, error = 0; 583 584 s = splnet(); 585 switch (act) { 586 case DVACT_ACTIVATE: 587 error = EOPNOTSUPP; 588 break; 589 590 case DVACT_DEACTIVATE: 591 if (sc->sc_flags & TULIPF_HAS_MII) 592 mii_activate(&sc->sc_mii, act, MII_PHY_ANY, 593 MII_OFFSET_ANY); 594 if_deactivate(&sc->sc_ethercom.ec_if); 595 break; 596 } 597 splx(s); 598 599 return (error); 600 } 601 602 /* 603 * tlp_detach: 604 * 605 * Detach a Tulip interface. 606 */ 607 int 608 tlp_detach(struct tulip_softc *sc) 609 { 610 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 611 struct tulip_rxsoft *rxs; 612 struct tulip_txsoft *txs; 613 device_t self = sc->sc_dev; 614 int i; 615 616 /* 617 * Succeed now if there isn't any work to do. 618 */ 619 if ((sc->sc_flags & TULIPF_ATTACHED) == 0) 620 return (0); 621 622 /* Unhook our tick handler. */ 623 if (sc->sc_tick) 624 callout_stop(&sc->sc_tick_callout); 625 626 if (sc->sc_flags & TULIPF_HAS_MII) { 627 /* Detach all PHYs */ 628 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY); 629 } 630 631 /* Delete all remaining media. */ 632 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY); 633 634 #if NRND > 0 635 rnd_detach_source(&sc->sc_rnd_source); 636 #endif 637 ether_ifdetach(ifp); 638 if_detach(ifp); 639 640 for (i = 0; i < TULIP_NRXDESC; i++) { 641 rxs = &sc->sc_rxsoft[i]; 642 if (rxs->rxs_mbuf != NULL) { 643 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 644 m_freem(rxs->rxs_mbuf); 645 rxs->rxs_mbuf = NULL; 646 } 647 bus_dmamap_destroy(sc->sc_dmat, rxs->rxs_dmamap); 648 } 649 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 650 txs = &sc->sc_txsoft[i]; 651 if (txs->txs_mbuf != NULL) { 652 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 653 m_freem(txs->txs_mbuf); 654 txs->txs_mbuf = NULL; 655 } 656 bus_dmamap_destroy(sc->sc_dmat, txs->txs_dmamap); 657 } 658 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 659 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 660 bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data, 661 sizeof(struct tulip_control_data)); 662 bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg); 663 664 pmf_device_deregister(self); 665 666 if (sc->sc_srom) 667 free(sc->sc_srom, M_DEVBUF); 668 669 return (0); 670 } 671 672 /* 673 * tlp_start: [ifnet interface function] 674 * 675 * Start packet transmission on the interface. 676 */ 677 static void 678 tlp_start(struct ifnet *ifp) 679 { 680 struct tulip_softc *sc = ifp->if_softc; 681 struct mbuf *m0, *m; 682 struct tulip_txsoft *txs, *last_txs = NULL; 683 bus_dmamap_t dmamap; 684 int error, firsttx, nexttx, lasttx = 1, ofree, seg; 685 686 DPRINTF(sc, ("%s: tlp_start: sc_flags 0x%08x, if_flags 0x%08x\n", 687 device_xname(sc->sc_dev), sc->sc_flags, ifp->if_flags)); 688 689 /* 690 * If we want a filter setup, it means no more descriptors were 691 * available for the setup routine. Let it get a chance to wedge 692 * itself into the ring. 693 */ 694 if (sc->sc_flags & TULIPF_WANT_SETUP) 695 ifp->if_flags |= IFF_OACTIVE; 696 697 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING) 698 return; 699 700 if (sc->sc_tick == tlp_2114x_nway_tick && 701 (sc->sc_flags & TULIPF_LINK_UP) == 0 && ifp->if_snd.ifq_len < 10) 702 return; 703 704 /* 705 * Remember the previous number of free descriptors and 706 * the first descriptor we'll use. 707 */ 708 ofree = sc->sc_txfree; 709 firsttx = sc->sc_txnext; 710 711 DPRINTF(sc, ("%s: tlp_start: txfree %d, txnext %d\n", 712 device_xname(sc->sc_dev), ofree, firsttx)); 713 714 /* 715 * Loop through the send queue, setting up transmit descriptors 716 * until we drain the queue, or use up all available transmit 717 * descriptors. 718 */ 719 while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL && 720 sc->sc_txfree != 0) { 721 /* 722 * Grab a packet off the queue. 723 */ 724 IFQ_POLL(&ifp->if_snd, m0); 725 if (m0 == NULL) 726 break; 727 m = NULL; 728 729 dmamap = txs->txs_dmamap; 730 731 /* 732 * Load the DMA map. If this fails, the packet either 733 * didn't fit in the alloted number of segments, or we were 734 * short on resources. In this case, we'll copy and try 735 * again. 736 * 737 * Note that if we're only allowed 1 Tx segment, we 738 * have an alignment restriction. Do this test before 739 * attempting to load the DMA map, because it's more 740 * likely we'll trip the alignment test than the 741 * more-than-one-segment test. 742 */ 743 if ((sc->sc_ntxsegs == 1 && (mtod(m0, uintptr_t) & 3) != 0) || 744 bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 745 BUS_DMA_WRITE|BUS_DMA_NOWAIT) != 0) { 746 MGETHDR(m, M_DONTWAIT, MT_DATA); 747 if (m == NULL) { 748 aprint_error_dev(sc->sc_dev, "unable to allocate Tx mbuf\n"); 749 break; 750 } 751 MCLAIM(m, &sc->sc_ethercom.ec_tx_mowner); 752 if (m0->m_pkthdr.len > MHLEN) { 753 MCLGET(m, M_DONTWAIT); 754 if ((m->m_flags & M_EXT) == 0) { 755 aprint_error_dev(sc->sc_dev, 756 "unable to allocate Tx cluster\n"); 757 m_freem(m); 758 break; 759 } 760 } 761 m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, void *)); 762 m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len; 763 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, 764 m, BUS_DMA_WRITE|BUS_DMA_NOWAIT); 765 if (error) { 766 aprint_error_dev(sc->sc_dev, 767 "unable to load Tx buffer, error = %d", 768 error); 769 break; 770 } 771 } 772 773 /* 774 * Ensure we have enough descriptors free to describe 775 * the packet. 776 */ 777 if (dmamap->dm_nsegs > sc->sc_txfree) { 778 /* 779 * Not enough free descriptors to transmit this 780 * packet. We haven't committed to anything yet, 781 * so just unload the DMA map, put the packet 782 * back on the queue, and punt. Notify the upper 783 * layer that there are no more slots left. 784 * 785 * XXX We could allocate an mbuf and copy, but 786 * XXX it is worth it? 787 */ 788 ifp->if_flags |= IFF_OACTIVE; 789 bus_dmamap_unload(sc->sc_dmat, dmamap); 790 if (m != NULL) 791 m_freem(m); 792 break; 793 } 794 795 IFQ_DEQUEUE(&ifp->if_snd, m0); 796 if (m != NULL) { 797 m_freem(m0); 798 m0 = m; 799 } 800 801 /* 802 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. 803 */ 804 805 /* Sync the DMA map. */ 806 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 807 BUS_DMASYNC_PREWRITE); 808 809 /* 810 * Initialize the transmit descriptors. 811 */ 812 for (nexttx = sc->sc_txnext, seg = 0; 813 seg < dmamap->dm_nsegs; 814 seg++, nexttx = TULIP_NEXTTX(nexttx)) { 815 /* 816 * If this is the first descriptor we're 817 * enqueueing, don't set the OWN bit just 818 * yet. That could cause a race condition. 819 * We'll do it below. 820 */ 821 sc->sc_txdescs[nexttx].td_status = 822 (nexttx == firsttx) ? 0 : htole32(TDSTAT_OWN); 823 sc->sc_txdescs[nexttx].td_bufaddr1 = 824 htole32(dmamap->dm_segs[seg].ds_addr); 825 sc->sc_txdescs[nexttx].td_ctl = 826 htole32((dmamap->dm_segs[seg].ds_len << 827 TDCTL_SIZE1_SHIFT) | sc->sc_tdctl_ch | 828 (nexttx == (TULIP_NTXDESC - 1) ? 829 sc->sc_tdctl_er : 0)); 830 lasttx = nexttx; 831 } 832 833 KASSERT(lasttx != -1); 834 835 /* Set `first segment' and `last segment' appropriately. */ 836 sc->sc_txdescs[sc->sc_txnext].td_ctl |= htole32(TDCTL_Tx_FS); 837 sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_LS); 838 839 #ifdef TLP_DEBUG 840 if (ifp->if_flags & IFF_DEBUG) { 841 printf(" txsoft %p transmit chain:\n", txs); 842 for (seg = sc->sc_txnext;; seg = TULIP_NEXTTX(seg)) { 843 printf(" descriptor %d:\n", seg); 844 printf(" td_status: 0x%08x\n", 845 le32toh(sc->sc_txdescs[seg].td_status)); 846 printf(" td_ctl: 0x%08x\n", 847 le32toh(sc->sc_txdescs[seg].td_ctl)); 848 printf(" td_bufaddr1: 0x%08x\n", 849 le32toh(sc->sc_txdescs[seg].td_bufaddr1)); 850 printf(" td_bufaddr2: 0x%08x\n", 851 le32toh(sc->sc_txdescs[seg].td_bufaddr2)); 852 if (seg == lasttx) 853 break; 854 } 855 } 856 #endif 857 858 /* Sync the descriptors we're using. */ 859 TULIP_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs, 860 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 861 862 /* 863 * Store a pointer to the packet so we can free it later, 864 * and remember what txdirty will be once the packet is 865 * done. 866 */ 867 txs->txs_mbuf = m0; 868 txs->txs_firstdesc = sc->sc_txnext; 869 txs->txs_lastdesc = lasttx; 870 txs->txs_ndescs = dmamap->dm_nsegs; 871 872 /* Advance the tx pointer. */ 873 sc->sc_txfree -= dmamap->dm_nsegs; 874 sc->sc_txnext = nexttx; 875 876 SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q); 877 SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q); 878 879 last_txs = txs; 880 881 #if NBPFILTER > 0 882 /* 883 * Pass the packet to any BPF listeners. 884 */ 885 if (ifp->if_bpf) 886 bpf_mtap(ifp->if_bpf, m0); 887 #endif /* NBPFILTER > 0 */ 888 } 889 890 if (txs == NULL || sc->sc_txfree == 0) { 891 /* No more slots left; notify upper layer. */ 892 ifp->if_flags |= IFF_OACTIVE; 893 } 894 895 if (sc->sc_txfree != ofree) { 896 DPRINTF(sc, ("%s: packets enqueued, IC on %d, OWN on %d\n", 897 device_xname(sc->sc_dev), lasttx, firsttx)); 898 /* 899 * Cause a transmit interrupt to happen on the 900 * last packet we enqueued. 901 */ 902 sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_IC); 903 TULIP_CDTXSYNC(sc, lasttx, 1, 904 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 905 906 /* 907 * Some clone chips want IC on the *first* segment in 908 * the packet. Appease them. 909 */ 910 KASSERT(last_txs != NULL); 911 if ((sc->sc_flags & TULIPF_IC_FS) != 0 && 912 last_txs->txs_firstdesc != lasttx) { 913 sc->sc_txdescs[last_txs->txs_firstdesc].td_ctl |= 914 htole32(TDCTL_Tx_IC); 915 TULIP_CDTXSYNC(sc, last_txs->txs_firstdesc, 1, 916 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 917 } 918 919 /* 920 * The entire packet chain is set up. Give the 921 * first descriptor to the chip now. 922 */ 923 sc->sc_txdescs[firsttx].td_status |= htole32(TDSTAT_OWN); 924 TULIP_CDTXSYNC(sc, firsttx, 1, 925 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 926 927 /* Wake up the transmitter. */ 928 /* XXX USE AUTOPOLLING? */ 929 TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD); 930 931 /* Set a watchdog timer in case the chip flakes out. */ 932 ifp->if_timer = 5; 933 } 934 } 935 936 /* 937 * tlp_watchdog: [ifnet interface function] 938 * 939 * Watchdog timer handler. 940 */ 941 static void 942 tlp_watchdog(struct ifnet *ifp) 943 { 944 struct tulip_softc *sc = ifp->if_softc; 945 int doing_setup, doing_transmit; 946 947 doing_setup = (sc->sc_flags & TULIPF_DOING_SETUP); 948 doing_transmit = (! SIMPLEQ_EMPTY(&sc->sc_txdirtyq)); 949 950 if (doing_setup && doing_transmit) { 951 printf("%s: filter setup and transmit timeout\n", device_xname(sc->sc_dev)); 952 ifp->if_oerrors++; 953 } else if (doing_transmit) { 954 printf("%s: transmit timeout\n", device_xname(sc->sc_dev)); 955 ifp->if_oerrors++; 956 } else if (doing_setup) 957 printf("%s: filter setup timeout\n", device_xname(sc->sc_dev)); 958 else 959 printf("%s: spurious watchdog timeout\n", device_xname(sc->sc_dev)); 960 961 (void) tlp_init(ifp); 962 963 /* Try to get more packets going. */ 964 tlp_start(ifp); 965 } 966 967 /* If the interface is up and running, only modify the receive 968 * filter when setting promiscuous or debug mode. Otherwise fall 969 * through to ether_ioctl, which will reset the chip. 970 */ 971 static int 972 tlp_ifflags_cb(struct ethercom *ec) 973 { 974 struct ifnet *ifp = &ec->ec_if; 975 struct tulip_softc *sc = ifp->if_softc; 976 int change = ifp->if_flags ^ sc->sc_if_flags; 977 978 if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0) 979 return ENETRESET; 980 if ((change & IFF_PROMISC) != 0) 981 (*sc->sc_filter_setup)(sc); 982 return 0; 983 } 984 985 /* 986 * tlp_ioctl: [ifnet interface function] 987 * 988 * Handle control requests from the operator. 989 */ 990 static int 991 tlp_ioctl(struct ifnet *ifp, u_long cmd, void *data) 992 { 993 struct tulip_softc *sc = ifp->if_softc; 994 struct ifreq *ifr = (struct ifreq *)data; 995 int s, error; 996 997 s = splnet(); 998 999 switch (cmd) { 1000 case SIOCSIFMEDIA: 1001 case SIOCGIFMEDIA: 1002 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 1003 break; 1004 default: 1005 error = ether_ioctl(ifp, cmd, data); 1006 if (error == ENETRESET) { 1007 if (ifp->if_flags & IFF_RUNNING) { 1008 /* 1009 * Multicast list has changed. Set the 1010 * hardware filter accordingly. 1011 */ 1012 (*sc->sc_filter_setup)(sc); 1013 } 1014 error = 0; 1015 } 1016 break; 1017 } 1018 1019 /* Try to get more packets going. */ 1020 if (TULIP_IS_ENABLED(sc)) 1021 tlp_start(ifp); 1022 1023 sc->sc_if_flags = ifp->if_flags; 1024 splx(s); 1025 return (error); 1026 } 1027 1028 /* 1029 * tlp_intr: 1030 * 1031 * Interrupt service routine. 1032 */ 1033 int 1034 tlp_intr(void *arg) 1035 { 1036 struct tulip_softc *sc = arg; 1037 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1038 uint32_t status, rxstatus, txstatus; 1039 int handled = 0, txthresh; 1040 1041 DPRINTF(sc, ("%s: tlp_intr\n", device_xname(sc->sc_dev))); 1042 1043 #ifdef DEBUG 1044 if (TULIP_IS_ENABLED(sc) == 0) 1045 panic("%s: tlp_intr: not enabled", device_xname(sc->sc_dev)); 1046 #endif 1047 1048 /* 1049 * If the interface isn't running, the interrupt couldn't 1050 * possibly have come from us. 1051 */ 1052 if ((ifp->if_flags & IFF_RUNNING) == 0 || 1053 !device_is_active(sc->sc_dev)) 1054 return (0); 1055 1056 /* Disable interrupts on the DM9102 (interrupt edge bug). */ 1057 switch (sc->sc_chip) { 1058 case TULIP_CHIP_DM9102: 1059 case TULIP_CHIP_DM9102A: 1060 TULIP_WRITE(sc, CSR_INTEN, 0); 1061 break; 1062 1063 default: 1064 /* Nothing. */ 1065 break; 1066 } 1067 1068 for (;;) { 1069 status = TULIP_READ(sc, CSR_STATUS); 1070 if (status) 1071 TULIP_WRITE(sc, CSR_STATUS, status); 1072 1073 if ((status & sc->sc_inten) == 0) 1074 break; 1075 1076 handled = 1; 1077 1078 rxstatus = status & sc->sc_rxint_mask; 1079 txstatus = status & sc->sc_txint_mask; 1080 1081 if (rxstatus) { 1082 /* Grab new any new packets. */ 1083 tlp_rxintr(sc); 1084 1085 if (rxstatus & STATUS_RWT) 1086 printf("%s: receive watchdog timeout\n", 1087 device_xname(sc->sc_dev)); 1088 1089 if (rxstatus & STATUS_RU) { 1090 printf("%s: receive ring overrun\n", 1091 device_xname(sc->sc_dev)); 1092 /* Get the receive process going again. */ 1093 if (sc->sc_tdctl_er != TDCTL_ER) { 1094 tlp_idle(sc, OPMODE_SR); 1095 TULIP_WRITE(sc, CSR_RXLIST, 1096 TULIP_CDRXADDR(sc, sc->sc_rxptr)); 1097 TULIP_WRITE(sc, CSR_OPMODE, 1098 sc->sc_opmode); 1099 } 1100 TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD); 1101 break; 1102 } 1103 } 1104 1105 if (txstatus) { 1106 /* Sweep up transmit descriptors. */ 1107 tlp_txintr(sc); 1108 1109 if (txstatus & STATUS_TJT) 1110 printf("%s: transmit jabber timeout\n", 1111 device_xname(sc->sc_dev)); 1112 1113 if (txstatus & STATUS_UNF) { 1114 /* 1115 * Increase our transmit threshold if 1116 * another is available. 1117 */ 1118 txthresh = sc->sc_txthresh + 1; 1119 if (sc->sc_txth[txthresh].txth_name != NULL) { 1120 /* Idle the transmit process. */ 1121 tlp_idle(sc, OPMODE_ST); 1122 1123 sc->sc_txthresh = txthresh; 1124 sc->sc_opmode &= ~(OPMODE_TR|OPMODE_SF); 1125 sc->sc_opmode |= 1126 sc->sc_txth[txthresh].txth_opmode; 1127 printf("%s: transmit underrun; new " 1128 "threshold: %s\n", 1129 device_xname(sc->sc_dev), 1130 sc->sc_txth[txthresh].txth_name); 1131 1132 /* 1133 * Set the new threshold and restart 1134 * the transmit process. 1135 */ 1136 TULIP_WRITE(sc, CSR_OPMODE, 1137 sc->sc_opmode); 1138 } 1139 /* 1140 * XXX Log every Nth underrun from 1141 * XXX now on? 1142 */ 1143 } 1144 } 1145 1146 if (status & (STATUS_TPS|STATUS_RPS)) { 1147 if (status & STATUS_TPS) 1148 printf("%s: transmit process stopped\n", 1149 device_xname(sc->sc_dev)); 1150 if (status & STATUS_RPS) 1151 printf("%s: receive process stopped\n", 1152 device_xname(sc->sc_dev)); 1153 (void) tlp_init(ifp); 1154 break; 1155 } 1156 1157 if (status & STATUS_SE) { 1158 const char *str; 1159 switch (status & STATUS_EB) { 1160 case STATUS_EB_PARITY: 1161 str = "parity error"; 1162 break; 1163 1164 case STATUS_EB_MABT: 1165 str = "master abort"; 1166 break; 1167 1168 case STATUS_EB_TABT: 1169 str = "target abort"; 1170 break; 1171 1172 default: 1173 str = "unknown error"; 1174 break; 1175 } 1176 aprint_error_dev(sc->sc_dev, "fatal system error: %s\n", 1177 str); 1178 (void) tlp_init(ifp); 1179 break; 1180 } 1181 1182 /* 1183 * Not handled: 1184 * 1185 * Transmit buffer unavailable -- normal 1186 * condition, nothing to do, really. 1187 * 1188 * General purpose timer experied -- we don't 1189 * use the general purpose timer. 1190 * 1191 * Early receive interrupt -- not available on 1192 * all chips, we just use RI. We also only 1193 * use single-segment receive DMA, so this 1194 * is mostly useless. 1195 */ 1196 } 1197 1198 /* Bring interrupts back up on the DM9102. */ 1199 switch (sc->sc_chip) { 1200 case TULIP_CHIP_DM9102: 1201 case TULIP_CHIP_DM9102A: 1202 TULIP_WRITE(sc, CSR_INTEN, sc->sc_inten); 1203 break; 1204 1205 default: 1206 /* Nothing. */ 1207 break; 1208 } 1209 1210 /* Try to get more packets going. */ 1211 tlp_start(ifp); 1212 1213 #if NRND > 0 1214 if (handled) 1215 rnd_add_uint32(&sc->sc_rnd_source, status); 1216 #endif 1217 return (handled); 1218 } 1219 1220 /* 1221 * tlp_rxintr: 1222 * 1223 * Helper; handle receive interrupts. 1224 */ 1225 static void 1226 tlp_rxintr(struct tulip_softc *sc) 1227 { 1228 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1229 struct ether_header *eh; 1230 struct tulip_rxsoft *rxs; 1231 struct mbuf *m; 1232 uint32_t rxstat, errors; 1233 int i, len; 1234 1235 for (i = sc->sc_rxptr;; i = TULIP_NEXTRX(i)) { 1236 rxs = &sc->sc_rxsoft[i]; 1237 1238 TULIP_CDRXSYNC(sc, i, 1239 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1240 1241 rxstat = le32toh(sc->sc_rxdescs[i].td_status); 1242 1243 if (rxstat & TDSTAT_OWN) { 1244 /* 1245 * We have processed all of the receive buffers. 1246 */ 1247 break; 1248 } 1249 1250 /* 1251 * Make sure the packet fit in one buffer. This should 1252 * always be the case. But the Lite-On PNIC, rev 33 1253 * has an awful receive engine bug, which may require 1254 * a very icky work-around. 1255 */ 1256 if ((rxstat & (TDSTAT_Rx_FS|TDSTAT_Rx_LS)) != 1257 (TDSTAT_Rx_FS|TDSTAT_Rx_LS)) { 1258 printf("%s: incoming packet spilled, resetting\n", 1259 device_xname(sc->sc_dev)); 1260 (void) tlp_init(ifp); 1261 return; 1262 } 1263 1264 /* 1265 * If any collisions were seen on the wire, count one. 1266 */ 1267 if (rxstat & TDSTAT_Rx_CS) 1268 ifp->if_collisions++; 1269 1270 /* 1271 * If an error occurred, update stats, clear the status 1272 * word, and leave the packet buffer in place. It will 1273 * simply be reused the next time the ring comes around. 1274 */ 1275 errors = TDSTAT_Rx_DE | TDSTAT_Rx_RF | TDSTAT_Rx_TL | 1276 TDSTAT_Rx_CS | TDSTAT_Rx_RE | TDSTAT_Rx_DB | TDSTAT_Rx_CE; 1277 /* 1278 * If 802.1Q VLAN MTU is enabled, ignore the Frame Too Long 1279 * error. 1280 */ 1281 if ((sc->sc_ethercom.ec_capenable & ETHERCAP_VLAN_MTU) != 0) 1282 errors &= ~TDSTAT_Rx_TL; 1283 /* 1284 * If chip doesn't have MII, ignore the MII error bit. 1285 */ 1286 if ((sc->sc_flags & TULIPF_HAS_MII) == 0) 1287 errors &= ~TDSTAT_Rx_RE; 1288 1289 if ((rxstat & TDSTAT_ES) != 0 && 1290 (rxstat & errors) != 0) { 1291 rxstat &= errors; 1292 #define PRINTERR(bit, str) \ 1293 if (rxstat & (bit)) \ 1294 aprint_error_dev(sc->sc_dev, "receive error: %s\n", \ 1295 str) 1296 ifp->if_ierrors++; 1297 PRINTERR(TDSTAT_Rx_DE, "descriptor error"); 1298 PRINTERR(TDSTAT_Rx_RF, "runt frame"); 1299 PRINTERR(TDSTAT_Rx_TL, "frame too long"); 1300 PRINTERR(TDSTAT_Rx_RE, "MII error"); 1301 PRINTERR(TDSTAT_Rx_DB, "dribbling bit"); 1302 PRINTERR(TDSTAT_Rx_CE, "CRC error"); 1303 #undef PRINTERR 1304 TULIP_INIT_RXDESC(sc, i); 1305 continue; 1306 } 1307 1308 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1309 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 1310 1311 /* 1312 * No errors; receive the packet. Note the Tulip 1313 * includes the CRC with every packet. 1314 */ 1315 len = TDSTAT_Rx_LENGTH(rxstat) - ETHER_CRC_LEN; 1316 1317 #ifdef __NO_STRICT_ALIGNMENT 1318 /* 1319 * Allocate a new mbuf cluster. If that fails, we are 1320 * out of memory, and must drop the packet and recycle 1321 * the buffer that's already attached to this descriptor. 1322 */ 1323 m = rxs->rxs_mbuf; 1324 if (tlp_add_rxbuf(sc, i) != 0) { 1325 ifp->if_ierrors++; 1326 TULIP_INIT_RXDESC(sc, i); 1327 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1328 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1329 continue; 1330 } 1331 #else 1332 /* 1333 * The Tulip's receive buffers must be 4-byte aligned. 1334 * But this means that the data after the Ethernet header 1335 * is misaligned. We must allocate a new buffer and 1336 * copy the data, shifted forward 2 bytes. 1337 */ 1338 MGETHDR(m, M_DONTWAIT, MT_DATA); 1339 if (m == NULL) { 1340 dropit: 1341 ifp->if_ierrors++; 1342 TULIP_INIT_RXDESC(sc, i); 1343 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1344 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1345 continue; 1346 } 1347 MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner); 1348 if (len > (MHLEN - 2)) { 1349 MCLGET(m, M_DONTWAIT); 1350 if ((m->m_flags & M_EXT) == 0) { 1351 m_freem(m); 1352 goto dropit; 1353 } 1354 } 1355 m->m_data += 2; 1356 1357 /* 1358 * Note that we use clusters for incoming frames, so the 1359 * buffer is virtually contiguous. 1360 */ 1361 memcpy(mtod(m, void *), mtod(rxs->rxs_mbuf, void *), len); 1362 1363 /* Allow the receive descriptor to continue using its mbuf. */ 1364 TULIP_INIT_RXDESC(sc, i); 1365 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 1366 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1367 #endif /* __NO_STRICT_ALIGNMENT */ 1368 1369 ifp->if_ipackets++; 1370 eh = mtod(m, struct ether_header *); 1371 m->m_pkthdr.rcvif = ifp; 1372 m->m_pkthdr.len = m->m_len = len; 1373 1374 /* 1375 * XXX Work-around for a weird problem with the emulated 1376 * 21041 on Connectix Virtual PC: 1377 * 1378 * When we receive a full-size TCP segment, we seem to get 1379 * a packet there the Rx status says 1522 bytes, yet we do 1380 * not get a frame-too-long error from the chip. The extra 1381 * bytes seem to always be zeros. Perhaps Virtual PC is 1382 * inserting 4 bytes of zeros after every packet. In any 1383 * case, let's try and detect this condition and truncate 1384 * the length so that it will pass up the stack. 1385 */ 1386 if (__predict_false((sc->sc_flags & TULIPF_VPC) != 0)) { 1387 uint16_t etype = ntohs(eh->ether_type); 1388 1389 if (len > ETHER_MAX_FRAME(ifp, etype, 0)) 1390 m->m_pkthdr.len = m->m_len = len = 1391 ETHER_MAX_FRAME(ifp, etype, 0); 1392 } 1393 1394 #if NBPFILTER > 0 1395 /* 1396 * Pass this up to any BPF listeners, but only 1397 * pass it up the stack if it's for us. 1398 */ 1399 if (ifp->if_bpf) 1400 bpf_mtap(ifp->if_bpf, m); 1401 #endif /* NBPFILTER > 0 */ 1402 1403 /* 1404 * We sometimes have to run the 21140 in Hash-Only 1405 * mode. If we're in that mode, and not in promiscuous 1406 * mode, and we have a unicast packet that isn't for 1407 * us, then drop it. 1408 */ 1409 if (sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY && 1410 (ifp->if_flags & IFF_PROMISC) == 0 && 1411 ETHER_IS_MULTICAST(eh->ether_dhost) == 0 && 1412 memcmp(CLLADDR(ifp->if_sadl), eh->ether_dhost, 1413 ETHER_ADDR_LEN) != 0) { 1414 m_freem(m); 1415 continue; 1416 } 1417 1418 /* Pass it on. */ 1419 (*ifp->if_input)(ifp, m); 1420 } 1421 1422 /* Update the receive pointer. */ 1423 sc->sc_rxptr = i; 1424 } 1425 1426 /* 1427 * tlp_txintr: 1428 * 1429 * Helper; handle transmit interrupts. 1430 */ 1431 static void 1432 tlp_txintr(struct tulip_softc *sc) 1433 { 1434 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1435 struct tulip_txsoft *txs; 1436 uint32_t txstat; 1437 1438 DPRINTF(sc, ("%s: tlp_txintr: sc_flags 0x%08x\n", 1439 device_xname(sc->sc_dev), sc->sc_flags)); 1440 1441 ifp->if_flags &= ~IFF_OACTIVE; 1442 1443 /* 1444 * Go through our Tx list and free mbufs for those 1445 * frames that have been transmitted. 1446 */ 1447 while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) { 1448 TULIP_CDTXSYNC(sc, txs->txs_lastdesc, 1449 txs->txs_ndescs, 1450 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1451 1452 #ifdef TLP_DEBUG 1453 if (ifp->if_flags & IFF_DEBUG) { 1454 int i; 1455 printf(" txsoft %p transmit chain:\n", txs); 1456 for (i = txs->txs_firstdesc;; i = TULIP_NEXTTX(i)) { 1457 printf(" descriptor %d:\n", i); 1458 printf(" td_status: 0x%08x\n", 1459 le32toh(sc->sc_txdescs[i].td_status)); 1460 printf(" td_ctl: 0x%08x\n", 1461 le32toh(sc->sc_txdescs[i].td_ctl)); 1462 printf(" td_bufaddr1: 0x%08x\n", 1463 le32toh(sc->sc_txdescs[i].td_bufaddr1)); 1464 printf(" td_bufaddr2: 0x%08x\n", 1465 le32toh(sc->sc_txdescs[i].td_bufaddr2)); 1466 if (i == txs->txs_lastdesc) 1467 break; 1468 } 1469 } 1470 #endif 1471 1472 txstat = le32toh(sc->sc_txdescs[txs->txs_lastdesc].td_status); 1473 if (txstat & TDSTAT_OWN) 1474 break; 1475 1476 SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q); 1477 1478 sc->sc_txfree += txs->txs_ndescs; 1479 1480 if (txs->txs_mbuf == NULL) { 1481 /* 1482 * If we didn't have an mbuf, it was the setup 1483 * packet. 1484 */ 1485 #ifdef DIAGNOSTIC 1486 if ((sc->sc_flags & TULIPF_DOING_SETUP) == 0) 1487 panic("tlp_txintr: null mbuf, not doing setup"); 1488 #endif 1489 TULIP_CDSPSYNC(sc, BUS_DMASYNC_POSTWRITE); 1490 sc->sc_flags &= ~TULIPF_DOING_SETUP; 1491 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1492 continue; 1493 } 1494 1495 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap, 1496 0, txs->txs_dmamap->dm_mapsize, 1497 BUS_DMASYNC_POSTWRITE); 1498 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 1499 m_freem(txs->txs_mbuf); 1500 txs->txs_mbuf = NULL; 1501 1502 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1503 1504 /* 1505 * Check for errors and collisions. 1506 */ 1507 #ifdef TLP_STATS 1508 if (txstat & TDSTAT_Tx_UF) 1509 sc->sc_stats.ts_tx_uf++; 1510 if (txstat & TDSTAT_Tx_TO) 1511 sc->sc_stats.ts_tx_to++; 1512 if (txstat & TDSTAT_Tx_EC) 1513 sc->sc_stats.ts_tx_ec++; 1514 if (txstat & TDSTAT_Tx_LC) 1515 sc->sc_stats.ts_tx_lc++; 1516 #endif 1517 1518 if (txstat & (TDSTAT_Tx_UF|TDSTAT_Tx_TO)) 1519 ifp->if_oerrors++; 1520 1521 if (txstat & TDSTAT_Tx_EC) 1522 ifp->if_collisions += 16; 1523 else 1524 ifp->if_collisions += TDSTAT_Tx_COLLISIONS(txstat); 1525 if (txstat & TDSTAT_Tx_LC) 1526 ifp->if_collisions++; 1527 1528 ifp->if_opackets++; 1529 } 1530 1531 /* 1532 * If there are no more pending transmissions, cancel the watchdog 1533 * timer. 1534 */ 1535 if (txs == NULL && (sc->sc_flags & TULIPF_DOING_SETUP) == 0) 1536 ifp->if_timer = 0; 1537 1538 /* 1539 * If we have a receive filter setup pending, do it now. 1540 */ 1541 if (sc->sc_flags & TULIPF_WANT_SETUP) 1542 (*sc->sc_filter_setup)(sc); 1543 } 1544 1545 #ifdef TLP_STATS 1546 void 1547 tlp_print_stats(struct tulip_softc *sc) 1548 { 1549 1550 printf("%s: tx_uf %lu, tx_to %lu, tx_ec %lu, tx_lc %lu\n", 1551 device_xname(sc->sc_dev), 1552 sc->sc_stats.ts_tx_uf, sc->sc_stats.ts_tx_to, 1553 sc->sc_stats.ts_tx_ec, sc->sc_stats.ts_tx_lc); 1554 } 1555 #endif 1556 1557 /* 1558 * tlp_reset: 1559 * 1560 * Perform a soft reset on the Tulip. 1561 */ 1562 void 1563 tlp_reset(struct tulip_softc *sc) 1564 { 1565 int i; 1566 1567 TULIP_WRITE(sc, CSR_BUSMODE, BUSMODE_SWR); 1568 1569 /* 1570 * Xircom, ASIX and Conexant clones don't bring themselves 1571 * out of reset automatically. 1572 * Instead, we have to wait at least 50 PCI cycles, and then 1573 * clear SWR. 1574 */ 1575 switch (sc->sc_chip) { 1576 case TULIP_CHIP_X3201_3: 1577 case TULIP_CHIP_AX88140: 1578 case TULIP_CHIP_AX88141: 1579 case TULIP_CHIP_RS7112: 1580 delay(10); 1581 TULIP_WRITE(sc, CSR_BUSMODE, 0); 1582 break; 1583 default: 1584 break; 1585 } 1586 1587 for (i = 0; i < 1000; i++) { 1588 /* 1589 * Wait at least 50 PCI cycles for the reset to 1590 * complete before peeking at the Tulip again. 1591 * 10 uSec is a bit longer than 50 PCI cycles 1592 * (at 33MHz), but it doesn't hurt have the extra 1593 * wait. 1594 */ 1595 delay(10); 1596 if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR) == 0) 1597 break; 1598 } 1599 1600 if (TULIP_ISSET(sc, CSR_BUSMODE, BUSMODE_SWR)) 1601 aprint_error_dev(sc->sc_dev, "reset failed to complete\n"); 1602 1603 delay(1000); 1604 1605 /* 1606 * If the board has any GPIO reset sequences to issue, do them now. 1607 */ 1608 if (sc->sc_reset != NULL) 1609 (*sc->sc_reset)(sc); 1610 } 1611 1612 /* 1613 * tlp_init: [ ifnet interface function ] 1614 * 1615 * Initialize the interface. Must be called at splnet(). 1616 */ 1617 static int 1618 tlp_init(struct ifnet *ifp) 1619 { 1620 struct tulip_softc *sc = ifp->if_softc; 1621 struct tulip_txsoft *txs; 1622 struct tulip_rxsoft *rxs; 1623 int i, error = 0; 1624 1625 if ((error = tlp_enable(sc)) != 0) 1626 goto out; 1627 1628 /* 1629 * Cancel any pending I/O. 1630 */ 1631 tlp_stop(ifp, 0); 1632 1633 /* 1634 * Initialize `opmode' to 0, and call the pre-init routine, if 1635 * any. This is required because the 2114x and some of the 1636 * clones require that the media-related bits in `opmode' be 1637 * set before performing a soft-reset in order to get internal 1638 * chip pathways are correct. Yay! 1639 */ 1640 sc->sc_opmode = 0; 1641 if (sc->sc_preinit != NULL) 1642 (*sc->sc_preinit)(sc); 1643 1644 /* 1645 * Reset the Tulip to a known state. 1646 */ 1647 tlp_reset(sc); 1648 1649 /* 1650 * Initialize the BUSMODE register. 1651 */ 1652 sc->sc_busmode = BUSMODE_BAR; 1653 switch (sc->sc_chip) { 1654 case TULIP_CHIP_21140: 1655 case TULIP_CHIP_21140A: 1656 case TULIP_CHIP_21142: 1657 case TULIP_CHIP_21143: 1658 case TULIP_CHIP_82C115: 1659 case TULIP_CHIP_MX98725: 1660 /* 1661 * If we're allowed to do so, use Memory Read Line 1662 * and Memory Read Multiple. 1663 * 1664 * XXX Should we use Memory Write and Invalidate? 1665 */ 1666 if (sc->sc_flags & TULIPF_MRL) 1667 sc->sc_busmode |= BUSMODE_RLE; 1668 if (sc->sc_flags & TULIPF_MRM) 1669 sc->sc_busmode |= BUSMODE_RME; 1670 #if 0 1671 if (sc->sc_flags & TULIPF_MWI) 1672 sc->sc_busmode |= BUSMODE_WLE; 1673 #endif 1674 break; 1675 1676 case TULIP_CHIP_82C168: 1677 case TULIP_CHIP_82C169: 1678 sc->sc_busmode |= BUSMODE_PNIC_MBO; 1679 if (sc->sc_maxburst == 0) 1680 sc->sc_maxburst = 16; 1681 break; 1682 1683 case TULIP_CHIP_AX88140: 1684 case TULIP_CHIP_AX88141: 1685 if (sc->sc_maxburst == 0) 1686 sc->sc_maxburst = 16; 1687 break; 1688 1689 default: 1690 /* Nothing. */ 1691 break; 1692 } 1693 switch (sc->sc_cacheline) { 1694 default: 1695 /* 1696 * Note: We must *always* set these bits; a cache 1697 * alignment of 0 is RESERVED. 1698 */ 1699 case 8: 1700 sc->sc_busmode |= BUSMODE_CAL_8LW; 1701 break; 1702 case 16: 1703 sc->sc_busmode |= BUSMODE_CAL_16LW; 1704 break; 1705 case 32: 1706 sc->sc_busmode |= BUSMODE_CAL_32LW; 1707 break; 1708 } 1709 switch (sc->sc_maxburst) { 1710 case 1: 1711 sc->sc_busmode |= BUSMODE_PBL_1LW; 1712 break; 1713 case 2: 1714 sc->sc_busmode |= BUSMODE_PBL_2LW; 1715 break; 1716 case 4: 1717 sc->sc_busmode |= BUSMODE_PBL_4LW; 1718 break; 1719 case 8: 1720 sc->sc_busmode |= BUSMODE_PBL_8LW; 1721 break; 1722 case 16: 1723 sc->sc_busmode |= BUSMODE_PBL_16LW; 1724 break; 1725 case 32: 1726 sc->sc_busmode |= BUSMODE_PBL_32LW; 1727 break; 1728 default: 1729 sc->sc_busmode |= BUSMODE_PBL_DEFAULT; 1730 break; 1731 } 1732 #if BYTE_ORDER == BIG_ENDIAN 1733 /* 1734 * Can't use BUSMODE_BLE or BUSMODE_DBO; not all chips 1735 * support them, and even on ones that do, it doesn't 1736 * always work. So we always access descriptors with 1737 * little endian via htole32/le32toh. 1738 */ 1739 #endif 1740 /* 1741 * Big-endian bus requires BUSMODE_BLE anyway. 1742 * Also, BUSMODE_DBO is needed because we assume 1743 * descriptors are little endian. 1744 */ 1745 if (sc->sc_flags & TULIPF_BLE) 1746 sc->sc_busmode |= BUSMODE_BLE; 1747 if (sc->sc_flags & TULIPF_DBO) 1748 sc->sc_busmode |= BUSMODE_DBO; 1749 1750 /* 1751 * Some chips have a broken bus interface. 1752 */ 1753 switch (sc->sc_chip) { 1754 case TULIP_CHIP_DM9102: 1755 case TULIP_CHIP_DM9102A: 1756 sc->sc_busmode = 0; 1757 break; 1758 1759 default: 1760 /* Nothing. */ 1761 break; 1762 } 1763 1764 TULIP_WRITE(sc, CSR_BUSMODE, sc->sc_busmode); 1765 1766 /* 1767 * Initialize the OPMODE register. We don't write it until 1768 * we're ready to begin the transmit and receive processes. 1769 * 1770 * Media-related OPMODE bits are set in the media callbacks 1771 * for each specific chip/board. 1772 */ 1773 sc->sc_opmode |= OPMODE_SR | OPMODE_ST | 1774 sc->sc_txth[sc->sc_txthresh].txth_opmode; 1775 1776 /* 1777 * Magical mystery initialization on the Macronix chips. 1778 * The MX98713 uses its own magic value, the rest share 1779 * a common one. 1780 */ 1781 switch (sc->sc_chip) { 1782 case TULIP_CHIP_MX98713: 1783 TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98713); 1784 break; 1785 1786 case TULIP_CHIP_MX98713A: 1787 case TULIP_CHIP_MX98715: 1788 case TULIP_CHIP_MX98715A: 1789 case TULIP_CHIP_MX98715AEC_X: 1790 case TULIP_CHIP_MX98725: 1791 TULIP_WRITE(sc, CSR_PMAC_TOR, PMAC_TOR_98715); 1792 break; 1793 1794 default: 1795 /* Nothing. */ 1796 break; 1797 } 1798 1799 /* 1800 * Initialize the transmit descriptor ring. 1801 */ 1802 memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs)); 1803 for (i = 0; i < TULIP_NTXDESC; i++) { 1804 sc->sc_txdescs[i].td_ctl = htole32(sc->sc_tdctl_ch); 1805 sc->sc_txdescs[i].td_bufaddr2 = 1806 htole32(TULIP_CDTXADDR(sc, TULIP_NEXTTX(i))); 1807 } 1808 sc->sc_txdescs[TULIP_NTXDESC - 1].td_ctl |= htole32(sc->sc_tdctl_er); 1809 TULIP_CDTXSYNC(sc, 0, TULIP_NTXDESC, 1810 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1811 sc->sc_txfree = TULIP_NTXDESC; 1812 sc->sc_txnext = 0; 1813 1814 /* 1815 * Initialize the transmit job descriptors. 1816 */ 1817 SIMPLEQ_INIT(&sc->sc_txfreeq); 1818 SIMPLEQ_INIT(&sc->sc_txdirtyq); 1819 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 1820 txs = &sc->sc_txsoft[i]; 1821 txs->txs_mbuf = NULL; 1822 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 1823 } 1824 1825 /* 1826 * Initialize the receive descriptor and receive job 1827 * descriptor rings. 1828 */ 1829 for (i = 0; i < TULIP_NRXDESC; i++) { 1830 rxs = &sc->sc_rxsoft[i]; 1831 if (rxs->rxs_mbuf == NULL) { 1832 if ((error = tlp_add_rxbuf(sc, i)) != 0) { 1833 aprint_error_dev(sc->sc_dev, "unable to allocate or map rx " 1834 "buffer %d, error = %d\n", 1835 i, error); 1836 /* 1837 * XXX Should attempt to run with fewer receive 1838 * XXX buffers instead of just failing. 1839 */ 1840 tlp_rxdrain(sc); 1841 goto out; 1842 } 1843 } else 1844 TULIP_INIT_RXDESC(sc, i); 1845 } 1846 sc->sc_rxptr = 0; 1847 1848 /* 1849 * Initialize the interrupt mask and enable interrupts. 1850 */ 1851 /* normal interrupts */ 1852 sc->sc_inten = STATUS_TI | STATUS_TU | STATUS_RI | STATUS_NIS; 1853 1854 /* abnormal interrupts */ 1855 sc->sc_inten |= STATUS_TPS | STATUS_TJT | STATUS_UNF | 1856 STATUS_RU | STATUS_RPS | STATUS_RWT | STATUS_SE | STATUS_AIS; 1857 1858 sc->sc_rxint_mask = STATUS_RI|STATUS_RU|STATUS_RWT; 1859 sc->sc_txint_mask = STATUS_TI|STATUS_UNF|STATUS_TJT; 1860 1861 switch (sc->sc_chip) { 1862 case TULIP_CHIP_WB89C840F: 1863 /* 1864 * Clear bits that we don't want that happen to 1865 * overlap or don't exist. 1866 */ 1867 sc->sc_inten &= ~(STATUS_WINB_REI|STATUS_RWT); 1868 break; 1869 1870 default: 1871 /* Nothing. */ 1872 break; 1873 } 1874 1875 sc->sc_rxint_mask &= sc->sc_inten; 1876 sc->sc_txint_mask &= sc->sc_inten; 1877 1878 TULIP_WRITE(sc, CSR_INTEN, sc->sc_inten); 1879 TULIP_WRITE(sc, CSR_STATUS, 0xffffffff); 1880 1881 /* 1882 * Give the transmit and receive rings to the Tulip. 1883 */ 1884 TULIP_WRITE(sc, CSR_TXLIST, TULIP_CDTXADDR(sc, sc->sc_txnext)); 1885 TULIP_WRITE(sc, CSR_RXLIST, TULIP_CDRXADDR(sc, sc->sc_rxptr)); 1886 1887 /* 1888 * On chips that do this differently, set the station address. 1889 */ 1890 switch (sc->sc_chip) { 1891 case TULIP_CHIP_WB89C840F: 1892 { 1893 /* XXX Do this with stream writes? */ 1894 bus_addr_t cpa = TULIP_CSR_OFFSET(sc, CSR_WINB_CPA0); 1895 1896 for (i = 0; i < ETHER_ADDR_LEN; i++) { 1897 bus_space_write_1(sc->sc_st, sc->sc_sh, 1898 cpa + i, CLLADDR(ifp->if_sadl)[i]); 1899 } 1900 break; 1901 } 1902 1903 case TULIP_CHIP_AL981: 1904 case TULIP_CHIP_AN983: 1905 case TULIP_CHIP_AN985: 1906 { 1907 uint32_t reg; 1908 const uint8_t *enaddr = CLLADDR(ifp->if_sadl); 1909 1910 reg = enaddr[0] | 1911 (enaddr[1] << 8) | 1912 (enaddr[2] << 16) | 1913 (enaddr[3] << 24); 1914 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR0, reg); 1915 1916 reg = enaddr[4] | 1917 (enaddr[5] << 8); 1918 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_PAR1, reg); 1919 break; 1920 } 1921 1922 case TULIP_CHIP_AX88140: 1923 case TULIP_CHIP_AX88141: 1924 { 1925 uint32_t reg; 1926 const uint8_t *enaddr = CLLADDR(ifp->if_sadl); 1927 1928 reg = enaddr[0] | 1929 (enaddr[1] << 8) | 1930 (enaddr[2] << 16) | 1931 (enaddr[3] << 24); 1932 TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_PAR0); 1933 TULIP_WRITE(sc, CSR_AX_FILTDATA, reg); 1934 1935 reg = enaddr[4] | (enaddr[5] << 8); 1936 TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_PAR1); 1937 TULIP_WRITE(sc, CSR_AX_FILTDATA, reg); 1938 break; 1939 } 1940 1941 default: 1942 /* Nothing. */ 1943 break; 1944 } 1945 1946 /* 1947 * Set the receive filter. This will start the transmit and 1948 * receive processes. 1949 */ 1950 (*sc->sc_filter_setup)(sc); 1951 1952 /* 1953 * Set the current media. 1954 */ 1955 (void) (*sc->sc_mediasw->tmsw_set)(sc); 1956 1957 /* 1958 * Start the receive process. 1959 */ 1960 TULIP_WRITE(sc, CSR_RXPOLL, RXPOLL_RPD); 1961 1962 if (sc->sc_tick != NULL) { 1963 /* Start the one second clock. */ 1964 callout_reset(&sc->sc_tick_callout, hz >> 3, sc->sc_tick, sc); 1965 } 1966 1967 /* 1968 * Note that the interface is now running. 1969 */ 1970 ifp->if_flags |= IFF_RUNNING; 1971 ifp->if_flags &= ~IFF_OACTIVE; 1972 sc->sc_if_flags = ifp->if_flags; 1973 1974 out: 1975 if (error) { 1976 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 1977 ifp->if_timer = 0; 1978 printf("%s: interface not running\n", device_xname(sc->sc_dev)); 1979 } 1980 return (error); 1981 } 1982 1983 /* 1984 * tlp_enable: 1985 * 1986 * Enable the Tulip chip. 1987 */ 1988 static int 1989 tlp_enable(struct tulip_softc *sc) 1990 { 1991 1992 if (TULIP_IS_ENABLED(sc) == 0 && sc->sc_enable != NULL) { 1993 if ((*sc->sc_enable)(sc) != 0) { 1994 aprint_error_dev(sc->sc_dev, "device enable failed\n"); 1995 return (EIO); 1996 } 1997 sc->sc_flags |= TULIPF_ENABLED; 1998 } 1999 return (0); 2000 } 2001 2002 /* 2003 * tlp_disable: 2004 * 2005 * Disable the Tulip chip. 2006 */ 2007 static void 2008 tlp_disable(struct tulip_softc *sc) 2009 { 2010 2011 if (TULIP_IS_ENABLED(sc) && sc->sc_disable != NULL) { 2012 (*sc->sc_disable)(sc); 2013 sc->sc_flags &= ~TULIPF_ENABLED; 2014 } 2015 } 2016 2017 /* 2018 * tlp_rxdrain: 2019 * 2020 * Drain the receive queue. 2021 */ 2022 static void 2023 tlp_rxdrain(struct tulip_softc *sc) 2024 { 2025 struct tulip_rxsoft *rxs; 2026 int i; 2027 2028 for (i = 0; i < TULIP_NRXDESC; i++) { 2029 rxs = &sc->sc_rxsoft[i]; 2030 if (rxs->rxs_mbuf != NULL) { 2031 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 2032 m_freem(rxs->rxs_mbuf); 2033 rxs->rxs_mbuf = NULL; 2034 } 2035 } 2036 } 2037 2038 /* 2039 * tlp_stop: [ ifnet interface function ] 2040 * 2041 * Stop transmission on the interface. 2042 */ 2043 static void 2044 tlp_stop(struct ifnet *ifp, int disable) 2045 { 2046 struct tulip_softc *sc = ifp->if_softc; 2047 struct tulip_txsoft *txs; 2048 2049 if (sc->sc_tick != NULL) { 2050 /* Stop the one second clock. */ 2051 callout_stop(&sc->sc_tick_callout); 2052 } 2053 2054 if (sc->sc_flags & TULIPF_HAS_MII) { 2055 /* Down the MII. */ 2056 mii_down(&sc->sc_mii); 2057 } 2058 2059 /* Disable interrupts. */ 2060 TULIP_WRITE(sc, CSR_INTEN, 0); 2061 2062 /* Stop the transmit and receive processes. */ 2063 sc->sc_opmode = 0; 2064 TULIP_WRITE(sc, CSR_OPMODE, 0); 2065 TULIP_WRITE(sc, CSR_RXLIST, 0); 2066 TULIP_WRITE(sc, CSR_TXLIST, 0); 2067 2068 /* 2069 * Release any queued transmit buffers. 2070 */ 2071 while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) { 2072 SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q); 2073 if (txs->txs_mbuf != NULL) { 2074 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 2075 m_freem(txs->txs_mbuf); 2076 txs->txs_mbuf = NULL; 2077 } 2078 SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); 2079 } 2080 2081 sc->sc_flags &= ~(TULIPF_WANT_SETUP|TULIPF_DOING_SETUP); 2082 2083 /* 2084 * Mark the interface down and cancel the watchdog timer. 2085 */ 2086 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 2087 sc->sc_if_flags = ifp->if_flags; 2088 ifp->if_timer = 0; 2089 2090 /* 2091 * Reset the chip (needed on some flavors to actually disable it). 2092 */ 2093 tlp_reset(sc); 2094 2095 if (disable) { 2096 tlp_rxdrain(sc); 2097 tlp_disable(sc); 2098 } 2099 } 2100 2101 #define SROM_EMIT(sc, x) \ 2102 do { \ 2103 TULIP_WRITE((sc), CSR_MIIROM, (x)); \ 2104 delay(2); \ 2105 } while (0) 2106 2107 /* 2108 * tlp_srom_idle: 2109 * 2110 * Put the SROM in idle state. 2111 */ 2112 static void 2113 tlp_srom_idle(struct tulip_softc *sc) 2114 { 2115 uint32_t miirom; 2116 int i; 2117 2118 miirom = MIIROM_SR; 2119 SROM_EMIT(sc, miirom); 2120 2121 miirom |= MIIROM_RD; 2122 SROM_EMIT(sc, miirom); 2123 2124 miirom |= MIIROM_SROMCS; 2125 SROM_EMIT(sc, miirom); 2126 2127 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2128 2129 /* Strobe the clock 32 times. */ 2130 for (i = 0; i < 32; i++) { 2131 SROM_EMIT(sc, miirom); 2132 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2133 } 2134 2135 SROM_EMIT(sc, miirom); 2136 2137 miirom &= ~MIIROM_SROMCS; 2138 SROM_EMIT(sc, miirom); 2139 2140 SROM_EMIT(sc, 0); 2141 } 2142 2143 /* 2144 * tlp_srom_size: 2145 * 2146 * Determine the number of address bits in the SROM. 2147 */ 2148 static int 2149 tlp_srom_size(struct tulip_softc *sc) 2150 { 2151 uint32_t miirom; 2152 int x; 2153 2154 /* Select the SROM. */ 2155 miirom = MIIROM_SR; 2156 SROM_EMIT(sc, miirom); 2157 2158 miirom |= MIIROM_RD; 2159 SROM_EMIT(sc, miirom); 2160 2161 /* Send CHIP SELECT for one clock tick. */ 2162 miirom |= MIIROM_SROMCS; 2163 SROM_EMIT(sc, miirom); 2164 2165 /* Shift in the READ opcode. */ 2166 for (x = 3; x > 0; x--) { 2167 if (TULIP_SROM_OPC_READ & (1 << (x - 1))) 2168 miirom |= MIIROM_SROMDI; 2169 else 2170 miirom &= ~MIIROM_SROMDI; 2171 SROM_EMIT(sc, miirom); 2172 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2173 SROM_EMIT(sc, miirom); 2174 } 2175 2176 /* Shift in address and look for dummy 0 bit. */ 2177 for (x = 1; x <= 12; x++) { 2178 miirom &= ~MIIROM_SROMDI; 2179 SROM_EMIT(sc, miirom); 2180 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2181 if (!TULIP_ISSET(sc, CSR_MIIROM, MIIROM_SROMDO)) 2182 break; 2183 SROM_EMIT(sc, miirom); 2184 } 2185 2186 /* Clear CHIP SELECT. */ 2187 miirom &= ~MIIROM_SROMCS; 2188 SROM_EMIT(sc, miirom); 2189 2190 /* Deselect the SROM. */ 2191 SROM_EMIT(sc, 0); 2192 2193 if (x < 4 || x > 12) { 2194 aprint_debug_dev(sc->sc_dev, "broken MicroWire interface detected; " 2195 "setting SROM size to 1Kb\n"); 2196 return (6); 2197 } else { 2198 if (tlp_srom_debug) 2199 printf("%s: SROM size is 2^%d*16 bits (%d bytes)\n", 2200 device_xname(sc->sc_dev), x, (1 << (x + 4)) >> 3); 2201 return (x); 2202 } 2203 } 2204 2205 /* 2206 * tlp_read_srom: 2207 * 2208 * Read the Tulip SROM. 2209 */ 2210 int 2211 tlp_read_srom(struct tulip_softc *sc) 2212 { 2213 int size; 2214 uint32_t miirom; 2215 uint16_t datain; 2216 int i, x; 2217 2218 tlp_srom_idle(sc); 2219 2220 sc->sc_srom_addrbits = tlp_srom_size(sc); 2221 if (sc->sc_srom_addrbits == 0) 2222 return (0); 2223 size = TULIP_ROM_SIZE(sc->sc_srom_addrbits); 2224 sc->sc_srom = malloc(size, M_DEVBUF, M_NOWAIT); 2225 2226 /* Select the SROM. */ 2227 miirom = MIIROM_SR; 2228 SROM_EMIT(sc, miirom); 2229 2230 miirom |= MIIROM_RD; 2231 SROM_EMIT(sc, miirom); 2232 2233 for (i = 0; i < size; i += 2) { 2234 /* Send CHIP SELECT for one clock tick. */ 2235 miirom |= MIIROM_SROMCS; 2236 SROM_EMIT(sc, miirom); 2237 2238 /* Shift in the READ opcode. */ 2239 for (x = 3; x > 0; x--) { 2240 if (TULIP_SROM_OPC_READ & (1 << (x - 1))) 2241 miirom |= MIIROM_SROMDI; 2242 else 2243 miirom &= ~MIIROM_SROMDI; 2244 SROM_EMIT(sc, miirom); 2245 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2246 SROM_EMIT(sc, miirom); 2247 } 2248 2249 /* Shift in address. */ 2250 for (x = sc->sc_srom_addrbits; x > 0; x--) { 2251 if (i & (1 << x)) 2252 miirom |= MIIROM_SROMDI; 2253 else 2254 miirom &= ~MIIROM_SROMDI; 2255 SROM_EMIT(sc, miirom); 2256 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2257 SROM_EMIT(sc, miirom); 2258 } 2259 2260 /* Shift out data. */ 2261 miirom &= ~MIIROM_SROMDI; 2262 datain = 0; 2263 for (x = 16; x > 0; x--) { 2264 SROM_EMIT(sc, miirom|MIIROM_SROMSK); 2265 if (TULIP_ISSET(sc, CSR_MIIROM, MIIROM_SROMDO)) 2266 datain |= (1 << (x - 1)); 2267 SROM_EMIT(sc, miirom); 2268 } 2269 sc->sc_srom[i] = datain & 0xff; 2270 sc->sc_srom[i + 1] = datain >> 8; 2271 2272 /* Clear CHIP SELECT. */ 2273 miirom &= ~MIIROM_SROMCS; 2274 SROM_EMIT(sc, miirom); 2275 } 2276 2277 /* Deselect the SROM. */ 2278 SROM_EMIT(sc, 0); 2279 2280 /* ...and idle it. */ 2281 tlp_srom_idle(sc); 2282 2283 if (tlp_srom_debug) { 2284 printf("SROM CONTENTS:"); 2285 for (i = 0; i < size; i++) { 2286 if ((i % 8) == 0) 2287 printf("\n\t"); 2288 printf("0x%02x ", sc->sc_srom[i]); 2289 } 2290 printf("\n"); 2291 } 2292 2293 return (1); 2294 } 2295 2296 #undef SROM_EMIT 2297 2298 /* 2299 * tlp_add_rxbuf: 2300 * 2301 * Add a receive buffer to the indicated descriptor. 2302 */ 2303 static int 2304 tlp_add_rxbuf(struct tulip_softc *sc, int idx) 2305 { 2306 struct tulip_rxsoft *rxs = &sc->sc_rxsoft[idx]; 2307 struct mbuf *m; 2308 int error; 2309 2310 MGETHDR(m, M_DONTWAIT, MT_DATA); 2311 if (m == NULL) 2312 return (ENOBUFS); 2313 2314 MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner); 2315 MCLGET(m, M_DONTWAIT); 2316 if ((m->m_flags & M_EXT) == 0) { 2317 m_freem(m); 2318 return (ENOBUFS); 2319 } 2320 2321 if (rxs->rxs_mbuf != NULL) 2322 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 2323 2324 rxs->rxs_mbuf = m; 2325 2326 error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, 2327 m->m_ext.ext_buf, m->m_ext.ext_size, NULL, 2328 BUS_DMA_READ|BUS_DMA_NOWAIT); 2329 if (error) { 2330 aprint_error_dev(sc->sc_dev, "can't load rx DMA map %d, error = %d\n", 2331 idx, error); 2332 panic("tlp_add_rxbuf"); /* XXX */ 2333 } 2334 2335 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0, 2336 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 2337 2338 TULIP_INIT_RXDESC(sc, idx); 2339 2340 return (0); 2341 } 2342 2343 /* 2344 * tlp_srom_crcok: 2345 * 2346 * Check the CRC of the Tulip SROM. 2347 */ 2348 int 2349 tlp_srom_crcok(const uint8_t *romdata) 2350 { 2351 uint32_t crc; 2352 2353 crc = ether_crc32_le(romdata, TULIP_ROM_CRC32_CHECKSUM); 2354 crc = (crc & 0xffff) ^ 0xffff; 2355 if (crc == TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM)) 2356 return (1); 2357 2358 /* 2359 * Try an alternate checksum. 2360 */ 2361 crc = ether_crc32_le(romdata, TULIP_ROM_CRC32_CHECKSUM1); 2362 crc = (crc & 0xffff) ^ 0xffff; 2363 if (crc == TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM1)) 2364 return (1); 2365 2366 return (0); 2367 } 2368 2369 /* 2370 * tlp_isv_srom: 2371 * 2372 * Check to see if the SROM is in the new standardized format. 2373 */ 2374 int 2375 tlp_isv_srom(const uint8_t *romdata) 2376 { 2377 int i; 2378 uint16_t cksum; 2379 2380 if (tlp_srom_crcok(romdata)) { 2381 /* 2382 * SROM CRC checks out; must be in the new format. 2383 */ 2384 return (1); 2385 } 2386 2387 cksum = TULIP_ROM_GETW(romdata, TULIP_ROM_CRC32_CHECKSUM); 2388 if (cksum == 0xffff || cksum == 0) { 2389 /* 2390 * No checksum present. Check the SROM ID; 18 bytes of 0 2391 * followed by 1 (version) followed by the number of 2392 * adapters which use this SROM (should be non-zero). 2393 */ 2394 for (i = 0; i < TULIP_ROM_SROM_FORMAT_VERION; i++) { 2395 if (romdata[i] != 0) 2396 return (0); 2397 } 2398 if (romdata[TULIP_ROM_SROM_FORMAT_VERION] != 1) 2399 return (0); 2400 if (romdata[TULIP_ROM_CHIP_COUNT] == 0) 2401 return (0); 2402 return (1); 2403 } 2404 2405 return (0); 2406 } 2407 2408 /* 2409 * tlp_isv_srom_enaddr: 2410 * 2411 * Get the Ethernet address from an ISV SROM. 2412 */ 2413 int 2414 tlp_isv_srom_enaddr(struct tulip_softc *sc, uint8_t *enaddr) 2415 { 2416 int i, devcnt; 2417 2418 if (tlp_isv_srom(sc->sc_srom) == 0) 2419 return (0); 2420 2421 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 2422 for (i = 0; i < devcnt; i++) { 2423 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 2424 break; 2425 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 2426 sc->sc_devno) 2427 break; 2428 } 2429 2430 if (i == devcnt) 2431 return (0); 2432 2433 memcpy(enaddr, &sc->sc_srom[TULIP_ROM_IEEE_NETWORK_ADDRESS], 2434 ETHER_ADDR_LEN); 2435 enaddr[5] += i; 2436 2437 return (1); 2438 } 2439 2440 /* 2441 * tlp_parse_old_srom: 2442 * 2443 * Parse old-format SROMs. 2444 * 2445 * This routine is largely lifted from Matt Thomas's `de' driver. 2446 */ 2447 int 2448 tlp_parse_old_srom(struct tulip_softc *sc, uint8_t *enaddr) 2449 { 2450 static const uint8_t testpat[] = 2451 { 0xff, 0, 0x55, 0xaa, 0xff, 0, 0x55, 0xaa }; 2452 int i; 2453 uint32_t cksum; 2454 2455 if (memcmp(&sc->sc_srom[0], &sc->sc_srom[16], 8) != 0) { 2456 /* 2457 * Phobos G100 interfaces have the address at 2458 * offsets 0 and 20, but each pair of bytes is 2459 * swapped. 2460 */ 2461 if (sc->sc_srom_addrbits == 6 && 2462 sc->sc_srom[1] == 0x00 && 2463 sc->sc_srom[0] == 0x60 && 2464 sc->sc_srom[3] == 0xf5 && 2465 memcmp(&sc->sc_srom[0], &sc->sc_srom[20], 6) == 0) { 2466 for (i = 0; i < 6; i += 2) { 2467 enaddr[i] = sc->sc_srom[i + 1]; 2468 enaddr[i + 1] = sc->sc_srom[i]; 2469 } 2470 return (1); 2471 } 2472 2473 /* 2474 * Phobos G130/G160 interfaces have the address at 2475 * offsets 20 and 84, but each pair of bytes is 2476 * swapped. 2477 */ 2478 if (sc->sc_srom_addrbits == 6 && 2479 sc->sc_srom[21] == 0x00 && 2480 sc->sc_srom[20] == 0x60 && 2481 sc->sc_srom[23] == 0xf5 && 2482 memcmp(&sc->sc_srom[20], &sc->sc_srom[84], 6) == 0) { 2483 for (i = 0; i < 6; i += 2) { 2484 enaddr[i] = sc->sc_srom[20 + i + 1]; 2485 enaddr[i + 1] = sc->sc_srom[20 + i]; 2486 } 2487 return (1); 2488 } 2489 2490 /* 2491 * Cobalt Networks interfaces simply have the address 2492 * in the first six bytes. The rest is zeroed out 2493 * on some models, but others contain unknown data. 2494 */ 2495 if (sc->sc_srom[0] == 0x00 && 2496 sc->sc_srom[1] == 0x10 && 2497 sc->sc_srom[2] == 0xe0) { 2498 memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN); 2499 return (1); 2500 } 2501 2502 /* 2503 * Some vendors (e.g. ZNYX) don't use the standard 2504 * DEC Address ROM format, but rather just have an 2505 * Ethernet address in the first 6 bytes, maybe a 2506 * 2 byte checksum, and then all 0xff's. 2507 */ 2508 for (i = 8; i < 32; i++) { 2509 if (sc->sc_srom[i] != 0xff && 2510 sc->sc_srom[i] != 0) 2511 return (0); 2512 } 2513 2514 /* 2515 * Sanity check the Ethernet address: 2516 * 2517 * - Make sure it's not multicast or locally 2518 * assigned 2519 * - Make sure it has a non-0 OUI 2520 */ 2521 if (sc->sc_srom[0] & 3) 2522 return (0); 2523 if (sc->sc_srom[0] == 0 && sc->sc_srom[1] == 0 && 2524 sc->sc_srom[2] == 0) 2525 return (0); 2526 2527 memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN); 2528 return (1); 2529 } 2530 2531 /* 2532 * Standard DEC Address ROM test. 2533 */ 2534 2535 if (memcmp(&sc->sc_srom[24], testpat, 8) != 0) 2536 return (0); 2537 2538 for (i = 0; i < 8; i++) { 2539 if (sc->sc_srom[i] != sc->sc_srom[15 - i]) 2540 return (0); 2541 } 2542 2543 memcpy(enaddr, sc->sc_srom, ETHER_ADDR_LEN); 2544 2545 cksum = *(uint16_t *) &enaddr[0]; 2546 2547 cksum <<= 1; 2548 if (cksum > 0xffff) 2549 cksum -= 0xffff; 2550 2551 cksum += *(uint16_t *) &enaddr[2]; 2552 if (cksum > 0xffff) 2553 cksum -= 0xffff; 2554 2555 cksum <<= 1; 2556 if (cksum > 0xffff) 2557 cksum -= 0xffff; 2558 2559 cksum += *(uint16_t *) &enaddr[4]; 2560 if (cksum >= 0xffff) 2561 cksum -= 0xffff; 2562 2563 if (cksum != *(uint16_t *) &sc->sc_srom[6]) 2564 return (0); 2565 2566 return (1); 2567 } 2568 2569 /* 2570 * tlp_filter_setup: 2571 * 2572 * Set the Tulip's receive filter. 2573 */ 2574 static void 2575 tlp_filter_setup(struct tulip_softc *sc) 2576 { 2577 struct ethercom *ec = &sc->sc_ethercom; 2578 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2579 struct ether_multi *enm; 2580 struct ether_multistep step; 2581 volatile uint32_t *sp; 2582 struct tulip_txsoft *txs; 2583 uint8_t enaddr[ETHER_ADDR_LEN]; 2584 uint32_t hash, hashsize; 2585 int cnt, nexttx; 2586 2587 DPRINTF(sc, ("%s: tlp_filter_setup: sc_flags 0x%08x\n", 2588 device_xname(sc->sc_dev), sc->sc_flags)); 2589 2590 memcpy(enaddr, CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN); 2591 2592 /* 2593 * If there are transmissions pending, wait until they have 2594 * completed. 2595 */ 2596 if (! SIMPLEQ_EMPTY(&sc->sc_txdirtyq) || 2597 (sc->sc_flags & TULIPF_DOING_SETUP) != 0) { 2598 sc->sc_flags |= TULIPF_WANT_SETUP; 2599 DPRINTF(sc, ("%s: tlp_filter_setup: deferring\n", 2600 device_xname(sc->sc_dev))); 2601 return; 2602 } 2603 sc->sc_flags &= ~TULIPF_WANT_SETUP; 2604 2605 switch (sc->sc_chip) { 2606 case TULIP_CHIP_82C115: 2607 hashsize = TULIP_PNICII_HASHSIZE; 2608 break; 2609 2610 default: 2611 hashsize = TULIP_MCHASHSIZE; 2612 } 2613 2614 /* 2615 * If we're running, idle the transmit and receive engines. If 2616 * we're NOT running, we're being called from tlp_init(), and our 2617 * writing OPMODE will start the transmit and receive processes 2618 * in motion. 2619 */ 2620 if (ifp->if_flags & IFF_RUNNING) 2621 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 2622 2623 sc->sc_opmode &= ~(OPMODE_PR|OPMODE_PM); 2624 2625 if (ifp->if_flags & IFF_PROMISC) { 2626 sc->sc_opmode |= OPMODE_PR; 2627 goto allmulti; 2628 } 2629 2630 /* 2631 * Try Perfect filtering first. 2632 */ 2633 2634 sc->sc_filtmode = TDCTL_Tx_FT_PERFECT; 2635 sp = TULIP_CDSP(sc); 2636 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2637 cnt = 0; 2638 ETHER_FIRST_MULTI(step, ec, enm); 2639 while (enm != NULL) { 2640 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2641 /* 2642 * We must listen to a range of multicast addresses. 2643 * For now, just accept all multicasts, rather than 2644 * trying to set only those filter bits needed to match 2645 * the range. (At this time, the only use of address 2646 * ranges is for IP multicast routing, for which the 2647 * range is big enough to require all bits set.) 2648 */ 2649 goto allmulti; 2650 } 2651 if (cnt == (TULIP_MAXADDRS - 2)) { 2652 /* 2653 * We already have our multicast limit (still need 2654 * our station address and broadcast). Go to 2655 * Hash-Perfect mode. 2656 */ 2657 goto hashperfect; 2658 } 2659 cnt++; 2660 *sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 0)); 2661 *sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 1)); 2662 *sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 2)); 2663 ETHER_NEXT_MULTI(step, enm); 2664 } 2665 2666 if (ifp->if_flags & IFF_BROADCAST) { 2667 /* ...and the broadcast address. */ 2668 cnt++; 2669 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2670 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2671 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2672 } 2673 2674 /* Pad the rest with our station address. */ 2675 for (; cnt < TULIP_MAXADDRS; cnt++) { 2676 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 0)); 2677 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 1)); 2678 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 2)); 2679 } 2680 ifp->if_flags &= ~IFF_ALLMULTI; 2681 goto setit; 2682 2683 hashperfect: 2684 /* 2685 * Try Hash-Perfect mode. 2686 */ 2687 2688 /* 2689 * Some 21140 chips have broken Hash-Perfect modes. On these 2690 * chips, we simply use Hash-Only mode, and put our station 2691 * address into the filter. 2692 */ 2693 if (sc->sc_chip == TULIP_CHIP_21140) 2694 sc->sc_filtmode = TDCTL_Tx_FT_HASHONLY; 2695 else 2696 sc->sc_filtmode = TDCTL_Tx_FT_HASH; 2697 sp = TULIP_CDSP(sc); 2698 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2699 ETHER_FIRST_MULTI(step, ec, enm); 2700 while (enm != NULL) { 2701 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2702 /* 2703 * We must listen to a range of multicast addresses. 2704 * For now, just accept all multicasts, rather than 2705 * trying to set only those filter bits needed to match 2706 * the range. (At this time, the only use of address 2707 * ranges is for IP multicast routing, for which the 2708 * range is big enough to require all bits set.) 2709 */ 2710 goto allmulti; 2711 } 2712 hash = tlp_mchash(enm->enm_addrlo, hashsize); 2713 sp[hash >> 4] |= htole32(1 << (hash & 0xf)); 2714 ETHER_NEXT_MULTI(step, enm); 2715 } 2716 2717 if (ifp->if_flags & IFF_BROADCAST) { 2718 /* ...and the broadcast address. */ 2719 hash = tlp_mchash(etherbroadcastaddr, hashsize); 2720 sp[hash >> 4] |= htole32(1 << (hash & 0xf)); 2721 } 2722 2723 if (sc->sc_filtmode == TDCTL_Tx_FT_HASHONLY) { 2724 /* ...and our station address. */ 2725 hash = tlp_mchash(enaddr, hashsize); 2726 sp[hash >> 4] |= htole32(1 << (hash & 0xf)); 2727 } else { 2728 /* 2729 * Hash-Perfect mode; put our station address after 2730 * the hash table. 2731 */ 2732 sp[39] = htole32(TULIP_SP_FIELD(enaddr, 0)); 2733 sp[40] = htole32(TULIP_SP_FIELD(enaddr, 1)); 2734 sp[41] = htole32(TULIP_SP_FIELD(enaddr, 2)); 2735 } 2736 ifp->if_flags &= ~IFF_ALLMULTI; 2737 goto setit; 2738 2739 allmulti: 2740 /* 2741 * Use Perfect filter mode. First address is the broadcast address, 2742 * and pad the rest with our station address. We'll set Pass-all- 2743 * multicast in OPMODE below. 2744 */ 2745 sc->sc_filtmode = TDCTL_Tx_FT_PERFECT; 2746 sp = TULIP_CDSP(sc); 2747 memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); 2748 cnt = 0; 2749 if (ifp->if_flags & IFF_BROADCAST) { 2750 cnt++; 2751 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2752 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2753 *sp++ = htole32(TULIP_SP_FIELD_C(0xff, 0xff)); 2754 } 2755 for (; cnt < TULIP_MAXADDRS; cnt++) { 2756 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 0)); 2757 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 1)); 2758 *sp++ = htole32(TULIP_SP_FIELD(enaddr, 2)); 2759 } 2760 ifp->if_flags |= IFF_ALLMULTI; 2761 2762 setit: 2763 if (ifp->if_flags & IFF_ALLMULTI) 2764 sc->sc_opmode |= OPMODE_PM; 2765 2766 /* Sync the setup packet buffer. */ 2767 TULIP_CDSPSYNC(sc, BUS_DMASYNC_PREWRITE); 2768 2769 /* 2770 * Fill in the setup packet descriptor. 2771 */ 2772 txs = SIMPLEQ_FIRST(&sc->sc_txfreeq); 2773 2774 txs->txs_firstdesc = sc->sc_txnext; 2775 txs->txs_lastdesc = sc->sc_txnext; 2776 txs->txs_ndescs = 1; 2777 txs->txs_mbuf = NULL; 2778 2779 nexttx = sc->sc_txnext; 2780 sc->sc_txdescs[nexttx].td_status = 0; 2781 sc->sc_txdescs[nexttx].td_bufaddr1 = htole32(TULIP_CDSPADDR(sc)); 2782 sc->sc_txdescs[nexttx].td_ctl = 2783 htole32((TULIP_SETUP_PACKET_LEN << TDCTL_SIZE1_SHIFT) | 2784 sc->sc_filtmode | TDCTL_Tx_SET | sc->sc_setup_fsls | 2785 TDCTL_Tx_IC | sc->sc_tdctl_ch | 2786 (nexttx == (TULIP_NTXDESC - 1) ? sc->sc_tdctl_er : 0)); 2787 TULIP_CDTXSYNC(sc, nexttx, 1, 2788 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 2789 2790 #ifdef TLP_DEBUG 2791 if (ifp->if_flags & IFF_DEBUG) { 2792 printf(" filter_setup %p transmit chain:\n", txs); 2793 printf(" descriptor %d:\n", nexttx); 2794 printf(" td_status: 0x%08x\n", 2795 le32toh(sc->sc_txdescs[nexttx].td_status)); 2796 printf(" td_ctl: 0x%08x\n", 2797 le32toh(sc->sc_txdescs[nexttx].td_ctl)); 2798 printf(" td_bufaddr1: 0x%08x\n", 2799 le32toh(sc->sc_txdescs[nexttx].td_bufaddr1)); 2800 printf(" td_bufaddr2: 0x%08x\n", 2801 le32toh(sc->sc_txdescs[nexttx].td_bufaddr2)); 2802 } 2803 #endif 2804 2805 sc->sc_txdescs[nexttx].td_status = htole32(TDSTAT_OWN); 2806 TULIP_CDTXSYNC(sc, nexttx, 1, 2807 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 2808 2809 /* Advance the tx pointer. */ 2810 sc->sc_txfree -= 1; 2811 sc->sc_txnext = TULIP_NEXTTX(nexttx); 2812 2813 SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q); 2814 SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q); 2815 2816 /* 2817 * Set the OPMODE register. This will also resume the 2818 * transmit process we idled above. 2819 */ 2820 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2821 2822 sc->sc_flags |= TULIPF_DOING_SETUP; 2823 2824 /* 2825 * Kick the transmitter; this will cause the Tulip to 2826 * read the setup descriptor. 2827 */ 2828 /* XXX USE AUTOPOLLING? */ 2829 TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD); 2830 2831 /* Set up a watchdog timer in case the chip flakes out. */ 2832 ifp->if_timer = 5; 2833 2834 DPRINTF(sc, ("%s: tlp_filter_setup: returning\n", device_xname(sc->sc_dev))); 2835 } 2836 2837 /* 2838 * tlp_winb_filter_setup: 2839 * 2840 * Set the Winbond 89C840F's receive filter. 2841 */ 2842 static void 2843 tlp_winb_filter_setup(struct tulip_softc *sc) 2844 { 2845 struct ethercom *ec = &sc->sc_ethercom; 2846 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2847 struct ether_multi *enm; 2848 struct ether_multistep step; 2849 uint32_t hash, mchash[2]; 2850 2851 DPRINTF(sc, ("%s: tlp_winb_filter_setup: sc_flags 0x%08x\n", 2852 device_xname(sc->sc_dev), sc->sc_flags)); 2853 2854 sc->sc_opmode &= ~(OPMODE_WINB_APP|OPMODE_WINB_AMP|OPMODE_WINB_ABP); 2855 2856 if (ifp->if_flags & IFF_MULTICAST) 2857 sc->sc_opmode |= OPMODE_WINB_AMP; 2858 2859 if (ifp->if_flags & IFF_BROADCAST) 2860 sc->sc_opmode |= OPMODE_WINB_ABP; 2861 2862 if (ifp->if_flags & IFF_PROMISC) { 2863 sc->sc_opmode |= OPMODE_WINB_APP; 2864 goto allmulti; 2865 } 2866 2867 mchash[0] = mchash[1] = 0; 2868 2869 ETHER_FIRST_MULTI(step, ec, enm); 2870 while (enm != NULL) { 2871 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2872 /* 2873 * We must listen to a range of multicast addresses. 2874 * For now, just accept all multicasts, rather than 2875 * trying to set only those filter bits needed to match 2876 * the range. (At this time, the only use of address 2877 * ranges is for IP multicast routing, for which the 2878 * range is big enough to require all bits set.) 2879 */ 2880 goto allmulti; 2881 } 2882 2883 /* 2884 * According to the FreeBSD `wb' driver, yes, you 2885 * really do invert the hash. 2886 */ 2887 hash = 2888 (~(ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26)) 2889 & 0x3f; 2890 mchash[hash >> 5] |= 1 << (hash & 0x1f); 2891 ETHER_NEXT_MULTI(step, enm); 2892 } 2893 ifp->if_flags &= ~IFF_ALLMULTI; 2894 goto setit; 2895 2896 allmulti: 2897 ifp->if_flags |= IFF_ALLMULTI; 2898 mchash[0] = mchash[1] = 0xffffffff; 2899 2900 setit: 2901 TULIP_WRITE(sc, CSR_WINB_CMA0, mchash[0]); 2902 TULIP_WRITE(sc, CSR_WINB_CMA1, mchash[1]); 2903 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2904 DPRINTF(sc, ("%s: tlp_winb_filter_setup: returning\n", 2905 device_xname(sc->sc_dev))); 2906 } 2907 2908 /* 2909 * tlp_al981_filter_setup: 2910 * 2911 * Set the ADMtek AL981's receive filter. 2912 */ 2913 static void 2914 tlp_al981_filter_setup(struct tulip_softc *sc) 2915 { 2916 struct ethercom *ec = &sc->sc_ethercom; 2917 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2918 struct ether_multi *enm; 2919 struct ether_multistep step; 2920 uint32_t hash, mchash[2]; 2921 2922 /* 2923 * If the chip is running, we need to reset the interface, 2924 * and will revisit here (with IFF_RUNNING) clear. The 2925 * chip seems to really not like to have its multicast 2926 * filter programmed without a reset. 2927 */ 2928 if (ifp->if_flags & IFF_RUNNING) { 2929 (void) tlp_init(ifp); 2930 return; 2931 } 2932 2933 DPRINTF(sc, ("%s: tlp_al981_filter_setup: sc_flags 0x%08x\n", 2934 device_xname(sc->sc_dev), sc->sc_flags)); 2935 2936 sc->sc_opmode &= ~(OPMODE_PR|OPMODE_PM); 2937 2938 if (ifp->if_flags & IFF_PROMISC) { 2939 sc->sc_opmode |= OPMODE_PR; 2940 goto allmulti; 2941 } 2942 2943 mchash[0] = mchash[1] = 0; 2944 2945 ETHER_FIRST_MULTI(step, ec, enm); 2946 while (enm != NULL) { 2947 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2948 /* 2949 * We must listen to a range of multicast addresses. 2950 * For now, just accept all multicasts, rather than 2951 * trying to set only those filter bits needed to match 2952 * the range. (At this time, the only use of address 2953 * ranges is for IP multicast routing, for which the 2954 * range is big enough to require all bits set.) 2955 */ 2956 goto allmulti; 2957 } 2958 2959 hash = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) & 0x3f; 2960 mchash[hash >> 5] |= 1 << (hash & 0x1f); 2961 ETHER_NEXT_MULTI(step, enm); 2962 } 2963 ifp->if_flags &= ~IFF_ALLMULTI; 2964 goto setit; 2965 2966 allmulti: 2967 ifp->if_flags |= IFF_ALLMULTI; 2968 mchash[0] = mchash[1] = 0xffffffff; 2969 2970 setit: 2971 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_MAR0, mchash[0]); 2972 bus_space_write_4(sc->sc_st, sc->sc_sh, CSR_ADM_MAR1, mchash[1]); 2973 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 2974 DPRINTF(sc, ("%s: tlp_al981_filter_setup: returning\n", 2975 device_xname(sc->sc_dev))); 2976 } 2977 2978 /* 2979 * tlp_asix_filter_setup: 2980 * 2981 * Set the ASIX AX8814x recieve filter. 2982 */ 2983 static void 2984 tlp_asix_filter_setup(struct tulip_softc *sc) 2985 { 2986 struct ethercom *ec = &sc->sc_ethercom; 2987 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 2988 struct ether_multi *enm; 2989 struct ether_multistep step; 2990 uint32_t hash, mchash[2]; 2991 2992 DPRINTF(sc, ("%s: tlp_asix_filter_setup: sc_flags 0x%08x\n", 2993 device_xname(sc->sc_dev), sc->sc_flags)); 2994 2995 sc->sc_opmode &= ~(OPMODE_PM|OPMODE_AX_RB|OPMODE_PR); 2996 2997 if (ifp->if_flags & IFF_MULTICAST) 2998 sc->sc_opmode |= OPMODE_PM; 2999 3000 if (ifp->if_flags & IFF_BROADCAST) 3001 sc->sc_opmode |= OPMODE_AX_RB; 3002 3003 if (ifp->if_flags & IFF_PROMISC) { 3004 sc->sc_opmode |= OPMODE_PR; 3005 goto allmulti; 3006 } 3007 3008 mchash[0] = mchash[1] = 0; 3009 3010 ETHER_FIRST_MULTI(step, ec, enm); 3011 while (enm != NULL) { 3012 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 3013 /* 3014 * We must listen to a range of multicast addresses. 3015 * For now, just accept all multicasts, rather than 3016 * trying to set only those filter bits needed to match 3017 * the range. (At this time, the only use of address 3018 * ranges is for IP multicast routing, for which the 3019 * range is big enough to require all bits set.) 3020 */ 3021 goto allmulti; 3022 } 3023 hash = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26) 3024 & 0x3f; 3025 if (hash < 32) 3026 mchash[0] |= (1 << hash); 3027 else 3028 mchash[1] |= (1 << (hash - 32)); 3029 ETHER_NEXT_MULTI(step, enm); 3030 } 3031 ifp->if_flags &= ~IFF_ALLMULTI; 3032 goto setit; 3033 3034 allmulti: 3035 ifp->if_flags |= IFF_ALLMULTI; 3036 mchash[0] = mchash[1] = 0xffffffff; 3037 3038 setit: 3039 TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_MAR0); 3040 TULIP_WRITE(sc, CSR_AX_FILTDATA, mchash[0]); 3041 TULIP_WRITE(sc, CSR_AX_FILTIDX, AX_FILTIDX_MAR1); 3042 TULIP_WRITE(sc, CSR_AX_FILTDATA, mchash[1]); 3043 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3044 DPRINTF(sc, ("%s: tlp_asix_filter_setup: returning\n", 3045 device_xname(sc->sc_dev))); 3046 } 3047 3048 3049 /* 3050 * tlp_idle: 3051 * 3052 * Cause the transmit and/or receive processes to go idle. 3053 */ 3054 void 3055 tlp_idle(struct tulip_softc *sc, uint32_t bits) 3056 { 3057 static const char * const tlp_tx_state_names[] = { 3058 "STOPPED", 3059 "RUNNING - FETCH", 3060 "RUNNING - WAIT", 3061 "RUNNING - READING", 3062 "-- RESERVED --", 3063 "RUNNING - SETUP", 3064 "SUSPENDED", 3065 "RUNNING - CLOSE", 3066 }; 3067 static const char * const tlp_rx_state_names[] = { 3068 "STOPPED", 3069 "RUNNING - FETCH", 3070 "RUNNING - CHECK", 3071 "RUNNING - WAIT", 3072 "SUSPENDED", 3073 "RUNNING - CLOSE", 3074 "RUNNING - FLUSH", 3075 "RUNNING - QUEUE", 3076 }; 3077 static const char * const dm9102_tx_state_names[] = { 3078 "STOPPED", 3079 "RUNNING - FETCH", 3080 "RUNNING - SETUP", 3081 "RUNNING - READING", 3082 "RUNNING - CLOSE - CLEAR OWNER", 3083 "RUNNING - WAIT", 3084 "RUNNING - CLOSE - WRITE STATUS", 3085 "SUSPENDED", 3086 }; 3087 static const char * const dm9102_rx_state_names[] = { 3088 "STOPPED", 3089 "RUNNING - FETCH", 3090 "RUNNING - WAIT", 3091 "RUNNING - QUEUE", 3092 "RUNNING - CLOSE - CLEAR OWNER", 3093 "RUNNING - CLOSE - WRITE STATUS", 3094 "SUSPENDED", 3095 "RUNNING - FLUSH", 3096 }; 3097 3098 const char * const *tx_state_names, * const *rx_state_names; 3099 uint32_t csr, ackmask = 0; 3100 int i; 3101 3102 switch (sc->sc_chip) { 3103 case TULIP_CHIP_DM9102: 3104 case TULIP_CHIP_DM9102A: 3105 tx_state_names = dm9102_tx_state_names; 3106 rx_state_names = dm9102_rx_state_names; 3107 break; 3108 3109 default: 3110 tx_state_names = tlp_tx_state_names; 3111 rx_state_names = tlp_rx_state_names; 3112 break; 3113 } 3114 3115 if (bits & OPMODE_ST) 3116 ackmask |= STATUS_TPS; 3117 3118 if (bits & OPMODE_SR) 3119 ackmask |= STATUS_RPS; 3120 3121 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode & ~bits); 3122 3123 for (i = 0; i < 1000; i++) { 3124 if (TULIP_ISSET(sc, CSR_STATUS, ackmask) == ackmask) 3125 break; 3126 delay(10); 3127 } 3128 3129 csr = TULIP_READ(sc, CSR_STATUS); 3130 if ((csr & ackmask) != ackmask) { 3131 if ((bits & OPMODE_ST) != 0 && (csr & STATUS_TPS) == 0 && 3132 (csr & STATUS_TS) != STATUS_TS_STOPPED) { 3133 switch (sc->sc_chip) { 3134 case TULIP_CHIP_AX88140: 3135 case TULIP_CHIP_AX88141: 3136 /* 3137 * Filter the message out on noisy chips. 3138 */ 3139 break; 3140 default: 3141 printf("%s: transmit process failed to idle: " 3142 "state %s\n", device_xname(sc->sc_dev), 3143 tx_state_names[(csr & STATUS_TS) >> 20]); 3144 } 3145 } 3146 if ((bits & OPMODE_SR) != 0 && (csr & STATUS_RPS) == 0 && 3147 (csr & STATUS_RS) != STATUS_RS_STOPPED) { 3148 switch (sc->sc_chip) { 3149 case TULIP_CHIP_AN983: 3150 case TULIP_CHIP_AN985: 3151 case TULIP_CHIP_DM9102A: 3152 case TULIP_CHIP_RS7112: 3153 /* 3154 * Filter the message out on noisy chips. 3155 */ 3156 break; 3157 default: 3158 printf("%s: receive process failed to idle: " 3159 "state %s\n", device_xname(sc->sc_dev), 3160 rx_state_names[(csr & STATUS_RS) >> 17]); 3161 } 3162 } 3163 } 3164 TULIP_WRITE(sc, CSR_STATUS, ackmask); 3165 } 3166 3167 /***************************************************************************** 3168 * Generic media support functions. 3169 *****************************************************************************/ 3170 3171 /* 3172 * tlp_mediastatus: [ifmedia interface function] 3173 * 3174 * Query the current media. 3175 */ 3176 void 3177 tlp_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 3178 { 3179 struct tulip_softc *sc = ifp->if_softc; 3180 3181 if (TULIP_IS_ENABLED(sc) == 0) { 3182 ifmr->ifm_active = IFM_ETHER | IFM_NONE; 3183 ifmr->ifm_status = 0; 3184 return; 3185 } 3186 3187 (*sc->sc_mediasw->tmsw_get)(sc, ifmr); 3188 } 3189 3190 /* 3191 * tlp_mediachange: [ifmedia interface function] 3192 * 3193 * Update the current media. 3194 */ 3195 int 3196 tlp_mediachange(struct ifnet *ifp) 3197 { 3198 struct tulip_softc *sc = ifp->if_softc; 3199 3200 if ((ifp->if_flags & IFF_UP) == 0) 3201 return (0); 3202 return ((*sc->sc_mediasw->tmsw_set)(sc)); 3203 } 3204 3205 /***************************************************************************** 3206 * Support functions for MII-attached media. 3207 *****************************************************************************/ 3208 3209 /* 3210 * tlp_mii_tick: 3211 * 3212 * One second timer, used to tick the MII. 3213 */ 3214 static void 3215 tlp_mii_tick(void *arg) 3216 { 3217 struct tulip_softc *sc = arg; 3218 int s; 3219 3220 if (!device_is_active(sc->sc_dev)) 3221 return; 3222 3223 s = splnet(); 3224 mii_tick(&sc->sc_mii); 3225 splx(s); 3226 3227 callout_reset(&sc->sc_tick_callout, hz, sc->sc_tick, sc); 3228 } 3229 3230 /* 3231 * tlp_mii_statchg: [mii interface function] 3232 * 3233 * Callback from PHY when media changes. 3234 */ 3235 static void 3236 tlp_mii_statchg(device_t self) 3237 { 3238 struct tulip_softc *sc = device_private(self); 3239 3240 /* Idle the transmit and receive processes. */ 3241 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 3242 3243 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_HBD); 3244 3245 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) 3246 sc->sc_opmode |= OPMODE_TTM; 3247 else 3248 sc->sc_opmode |= OPMODE_HBD; 3249 3250 if (sc->sc_mii.mii_media_active & IFM_FDX) 3251 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 3252 3253 /* 3254 * Write new OPMODE bits. This also restarts the transmit 3255 * and receive processes. 3256 */ 3257 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3258 } 3259 3260 /* 3261 * tlp_winb_mii_statchg: [mii interface function] 3262 * 3263 * Callback from PHY when media changes. This version is 3264 * for the Winbond 89C840F, which has different OPMODE bits. 3265 */ 3266 static void 3267 tlp_winb_mii_statchg(device_t self) 3268 { 3269 struct tulip_softc *sc = device_private(self); 3270 3271 /* Idle the transmit and receive processes. */ 3272 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 3273 3274 sc->sc_opmode &= ~(OPMODE_WINB_FES|OPMODE_FD); 3275 3276 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_100_TX) 3277 sc->sc_opmode |= OPMODE_WINB_FES; 3278 3279 if (sc->sc_mii.mii_media_active & IFM_FDX) 3280 sc->sc_opmode |= OPMODE_FD; 3281 3282 /* 3283 * Write new OPMODE bits. This also restarts the transmit 3284 * and receive processes. 3285 */ 3286 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3287 } 3288 3289 /* 3290 * tlp_dm9102_mii_statchg: [mii interface function] 3291 * 3292 * Callback from PHY when media changes. This version is 3293 * for the DM9102. 3294 */ 3295 static void 3296 tlp_dm9102_mii_statchg(device_t self) 3297 { 3298 struct tulip_softc *sc = device_private(self); 3299 3300 /* 3301 * Don't idle the transmit and receive processes, here. It 3302 * seems to fail, and just causes excess noise. 3303 */ 3304 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD); 3305 3306 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) != IFM_100_TX) 3307 sc->sc_opmode |= OPMODE_TTM; 3308 3309 if (sc->sc_mii.mii_media_active & IFM_FDX) 3310 sc->sc_opmode |= OPMODE_FD; 3311 3312 /* 3313 * Write new OPMODE bits. 3314 */ 3315 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3316 } 3317 3318 /* 3319 * tlp_mii_getmedia: 3320 * 3321 * Callback from ifmedia to request current media status. 3322 */ 3323 static void 3324 tlp_mii_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr) 3325 { 3326 3327 mii_pollstat(&sc->sc_mii); 3328 ifmr->ifm_status = sc->sc_mii.mii_media_status; 3329 ifmr->ifm_active = sc->sc_mii.mii_media_active; 3330 } 3331 3332 /* 3333 * tlp_mii_setmedia: 3334 * 3335 * Callback from ifmedia to request new media setting. 3336 */ 3337 static int 3338 tlp_mii_setmedia(struct tulip_softc *sc) 3339 { 3340 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 3341 int rc; 3342 3343 if ((ifp->if_flags & IFF_UP) == 0) 3344 return 0; 3345 switch (sc->sc_chip) { 3346 case TULIP_CHIP_21142: 3347 case TULIP_CHIP_21143: 3348 /* Disable the internal Nway engine. */ 3349 TULIP_WRITE(sc, CSR_SIATXRX, 0); 3350 break; 3351 3352 default: 3353 /* Nothing. */ 3354 break; 3355 } 3356 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO) 3357 return 0; 3358 return rc; 3359 } 3360 3361 /* 3362 * tlp_bitbang_mii_readreg: 3363 * 3364 * Read a PHY register via bit-bang'ing the MII. 3365 */ 3366 static int 3367 tlp_bitbang_mii_readreg(device_t self, int phy, int reg) 3368 { 3369 struct tulip_softc *sc = device_private(self); 3370 3371 return (mii_bitbang_readreg(self, sc->sc_bitbang_ops, phy, reg)); 3372 } 3373 3374 /* 3375 * tlp_bitbang_mii_writereg: 3376 * 3377 * Write a PHY register via bit-bang'ing the MII. 3378 */ 3379 static void 3380 tlp_bitbang_mii_writereg(device_t self, int phy, int reg, int val) 3381 { 3382 struct tulip_softc *sc = device_private(self); 3383 3384 mii_bitbang_writereg(self, sc->sc_bitbang_ops, phy, reg, val); 3385 } 3386 3387 /* 3388 * tlp_sio_mii_bitbang_read: 3389 * 3390 * Read the MII serial port for the MII bit-bang module. 3391 */ 3392 static uint32_t 3393 tlp_sio_mii_bitbang_read(device_t self) 3394 { 3395 struct tulip_softc *sc = device_private(self); 3396 3397 return (TULIP_READ(sc, CSR_MIIROM)); 3398 } 3399 3400 /* 3401 * tlp_sio_mii_bitbang_write: 3402 * 3403 * Write the MII serial port for the MII bit-bang module. 3404 */ 3405 static void 3406 tlp_sio_mii_bitbang_write(device_t self, uint32_t val) 3407 { 3408 struct tulip_softc *sc = device_private(self); 3409 3410 TULIP_WRITE(sc, CSR_MIIROM, val); 3411 } 3412 3413 /* 3414 * tlp_pnic_mii_readreg: 3415 * 3416 * Read a PHY register on the Lite-On PNIC. 3417 */ 3418 static int 3419 tlp_pnic_mii_readreg(device_t self, int phy, int reg) 3420 { 3421 struct tulip_softc *sc = device_private(self); 3422 uint32_t val; 3423 int i; 3424 3425 TULIP_WRITE(sc, CSR_PNIC_MII, 3426 PNIC_MII_MBO | PNIC_MII_RESERVED | 3427 PNIC_MII_READ | (phy << PNIC_MII_PHYSHIFT) | 3428 (reg << PNIC_MII_REGSHIFT)); 3429 3430 for (i = 0; i < 1000; i++) { 3431 delay(10); 3432 val = TULIP_READ(sc, CSR_PNIC_MII); 3433 if ((val & PNIC_MII_BUSY) == 0) { 3434 if ((val & PNIC_MII_DATA) == PNIC_MII_DATA) 3435 return (0); 3436 else 3437 return (val & PNIC_MII_DATA); 3438 } 3439 } 3440 printf("%s: MII read timed out\n", device_xname(sc->sc_dev)); 3441 return (0); 3442 } 3443 3444 /* 3445 * tlp_pnic_mii_writereg: 3446 * 3447 * Write a PHY register on the Lite-On PNIC. 3448 */ 3449 static void 3450 tlp_pnic_mii_writereg(device_t self, int phy, int reg, int val) 3451 { 3452 struct tulip_softc *sc = device_private(self); 3453 int i; 3454 3455 TULIP_WRITE(sc, CSR_PNIC_MII, 3456 PNIC_MII_MBO | PNIC_MII_RESERVED | 3457 PNIC_MII_WRITE | (phy << PNIC_MII_PHYSHIFT) | 3458 (reg << PNIC_MII_REGSHIFT) | val); 3459 3460 for (i = 0; i < 1000; i++) { 3461 delay(10); 3462 if (TULIP_ISSET(sc, CSR_PNIC_MII, PNIC_MII_BUSY) == 0) 3463 return; 3464 } 3465 printf("%s: MII write timed out\n", device_xname(sc->sc_dev)); 3466 } 3467 3468 static const bus_addr_t tlp_al981_phy_regmap[] = { 3469 CSR_ADM_BMCR, 3470 CSR_ADM_BMSR, 3471 CSR_ADM_PHYIDR1, 3472 CSR_ADM_PHYIDR2, 3473 CSR_ADM_ANAR, 3474 CSR_ADM_ANLPAR, 3475 CSR_ADM_ANER, 3476 3477 CSR_ADM_XMC, 3478 CSR_ADM_XCIIS, 3479 CSR_ADM_XIE, 3480 CSR_ADM_100CTR, 3481 }; 3482 static const int tlp_al981_phy_regmap_size = sizeof(tlp_al981_phy_regmap) / 3483 sizeof(tlp_al981_phy_regmap[0]); 3484 3485 /* 3486 * tlp_al981_mii_readreg: 3487 * 3488 * Read a PHY register on the ADMtek AL981. 3489 */ 3490 static int 3491 tlp_al981_mii_readreg(device_t self, int phy, int reg) 3492 { 3493 struct tulip_softc *sc = device_private(self); 3494 3495 /* AL981 only has an internal PHY. */ 3496 if (phy != 0) 3497 return (0); 3498 3499 if (reg >= tlp_al981_phy_regmap_size) 3500 return (0); 3501 3502 return (bus_space_read_4(sc->sc_st, sc->sc_sh, 3503 tlp_al981_phy_regmap[reg]) & 0xffff); 3504 } 3505 3506 /* 3507 * tlp_al981_mii_writereg: 3508 * 3509 * Write a PHY register on the ADMtek AL981. 3510 */ 3511 static void 3512 tlp_al981_mii_writereg(device_t self, int phy, int reg, int val) 3513 { 3514 struct tulip_softc *sc = device_private(self); 3515 3516 /* AL981 only has an internal PHY. */ 3517 if (phy != 0) 3518 return; 3519 3520 if (reg >= tlp_al981_phy_regmap_size) 3521 return; 3522 3523 bus_space_write_4(sc->sc_st, sc->sc_sh, 3524 tlp_al981_phy_regmap[reg], val); 3525 } 3526 3527 /***************************************************************************** 3528 * Chip-specific pre-init and reset functions. 3529 *****************************************************************************/ 3530 3531 /* 3532 * tlp_2114x_preinit: 3533 * 3534 * Pre-init function shared by DECchip 21140, 21140A, 21142, and 21143. 3535 */ 3536 static void 3537 tlp_2114x_preinit(struct tulip_softc *sc) 3538 { 3539 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3540 struct tulip_21x4x_media *tm = ife->ifm_aux; 3541 3542 /* 3543 * Whether or not we're in MII or SIA/SYM mode, the media info 3544 * contains the appropriate OPMODE bits. 3545 * 3546 * Also, we always set the Must-Be-One bit. 3547 */ 3548 sc->sc_opmode |= OPMODE_MBO | tm->tm_opmode; 3549 3550 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3551 } 3552 3553 /* 3554 * tlp_2114x_mii_preinit: 3555 * 3556 * Pre-init function shared by DECchip 21140, 21140A, 21142, and 21143. 3557 * This version is used by boards which only have MII and don't have 3558 * an ISV SROM. 3559 */ 3560 static void 3561 tlp_2114x_mii_preinit(struct tulip_softc *sc) 3562 { 3563 3564 /* 3565 * Always set the Must-Be-One bit, and Port Select (to select MII). 3566 * We'll never be called during a media change. 3567 */ 3568 sc->sc_opmode |= OPMODE_MBO|OPMODE_PS; 3569 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3570 } 3571 3572 /* 3573 * tlp_pnic_preinit: 3574 * 3575 * Pre-init function for the Lite-On 82c168 and 82c169. 3576 */ 3577 static void 3578 tlp_pnic_preinit(struct tulip_softc *sc) 3579 { 3580 3581 if (sc->sc_flags & TULIPF_HAS_MII) { 3582 /* 3583 * MII case: just set the port-select bit; we will never 3584 * be called during a media change. 3585 */ 3586 sc->sc_opmode |= OPMODE_PS; 3587 } else { 3588 /* 3589 * ENDEC/PCS/Nway mode; enable the Tx backoff counter. 3590 */ 3591 sc->sc_opmode |= OPMODE_PNIC_TBEN; 3592 } 3593 } 3594 3595 /* 3596 * tlp_asix_preinit: 3597 * 3598 * Pre-init function for the ASIX chipsets. 3599 */ 3600 static void 3601 tlp_asix_preinit(struct tulip_softc *sc) 3602 { 3603 3604 switch (sc->sc_chip) { 3605 case TULIP_CHIP_AX88140: 3606 case TULIP_CHIP_AX88141: 3607 /* XXX Handle PHY. */ 3608 sc->sc_opmode |= OPMODE_HBD|OPMODE_PS; 3609 break; 3610 default: 3611 /* Nothing */ 3612 break; 3613 } 3614 3615 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3616 } 3617 3618 /* 3619 * tlp_dm9102_preinit: 3620 * 3621 * Pre-init function for the Davicom DM9102. 3622 */ 3623 static void 3624 tlp_dm9102_preinit(struct tulip_softc *sc) 3625 { 3626 3627 switch (sc->sc_chip) { 3628 case TULIP_CHIP_DM9102: 3629 sc->sc_opmode |= OPMODE_MBO|OPMODE_HBD|OPMODE_PS; 3630 break; 3631 3632 case TULIP_CHIP_DM9102A: 3633 /* 3634 * XXX Figure out how to actually deal with the HomePNA 3635 * XXX portion of the DM9102A. 3636 */ 3637 sc->sc_opmode |= OPMODE_MBO|OPMODE_HBD; 3638 break; 3639 3640 default: 3641 /* Nothing. */ 3642 break; 3643 } 3644 3645 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 3646 } 3647 3648 /* 3649 * tlp_21140_reset: 3650 * 3651 * Issue a reset sequence on the 21140 via the GPIO facility. 3652 */ 3653 static void 3654 tlp_21140_reset(struct tulip_softc *sc) 3655 { 3656 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3657 struct tulip_21x4x_media *tm = ife->ifm_aux; 3658 int i; 3659 3660 /* First, set the direction on the GPIO pins. */ 3661 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 3662 3663 /* Now, issue the reset sequence. */ 3664 for (i = 0; i < tm->tm_reset_length; i++) { 3665 delay(10); 3666 TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_reset_offset + i]); 3667 } 3668 3669 /* Now, issue the selection sequence. */ 3670 for (i = 0; i < tm->tm_gp_length; i++) { 3671 delay(10); 3672 TULIP_WRITE(sc, CSR_GPP, sc->sc_srom[tm->tm_gp_offset + i]); 3673 } 3674 3675 /* If there were no sequences, just lower the pins. */ 3676 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 3677 delay(10); 3678 TULIP_WRITE(sc, CSR_GPP, 0); 3679 } 3680 } 3681 3682 /* 3683 * tlp_21142_reset: 3684 * 3685 * Issue a reset sequence on the 21142 via the GPIO facility. 3686 */ 3687 static void 3688 tlp_21142_reset(struct tulip_softc *sc) 3689 { 3690 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 3691 struct tulip_21x4x_media *tm = ife->ifm_aux; 3692 const uint8_t *cp; 3693 int i; 3694 3695 cp = &sc->sc_srom[tm->tm_reset_offset]; 3696 for (i = 0; i < tm->tm_reset_length; i++, cp += 2) { 3697 delay(10); 3698 TULIP_WRITE(sc, CSR_SIAGEN, TULIP_ROM_GETW(cp, 0) << 16); 3699 } 3700 3701 cp = &sc->sc_srom[tm->tm_gp_offset]; 3702 for (i = 0; i < tm->tm_gp_length; i++, cp += 2) { 3703 delay(10); 3704 TULIP_WRITE(sc, CSR_SIAGEN, TULIP_ROM_GETW(cp, 0) << 16); 3705 } 3706 3707 /* If there were no sequences, just lower the pins. */ 3708 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 3709 delay(10); 3710 TULIP_WRITE(sc, CSR_SIAGEN, 0); 3711 } 3712 } 3713 3714 /* 3715 * tlp_pmac_reset: 3716 * 3717 * Reset routine for Macronix chips. 3718 */ 3719 static void 3720 tlp_pmac_reset(struct tulip_softc *sc) 3721 { 3722 3723 switch (sc->sc_chip) { 3724 case TULIP_CHIP_82C115: 3725 case TULIP_CHIP_MX98715: 3726 case TULIP_CHIP_MX98715A: 3727 case TULIP_CHIP_MX98725: 3728 /* 3729 * Set the LED operating mode. This information is located 3730 * in the EEPROM at byte offset 0x77, per the MX98715A and 3731 * MX98725 application notes. 3732 */ 3733 TULIP_WRITE(sc, CSR_MIIROM, sc->sc_srom[0x77] << 24); 3734 break; 3735 case TULIP_CHIP_MX98715AEC_X: 3736 /* 3737 * Set the LED operating mode. This information is located 3738 * in the EEPROM at byte offset 0x76, per the MX98715AEC 3739 * application note. 3740 */ 3741 TULIP_WRITE(sc, CSR_MIIROM, ((0xf & sc->sc_srom[0x76]) << 28) 3742 | ((0xf0 & sc->sc_srom[0x76]) << 20)); 3743 break; 3744 3745 default: 3746 /* Nothing. */ 3747 break; 3748 } 3749 } 3750 3751 #if 0 3752 /* 3753 * tlp_dm9102_reset: 3754 * 3755 * Reset routine for the Davicom DM9102. 3756 */ 3757 static void 3758 tlp_dm9102_reset(struct tulip_softc *sc) 3759 { 3760 3761 TULIP_WRITE(sc, CSR_DM_PHYSTAT, DM_PHYSTAT_GEPC|DM_PHYSTAT_GPED); 3762 delay(100); 3763 TULIP_WRITE(sc, CSR_DM_PHYSTAT, 0); 3764 } 3765 #endif 3766 3767 /***************************************************************************** 3768 * Chip/board-specific media switches. The ones here are ones that 3769 * are potentially common to multiple front-ends. 3770 *****************************************************************************/ 3771 3772 /* 3773 * This table is a common place for all sorts of media information, 3774 * keyed off of the SROM media code for that media. 3775 * 3776 * Note that we explicitly configure the 21142/21143 to always advertise 3777 * NWay capabilities when using the UTP port. 3778 * XXX Actually, we don't yet. 3779 */ 3780 static const struct tulip_srom_to_ifmedia tulip_srom_to_ifmedia_table[] = { 3781 { TULIP_ROM_MB_MEDIA_TP, IFM_10_T, 0, 3782 "10baseT", 3783 OPMODE_TTM, 3784 BMSR_10THDX, 3785 { SIACONN_21040_10BASET, 3786 SIATXRX_21040_10BASET, 3787 SIAGEN_21040_10BASET }, 3788 3789 { SIACONN_21041_10BASET, 3790 SIATXRX_21041_10BASET, 3791 SIAGEN_21041_10BASET }, 3792 3793 { SIACONN_21142_10BASET, 3794 SIATXRX_21142_10BASET, 3795 SIAGEN_21142_10BASET } }, 3796 3797 { TULIP_ROM_MB_MEDIA_BNC, IFM_10_2, 0, 3798 "10base2", 3799 0, 3800 0, 3801 { 0, 3802 0, 3803 0 }, 3804 3805 { SIACONN_21041_BNC, 3806 SIATXRX_21041_BNC, 3807 SIAGEN_21041_BNC }, 3808 3809 { SIACONN_21142_BNC, 3810 SIATXRX_21142_BNC, 3811 SIAGEN_21142_BNC } }, 3812 3813 { TULIP_ROM_MB_MEDIA_AUI, IFM_10_5, 0, 3814 "10base5", 3815 0, 3816 0, 3817 { SIACONN_21040_AUI, 3818 SIATXRX_21040_AUI, 3819 SIAGEN_21040_AUI }, 3820 3821 { SIACONN_21041_AUI, 3822 SIATXRX_21041_AUI, 3823 SIAGEN_21041_AUI }, 3824 3825 { SIACONN_21142_AUI, 3826 SIATXRX_21142_AUI, 3827 SIAGEN_21142_AUI } }, 3828 3829 { TULIP_ROM_MB_MEDIA_100TX, IFM_100_TX, 0, 3830 "100baseTX", 3831 OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD, 3832 BMSR_100TXHDX, 3833 { 0, 3834 0, 3835 0 }, 3836 3837 { 0, 3838 0, 3839 0 }, 3840 3841 { 0, 3842 0, 3843 SIAGEN_ABM } }, 3844 3845 { TULIP_ROM_MB_MEDIA_TP_FDX, IFM_10_T, IFM_FDX, 3846 "10baseT-FDX", 3847 OPMODE_TTM|OPMODE_FD|OPMODE_HBD, 3848 BMSR_10TFDX, 3849 { SIACONN_21040_10BASET_FDX, 3850 SIATXRX_21040_10BASET_FDX, 3851 SIAGEN_21040_10BASET_FDX }, 3852 3853 { SIACONN_21041_10BASET_FDX, 3854 SIATXRX_21041_10BASET_FDX, 3855 SIAGEN_21041_10BASET_FDX }, 3856 3857 { SIACONN_21142_10BASET_FDX, 3858 SIATXRX_21142_10BASET_FDX, 3859 SIAGEN_21142_10BASET_FDX } }, 3860 3861 { TULIP_ROM_MB_MEDIA_100TX_FDX, IFM_100_TX, IFM_FDX, 3862 "100baseTX-FDX", 3863 OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_FD|OPMODE_HBD, 3864 BMSR_100TXFDX, 3865 { 0, 3866 0, 3867 0 }, 3868 3869 { 0, 3870 0, 3871 0 }, 3872 3873 { 0, 3874 0, 3875 SIAGEN_ABM } }, 3876 3877 { TULIP_ROM_MB_MEDIA_100T4, IFM_100_T4, 0, 3878 "100baseT4", 3879 OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD, 3880 BMSR_100T4, 3881 { 0, 3882 0, 3883 0 }, 3884 3885 { 0, 3886 0, 3887 0 }, 3888 3889 { 0, 3890 0, 3891 SIAGEN_ABM } }, 3892 3893 { TULIP_ROM_MB_MEDIA_100FX, IFM_100_FX, 0, 3894 "100baseFX", 3895 OPMODE_PS|OPMODE_PCS|OPMODE_HBD, 3896 0, 3897 { 0, 3898 0, 3899 0 }, 3900 3901 { 0, 3902 0, 3903 0 }, 3904 3905 { 0, 3906 0, 3907 SIAGEN_ABM } }, 3908 3909 { TULIP_ROM_MB_MEDIA_100FX_FDX, IFM_100_FX, IFM_FDX, 3910 "100baseFX-FDX", 3911 OPMODE_PS|OPMODE_PCS|OPMODE_FD|OPMODE_HBD, 3912 0, 3913 { 0, 3914 0, 3915 0 }, 3916 3917 { 0, 3918 0, 3919 0 }, 3920 3921 { 0, 3922 0, 3923 SIAGEN_ABM } }, 3924 3925 { 0, 0, 0, 3926 NULL, 3927 0, 3928 0, 3929 { 0, 3930 0, 3931 0 }, 3932 3933 { 0, 3934 0, 3935 0 }, 3936 3937 { 0, 3938 0, 3939 0 } }, 3940 }; 3941 3942 static const struct tulip_srom_to_ifmedia *tlp_srom_to_ifmedia(uint8_t); 3943 static void tlp_srom_media_info(struct tulip_softc *, 3944 const struct tulip_srom_to_ifmedia *, 3945 struct tulip_21x4x_media *); 3946 static void tlp_add_srom_media(struct tulip_softc *, int, 3947 void (*)(struct tulip_softc *, struct ifmediareq *), 3948 int (*)(struct tulip_softc *), const uint8_t *, int); 3949 static void tlp_print_media(struct tulip_softc *); 3950 static void tlp_nway_activate(struct tulip_softc *, int); 3951 static void tlp_get_minst(struct tulip_softc *); 3952 3953 static const struct tulip_srom_to_ifmedia * 3954 tlp_srom_to_ifmedia(uint8_t sm) 3955 { 3956 const struct tulip_srom_to_ifmedia *tsti; 3957 3958 for (tsti = tulip_srom_to_ifmedia_table; 3959 tsti->tsti_name != NULL; tsti++) { 3960 if (tsti->tsti_srom == sm) 3961 return (tsti); 3962 } 3963 3964 return (NULL); 3965 } 3966 3967 static void 3968 tlp_srom_media_info(struct tulip_softc *sc, 3969 const struct tulip_srom_to_ifmedia *tsti, struct tulip_21x4x_media *tm) 3970 { 3971 3972 tm->tm_name = tsti->tsti_name; 3973 tm->tm_opmode = tsti->tsti_opmode; 3974 3975 sc->sc_sia_cap |= tsti->tsti_sia_cap; 3976 3977 switch (sc->sc_chip) { 3978 case TULIP_CHIP_DE425: 3979 case TULIP_CHIP_21040: 3980 tm->tm_sia = tsti->tsti_21040; /* struct assignment */ 3981 break; 3982 3983 case TULIP_CHIP_21041: 3984 tm->tm_sia = tsti->tsti_21041; /* struct assignment */ 3985 break; 3986 3987 case TULIP_CHIP_21142: 3988 case TULIP_CHIP_21143: 3989 case TULIP_CHIP_82C115: 3990 case TULIP_CHIP_MX98715: 3991 case TULIP_CHIP_MX98715A: 3992 case TULIP_CHIP_MX98715AEC_X: 3993 case TULIP_CHIP_MX98725: 3994 tm->tm_sia = tsti->tsti_21142; /* struct assignment */ 3995 break; 3996 3997 default: 3998 /* Nothing. */ 3999 break; 4000 } 4001 } 4002 4003 static void 4004 tlp_add_srom_media(struct tulip_softc *sc, int type, 4005 void (*get)(struct tulip_softc *, struct ifmediareq *), 4006 int (*set)(struct tulip_softc *), const uint8_t *list, 4007 int cnt) 4008 { 4009 struct tulip_21x4x_media *tm; 4010 const struct tulip_srom_to_ifmedia *tsti; 4011 int i; 4012 4013 for (i = 0; i < cnt; i++) { 4014 tsti = tlp_srom_to_ifmedia(list[i]); 4015 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4016 tlp_srom_media_info(sc, tsti, tm); 4017 tm->tm_type = type; 4018 tm->tm_get = get; 4019 tm->tm_set = set; 4020 4021 ifmedia_add(&sc->sc_mii.mii_media, 4022 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4023 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4024 } 4025 } 4026 4027 static void 4028 tlp_print_media(struct tulip_softc *sc) 4029 { 4030 struct ifmedia_entry *ife; 4031 struct tulip_21x4x_media *tm; 4032 const char *sep = ""; 4033 4034 #define PRINT(str) aprint_normal("%s%s", sep, str); sep = ", " 4035 4036 aprint_normal_dev(sc->sc_dev, ""); 4037 TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, ifm_list) { 4038 tm = ife->ifm_aux; 4039 if (tm == NULL) { 4040 #ifdef DIAGNOSTIC 4041 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 4042 panic("tlp_print_media"); 4043 #endif 4044 PRINT("auto"); 4045 } else if (tm->tm_type != TULIP_ROM_MB_21140_MII && 4046 tm->tm_type != TULIP_ROM_MB_21142_MII) { 4047 PRINT(tm->tm_name); 4048 } 4049 } 4050 aprint_normal("\n"); 4051 4052 #undef PRINT 4053 } 4054 4055 static void 4056 tlp_nway_activate(struct tulip_softc *sc, int media) 4057 { 4058 struct ifmedia_entry *ife; 4059 4060 ife = ifmedia_match(&sc->sc_mii.mii_media, media, 0); 4061 #ifdef DIAGNOSTIC 4062 if (ife == NULL) 4063 panic("tlp_nway_activate"); 4064 #endif 4065 sc->sc_nway_active = ife; 4066 } 4067 4068 static void 4069 tlp_get_minst(struct tulip_softc *sc) 4070 { 4071 4072 if ((sc->sc_media_seen & 4073 ~((1 << TULIP_ROM_MB_21140_MII) | 4074 (1 << TULIP_ROM_MB_21142_MII))) == 0) { 4075 /* 4076 * We have not yet seen any SIA/SYM media (but are 4077 * about to; that's why we're called!), so assign 4078 * the current media instance to be the `internal media' 4079 * instance, and advance it so any MII media gets a 4080 * fresh one (used to selecting/isolating a PHY). 4081 */ 4082 sc->sc_tlp_minst = sc->sc_mii.mii_instance++; 4083 } 4084 } 4085 4086 /* 4087 * SIA Utility functions. 4088 */ 4089 static void tlp_sia_update_link(struct tulip_softc *); 4090 static void tlp_sia_get(struct tulip_softc *, struct ifmediareq *); 4091 static int tlp_sia_set(struct tulip_softc *); 4092 static int tlp_sia_media(struct tulip_softc *, struct ifmedia_entry *); 4093 static void tlp_sia_fixup(struct tulip_softc *); 4094 4095 static void 4096 tlp_sia_update_link(struct tulip_softc *sc) 4097 { 4098 struct ifmedia_entry *ife; 4099 struct tulip_21x4x_media *tm; 4100 uint32_t siastat; 4101 4102 ife = TULIP_CURRENT_MEDIA(sc); 4103 tm = ife->ifm_aux; 4104 4105 sc->sc_flags &= ~(TULIPF_LINK_UP|TULIPF_LINK_VALID); 4106 4107 siastat = TULIP_READ(sc, CSR_SIASTAT); 4108 4109 /* 4110 * Note that when we do SIA link tests, we are assuming that 4111 * the chip is really in the mode that the current media setting 4112 * reflects. If we're not, then the link tests will not be 4113 * accurate! 4114 */ 4115 switch (IFM_SUBTYPE(ife->ifm_media)) { 4116 case IFM_10_T: 4117 sc->sc_flags |= TULIPF_LINK_VALID; 4118 if ((siastat & SIASTAT_LS10) == 0) 4119 sc->sc_flags |= TULIPF_LINK_UP; 4120 break; 4121 4122 case IFM_100_TX: 4123 case IFM_100_T4: 4124 sc->sc_flags |= TULIPF_LINK_VALID; 4125 if ((siastat & SIASTAT_LS100) == 0) 4126 sc->sc_flags |= TULIPF_LINK_UP; 4127 break; 4128 } 4129 4130 switch (sc->sc_chip) { 4131 case TULIP_CHIP_21142: 4132 case TULIP_CHIP_21143: 4133 /* 4134 * On these chips, we can tell more information about 4135 * AUI/BNC. Note that the AUI/BNC selection is made 4136 * in a different register; for our purpose, it's all 4137 * AUI. 4138 */ 4139 switch (IFM_SUBTYPE(ife->ifm_media)) { 4140 case IFM_10_2: 4141 case IFM_10_5: 4142 sc->sc_flags |= TULIPF_LINK_VALID; 4143 if (siastat & SIASTAT_ARA) { 4144 TULIP_WRITE(sc, CSR_SIASTAT, SIASTAT_ARA); 4145 sc->sc_flags |= TULIPF_LINK_UP; 4146 } 4147 break; 4148 4149 default: 4150 /* 4151 * If we're SYM media and can detect the link 4152 * via the GPIO facility, prefer that status 4153 * over LS100. 4154 */ 4155 if (tm->tm_type == TULIP_ROM_MB_21143_SYM && 4156 tm->tm_actmask != 0) { 4157 sc->sc_flags = (sc->sc_flags & 4158 ~TULIPF_LINK_UP) | TULIPF_LINK_VALID; 4159 if (TULIP_ISSET(sc, CSR_SIAGEN, 4160 tm->tm_actmask) == tm->tm_actdata) 4161 sc->sc_flags |= TULIPF_LINK_UP; 4162 } 4163 } 4164 break; 4165 4166 default: 4167 /* Nothing. */ 4168 break; 4169 } 4170 } 4171 4172 static void 4173 tlp_sia_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 4174 { 4175 struct ifmedia_entry *ife; 4176 4177 ifmr->ifm_status = 0; 4178 4179 tlp_sia_update_link(sc); 4180 4181 ife = TULIP_CURRENT_MEDIA(sc); 4182 4183 if (sc->sc_flags & TULIPF_LINK_VALID) 4184 ifmr->ifm_status |= IFM_AVALID; 4185 if (sc->sc_flags & TULIPF_LINK_UP) 4186 ifmr->ifm_status |= IFM_ACTIVE; 4187 ifmr->ifm_active = ife->ifm_media; 4188 } 4189 4190 static void 4191 tlp_sia_fixup(struct tulip_softc *sc) 4192 { 4193 struct ifmedia_entry *ife; 4194 struct tulip_21x4x_media *tm; 4195 uint32_t siaconn, siatxrx, siagen; 4196 4197 switch (sc->sc_chip) { 4198 case TULIP_CHIP_82C115: 4199 case TULIP_CHIP_MX98713A: 4200 case TULIP_CHIP_MX98715: 4201 case TULIP_CHIP_MX98715A: 4202 case TULIP_CHIP_MX98715AEC_X: 4203 case TULIP_CHIP_MX98725: 4204 siaconn = PMAC_SIACONN_MASK; 4205 siatxrx = PMAC_SIATXRX_MASK; 4206 siagen = PMAC_SIAGEN_MASK; 4207 break; 4208 4209 default: 4210 /* No fixups required on any other chips. */ 4211 return; 4212 } 4213 4214 TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, ifm_list) { 4215 tm = ife->ifm_aux; 4216 if (tm == NULL) 4217 continue; 4218 4219 tm->tm_siaconn &= siaconn; 4220 tm->tm_siatxrx &= siatxrx; 4221 tm->tm_siagen &= siagen; 4222 } 4223 } 4224 4225 static int 4226 tlp_sia_set(struct tulip_softc *sc) 4227 { 4228 4229 return (tlp_sia_media(sc, TULIP_CURRENT_MEDIA(sc))); 4230 } 4231 4232 static int 4233 tlp_sia_media(struct tulip_softc *sc, struct ifmedia_entry *ife) 4234 { 4235 struct tulip_21x4x_media *tm; 4236 4237 tm = ife->ifm_aux; 4238 4239 /* 4240 * XXX This appears to be necessary on a bunch of the clone chips. 4241 */ 4242 delay(20000); 4243 4244 /* 4245 * Idle the chip. 4246 */ 4247 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4248 4249 /* 4250 * Program the SIA. It's important to write in this order, 4251 * resetting the SIA first. 4252 */ 4253 TULIP_WRITE(sc, CSR_SIACONN, 0); /* SRL bit clear */ 4254 delay(1000); 4255 4256 TULIP_WRITE(sc, CSR_SIATXRX, tm->tm_siatxrx); 4257 4258 switch (sc->sc_chip) { 4259 case TULIP_CHIP_21142: 4260 case TULIP_CHIP_21143: 4261 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpctl); 4262 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpdata); 4263 break; 4264 default: 4265 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen); 4266 } 4267 4268 TULIP_WRITE(sc, CSR_SIACONN, tm->tm_siaconn); 4269 4270 /* 4271 * Set the OPMODE bits for this media and write OPMODE. 4272 * This will resume the transmit and receive processes. 4273 */ 4274 sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode; 4275 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4276 4277 return (0); 4278 } 4279 4280 /* 4281 * 21140 GPIO utility functions. 4282 */ 4283 static void tlp_21140_gpio_update_link(struct tulip_softc *); 4284 4285 static void 4286 tlp_21140_gpio_update_link(struct tulip_softc *sc) 4287 { 4288 struct ifmedia_entry *ife; 4289 struct tulip_21x4x_media *tm; 4290 4291 ife = TULIP_CURRENT_MEDIA(sc); 4292 tm = ife->ifm_aux; 4293 4294 sc->sc_flags &= ~(TULIPF_LINK_UP|TULIPF_LINK_VALID); 4295 4296 if (tm->tm_actmask != 0) { 4297 sc->sc_flags |= TULIPF_LINK_VALID; 4298 if (TULIP_ISSET(sc, CSR_GPP, tm->tm_actmask) == 4299 tm->tm_actdata) 4300 sc->sc_flags |= TULIPF_LINK_UP; 4301 } 4302 } 4303 4304 void 4305 tlp_21140_gpio_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 4306 { 4307 struct ifmedia_entry *ife; 4308 4309 ifmr->ifm_status = 0; 4310 4311 tlp_21140_gpio_update_link(sc); 4312 4313 ife = TULIP_CURRENT_MEDIA(sc); 4314 4315 if (sc->sc_flags & TULIPF_LINK_VALID) 4316 ifmr->ifm_status |= IFM_AVALID; 4317 if (sc->sc_flags & TULIPF_LINK_UP) 4318 ifmr->ifm_status |= IFM_ACTIVE; 4319 ifmr->ifm_active = ife->ifm_media; 4320 } 4321 4322 int 4323 tlp_21140_gpio_set(struct tulip_softc *sc) 4324 { 4325 struct ifmedia_entry *ife; 4326 struct tulip_21x4x_media *tm; 4327 4328 ife = TULIP_CURRENT_MEDIA(sc); 4329 tm = ife->ifm_aux; 4330 4331 /* 4332 * Idle the chip. 4333 */ 4334 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4335 4336 /* 4337 * Set the GPIO pins for this media, to flip any 4338 * relays, etc. 4339 */ 4340 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 4341 delay(10); 4342 TULIP_WRITE(sc, CSR_GPP, tm->tm_gpdata); 4343 4344 /* 4345 * Set the OPMODE bits for this media and write OPMODE. 4346 * This will resume the transmit and receive processes. 4347 */ 4348 sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode; 4349 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4350 4351 return (0); 4352 } 4353 4354 /* 4355 * 21040 and 21041 media switches. 4356 */ 4357 static void tlp_21040_tmsw_init(struct tulip_softc *); 4358 static void tlp_21040_tp_tmsw_init(struct tulip_softc *); 4359 static void tlp_21040_auibnc_tmsw_init(struct tulip_softc *); 4360 static void tlp_21041_tmsw_init(struct tulip_softc *); 4361 4362 const struct tulip_mediasw tlp_21040_mediasw = { 4363 tlp_21040_tmsw_init, tlp_sia_get, tlp_sia_set 4364 }; 4365 4366 const struct tulip_mediasw tlp_21040_tp_mediasw = { 4367 tlp_21040_tp_tmsw_init, tlp_sia_get, tlp_sia_set 4368 }; 4369 4370 const struct tulip_mediasw tlp_21040_auibnc_mediasw = { 4371 tlp_21040_auibnc_tmsw_init, tlp_sia_get, tlp_sia_set 4372 }; 4373 4374 const struct tulip_mediasw tlp_21041_mediasw = { 4375 tlp_21041_tmsw_init, tlp_sia_get, tlp_sia_set 4376 }; 4377 4378 static void 4379 tlp_21040_tmsw_init(struct tulip_softc *sc) 4380 { 4381 static const uint8_t media[] = { 4382 TULIP_ROM_MB_MEDIA_TP, 4383 TULIP_ROM_MB_MEDIA_TP_FDX, 4384 TULIP_ROM_MB_MEDIA_AUI, 4385 }; 4386 struct tulip_21x4x_media *tm; 4387 4388 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4389 tlp_mediastatus); 4390 4391 tlp_add_srom_media(sc, 0, NULL, NULL, media, 3); 4392 4393 /* 4394 * No SROM type for External SIA. 4395 */ 4396 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4397 tm->tm_name = "manual"; 4398 tm->tm_opmode = 0; 4399 tm->tm_siaconn = SIACONN_21040_EXTSIA; 4400 tm->tm_siatxrx = SIATXRX_21040_EXTSIA; 4401 tm->tm_siagen = SIAGEN_21040_EXTSIA; 4402 ifmedia_add(&sc->sc_mii.mii_media, 4403 IFM_MAKEWORD(IFM_ETHER, IFM_MANUAL, 0, sc->sc_tlp_minst), 0, tm); 4404 4405 /* 4406 * XXX Autosense not yet supported. 4407 */ 4408 4409 /* XXX This should be auto-sense. */ 4410 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4411 4412 tlp_print_media(sc); 4413 } 4414 4415 static void 4416 tlp_21040_tp_tmsw_init(struct tulip_softc *sc) 4417 { 4418 static const uint8_t media[] = { 4419 TULIP_ROM_MB_MEDIA_TP, 4420 TULIP_ROM_MB_MEDIA_TP_FDX, 4421 }; 4422 4423 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4424 tlp_mediastatus); 4425 4426 tlp_add_srom_media(sc, 0, NULL, NULL, media, 2); 4427 4428 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4429 4430 tlp_print_media(sc); 4431 } 4432 4433 static void 4434 tlp_21040_auibnc_tmsw_init(struct tulip_softc *sc) 4435 { 4436 static const uint8_t media[] = { 4437 TULIP_ROM_MB_MEDIA_AUI, 4438 }; 4439 4440 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4441 tlp_mediastatus); 4442 4443 tlp_add_srom_media(sc, 0, NULL, NULL, media, 1); 4444 4445 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_5); 4446 4447 tlp_print_media(sc); 4448 } 4449 4450 static void 4451 tlp_21041_tmsw_init(struct tulip_softc *sc) 4452 { 4453 static const uint8_t media[] = { 4454 TULIP_ROM_MB_MEDIA_TP, 4455 TULIP_ROM_MB_MEDIA_TP_FDX, 4456 TULIP_ROM_MB_MEDIA_BNC, 4457 TULIP_ROM_MB_MEDIA_AUI, 4458 }; 4459 int i, defmedia, devcnt, leaf_offset, mb_offset, m_cnt; 4460 const struct tulip_srom_to_ifmedia *tsti; 4461 struct tulip_21x4x_media *tm; 4462 uint16_t romdef; 4463 uint8_t mb; 4464 4465 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4466 tlp_mediastatus); 4467 4468 if (tlp_isv_srom(sc->sc_srom) == 0) { 4469 not_isv_srom: 4470 /* 4471 * If we have a board without the standard 21041 SROM format, 4472 * we just assume all media are present and try and pick a 4473 * reasonable default. 4474 */ 4475 tlp_add_srom_media(sc, 0, NULL, NULL, media, 4); 4476 4477 /* 4478 * XXX Autosense not yet supported. 4479 */ 4480 4481 /* XXX This should be auto-sense. */ 4482 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4483 4484 tlp_print_media(sc); 4485 return; 4486 } 4487 4488 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 4489 for (i = 0; i < devcnt; i++) { 4490 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 4491 break; 4492 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 4493 sc->sc_devno) 4494 break; 4495 } 4496 4497 if (i == devcnt) 4498 goto not_isv_srom; 4499 4500 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 4501 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 4502 mb_offset = leaf_offset + TULIP_ROM_IL_MEDIAn_BLOCK_BASE; 4503 m_cnt = sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 4504 4505 for (; m_cnt != 0; 4506 m_cnt--, mb_offset += TULIP_ROM_MB_SIZE(mb)) { 4507 mb = sc->sc_srom[mb_offset]; 4508 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4509 switch (mb & TULIP_ROM_MB_MEDIA_CODE) { 4510 case TULIP_ROM_MB_MEDIA_TP_FDX: 4511 case TULIP_ROM_MB_MEDIA_TP: 4512 case TULIP_ROM_MB_MEDIA_BNC: 4513 case TULIP_ROM_MB_MEDIA_AUI: 4514 tsti = tlp_srom_to_ifmedia(mb & 4515 TULIP_ROM_MB_MEDIA_CODE); 4516 4517 tlp_srom_media_info(sc, tsti, tm); 4518 4519 /* 4520 * Override our default SIA settings if the 4521 * SROM contains its own. 4522 */ 4523 if (mb & TULIP_ROM_MB_EXT) { 4524 tm->tm_siaconn = TULIP_ROM_GETW(sc->sc_srom, 4525 mb_offset + TULIP_ROM_MB_CSR13); 4526 tm->tm_siatxrx = TULIP_ROM_GETW(sc->sc_srom, 4527 mb_offset + TULIP_ROM_MB_CSR14); 4528 tm->tm_siagen = TULIP_ROM_GETW(sc->sc_srom, 4529 mb_offset + TULIP_ROM_MB_CSR15); 4530 } 4531 4532 ifmedia_add(&sc->sc_mii.mii_media, 4533 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4534 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4535 break; 4536 4537 default: 4538 aprint_error_dev(sc->sc_dev, 4539 "unknown media code 0x%02x\n", 4540 mb & TULIP_ROM_MB_MEDIA_CODE); 4541 free(tm, M_DEVBUF); 4542 } 4543 } 4544 4545 /* 4546 * XXX Autosense not yet supported. 4547 */ 4548 4549 romdef = TULIP_ROM_GETW(sc->sc_srom, leaf_offset + 4550 TULIP_ROM_IL_SELECT_CONN_TYPE); 4551 switch (romdef) { 4552 case SELECT_CONN_TYPE_TP: 4553 case SELECT_CONN_TYPE_TP_AUTONEG: 4554 case SELECT_CONN_TYPE_TP_NOLINKPASS: 4555 defmedia = IFM_ETHER|IFM_10_T; 4556 break; 4557 4558 case SELECT_CONN_TYPE_TP_FDX: 4559 defmedia = IFM_ETHER|IFM_10_T|IFM_FDX; 4560 break; 4561 4562 case SELECT_CONN_TYPE_BNC: 4563 defmedia = IFM_ETHER|IFM_10_2; 4564 break; 4565 4566 case SELECT_CONN_TYPE_AUI: 4567 defmedia = IFM_ETHER|IFM_10_5; 4568 break; 4569 #if 0 /* XXX */ 4570 case SELECT_CONN_TYPE_ASENSE: 4571 case SELECT_CONN_TYPE_ASENSE_AUTONEG: 4572 defmedia = IFM_ETHER|IFM_AUTO; 4573 break; 4574 #endif 4575 default: 4576 defmedia = 0; 4577 } 4578 4579 if (defmedia == 0) { 4580 /* 4581 * XXX We should default to auto-sense. 4582 */ 4583 defmedia = IFM_ETHER|IFM_10_T; 4584 } 4585 4586 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 4587 4588 tlp_print_media(sc); 4589 } 4590 4591 /* 4592 * DECchip 2114x ISV media switch. 4593 */ 4594 static void tlp_2114x_isv_tmsw_init(struct tulip_softc *); 4595 static void tlp_2114x_isv_tmsw_get(struct tulip_softc *, 4596 struct ifmediareq *); 4597 static int tlp_2114x_isv_tmsw_set(struct tulip_softc *); 4598 4599 const struct tulip_mediasw tlp_2114x_isv_mediasw = { 4600 tlp_2114x_isv_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set 4601 }; 4602 4603 static void tlp_2114x_nway_get(struct tulip_softc *, struct ifmediareq *); 4604 static int tlp_2114x_nway_set(struct tulip_softc *); 4605 4606 static void tlp_2114x_nway_statchg(device_t); 4607 static int tlp_2114x_nway_service(struct tulip_softc *, int); 4608 static void tlp_2114x_nway_auto(struct tulip_softc *); 4609 static void tlp_2114x_nway_status(struct tulip_softc *); 4610 4611 static void 4612 tlp_2114x_isv_tmsw_init(struct tulip_softc *sc) 4613 { 4614 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4615 struct ifmedia_entry *ife; 4616 struct mii_softc *phy; 4617 struct tulip_21x4x_media *tm; 4618 const struct tulip_srom_to_ifmedia *tsti; 4619 int i, devcnt, leaf_offset, m_cnt, type, length; 4620 int defmedia, miidef; 4621 uint16_t word; 4622 uint8_t *cp, *ncp; 4623 4624 defmedia = miidef = 0; 4625 4626 sc->sc_mii.mii_ifp = ifp; 4627 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 4628 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 4629 sc->sc_mii.mii_statchg = sc->sc_statchg; 4630 4631 /* 4632 * Ignore `instance'; we may get a mixture of SIA and MII 4633 * media, and `instance' is used to isolate or select the 4634 * PHY on the MII as appropriate. Note that duplicate media 4635 * are disallowed, so ignoring `instance' is safe. 4636 */ 4637 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, tlp_mediachange, 4638 tlp_mediastatus); 4639 4640 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 4641 for (i = 0; i < devcnt; i++) { 4642 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 4643 break; 4644 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 4645 sc->sc_devno) 4646 break; 4647 } 4648 4649 if (i == devcnt) { 4650 aprint_error_dev(sc->sc_dev, "unable to locate info leaf in SROM\n"); 4651 return; 4652 } 4653 4654 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 4655 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 4656 4657 /* XXX SELECT CONN TYPE */ 4658 4659 cp = &sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 4660 4661 /* 4662 * On some chips, the first thing in the Info Leaf is the 4663 * GPIO pin direction data. 4664 */ 4665 switch (sc->sc_chip) { 4666 case TULIP_CHIP_21140: 4667 case TULIP_CHIP_21140A: 4668 case TULIP_CHIP_MX98713: 4669 case TULIP_CHIP_AX88140: 4670 case TULIP_CHIP_AX88141: 4671 sc->sc_gp_dir = *cp++; 4672 break; 4673 4674 default: 4675 /* Nothing. */ 4676 break; 4677 } 4678 4679 /* Get the media count. */ 4680 m_cnt = *cp++; 4681 4682 if (m_cnt == 0) { 4683 sc->sc_mediasw = &tlp_sio_mii_mediasw; 4684 (*sc->sc_mediasw->tmsw_init)(sc); 4685 return; 4686 } 4687 4688 for (; m_cnt != 0; cp = ncp, m_cnt--) { 4689 /* 4690 * Determine the type and length of this media block. 4691 * The 21143 is spec'd to always use extended format blocks, 4692 * but some cards don't set the bit to indicate this. 4693 * Hopefully there are no cards which really don't use 4694 * extended format blocks. 4695 */ 4696 if ((*cp & 0x80) == 0 && sc->sc_chip != TULIP_CHIP_21143) { 4697 length = 4; 4698 type = TULIP_ROM_MB_21140_GPR; 4699 } else { 4700 length = (*cp++ & 0x7f) - 1; 4701 type = *cp++ & 0x3f; 4702 } 4703 4704 /* Compute the start of the next block. */ 4705 ncp = cp + length; 4706 4707 /* Now, parse the block. */ 4708 switch (type) { 4709 case TULIP_ROM_MB_21140_GPR: 4710 tlp_get_minst(sc); 4711 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_GPR; 4712 4713 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4714 4715 tm->tm_type = TULIP_ROM_MB_21140_GPR; 4716 tm->tm_get = tlp_21140_gpio_get; 4717 tm->tm_set = tlp_21140_gpio_set; 4718 4719 /* First is the media type code. */ 4720 tsti = tlp_srom_to_ifmedia(cp[0] & 4721 TULIP_ROM_MB_MEDIA_CODE); 4722 if (tsti == NULL) { 4723 /* Invalid media code. */ 4724 free(tm, M_DEVBUF); 4725 break; 4726 } 4727 4728 /* Get defaults. */ 4729 tlp_srom_media_info(sc, tsti, tm); 4730 4731 /* Next is any GPIO info for this media. */ 4732 tm->tm_gpdata = cp[1]; 4733 4734 /* 4735 * Next is a word containing OPMODE information 4736 * and info on how to detect if this media is 4737 * active. 4738 */ 4739 word = TULIP_ROM_GETW(cp, 2); 4740 tm->tm_opmode &= OPMODE_FD; 4741 tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word); 4742 if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) { 4743 tm->tm_actmask = 4744 TULIP_ROM_MB_BITPOS(word); 4745 tm->tm_actdata = 4746 (word & TULIP_ROM_MB_POLARITY) ? 4747 0 : tm->tm_actmask; 4748 } 4749 4750 ifmedia_add(&sc->sc_mii.mii_media, 4751 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4752 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4753 break; 4754 4755 case TULIP_ROM_MB_21140_MII: 4756 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_MII; 4757 4758 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4759 4760 tm->tm_type = TULIP_ROM_MB_21140_MII; 4761 tm->tm_get = tlp_mii_getmedia; 4762 tm->tm_set = tlp_mii_setmedia; 4763 tm->tm_opmode = OPMODE_PS; 4764 4765 if (sc->sc_reset == NULL) 4766 sc->sc_reset = tlp_21140_reset; 4767 4768 /* First is the PHY number. */ 4769 tm->tm_phyno = *cp++; 4770 4771 /* Next is the MII select sequence length and offset. */ 4772 tm->tm_gp_length = *cp++; 4773 tm->tm_gp_offset = cp - &sc->sc_srom[0]; 4774 cp += tm->tm_gp_length; 4775 4776 /* Next is the MII reset sequence length and offset. */ 4777 tm->tm_reset_length = *cp++; 4778 tm->tm_reset_offset = cp - &sc->sc_srom[0]; 4779 cp += tm->tm_reset_length; 4780 4781 /* 4782 * The following items are left in the media block 4783 * that we don't particularly care about: 4784 * 4785 * capabilities W 4786 * advertisement W 4787 * full duplex W 4788 * tx threshold W 4789 * 4790 * These appear to be bits in the PHY registers, 4791 * which our MII code handles on its own. 4792 */ 4793 4794 /* 4795 * Before we probe the MII bus, we need to reset 4796 * it and issue the selection sequence. 4797 */ 4798 4799 /* Set the direction of the pins... */ 4800 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 4801 4802 for (i = 0; i < tm->tm_reset_length; i++) { 4803 delay(10); 4804 TULIP_WRITE(sc, CSR_GPP, 4805 sc->sc_srom[tm->tm_reset_offset + i]); 4806 } 4807 4808 for (i = 0; i < tm->tm_gp_length; i++) { 4809 delay(10); 4810 TULIP_WRITE(sc, CSR_GPP, 4811 sc->sc_srom[tm->tm_gp_offset + i]); 4812 } 4813 4814 /* If there were no sequences, just lower the pins. */ 4815 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 4816 delay(10); 4817 TULIP_WRITE(sc, CSR_GPP, 0); 4818 } 4819 4820 /* 4821 * Now, probe the MII for the PHY. Note, we know 4822 * the location of the PHY on the bus, but we don't 4823 * particularly care; the MII code just likes to 4824 * search the whole thing anyhow. 4825 */ 4826 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 4827 MII_PHY_ANY, tm->tm_phyno, 0); 4828 4829 /* 4830 * Now, search for the PHY we hopefully just 4831 * configured. If it's not configured into the 4832 * kernel, we lose. The PHY's default media always 4833 * takes priority. 4834 */ 4835 LIST_FOREACH(phy, &sc->sc_mii.mii_phys, mii_list) { 4836 if (phy->mii_offset == tm->tm_phyno) 4837 break; 4838 } 4839 if (phy == NULL) { 4840 aprint_error_dev(sc->sc_dev, "unable to configure MII\n"); 4841 break; 4842 } 4843 4844 sc->sc_flags |= TULIPF_HAS_MII; 4845 sc->sc_tick = tlp_mii_tick; 4846 miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 4847 phy->mii_inst); 4848 4849 /* 4850 * Okay, now that we've found the PHY and the MII 4851 * layer has added all of the media associated 4852 * with that PHY, we need to traverse the media 4853 * list, and add our `tm' to each entry's `aux' 4854 * pointer. 4855 * 4856 * We do this by looking for media with our 4857 * PHY's `instance'. 4858 */ 4859 TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, 4860 ifm_list) { 4861 if (IFM_INST(ife->ifm_media) != phy->mii_inst) 4862 continue; 4863 ife->ifm_aux = tm; 4864 } 4865 break; 4866 4867 case TULIP_ROM_MB_21142_SIA: 4868 tlp_get_minst(sc); 4869 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_SIA; 4870 4871 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4872 4873 tm->tm_type = TULIP_ROM_MB_21142_SIA; 4874 tm->tm_get = tlp_sia_get; 4875 tm->tm_set = tlp_sia_set; 4876 4877 /* First is the media type code. */ 4878 tsti = tlp_srom_to_ifmedia(cp[0] & 4879 TULIP_ROM_MB_MEDIA_CODE); 4880 if (tsti == NULL) { 4881 /* Invalid media code. */ 4882 free(tm, M_DEVBUF); 4883 break; 4884 } 4885 4886 /* Get defaults. */ 4887 tlp_srom_media_info(sc, tsti, tm); 4888 4889 /* 4890 * Override our default SIA settings if the 4891 * SROM contains its own. 4892 */ 4893 if (cp[0] & 0x40) { 4894 tm->tm_siaconn = TULIP_ROM_GETW(cp, 1); 4895 tm->tm_siatxrx = TULIP_ROM_GETW(cp, 3); 4896 tm->tm_siagen = TULIP_ROM_GETW(cp, 5); 4897 cp += 7; 4898 } else 4899 cp++; 4900 4901 /* Next is GPIO control/data. */ 4902 tm->tm_gpctl = TULIP_ROM_GETW(cp, 0) << 16; 4903 tm->tm_gpdata = TULIP_ROM_GETW(cp, 2) << 16; 4904 4905 ifmedia_add(&sc->sc_mii.mii_media, 4906 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4907 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4908 break; 4909 4910 case TULIP_ROM_MB_21142_MII: 4911 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_MII; 4912 4913 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4914 4915 tm->tm_type = TULIP_ROM_MB_21142_MII; 4916 tm->tm_get = tlp_mii_getmedia; 4917 tm->tm_set = tlp_mii_setmedia; 4918 tm->tm_opmode = OPMODE_PS; 4919 4920 if (sc->sc_reset == NULL) 4921 sc->sc_reset = tlp_21142_reset; 4922 4923 /* First is the PHY number. */ 4924 tm->tm_phyno = *cp++; 4925 4926 /* Next is the MII select sequence length and offset. */ 4927 tm->tm_gp_length = *cp++; 4928 tm->tm_gp_offset = cp - &sc->sc_srom[0]; 4929 cp += tm->tm_gp_length * 2; 4930 4931 /* Next is the MII reset sequence length and offset. */ 4932 tm->tm_reset_length = *cp++; 4933 tm->tm_reset_offset = cp - &sc->sc_srom[0]; 4934 cp += tm->tm_reset_length * 2; 4935 4936 /* 4937 * The following items are left in the media block 4938 * that we don't particularly care about: 4939 * 4940 * capabilities W 4941 * advertisement W 4942 * full duplex W 4943 * tx threshold W 4944 * MII interrupt W 4945 * 4946 * These appear to be bits in the PHY registers, 4947 * which our MII code handles on its own. 4948 */ 4949 4950 /* 4951 * Before we probe the MII bus, we need to reset 4952 * it and issue the selection sequence. 4953 */ 4954 4955 cp = &sc->sc_srom[tm->tm_reset_offset]; 4956 for (i = 0; i < tm->tm_reset_length; i++, cp += 2) { 4957 delay(10); 4958 TULIP_WRITE(sc, CSR_SIAGEN, 4959 TULIP_ROM_GETW(cp, 0) << 16); 4960 } 4961 4962 cp = &sc->sc_srom[tm->tm_gp_offset]; 4963 for (i = 0; i < tm->tm_gp_length; i++, cp += 2) { 4964 delay(10); 4965 TULIP_WRITE(sc, CSR_SIAGEN, 4966 TULIP_ROM_GETW(cp, 0) << 16); 4967 } 4968 4969 /* If there were no sequences, just lower the pins. */ 4970 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 4971 delay(10); 4972 TULIP_WRITE(sc, CSR_SIAGEN, 0); 4973 } 4974 4975 /* 4976 * Now, probe the MII for the PHY. Note, we know 4977 * the location of the PHY on the bus, but we don't 4978 * particularly care; the MII code just likes to 4979 * search the whole thing anyhow. 4980 */ 4981 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 4982 MII_PHY_ANY, tm->tm_phyno, 0); 4983 4984 /* 4985 * Now, search for the PHY we hopefully just 4986 * configured. If it's not configured into the 4987 * kernel, we lose. The PHY's default media always 4988 * takes priority. 4989 */ 4990 LIST_FOREACH(phy, &sc->sc_mii.mii_phys, mii_list) { 4991 if (phy->mii_offset == tm->tm_phyno) 4992 break; 4993 } 4994 if (phy == NULL) { 4995 aprint_error_dev(sc->sc_dev, "unable to configure MII\n"); 4996 break; 4997 } 4998 4999 sc->sc_flags |= TULIPF_HAS_MII; 5000 sc->sc_tick = tlp_mii_tick; 5001 miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 5002 phy->mii_inst); 5003 5004 /* 5005 * Okay, now that we've found the PHY and the MII 5006 * layer has added all of the media associated 5007 * with that PHY, we need to traverse the media 5008 * list, and add our `tm' to each entry's `aux' 5009 * pointer. 5010 * 5011 * We do this by looking for media with our 5012 * PHY's `instance'. 5013 */ 5014 TAILQ_FOREACH(ife, &sc->sc_mii.mii_media.ifm_list, 5015 ifm_list) { 5016 if (IFM_INST(ife->ifm_media) != phy->mii_inst) 5017 continue; 5018 ife->ifm_aux = tm; 5019 } 5020 break; 5021 5022 case TULIP_ROM_MB_21143_SYM: 5023 tlp_get_minst(sc); 5024 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21143_SYM; 5025 5026 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5027 5028 tm->tm_type = TULIP_ROM_MB_21143_SYM; 5029 tm->tm_get = tlp_sia_get; 5030 tm->tm_set = tlp_sia_set; 5031 5032 /* First is the media type code. */ 5033 tsti = tlp_srom_to_ifmedia(cp[0] & 5034 TULIP_ROM_MB_MEDIA_CODE); 5035 if (tsti == NULL) { 5036 /* Invalid media code. */ 5037 free(tm, M_DEVBUF); 5038 break; 5039 } 5040 5041 /* Get defaults. */ 5042 tlp_srom_media_info(sc, tsti, tm); 5043 5044 /* Next is GPIO control/data. */ 5045 tm->tm_gpctl = TULIP_ROM_GETW(cp, 1) << 16; 5046 tm->tm_gpdata = TULIP_ROM_GETW(cp, 3) << 16; 5047 5048 /* 5049 * Next is a word containing OPMODE information 5050 * and info on how to detect if this media is 5051 * active. 5052 */ 5053 word = TULIP_ROM_GETW(cp, 5); 5054 tm->tm_opmode &= OPMODE_FD; 5055 tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word); 5056 if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) { 5057 tm->tm_actmask = 5058 TULIP_ROM_MB_BITPOS(word); 5059 tm->tm_actdata = 5060 (word & TULIP_ROM_MB_POLARITY) ? 5061 0 : tm->tm_actmask; 5062 } 5063 5064 ifmedia_add(&sc->sc_mii.mii_media, 5065 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 5066 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 5067 break; 5068 5069 case TULIP_ROM_MB_21143_RESET: 5070 aprint_normal_dev(sc->sc_dev, "21143 reset block\n"); 5071 break; 5072 5073 default: 5074 aprint_error_dev(sc->sc_dev, 5075 "unknown ISV media block type 0x%02x\n", type); 5076 } 5077 } 5078 5079 /* 5080 * Deal with the case where no media is configured. 5081 */ 5082 if (TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list) == NULL) { 5083 aprint_error_dev(sc->sc_dev, "no media found!\n"); 5084 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5085 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5086 return; 5087 } 5088 5089 /* 5090 * Pick the default media. 5091 */ 5092 if (miidef != 0) 5093 defmedia = miidef; 5094 else { 5095 switch (sc->sc_chip) { 5096 case TULIP_CHIP_21140: 5097 case TULIP_CHIP_21140A: 5098 /* XXX should come from SROM */ 5099 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0); 5100 if (ifmedia_match(&sc->sc_mii.mii_media, defmedia, 5101 sc->sc_mii.mii_media.ifm_mask) == NULL) { 5102 /* 5103 * There is not a 10baseT media. 5104 * Fall back to the first found one. 5105 */ 5106 ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 5107 defmedia = ife->ifm_media; 5108 } 5109 break; 5110 5111 case TULIP_CHIP_21142: 5112 case TULIP_CHIP_21143: 5113 case TULIP_CHIP_MX98713A: 5114 case TULIP_CHIP_MX98715: 5115 case TULIP_CHIP_MX98715A: 5116 case TULIP_CHIP_MX98715AEC_X: 5117 case TULIP_CHIP_MX98725: 5118 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5119 tm->tm_name = "auto"; 5120 tm->tm_get = tlp_2114x_nway_get; 5121 tm->tm_set = tlp_2114x_nway_set; 5122 5123 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0); 5124 ifmedia_add(&sc->sc_mii.mii_media, defmedia, 0, tm); 5125 5126 sc->sc_statchg = tlp_2114x_nway_statchg; 5127 sc->sc_tick = tlp_2114x_nway_tick; 5128 break; 5129 5130 default: 5131 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0); 5132 break; 5133 } 5134 } 5135 5136 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 5137 5138 /* 5139 * Display any non-MII media we've located. 5140 */ 5141 if (sc->sc_media_seen & 5142 ~((1 << TULIP_ROM_MB_21140_MII) | (1 << TULIP_ROM_MB_21142_MII))) 5143 tlp_print_media(sc); 5144 5145 tlp_sia_fixup(sc); 5146 } 5147 5148 static void 5149 tlp_2114x_nway_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5150 { 5151 5152 (void) tlp_2114x_nway_service(sc, MII_POLLSTAT); 5153 ifmr->ifm_status = sc->sc_mii.mii_media_status; 5154 ifmr->ifm_active = sc->sc_mii.mii_media_active; 5155 } 5156 5157 static int 5158 tlp_2114x_nway_set(struct tulip_softc *sc) 5159 { 5160 5161 return (tlp_2114x_nway_service(sc, MII_MEDIACHG)); 5162 } 5163 5164 static void 5165 tlp_2114x_nway_statchg(device_t self) 5166 { 5167 struct tulip_softc *sc = device_private(self); 5168 struct mii_data *mii = &sc->sc_mii; 5169 struct ifmedia_entry *ife; 5170 5171 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE) 5172 return; 5173 5174 if ((ife = ifmedia_match(&mii->mii_media, mii->mii_media_active, 5175 mii->mii_media.ifm_mask)) == NULL) { 5176 printf("tlp_2114x_nway_statchg: no match for media 0x%x/0x%x\n", 5177 mii->mii_media_active, ~mii->mii_media.ifm_mask); 5178 panic("tlp_2114x_nway_statchg"); 5179 } 5180 5181 tlp_sia_media(sc, ife); 5182 } 5183 5184 static void 5185 tlp_2114x_nway_tick(void *arg) 5186 { 5187 struct tulip_softc *sc = arg; 5188 struct mii_data *mii = &sc->sc_mii; 5189 int s, ticks; 5190 5191 if (!device_is_active(sc->sc_dev)) 5192 return; 5193 5194 s = splnet(); 5195 tlp_2114x_nway_service(sc, MII_TICK); 5196 if ((sc->sc_flags & TULIPF_LINK_UP) == 0 && 5197 (mii->mii_media_status & IFM_ACTIVE) != 0 && 5198 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { 5199 sc->sc_flags |= TULIPF_LINK_UP; 5200 tlp_start(&sc->sc_ethercom.ec_if); 5201 } else if ((sc->sc_flags & TULIPF_LINK_UP) != 0 && 5202 (mii->mii_media_status & IFM_ACTIVE) == 0) { 5203 sc->sc_flags &= ~TULIPF_LINK_UP; 5204 } 5205 splx(s); 5206 5207 if ((sc->sc_flags & TULIPF_LINK_UP) == 0) 5208 ticks = hz >> 3; 5209 else 5210 ticks = hz; 5211 callout_reset(&sc->sc_tick_callout, ticks, tlp_2114x_nway_tick, sc); 5212 } 5213 5214 /* 5215 * Support for the 2114X internal NWay block. This is constructed 5216 * somewhat like a PHY driver for simplicity. 5217 */ 5218 5219 static int 5220 tlp_2114x_nway_service(struct tulip_softc *sc, int cmd) 5221 { 5222 struct mii_data *mii = &sc->sc_mii; 5223 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5224 5225 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5226 return (0); 5227 5228 switch (cmd) { 5229 case MII_POLLSTAT: 5230 /* Nothing special to do here. */ 5231 break; 5232 5233 case MII_MEDIACHG: 5234 switch (IFM_SUBTYPE(ife->ifm_media)) { 5235 case IFM_AUTO: 5236 goto restart; 5237 default: 5238 /* Manual setting doesn't go through here. */ 5239 printf("tlp_2114x_nway_service: oops!\n"); 5240 return (EINVAL); 5241 } 5242 break; 5243 5244 case MII_TICK: 5245 /* 5246 * Only used for autonegotiation. 5247 */ 5248 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 5249 break; 5250 5251 /* 5252 * Check to see if we have link. If we do, we don't 5253 * need to restart the autonegotiation process. 5254 */ 5255 #if 0 5256 if (mii->mii_media_status & IFM_ACTIVE) 5257 #else 5258 if (sc->sc_flags & TULIPF_LINK_UP) 5259 #endif 5260 break; 5261 5262 /* 5263 * Only retry autonegotiation every 5 seconds. 5264 */ 5265 if (++sc->sc_nway_ticks != (5 << 3)) 5266 break; 5267 5268 restart: 5269 sc->sc_nway_ticks = 0; 5270 ife->ifm_data = IFM_NONE; 5271 tlp_2114x_nway_auto(sc); 5272 break; 5273 } 5274 5275 /* Update the media status. */ 5276 tlp_2114x_nway_status(sc); 5277 5278 /* 5279 * Callback if something changed. Manually configuration goes through 5280 * tlp_sia_set() anyway, so ignore that here. 5281 */ 5282 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO && 5283 ife->ifm_data != mii->mii_media_active) { 5284 (*sc->sc_statchg)(sc->sc_dev); 5285 ife->ifm_data = mii->mii_media_active; 5286 } 5287 return (0); 5288 } 5289 5290 static void 5291 tlp_2114x_nway_auto(struct tulip_softc *sc) 5292 { 5293 uint32_t siastat, siatxrx; 5294 5295 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 5296 5297 sc->sc_opmode &= ~(OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_FD); 5298 sc->sc_opmode |= OPMODE_TTM|OPMODE_HBD; 5299 siatxrx = 0xffbf; /* XXX magic number */ 5300 5301 /* Compute the link code word to advertise. */ 5302 if (sc->sc_sia_cap & BMSR_100T4) 5303 siatxrx |= SIATXRX_T4; 5304 if (sc->sc_sia_cap & BMSR_100TXFDX) 5305 siatxrx |= SIATXRX_TXF; 5306 if (sc->sc_sia_cap & BMSR_100TXHDX) 5307 siatxrx |= SIATXRX_THX; 5308 if (sc->sc_sia_cap & BMSR_10TFDX) 5309 sc->sc_opmode |= OPMODE_FD; 5310 if (sc->sc_sia_cap & BMSR_10THDX) 5311 siatxrx |= SIATXRX_TH; 5312 5313 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 5314 5315 TULIP_WRITE(sc, CSR_SIACONN, 0); 5316 delay(1000); 5317 TULIP_WRITE(sc, CSR_SIATXRX, siatxrx); 5318 TULIP_WRITE(sc, CSR_SIACONN, SIACONN_SRL); 5319 5320 siastat = TULIP_READ(sc, CSR_SIASTAT); 5321 siastat &= ~(SIASTAT_ANS|SIASTAT_LPC|SIASTAT_TRA|SIASTAT_ARA| 5322 SIASTAT_LS100|SIASTAT_LS10|SIASTAT_MRA); 5323 siastat |= SIASTAT_ANS_TXDIS; 5324 TULIP_WRITE(sc, CSR_SIASTAT, siastat); 5325 } 5326 5327 static void 5328 tlp_2114x_nway_status(struct tulip_softc *sc) 5329 { 5330 struct mii_data *mii = &sc->sc_mii; 5331 uint32_t siatxrx, siastat, anlpar; 5332 5333 mii->mii_media_status = IFM_AVALID; 5334 mii->mii_media_active = IFM_ETHER; 5335 5336 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5337 return; 5338 5339 siastat = TULIP_READ(sc, CSR_SIASTAT); 5340 siatxrx = TULIP_READ(sc, CSR_SIATXRX); 5341 5342 if (siatxrx & SIATXRX_ANE) { 5343 if ((siastat & SIASTAT_ANS) != SIASTAT_ANS_FLPGOOD) { 5344 /* Erg, still trying, I guess... */ 5345 mii->mii_media_active |= IFM_NONE; 5346 return; 5347 } 5348 5349 if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100)) 5350 mii->mii_media_status |= IFM_ACTIVE; 5351 5352 if (siastat & SIASTAT_LPN) { 5353 anlpar = SIASTAT_GETLPC(siastat); 5354 if (anlpar & ANLPAR_T4 && 5355 sc->sc_sia_cap & BMSR_100T4) 5356 mii->mii_media_active |= IFM_100_T4; 5357 else if (anlpar & ANLPAR_TX_FD && 5358 sc->sc_sia_cap & BMSR_100TXFDX) 5359 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 5360 else if (anlpar & ANLPAR_TX && 5361 sc->sc_sia_cap & BMSR_100TXHDX) 5362 mii->mii_media_active |= IFM_100_TX; 5363 else if (anlpar & ANLPAR_10_FD && 5364 sc->sc_sia_cap & BMSR_10TFDX) 5365 mii->mii_media_active |= IFM_10_T|IFM_FDX; 5366 else if (anlpar & ANLPAR_10 && 5367 sc->sc_sia_cap & BMSR_10THDX) 5368 mii->mii_media_active |= IFM_10_T; 5369 else 5370 mii->mii_media_active |= IFM_NONE; 5371 } else { 5372 /* 5373 * If the other side doesn't support NWAY, then the 5374 * best we can do is determine if we have a 10Mbps or 5375 * 100Mbps link. There's no way to know if the link 5376 * is full or half duplex, so we default to half duplex 5377 * and hope that the user is clever enough to manually 5378 * change the media settings if we're wrong. 5379 */ 5380 if ((siastat & SIASTAT_LS100) == 0) 5381 mii->mii_media_active |= IFM_100_TX; 5382 else if ((siastat & SIASTAT_LS10) == 0) 5383 mii->mii_media_active |= IFM_10_T; 5384 else 5385 mii->mii_media_active |= IFM_NONE; 5386 } 5387 } else { 5388 if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100)) 5389 mii->mii_media_status |= IFM_ACTIVE; 5390 5391 if (sc->sc_opmode & OPMODE_TTM) 5392 mii->mii_media_active |= IFM_10_T; 5393 else 5394 mii->mii_media_active |= IFM_100_TX; 5395 if (sc->sc_opmode & OPMODE_FD) 5396 mii->mii_media_active |= IFM_FDX; 5397 } 5398 } 5399 5400 static void 5401 tlp_2114x_isv_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5402 { 5403 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 5404 struct tulip_21x4x_media *tm = ife->ifm_aux; 5405 5406 (*tm->tm_get)(sc, ifmr); 5407 } 5408 5409 static int 5410 tlp_2114x_isv_tmsw_set(struct tulip_softc *sc) 5411 { 5412 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 5413 struct tulip_21x4x_media *tm = ife->ifm_aux; 5414 5415 /* 5416 * Check to see if we need to reset the chip, and do it. The 5417 * reset path will get the OPMODE register right the next 5418 * time through. 5419 */ 5420 if (TULIP_MEDIA_NEEDSRESET(sc, tm->tm_opmode)) 5421 return (tlp_init(&sc->sc_ethercom.ec_if)); 5422 5423 return ((*tm->tm_set)(sc)); 5424 } 5425 5426 /* 5427 * MII-on-SIO media switch. Handles only MII attached to the SIO. 5428 */ 5429 static void tlp_sio_mii_tmsw_init(struct tulip_softc *); 5430 5431 const struct tulip_mediasw tlp_sio_mii_mediasw = { 5432 tlp_sio_mii_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5433 }; 5434 5435 static void 5436 tlp_sio_mii_tmsw_init(struct tulip_softc *sc) 5437 { 5438 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5439 5440 /* 5441 * We don't attach any media info structures to the ifmedia 5442 * entries, so if we're using a pre-init function that needs 5443 * that info, override it to one that doesn't. 5444 */ 5445 if (sc->sc_preinit == tlp_2114x_preinit) 5446 sc->sc_preinit = tlp_2114x_mii_preinit; 5447 5448 sc->sc_mii.mii_ifp = ifp; 5449 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 5450 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 5451 sc->sc_mii.mii_statchg = sc->sc_statchg; 5452 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5453 tlp_mediastatus); 5454 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5455 MII_OFFSET_ANY, 0); 5456 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5457 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5458 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5459 } else { 5460 sc->sc_flags |= TULIPF_HAS_MII; 5461 sc->sc_tick = tlp_mii_tick; 5462 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5463 } 5464 } 5465 5466 /* 5467 * Lite-On PNIC media switch. Must handle MII or internal NWAY. 5468 */ 5469 static void tlp_pnic_tmsw_init(struct tulip_softc *); 5470 static void tlp_pnic_tmsw_get(struct tulip_softc *, struct ifmediareq *); 5471 static int tlp_pnic_tmsw_set(struct tulip_softc *); 5472 5473 const struct tulip_mediasw tlp_pnic_mediasw = { 5474 tlp_pnic_tmsw_init, tlp_pnic_tmsw_get, tlp_pnic_tmsw_set 5475 }; 5476 5477 static void tlp_pnic_nway_statchg(device_t); 5478 static void tlp_pnic_nway_tick(void *); 5479 static int tlp_pnic_nway_service(struct tulip_softc *, int); 5480 static void tlp_pnic_nway_reset(struct tulip_softc *); 5481 static int tlp_pnic_nway_auto(struct tulip_softc *, int); 5482 static void tlp_pnic_nway_auto_timeout(void *); 5483 static void tlp_pnic_nway_status(struct tulip_softc *); 5484 static void tlp_pnic_nway_acomp(struct tulip_softc *); 5485 5486 static void 5487 tlp_pnic_tmsw_init(struct tulip_softc *sc) 5488 { 5489 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5490 const char *sep = ""; 5491 5492 #define ADD(m, c) ifmedia_add(&sc->sc_mii.mii_media, (m), (c), NULL) 5493 #define PRINT(str) aprint_normal("%s%s", sep, str); sep = ", " 5494 5495 sc->sc_mii.mii_ifp = ifp; 5496 sc->sc_mii.mii_readreg = tlp_pnic_mii_readreg; 5497 sc->sc_mii.mii_writereg = tlp_pnic_mii_writereg; 5498 sc->sc_mii.mii_statchg = sc->sc_statchg; 5499 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5500 tlp_mediastatus); 5501 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5502 MII_OFFSET_ANY, 0); 5503 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5504 /* XXX What about AUI/BNC support? */ 5505 aprint_normal_dev(sc->sc_dev, ""); 5506 5507 tlp_pnic_nway_reset(sc); 5508 5509 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), 5510 PNIC_NWAY_TW|PNIC_NWAY_CAP10T); 5511 PRINT("10baseT"); 5512 5513 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, 0), 5514 PNIC_NWAY_TW|PNIC_NWAY_FD|PNIC_NWAY_CAP10TFDX); 5515 PRINT("10baseT-FDX"); 5516 5517 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, 0), 5518 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_CAP100TX); 5519 PRINT("100baseTX"); 5520 5521 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, 0), 5522 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_FD| 5523 PNIC_NWAY_CAP100TXFDX); 5524 PRINT("100baseTX-FDX"); 5525 5526 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 5527 PNIC_NWAY_TW|PNIC_NWAY_RN|PNIC_NWAY_NW| 5528 PNIC_NWAY_CAP10T|PNIC_NWAY_CAP10TFDX| 5529 PNIC_NWAY_CAP100TXFDX|PNIC_NWAY_CAP100TX); 5530 PRINT("auto"); 5531 5532 aprint_normal("\n"); 5533 5534 sc->sc_statchg = tlp_pnic_nway_statchg; 5535 sc->sc_tick = tlp_pnic_nway_tick; 5536 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5537 } else { 5538 sc->sc_flags |= TULIPF_HAS_MII; 5539 sc->sc_tick = tlp_mii_tick; 5540 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5541 } 5542 5543 #undef ADD 5544 #undef PRINT 5545 } 5546 5547 static void 5548 tlp_pnic_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5549 { 5550 struct mii_data *mii = &sc->sc_mii; 5551 5552 if (sc->sc_flags & TULIPF_HAS_MII) 5553 tlp_mii_getmedia(sc, ifmr); 5554 else { 5555 mii->mii_media_status = 0; 5556 mii->mii_media_active = IFM_NONE; 5557 tlp_pnic_nway_service(sc, MII_POLLSTAT); 5558 ifmr->ifm_status = sc->sc_mii.mii_media_status; 5559 ifmr->ifm_active = sc->sc_mii.mii_media_active; 5560 } 5561 } 5562 5563 static int 5564 tlp_pnic_tmsw_set(struct tulip_softc *sc) 5565 { 5566 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5567 struct mii_data *mii = &sc->sc_mii; 5568 5569 if (sc->sc_flags & TULIPF_HAS_MII) { 5570 /* 5571 * Make sure the built-in Tx jabber timer is disabled. 5572 */ 5573 TULIP_WRITE(sc, CSR_PNIC_ENDEC, PNIC_ENDEC_JDIS); 5574 5575 return (tlp_mii_setmedia(sc)); 5576 } 5577 5578 if (ifp->if_flags & IFF_UP) { 5579 mii->mii_media_status = 0; 5580 mii->mii_media_active = IFM_NONE; 5581 return (tlp_pnic_nway_service(sc, MII_MEDIACHG)); 5582 } 5583 5584 return (0); 5585 } 5586 5587 static void 5588 tlp_pnic_nway_statchg(device_t self) 5589 { 5590 struct tulip_softc *sc = device_private(self); 5591 5592 /* Idle the transmit and receive processes. */ 5593 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 5594 5595 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_PS|OPMODE_PCS| 5596 OPMODE_SCR|OPMODE_HBD); 5597 5598 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) { 5599 sc->sc_opmode |= OPMODE_TTM; 5600 TULIP_WRITE(sc, CSR_GPP, 5601 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 0) | 5602 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 5603 } else { 5604 sc->sc_opmode |= OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD; 5605 TULIP_WRITE(sc, CSR_GPP, 5606 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 1) | 5607 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 5608 } 5609 5610 if (sc->sc_mii.mii_media_active & IFM_FDX) 5611 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 5612 5613 /* 5614 * Write new OPMODE bits. This also restarts the transmit 5615 * and receive processes. 5616 */ 5617 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 5618 } 5619 5620 static void 5621 tlp_pnic_nway_tick(void *arg) 5622 { 5623 struct tulip_softc *sc = arg; 5624 int s; 5625 5626 if (!device_is_active(sc->sc_dev)) 5627 return; 5628 5629 s = splnet(); 5630 tlp_pnic_nway_service(sc, MII_TICK); 5631 splx(s); 5632 5633 callout_reset(&sc->sc_tick_callout, hz, tlp_pnic_nway_tick, sc); 5634 } 5635 5636 /* 5637 * Support for the Lite-On PNIC internal NWay block. This is constructed 5638 * somewhat like a PHY driver for simplicity. 5639 */ 5640 5641 static int 5642 tlp_pnic_nway_service(struct tulip_softc *sc, int cmd) 5643 { 5644 struct mii_data *mii = &sc->sc_mii; 5645 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5646 5647 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5648 return (0); 5649 5650 switch (cmd) { 5651 case MII_POLLSTAT: 5652 /* Nothing special to do here. */ 5653 break; 5654 5655 case MII_MEDIACHG: 5656 switch (IFM_SUBTYPE(ife->ifm_media)) { 5657 case IFM_AUTO: 5658 (void) tlp_pnic_nway_auto(sc, 1); 5659 break; 5660 case IFM_100_T4: 5661 /* 5662 * XXX Not supported as a manual setting right now. 5663 */ 5664 return (EINVAL); 5665 default: 5666 /* 5667 * NWAY register data is stored in the ifmedia entry. 5668 */ 5669 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 5670 } 5671 break; 5672 5673 case MII_TICK: 5674 /* 5675 * Only used for autonegotiation. 5676 */ 5677 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 5678 return (0); 5679 5680 /* 5681 * Check to see if we have link. If we do, we don't 5682 * need to restart the autonegotiation process. 5683 */ 5684 if (sc->sc_flags & TULIPF_LINK_UP) 5685 return (0); 5686 5687 /* 5688 * Only retry autonegotiation every 5 seconds. 5689 */ 5690 if (++sc->sc_nway_ticks != 5) 5691 return (0); 5692 5693 sc->sc_nway_ticks = 0; 5694 tlp_pnic_nway_reset(sc); 5695 if (tlp_pnic_nway_auto(sc, 0) == EJUSTRETURN) 5696 return (0); 5697 break; 5698 } 5699 5700 /* Update the media status. */ 5701 tlp_pnic_nway_status(sc); 5702 5703 /* Callback if something changed. */ 5704 if ((sc->sc_nway_active == NULL || 5705 sc->sc_nway_active->ifm_media != mii->mii_media_active) || 5706 cmd == MII_MEDIACHG) { 5707 (*sc->sc_statchg)(sc->sc_dev); 5708 tlp_nway_activate(sc, mii->mii_media_active); 5709 } 5710 return (0); 5711 } 5712 5713 static void 5714 tlp_pnic_nway_reset(struct tulip_softc *sc) 5715 { 5716 5717 TULIP_WRITE(sc, CSR_PNIC_NWAY, PNIC_NWAY_RS); 5718 delay(100); 5719 TULIP_WRITE(sc, CSR_PNIC_NWAY, 0); 5720 } 5721 5722 static int 5723 tlp_pnic_nway_auto(struct tulip_softc *sc, int waitfor) 5724 { 5725 struct mii_data *mii = &sc->sc_mii; 5726 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5727 uint32_t reg; 5728 int i; 5729 5730 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) 5731 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 5732 5733 if (waitfor) { 5734 /* Wait 500ms for it to complete. */ 5735 for (i = 0; i < 500; i++) { 5736 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5737 if (reg & PNIC_NWAY_LPAR_MASK) { 5738 tlp_pnic_nway_acomp(sc); 5739 return (0); 5740 } 5741 delay(1000); 5742 } 5743 #if 0 5744 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 5745 aprint_error_dev(sc->sc_dev, "autonegotiation failed to complete\n"); 5746 #endif 5747 5748 /* 5749 * Don't need to worry about clearing DOINGAUTO. 5750 * If that's set, a timeout is pending, and it will 5751 * clear the flag. 5752 */ 5753 return (EIO); 5754 } 5755 5756 /* 5757 * Just let it finish asynchronously. This is for the benefit of 5758 * the tick handler driving autonegotiation. Don't want 500ms 5759 * delays all the time while the system is running! 5760 */ 5761 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) { 5762 sc->sc_flags |= TULIPF_DOINGAUTO; 5763 callout_reset(&sc->sc_nway_callout, hz >> 1, 5764 tlp_pnic_nway_auto_timeout, sc); 5765 } 5766 return (EJUSTRETURN); 5767 } 5768 5769 static void 5770 tlp_pnic_nway_auto_timeout(void *arg) 5771 { 5772 struct tulip_softc *sc = arg; 5773 uint32_t reg; 5774 int s; 5775 5776 s = splnet(); 5777 sc->sc_flags &= ~TULIPF_DOINGAUTO; 5778 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5779 #if 0 5780 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 5781 aprint_error_dev(sc->sc_dev, "autonegotiation failed to complete\n"); 5782 #endif 5783 5784 tlp_pnic_nway_acomp(sc); 5785 5786 /* Update the media status. */ 5787 (void) tlp_pnic_nway_service(sc, MII_POLLSTAT); 5788 splx(s); 5789 } 5790 5791 static void 5792 tlp_pnic_nway_status(struct tulip_softc *sc) 5793 { 5794 struct mii_data *mii = &sc->sc_mii; 5795 uint32_t reg; 5796 5797 mii->mii_media_status = IFM_AVALID; 5798 mii->mii_media_active = IFM_ETHER; 5799 5800 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5801 5802 if (sc->sc_flags & TULIPF_LINK_UP) 5803 mii->mii_media_status |= IFM_ACTIVE; 5804 5805 if (reg & PNIC_NWAY_NW) { 5806 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) { 5807 /* Erg, still trying, I guess... */ 5808 mii->mii_media_active |= IFM_NONE; 5809 return; 5810 } 5811 5812 #if 0 5813 if (reg & PNIC_NWAY_LPAR100T4) 5814 mii->mii_media_active |= IFM_100_T4; 5815 else 5816 #endif 5817 if (reg & PNIC_NWAY_LPAR100TXFDX) 5818 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 5819 else if (reg & PNIC_NWAY_LPAR100TX) 5820 mii->mii_media_active |= IFM_100_TX; 5821 else if (reg & PNIC_NWAY_LPAR10TFDX) 5822 mii->mii_media_active |= IFM_10_T|IFM_FDX; 5823 else if (reg & PNIC_NWAY_LPAR10T) 5824 mii->mii_media_active |= IFM_10_T; 5825 else 5826 mii->mii_media_active |= IFM_NONE; 5827 } else { 5828 if (reg & PNIC_NWAY_100) 5829 mii->mii_media_active |= IFM_100_TX; 5830 else 5831 mii->mii_media_active |= IFM_10_T; 5832 if (reg & PNIC_NWAY_FD) 5833 mii->mii_media_active |= IFM_FDX; 5834 } 5835 } 5836 5837 static void 5838 tlp_pnic_nway_acomp(struct tulip_softc *sc) 5839 { 5840 uint32_t reg; 5841 5842 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5843 reg &= ~(PNIC_NWAY_FD|PNIC_NWAY_100|PNIC_NWAY_RN); 5844 5845 if (reg & (PNIC_NWAY_LPAR100TXFDX|PNIC_NWAY_LPAR100TX)) 5846 reg |= PNIC_NWAY_100; 5847 if (reg & (PNIC_NWAY_LPAR10TFDX|PNIC_NWAY_LPAR100TXFDX)) 5848 reg |= PNIC_NWAY_FD; 5849 5850 TULIP_WRITE(sc, CSR_PNIC_NWAY, reg); 5851 } 5852 5853 /* 5854 * Macronix PMAC and Lite-On PNIC-II media switch: 5855 * 5856 * MX98713 and MX98713A 21140-like MII or GPIO media. 5857 * 5858 * MX98713A 21143-like MII or SIA/SYM media. 5859 * 5860 * MX98715, MX98715A, MX98725, 21143-like SIA/SYM media. 5861 * 82C115, MX98715AEC-C, -E 5862 * 5863 * So, what we do here is fake MII-on-SIO or ISV media info, and 5864 * use the ISV media switch get/set functions to handle the rest. 5865 */ 5866 5867 static void tlp_pmac_tmsw_init(struct tulip_softc *); 5868 5869 const struct tulip_mediasw tlp_pmac_mediasw = { 5870 tlp_pmac_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set 5871 }; 5872 5873 const struct tulip_mediasw tlp_pmac_mii_mediasw = { 5874 tlp_pmac_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5875 }; 5876 5877 static void 5878 tlp_pmac_tmsw_init(struct tulip_softc *sc) 5879 { 5880 static const uint8_t media[] = { 5881 TULIP_ROM_MB_MEDIA_TP, 5882 TULIP_ROM_MB_MEDIA_TP_FDX, 5883 TULIP_ROM_MB_MEDIA_100TX, 5884 TULIP_ROM_MB_MEDIA_100TX_FDX, 5885 }; 5886 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5887 struct tulip_21x4x_media *tm; 5888 5889 sc->sc_mii.mii_ifp = ifp; 5890 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 5891 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 5892 sc->sc_mii.mii_statchg = sc->sc_statchg; 5893 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5894 tlp_mediastatus); 5895 if (sc->sc_chip == TULIP_CHIP_MX98713 || 5896 sc->sc_chip == TULIP_CHIP_MX98713A) { 5897 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 5898 MII_PHY_ANY, MII_OFFSET_ANY, 0); 5899 if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL) { 5900 sc->sc_flags |= TULIPF_HAS_MII; 5901 sc->sc_tick = tlp_mii_tick; 5902 sc->sc_preinit = tlp_2114x_mii_preinit; 5903 sc->sc_mediasw = &tlp_pmac_mii_mediasw; 5904 ifmedia_set(&sc->sc_mii.mii_media, 5905 IFM_ETHER|IFM_AUTO); 5906 return; 5907 } 5908 } 5909 5910 switch (sc->sc_chip) { 5911 case TULIP_CHIP_MX98713: 5912 tlp_add_srom_media(sc, TULIP_ROM_MB_21140_GPR, 5913 tlp_21140_gpio_get, tlp_21140_gpio_set, media, 4); 5914 5915 /* 5916 * XXX Should implement auto-sense for this someday, 5917 * XXX when we do the same for the 21140. 5918 */ 5919 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 5920 break; 5921 5922 default: 5923 tlp_add_srom_media(sc, TULIP_ROM_MB_21142_SIA, 5924 tlp_sia_get, tlp_sia_set, media, 2); 5925 tlp_add_srom_media(sc, TULIP_ROM_MB_21143_SYM, 5926 tlp_sia_get, tlp_sia_set, media + 2, 2); 5927 5928 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5929 tm->tm_name = "auto"; 5930 tm->tm_get = tlp_2114x_nway_get; 5931 tm->tm_set = tlp_2114x_nway_set; 5932 ifmedia_add(&sc->sc_mii.mii_media, 5933 IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 0, tm); 5934 5935 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5936 sc->sc_statchg = tlp_2114x_nway_statchg; 5937 sc->sc_tick = tlp_2114x_nway_tick; 5938 break; 5939 } 5940 5941 tlp_print_media(sc); 5942 tlp_sia_fixup(sc); 5943 5944 /* Set the LED modes. */ 5945 tlp_pmac_reset(sc); 5946 5947 sc->sc_reset = tlp_pmac_reset; 5948 } 5949 5950 /* 5951 * ADMtek AL981 media switch. Only has internal PHY. 5952 */ 5953 static void tlp_al981_tmsw_init(struct tulip_softc *); 5954 5955 const struct tulip_mediasw tlp_al981_mediasw = { 5956 tlp_al981_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5957 }; 5958 5959 static void 5960 tlp_al981_tmsw_init(struct tulip_softc *sc) 5961 { 5962 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5963 5964 sc->sc_mii.mii_ifp = ifp; 5965 sc->sc_mii.mii_readreg = tlp_al981_mii_readreg; 5966 sc->sc_mii.mii_writereg = tlp_al981_mii_writereg; 5967 sc->sc_mii.mii_statchg = sc->sc_statchg; 5968 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5969 tlp_mediastatus); 5970 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5971 MII_OFFSET_ANY, 0); 5972 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5973 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5974 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5975 } else { 5976 sc->sc_flags |= TULIPF_HAS_MII; 5977 sc->sc_tick = tlp_mii_tick; 5978 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5979 } 5980 } 5981 5982 /* 5983 * ADMtek AN983/985 media switch. Only has internal PHY, but 5984 * on an SIO-like interface. Unfortunately, we can't use the 5985 * standard SIO media switch, because the AN985 "ghosts" the 5986 * singly PHY at every address. 5987 */ 5988 static void tlp_an985_tmsw_init(struct tulip_softc *); 5989 5990 const struct tulip_mediasw tlp_an985_mediasw = { 5991 tlp_an985_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5992 }; 5993 5994 static void 5995 tlp_an985_tmsw_init(struct tulip_softc *sc) 5996 { 5997 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5998 5999 sc->sc_mii.mii_ifp = ifp; 6000 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6001 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6002 sc->sc_mii.mii_statchg = sc->sc_statchg; 6003 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6004 tlp_mediastatus); 6005 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 6006 MII_OFFSET_ANY, 0); 6007 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6008 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6009 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6010 } else { 6011 sc->sc_flags |= TULIPF_HAS_MII; 6012 sc->sc_tick = tlp_mii_tick; 6013 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6014 } 6015 } 6016 6017 /* 6018 * Davicom DM9102 media switch. Internal PHY and possibly HomePNA. 6019 */ 6020 static void tlp_dm9102_tmsw_init(struct tulip_softc *); 6021 static void tlp_dm9102_tmsw_getmedia(struct tulip_softc *, 6022 struct ifmediareq *); 6023 static int tlp_dm9102_tmsw_setmedia(struct tulip_softc *); 6024 6025 const struct tulip_mediasw tlp_dm9102_mediasw = { 6026 tlp_dm9102_tmsw_init, tlp_dm9102_tmsw_getmedia, 6027 tlp_dm9102_tmsw_setmedia 6028 }; 6029 6030 static void 6031 tlp_dm9102_tmsw_init(struct tulip_softc *sc) 6032 { 6033 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6034 uint32_t opmode; 6035 6036 sc->sc_mii.mii_ifp = ifp; 6037 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6038 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6039 sc->sc_mii.mii_statchg = sc->sc_statchg; 6040 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6041 tlp_mediastatus); 6042 6043 /* PHY block already reset via tlp_reset(). */ 6044 6045 /* 6046 * Configure OPMODE properly for the internal MII interface. 6047 */ 6048 switch (sc->sc_chip) { 6049 case TULIP_CHIP_DM9102: 6050 opmode = OPMODE_MBO|OPMODE_HBD|OPMODE_PS; 6051 break; 6052 6053 case TULIP_CHIP_DM9102A: 6054 opmode = OPMODE_MBO|OPMODE_HBD; 6055 break; 6056 6057 default: 6058 opmode = 0; 6059 break; 6060 } 6061 6062 TULIP_WRITE(sc, CSR_OPMODE, opmode); 6063 6064 /* Now, probe the internal MII for the internal PHY. */ 6065 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 6066 MII_OFFSET_ANY, 0); 6067 6068 /* 6069 * XXX Figure out what to do about the HomePNA portion 6070 * XXX of the DM9102A. 6071 */ 6072 6073 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6074 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6075 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6076 } else { 6077 sc->sc_flags |= TULIPF_HAS_MII; 6078 sc->sc_tick = tlp_mii_tick; 6079 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6080 } 6081 } 6082 6083 static void 6084 tlp_dm9102_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr) 6085 { 6086 6087 /* XXX HomePNA on DM9102A. */ 6088 tlp_mii_getmedia(sc, ifmr); 6089 } 6090 6091 static int 6092 tlp_dm9102_tmsw_setmedia(struct tulip_softc *sc) 6093 { 6094 6095 /* XXX HomePNA on DM9102A. */ 6096 return (tlp_mii_setmedia(sc)); 6097 } 6098 6099 /* 6100 * ASIX AX88140A/AX88141 media switch. Internal PHY or MII. 6101 */ 6102 6103 static void tlp_asix_tmsw_init(struct tulip_softc *); 6104 static void tlp_asix_tmsw_getmedia(struct tulip_softc *, 6105 struct ifmediareq *); 6106 static int tlp_asix_tmsw_setmedia(struct tulip_softc *); 6107 6108 const struct tulip_mediasw tlp_asix_mediasw = { 6109 tlp_asix_tmsw_init, tlp_asix_tmsw_getmedia, 6110 tlp_asix_tmsw_setmedia 6111 }; 6112 6113 static void 6114 tlp_asix_tmsw_init(struct tulip_softc *sc) 6115 { 6116 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6117 uint32_t opmode; 6118 6119 sc->sc_mii.mii_ifp = ifp; 6120 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6121 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6122 sc->sc_mii.mii_statchg = sc->sc_statchg; 6123 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6124 tlp_mediastatus); 6125 6126 /* 6127 * Configure OPMODE properly for the internal MII interface. 6128 */ 6129 switch (sc->sc_chip) { 6130 case TULIP_CHIP_AX88140: 6131 case TULIP_CHIP_AX88141: 6132 opmode = OPMODE_HBD|OPMODE_PS; 6133 break; 6134 default: 6135 opmode = 0; 6136 break; 6137 } 6138 6139 TULIP_WRITE(sc, CSR_OPMODE, opmode); 6140 6141 /* Now, probe the internal MII for the internal PHY. */ 6142 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 6143 MII_OFFSET_ANY, 0); 6144 6145 /* XXX Figure how to handle the PHY. */ 6146 6147 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6148 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6149 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6150 } else { 6151 sc->sc_flags |= TULIPF_HAS_MII; 6152 sc->sc_tick = tlp_mii_tick; 6153 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6154 } 6155 6156 6157 } 6158 6159 static void 6160 tlp_asix_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr) 6161 { 6162 6163 /* XXX PHY handling. */ 6164 tlp_mii_getmedia(sc, ifmr); 6165 } 6166 6167 static int 6168 tlp_asix_tmsw_setmedia(struct tulip_softc *sc) 6169 { 6170 6171 /* XXX PHY handling. */ 6172 return (tlp_mii_setmedia(sc)); 6173 } 6174 6175 /* 6176 * RS7112 media switch. Handles only MII attached to the SIO. 6177 * We only have a PHY at 1. 6178 */ 6179 void tlp_rs7112_tmsw_init(struct tulip_softc *); 6180 6181 const struct tulip_mediasw tlp_rs7112_mediasw = { 6182 tlp_rs7112_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 6183 }; 6184 6185 void 6186 tlp_rs7112_tmsw_init(struct tulip_softc *sc) 6187 { 6188 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6189 6190 /* 6191 * We don't attach any media info structures to the ifmedia 6192 * entries, so if we're using a pre-init function that needs 6193 * that info, override it to one that doesn't. 6194 */ 6195 if (sc->sc_preinit == tlp_2114x_preinit) 6196 sc->sc_preinit = tlp_2114x_mii_preinit; 6197 6198 sc->sc_mii.mii_ifp = ifp; 6199 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6200 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6201 sc->sc_mii.mii_statchg = sc->sc_statchg; 6202 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6203 tlp_mediastatus); 6204 6205 /* 6206 * The RS7112 reports a PHY at 0 (possibly HomePNA?) 6207 * and 1 (ethernet). We attach ethernet only. 6208 */ 6209 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 6210 MII_OFFSET_ANY, 0); 6211 6212 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6213 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6214 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6215 } else { 6216 sc->sc_flags |= TULIPF_HAS_MII; 6217 sc->sc_tick = tlp_mii_tick; 6218 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6219 } 6220 } 6221