1 /* $NetBSD: tulip.c,v 1.162 2008/04/08 12:07:27 cegger 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 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Device driver for the Digital Semiconductor ``Tulip'' (21x4x) 42 * Ethernet controller family, and a variety of clone chips. 43 */ 44 45 #include <sys/cdefs.h> 46 __KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.162 2008/04/08 12:07:27 cegger Exp $"); 47 48 #include "bpfilter.h" 49 50 #include <sys/param.h> 51 #include <sys/systm.h> 52 #include <sys/callout.h> 53 #include <sys/mbuf.h> 54 #include <sys/malloc.h> 55 #include <sys/kernel.h> 56 #include <sys/socket.h> 57 #include <sys/ioctl.h> 58 #include <sys/errno.h> 59 #include <sys/device.h> 60 61 #include <machine/endian.h> 62 63 #include <uvm/uvm_extern.h> 64 65 #include <net/if.h> 66 #include <net/if_dl.h> 67 #include <net/if_media.h> 68 #include <net/if_ether.h> 69 70 #if NBPFILTER > 0 71 #include <net/bpf.h> 72 #endif 73 74 #include <sys/bus.h> 75 #include <sys/intr.h> 76 77 #include <dev/mii/mii.h> 78 #include <dev/mii/miivar.h> 79 #include <dev/mii/mii_bitbang.h> 80 81 #include <dev/ic/tulipreg.h> 82 #include <dev/ic/tulipvar.h> 83 84 const char * const tlp_chip_names[] = TULIP_CHIP_NAMES; 85 86 static const struct tulip_txthresh_tab tlp_10_txthresh_tab[] = 87 TLP_TXTHRESH_TAB_10; 88 89 static const struct tulip_txthresh_tab tlp_10_100_txthresh_tab[] = 90 TLP_TXTHRESH_TAB_10_100; 91 92 static const struct tulip_txthresh_tab tlp_winb_txthresh_tab[] = 93 TLP_TXTHRESH_TAB_WINB; 94 95 static const struct tulip_txthresh_tab tlp_dm9102_txthresh_tab[] = 96 TLP_TXTHRESH_TAB_DM9102; 97 98 static void tlp_start(struct ifnet *); 99 static void tlp_watchdog(struct ifnet *); 100 static int tlp_ioctl(struct ifnet *, u_long, void *); 101 static int tlp_init(struct ifnet *); 102 static void tlp_stop(struct ifnet *, int); 103 104 static void tlp_rxdrain(struct tulip_softc *); 105 static int tlp_add_rxbuf(struct tulip_softc *, int); 106 static void tlp_srom_idle(struct tulip_softc *); 107 static int tlp_srom_size(struct tulip_softc *); 108 109 static int tlp_enable(struct tulip_softc *); 110 static void tlp_disable(struct tulip_softc *); 111 112 static void tlp_filter_setup(struct tulip_softc *); 113 static void tlp_winb_filter_setup(struct tulip_softc *); 114 static void tlp_al981_filter_setup(struct tulip_softc *); 115 static void tlp_asix_filter_setup(struct tulip_softc *); 116 117 static void tlp_rxintr(struct tulip_softc *); 118 static void tlp_txintr(struct tulip_softc *); 119 120 static void tlp_mii_tick(void *); 121 static void tlp_mii_statchg(struct device *); 122 static void tlp_winb_mii_statchg(struct device *); 123 static void tlp_dm9102_mii_statchg(struct device *); 124 125 static void tlp_mii_getmedia(struct tulip_softc *, struct ifmediareq *); 126 static int tlp_mii_setmedia(struct tulip_softc *); 127 128 static int tlp_bitbang_mii_readreg(struct device *, int, int); 129 static void tlp_bitbang_mii_writereg(struct device *, int, int, int); 130 131 static int tlp_pnic_mii_readreg(struct device *, int, int); 132 static void tlp_pnic_mii_writereg(struct device *, int, int, int); 133 134 static int tlp_al981_mii_readreg(struct device *, int, int); 135 static void tlp_al981_mii_writereg(struct device *, int, int, int); 136 137 static void tlp_2114x_preinit(struct tulip_softc *); 138 static void tlp_2114x_mii_preinit(struct tulip_softc *); 139 static void tlp_pnic_preinit(struct tulip_softc *); 140 static void tlp_dm9102_preinit(struct tulip_softc *); 141 static void tlp_asix_preinit(struct tulip_softc *); 142 143 static void tlp_21140_reset(struct tulip_softc *); 144 static void tlp_21142_reset(struct tulip_softc *); 145 static void tlp_pmac_reset(struct tulip_softc *); 146 #if 0 147 static void tlp_dm9102_reset(struct tulip_softc *); 148 #endif 149 150 static void tlp_2114x_nway_tick(void *); 151 152 #define tlp_mchash(addr, sz) \ 153 (ether_crc32_le((addr), ETHER_ADDR_LEN) & ((sz) - 1)) 154 155 /* 156 * MII bit-bang glue. 157 */ 158 static u_int32_t tlp_sio_mii_bitbang_read(struct device *); 159 static void tlp_sio_mii_bitbang_write(struct device *, u_int32_t); 160 161 static const struct mii_bitbang_ops tlp_sio_mii_bitbang_ops = { 162 tlp_sio_mii_bitbang_read, 163 tlp_sio_mii_bitbang_write, 164 { 165 MIIROM_MDO, /* MII_BIT_MDO */ 166 MIIROM_MDI, /* MII_BIT_MDI */ 167 MIIROM_MDC, /* MII_BIT_MDC */ 168 0, /* MII_BIT_DIR_HOST_PHY */ 169 MIIROM_MIIDIR, /* MII_BIT_DIR_PHY_HOST */ 170 } 171 }; 172 173 #ifdef TLP_DEBUG 174 #define DPRINTF(sc, x) if ((sc)->sc_ethercom.ec_if.if_flags & IFF_DEBUG) \ 175 printf x 176 #else 177 #define DPRINTF(sc, x) /* nothing */ 178 #endif 179 180 #ifdef TLP_STATS 181 static void tlp_print_stats(struct tulip_softc *); 182 #endif 183 184 /* 185 * Can be used to debug the SROM-related things, including contents. 186 * Initialized so that it's patchable. 187 */ 188 int tlp_srom_debug = 0; 189 190 /* 191 * tlp_attach: 192 * 193 * Attach a Tulip interface to the system. 194 */ 195 void 196 tlp_attach(struct tulip_softc *sc, const u_int8_t *enaddr) 197 { 198 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 199 device_t self = &sc->sc_dev; 200 int i, error; 201 202 callout_init(&sc->sc_nway_callout, 0); 203 callout_init(&sc->sc_tick_callout, 0); 204 205 /* 206 * NOTE: WE EXPECT THE FRONT-END TO INITIALIZE sc_regshift! 207 */ 208 209 /* 210 * Setup the transmit threshold table. 211 */ 212 switch (sc->sc_chip) { 213 case TULIP_CHIP_DE425: 214 case TULIP_CHIP_21040: 215 case TULIP_CHIP_21041: 216 sc->sc_txth = tlp_10_txthresh_tab; 217 break; 218 219 case TULIP_CHIP_DM9102: 220 case TULIP_CHIP_DM9102A: 221 sc->sc_txth = tlp_dm9102_txthresh_tab; 222 break; 223 224 default: 225 sc->sc_txth = tlp_10_100_txthresh_tab; 226 break; 227 } 228 229 /* 230 * Setup the filter setup function. 231 */ 232 switch (sc->sc_chip) { 233 case TULIP_CHIP_WB89C840F: 234 sc->sc_filter_setup = tlp_winb_filter_setup; 235 break; 236 237 case TULIP_CHIP_AL981: 238 case TULIP_CHIP_AN983: 239 case TULIP_CHIP_AN985: 240 sc->sc_filter_setup = tlp_al981_filter_setup; 241 break; 242 243 case TULIP_CHIP_AX88140: 244 case TULIP_CHIP_AX88141: 245 sc->sc_filter_setup = tlp_asix_filter_setup; 246 break; 247 248 default: 249 sc->sc_filter_setup = tlp_filter_setup; 250 break; 251 } 252 253 /* 254 * Set up the media status change function. 255 */ 256 switch (sc->sc_chip) { 257 case TULIP_CHIP_WB89C840F: 258 sc->sc_statchg = tlp_winb_mii_statchg; 259 break; 260 261 case TULIP_CHIP_DM9102: 262 case TULIP_CHIP_DM9102A: 263 sc->sc_statchg = tlp_dm9102_mii_statchg; 264 break; 265 266 default: 267 /* 268 * We may override this if we have special media 269 * handling requirements (e.g. flipping GPIO pins). 270 * 271 * The pure-MII statchg function covers the basics. 272 */ 273 sc->sc_statchg = tlp_mii_statchg; 274 break; 275 } 276 277 /* 278 * Default to no FS|LS in setup packet descriptors. They're 279 * supposed to be zero according to the 21040 and 21143 280 * manuals, and some chips fall over badly if they're 281 * included. Yet, other chips seem to require them. Sigh. 282 */ 283 switch (sc->sc_chip) { 284 case TULIP_CHIP_X3201_3: 285 sc->sc_setup_fsls = TDCTL_Tx_FS|TDCTL_Tx_LS; 286 break; 287 288 default: 289 sc->sc_setup_fsls = 0; 290 } 291 292 /* 293 * Set up various chip-specific quirks. 294 * 295 * Note that wherever we can, we use the "ring" option for 296 * transmit and receive descriptors. This is because some 297 * clone chips apparently have problems when using chaining, 298 * although some *only* support chaining. 299 * 300 * What we do is always program the "next" pointer, and then 301 * conditionally set the TDCTL_CH and TDCTL_ER bits in the 302 * appropriate places. 303 */ 304 switch (sc->sc_chip) { 305 case TULIP_CHIP_21140: 306 case TULIP_CHIP_21140A: 307 case TULIP_CHIP_21142: 308 case TULIP_CHIP_21143: 309 case TULIP_CHIP_82C115: /* 21143-like */ 310 case TULIP_CHIP_MX98713: /* 21140-like */ 311 case TULIP_CHIP_MX98713A: /* 21143-like */ 312 case TULIP_CHIP_MX98715: /* 21143-like */ 313 case TULIP_CHIP_MX98715A: /* 21143-like */ 314 case TULIP_CHIP_MX98715AEC_X: /* 21143-like */ 315 case TULIP_CHIP_MX98725: /* 21143-like */ 316 case TULIP_CHIP_RS7112: /* 21143-like */ 317 /* 318 * Run these chips in ring mode. 319 */ 320 sc->sc_tdctl_ch = 0; 321 sc->sc_tdctl_er = TDCTL_ER; 322 sc->sc_preinit = tlp_2114x_preinit; 323 break; 324 325 case TULIP_CHIP_82C168: 326 case TULIP_CHIP_82C169: 327 /* 328 * Run these chips in ring mode. 329 */ 330 sc->sc_tdctl_ch = 0; 331 sc->sc_tdctl_er = TDCTL_ER; 332 sc->sc_preinit = tlp_pnic_preinit; 333 334 /* 335 * These chips seem to have busted DMA engines; just put them 336 * in Store-and-Forward mode from the get-go. 337 */ 338 sc->sc_txthresh = TXTH_SF; 339 break; 340 341 case TULIP_CHIP_WB89C840F: 342 /* 343 * Run this chip in chained mode. 344 */ 345 sc->sc_tdctl_ch = TDCTL_CH; 346 sc->sc_tdctl_er = 0; 347 sc->sc_flags |= TULIPF_IC_FS; 348 break; 349 350 case TULIP_CHIP_DM9102: 351 case TULIP_CHIP_DM9102A: 352 /* 353 * Run these chips in chained mode. 354 */ 355 sc->sc_tdctl_ch = TDCTL_CH; 356 sc->sc_tdctl_er = 0; 357 sc->sc_preinit = tlp_dm9102_preinit; 358 359 /* 360 * These chips have a broken bus interface, so we 361 * can't use any optimized bus commands. For this 362 * reason, we tend to underrun pretty quickly, so 363 * just to Store-and-Forward mode from the get-go. 364 */ 365 sc->sc_txthresh = TXTH_DM9102_SF; 366 break; 367 368 case TULIP_CHIP_AX88140: 369 case TULIP_CHIP_AX88141: 370 /* 371 * Run these chips in ring mode. 372 */ 373 sc->sc_tdctl_ch = 0; 374 sc->sc_tdctl_er = TDCTL_ER; 375 sc->sc_preinit = tlp_asix_preinit; 376 break; 377 378 default: 379 /* 380 * Default to running in ring mode. 381 */ 382 sc->sc_tdctl_ch = 0; 383 sc->sc_tdctl_er = TDCTL_ER; 384 } 385 386 /* 387 * Set up the MII bit-bang operations. 388 */ 389 switch (sc->sc_chip) { 390 case TULIP_CHIP_WB89C840F: /* XXX direction bit different? */ 391 sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops; 392 break; 393 394 default: 395 sc->sc_bitbang_ops = &tlp_sio_mii_bitbang_ops; 396 } 397 398 SIMPLEQ_INIT(&sc->sc_txfreeq); 399 SIMPLEQ_INIT(&sc->sc_txdirtyq); 400 401 /* 402 * Allocate the control data structures, and create and load the 403 * DMA map for it. 404 */ 405 if ((error = bus_dmamem_alloc(sc->sc_dmat, 406 sizeof(struct tulip_control_data), PAGE_SIZE, 0, &sc->sc_cdseg, 407 1, &sc->sc_cdnseg, 0)) != 0) { 408 aprint_error_dev(&sc->sc_dev, "unable to allocate control data, error = %d\n", 409 error); 410 goto fail_0; 411 } 412 413 if ((error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg, 414 sizeof(struct tulip_control_data), (void **)&sc->sc_control_data, 415 BUS_DMA_COHERENT)) != 0) { 416 aprint_error_dev(&sc->sc_dev, "unable to map control data, error = %d\n", 417 error); 418 goto fail_1; 419 } 420 421 if ((error = bus_dmamap_create(sc->sc_dmat, 422 sizeof(struct tulip_control_data), 1, 423 sizeof(struct tulip_control_data), 0, 0, &sc->sc_cddmamap)) != 0) { 424 aprint_error_dev(&sc->sc_dev, "unable to create control data DMA map, " 425 "error = %d\n", error); 426 goto fail_2; 427 } 428 429 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap, 430 sc->sc_control_data, sizeof(struct tulip_control_data), NULL, 431 0)) != 0) { 432 aprint_error_dev(&sc->sc_dev, "unable to load control data DMA map, error = %d\n", 433 error); 434 goto fail_3; 435 } 436 437 /* 438 * Create the transmit buffer DMA maps. 439 * 440 * Note that on the Xircom clone, transmit buffers must be 441 * 4-byte aligned. We're almost guaranteed to have to copy 442 * the packet in that case, so we just limit ourselves to 443 * one segment. 444 * 445 * On the DM9102, the transmit logic can only handle one 446 * DMA segment. 447 */ 448 switch (sc->sc_chip) { 449 case TULIP_CHIP_X3201_3: 450 case TULIP_CHIP_DM9102: 451 case TULIP_CHIP_DM9102A: 452 case TULIP_CHIP_AX88140: 453 case TULIP_CHIP_AX88141: 454 sc->sc_ntxsegs = 1; 455 break; 456 457 default: 458 sc->sc_ntxsegs = TULIP_NTXSEGS; 459 } 460 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 461 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 462 sc->sc_ntxsegs, MCLBYTES, 0, 0, 463 &sc->sc_txsoft[i].txs_dmamap)) != 0) { 464 aprint_error_dev(&sc->sc_dev, "unable to create tx DMA map %d, " 465 "error = %d\n", i, error); 466 goto fail_4; 467 } 468 } 469 470 /* 471 * Create the receive buffer DMA maps. 472 */ 473 for (i = 0; i < TULIP_NRXDESC; i++) { 474 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 475 MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) { 476 aprint_error_dev(&sc->sc_dev, "unable to create rx DMA map %d, " 477 "error = %d\n", i, error); 478 goto fail_5; 479 } 480 sc->sc_rxsoft[i].rxs_mbuf = NULL; 481 } 482 483 /* 484 * From this point forward, the attachment cannot fail. A failure 485 * before this point releases all resources that may have been 486 * allocated. 487 */ 488 sc->sc_flags |= TULIPF_ATTACHED; 489 490 /* 491 * Reset the chip to a known state. 492 */ 493 tlp_reset(sc); 494 495 /* Announce ourselves. */ 496 printf("%s: %s%sEthernet address %s\n", device_xname(&sc->sc_dev), 497 sc->sc_name[0] != '\0' ? sc->sc_name : "", 498 sc->sc_name[0] != '\0' ? ", " : "", 499 ether_sprintf(enaddr)); 500 501 /* 502 * Check to see if we're the simulated Ethernet on Connectix 503 * Virtual PC. 504 */ 505 if (enaddr[0] == 0x00 && enaddr[1] == 0x03 && enaddr[2] == 0xff) 506 sc->sc_flags |= TULIPF_VPC; 507 508 /* 509 * Initialize our media structures. This may probe the MII, if 510 * present. 511 */ 512 (*sc->sc_mediasw->tmsw_init)(sc); 513 514 strlcpy(ifp->if_xname, device_xname(&sc->sc_dev), IFNAMSIZ); 515 ifp->if_softc = sc; 516 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 517 sc->sc_if_flags = ifp->if_flags; 518 ifp->if_ioctl = tlp_ioctl; 519 ifp->if_start = tlp_start; 520 ifp->if_watchdog = tlp_watchdog; 521 ifp->if_init = tlp_init; 522 ifp->if_stop = tlp_stop; 523 IFQ_SET_READY(&ifp->if_snd); 524 525 /* 526 * We can support 802.1Q VLAN-sized frames. 527 */ 528 sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU; 529 530 /* 531 * Attach the interface. 532 */ 533 if_attach(ifp); 534 ether_ifattach(ifp, enaddr); 535 #if NRND > 0 536 rnd_attach_source(&sc->sc_rnd_source, device_xname(&sc->sc_dev), 537 RND_TYPE_NET, 0); 538 #endif 539 540 if (!pmf_device_register(self, NULL, NULL)) 541 aprint_error_dev(self, "couldn't establish power handler\n"); 542 else 543 pmf_class_network_register(self, ifp); 544 545 return; 546 547 /* 548 * Free any resources we've allocated during the failed attach 549 * attempt. Do this in reverse order and fall through. 550 */ 551 fail_5: 552 for (i = 0; i < TULIP_NRXDESC; i++) { 553 if (sc->sc_rxsoft[i].rxs_dmamap != NULL) 554 bus_dmamap_destroy(sc->sc_dmat, 555 sc->sc_rxsoft[i].rxs_dmamap); 556 } 557 fail_4: 558 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 559 if (sc->sc_txsoft[i].txs_dmamap != NULL) 560 bus_dmamap_destroy(sc->sc_dmat, 561 sc->sc_txsoft[i].txs_dmamap); 562 } 563 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 564 fail_3: 565 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 566 fail_2: 567 bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data, 568 sizeof(struct tulip_control_data)); 569 fail_1: 570 bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg); 571 fail_0: 572 return; 573 } 574 575 /* 576 * tlp_activate: 577 * 578 * Handle device activation/deactivation requests. 579 */ 580 int 581 tlp_activate(struct device *self, enum devact act) 582 { 583 struct tulip_softc *sc = (void *) self; 584 int s, error = 0; 585 586 s = splnet(); 587 switch (act) { 588 case DVACT_ACTIVATE: 589 error = EOPNOTSUPP; 590 break; 591 592 case DVACT_DEACTIVATE: 593 if (sc->sc_flags & TULIPF_HAS_MII) 594 mii_activate(&sc->sc_mii, act, MII_PHY_ANY, 595 MII_OFFSET_ANY); 596 if_deactivate(&sc->sc_ethercom.ec_if); 597 break; 598 } 599 splx(s); 600 601 return (error); 602 } 603 604 /* 605 * tlp_detach: 606 * 607 * Detach a Tulip interface. 608 */ 609 int 610 tlp_detach(struct tulip_softc *sc) 611 { 612 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 613 struct tulip_rxsoft *rxs; 614 struct tulip_txsoft *txs; 615 device_t self = &sc->sc_dev; 616 int i; 617 618 /* 619 * Succeed now if there isn't any work to do. 620 */ 621 if ((sc->sc_flags & TULIPF_ATTACHED) == 0) 622 return (0); 623 624 /* Unhook our tick handler. */ 625 if (sc->sc_tick) 626 callout_stop(&sc->sc_tick_callout); 627 628 if (sc->sc_flags & TULIPF_HAS_MII) { 629 /* Detach all PHYs */ 630 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY); 631 } 632 633 /* Delete all remaining media. */ 634 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY); 635 636 #if NRND > 0 637 rnd_detach_source(&sc->sc_rnd_source); 638 #endif 639 ether_ifdetach(ifp); 640 if_detach(ifp); 641 642 for (i = 0; i < TULIP_NRXDESC; i++) { 643 rxs = &sc->sc_rxsoft[i]; 644 if (rxs->rxs_mbuf != NULL) { 645 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 646 m_freem(rxs->rxs_mbuf); 647 rxs->rxs_mbuf = NULL; 648 } 649 bus_dmamap_destroy(sc->sc_dmat, rxs->rxs_dmamap); 650 } 651 for (i = 0; i < TULIP_TXQUEUELEN; i++) { 652 txs = &sc->sc_txsoft[i]; 653 if (txs->txs_mbuf != NULL) { 654 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap); 655 m_freem(txs->txs_mbuf); 656 txs->txs_mbuf = NULL; 657 } 658 bus_dmamap_destroy(sc->sc_dmat, txs->txs_dmamap); 659 } 660 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 661 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 662 bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data, 663 sizeof(struct tulip_control_data)); 664 bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg); 665 666 pmf_device_deregister(self); 667 668 if (sc->sc_srom) 669 free(sc->sc_srom, M_DEVBUF); 670 671 return (0); 672 } 673 674 /* 675 * tlp_start: [ifnet interface function] 676 * 677 * Start packet transmission on the interface. 678 */ 679 static void 680 tlp_start(struct ifnet *ifp) 681 { 682 struct tulip_softc *sc = ifp->if_softc; 683 struct mbuf *m0, *m; 684 struct tulip_txsoft *txs, *last_txs = NULL; 685 bus_dmamap_t dmamap; 686 int error, firsttx, nexttx, lasttx = 1, ofree, seg; 687 688 DPRINTF(sc, ("%s: tlp_start: sc_flags 0x%08x, if_flags 0x%08x\n", 689 device_xname(&sc->sc_dev), sc->sc_flags, ifp->if_flags)); 690 691 /* 692 * If we want a filter setup, it means no more descriptors were 693 * available for the setup routine. Let it get a chance to wedge 694 * itself into the ring. 695 */ 696 if (sc->sc_flags & TULIPF_WANT_SETUP) 697 ifp->if_flags |= IFF_OACTIVE; 698 699 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING) 700 return; 701 702 if (sc->sc_tick == tlp_2114x_nway_tick && 703 (sc->sc_flags & TULIPF_LINK_UP) == 0 && ifp->if_snd.ifq_len < 10) 704 return; 705 706 /* 707 * Remember the previous number of free descriptors and 708 * the first descriptor we'll use. 709 */ 710 ofree = sc->sc_txfree; 711 firsttx = sc->sc_txnext; 712 713 DPRINTF(sc, ("%s: tlp_start: txfree %d, txnext %d\n", 714 device_xname(&sc->sc_dev), ofree, firsttx)); 715 716 /* 717 * Loop through the send queue, setting up transmit descriptors 718 * until we drain the queue, or use up all available transmit 719 * descriptors. 720 */ 721 while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL && 722 sc->sc_txfree != 0) { 723 /* 724 * Grab a packet off the queue. 725 */ 726 IFQ_POLL(&ifp->if_snd, m0); 727 if (m0 == NULL) 728 break; 729 m = NULL; 730 731 dmamap = txs->txs_dmamap; 732 733 /* 734 * Load the DMA map. If this fails, the packet either 735 * didn't fit in the alloted number of segments, or we were 736 * short on resources. In this case, we'll copy and try 737 * again. 738 * 739 * Note that if we're only allowed 1 Tx segment, we 740 * have an alignment restriction. Do this test before 741 * attempting to load the DMA map, because it's more 742 * likely we'll trip the alignment test than the 743 * more-than-one-segment test. 744 */ 745 if ((sc->sc_ntxsegs == 1 && (mtod(m0, uintptr_t) & 3) != 0) || 746 bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 747 BUS_DMA_WRITE|BUS_DMA_NOWAIT) != 0) { 748 MGETHDR(m, M_DONTWAIT, MT_DATA); 749 if (m == NULL) { 750 aprint_error_dev(&sc->sc_dev, "unable to allocate Tx mbuf\n"); 751 break; 752 } 753 MCLAIM(m, &sc->sc_ethercom.ec_tx_mowner); 754 if (m0->m_pkthdr.len > MHLEN) { 755 MCLGET(m, M_DONTWAIT); 756 if ((m->m_flags & M_EXT) == 0) { 757 printf("%s: unable to allocate Tx " 758 "cluster\n", device_xname(&sc->sc_dev)); 759 m_freem(m); 760 break; 761 } 762 } 763 m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, void *)); 764 m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len; 765 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, 766 m, BUS_DMA_WRITE|BUS_DMA_NOWAIT); 767 if (error) { 768 printf("%s: unable to load Tx buffer, " 769 "error = %d\n", device_xname(&sc->sc_dev), error); 770 break; 771 } 772 } 773 774 /* 775 * Ensure we have enough descriptors free to describe 776 * the packet. 777 */ 778 if (dmamap->dm_nsegs > sc->sc_txfree) { 779 /* 780 * Not enough free descriptors to transmit this 781 * packet. We haven't committed to anything yet, 782 * so just unload the DMA map, put the packet 783 * back on the queue, and punt. Notify the upper 784 * layer that there are no more slots left. 785 * 786 * XXX We could allocate an mbuf and copy, but 787 * XXX it is worth it? 788 */ 789 ifp->if_flags |= IFF_OACTIVE; 790 bus_dmamap_unload(sc->sc_dmat, dmamap); 791 if (m != NULL) 792 m_freem(m); 793 break; 794 } 795 796 IFQ_DEQUEUE(&ifp->if_snd, m0); 797 if (m != NULL) { 798 m_freem(m0); 799 m0 = m; 800 } 801 802 /* 803 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. 804 */ 805 806 /* Sync the DMA map. */ 807 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 808 BUS_DMASYNC_PREWRITE); 809 810 /* 811 * Initialize the transmit descriptors. 812 */ 813 for (nexttx = sc->sc_txnext, seg = 0; 814 seg < dmamap->dm_nsegs; 815 seg++, nexttx = TULIP_NEXTTX(nexttx)) { 816 /* 817 * If this is the first descriptor we're 818 * enqueueing, don't set the OWN bit just 819 * yet. That could cause a race condition. 820 * We'll do it below. 821 */ 822 sc->sc_txdescs[nexttx].td_status = 823 (nexttx == firsttx) ? 0 : htole32(TDSTAT_OWN); 824 sc->sc_txdescs[nexttx].td_bufaddr1 = 825 htole32(dmamap->dm_segs[seg].ds_addr); 826 sc->sc_txdescs[nexttx].td_ctl = 827 htole32((dmamap->dm_segs[seg].ds_len << 828 TDCTL_SIZE1_SHIFT) | sc->sc_tdctl_ch | 829 (nexttx == (TULIP_NTXDESC - 1) ? 830 sc->sc_tdctl_er : 0)); 831 lasttx = nexttx; 832 } 833 834 KASSERT(lasttx != -1); 835 836 /* Set `first segment' and `last segment' appropriately. */ 837 sc->sc_txdescs[sc->sc_txnext].td_ctl |= htole32(TDCTL_Tx_FS); 838 sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_LS); 839 840 #ifdef TLP_DEBUG 841 if (ifp->if_flags & IFF_DEBUG) { 842 printf(" txsoft %p transmit chain:\n", txs); 843 for (seg = sc->sc_txnext;; seg = TULIP_NEXTTX(seg)) { 844 printf(" descriptor %d:\n", seg); 845 printf(" td_status: 0x%08x\n", 846 le32toh(sc->sc_txdescs[seg].td_status)); 847 printf(" td_ctl: 0x%08x\n", 848 le32toh(sc->sc_txdescs[seg].td_ctl)); 849 printf(" td_bufaddr1: 0x%08x\n", 850 le32toh(sc->sc_txdescs[seg].td_bufaddr1)); 851 printf(" td_bufaddr2: 0x%08x\n", 852 le32toh(sc->sc_txdescs[seg].td_bufaddr2)); 853 if (seg == lasttx) 854 break; 855 } 856 } 857 #endif 858 859 /* Sync the descriptors we're using. */ 860 TULIP_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs, 861 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 862 863 /* 864 * Store a pointer to the packet so we can free it later, 865 * and remember what txdirty will be once the packet is 866 * done. 867 */ 868 txs->txs_mbuf = m0; 869 txs->txs_firstdesc = sc->sc_txnext; 870 txs->txs_lastdesc = lasttx; 871 txs->txs_ndescs = dmamap->dm_nsegs; 872 873 /* Advance the tx pointer. */ 874 sc->sc_txfree -= dmamap->dm_nsegs; 875 sc->sc_txnext = nexttx; 876 877 SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q); 878 SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q); 879 880 last_txs = txs; 881 882 #if NBPFILTER > 0 883 /* 884 * Pass the packet to any BPF listeners. 885 */ 886 if (ifp->if_bpf) 887 bpf_mtap(ifp->if_bpf, m0); 888 #endif /* NBPFILTER > 0 */ 889 } 890 891 if (txs == NULL || sc->sc_txfree == 0) { 892 /* No more slots left; notify upper layer. */ 893 ifp->if_flags |= IFF_OACTIVE; 894 } 895 896 if (sc->sc_txfree != ofree) { 897 DPRINTF(sc, ("%s: packets enqueued, IC on %d, OWN on %d\n", 898 device_xname(&sc->sc_dev), lasttx, firsttx)); 899 /* 900 * Cause a transmit interrupt to happen on the 901 * last packet we enqueued. 902 */ 903 sc->sc_txdescs[lasttx].td_ctl |= htole32(TDCTL_Tx_IC); 904 TULIP_CDTXSYNC(sc, lasttx, 1, 905 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 906 907 /* 908 * Some clone chips want IC on the *first* segment in 909 * the packet. Appease them. 910 */ 911 KASSERT(last_txs != NULL); 912 if ((sc->sc_flags & TULIPF_IC_FS) != 0 && 913 last_txs->txs_firstdesc != lasttx) { 914 sc->sc_txdescs[last_txs->txs_firstdesc].td_ctl |= 915 htole32(TDCTL_Tx_IC); 916 TULIP_CDTXSYNC(sc, last_txs->txs_firstdesc, 1, 917 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 918 } 919 920 /* 921 * The entire packet chain is set up. Give the 922 * first descriptor to the chip now. 923 */ 924 sc->sc_txdescs[firsttx].td_status |= htole32(TDSTAT_OWN); 925 TULIP_CDTXSYNC(sc, firsttx, 1, 926 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 927 928 /* Wake up the transmitter. */ 929 /* XXX USE AUTOPOLLING? */ 930 TULIP_WRITE(sc, CSR_TXPOLL, TXPOLL_TPD); 931 932 /* Set a watchdog timer in case the chip flakes out. */ 933 ifp->if_timer = 5; 934 } 935 } 936 937 /* 938 * tlp_watchdog: [ifnet interface function] 939 * 940 * Watchdog timer handler. 941 */ 942 static void 943 tlp_watchdog(struct ifnet *ifp) 944 { 945 struct tulip_softc *sc = ifp->if_softc; 946 int doing_setup, doing_transmit; 947 948 doing_setup = (sc->sc_flags & TULIPF_DOING_SETUP); 949 doing_transmit = (! SIMPLEQ_EMPTY(&sc->sc_txdirtyq)); 950 951 if (doing_setup && doing_transmit) { 952 printf("%s: filter setup and transmit timeout\n", device_xname(&sc->sc_dev)); 953 ifp->if_oerrors++; 954 } else if (doing_transmit) { 955 printf("%s: transmit timeout\n", device_xname(&sc->sc_dev)); 956 ifp->if_oerrors++; 957 } else if (doing_setup) 958 printf("%s: filter setup timeout\n", device_xname(&sc->sc_dev)); 959 else 960 printf("%s: spurious watchdog timeout\n", device_xname(&sc->sc_dev)); 961 962 (void) tlp_init(ifp); 963 964 /* Try to get more packets going. */ 965 tlp_start(ifp); 966 } 967 968 /* 969 * tlp_ioctl: [ifnet interface function] 970 * 971 * Handle control requests from the operator. 972 */ 973 static int 974 tlp_ioctl(struct ifnet *ifp, u_long cmd, void *data) 975 { 976 struct tulip_softc *sc = ifp->if_softc; 977 struct ifreq *ifr = (struct ifreq *)data; 978 int s, error; 979 980 s = splnet(); 981 982 switch (cmd) { 983 case SIOCSIFMEDIA: 984 case SIOCGIFMEDIA: 985 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 986 break; 987 case SIOCSIFFLAGS: 988 /* If the interface is up and running, only modify the receive 989 * filter when setting promiscuous or debug mode. Otherwise 990 * fall through to ether_ioctl, which will reset the chip. 991 */ 992 #define RESETIGN (IFF_CANTCHANGE|IFF_DEBUG) 993 if (((ifp->if_flags & (IFF_UP|IFF_RUNNING)) 994 == (IFF_UP|IFF_RUNNING)) 995 && ((ifp->if_flags & (~RESETIGN)) 996 == (sc->sc_if_flags & (~RESETIGN)))) { 997 /* Set up the receive filter. */ 998 (*sc->sc_filter_setup)(sc); 999 error = 0; 1000 break; 1001 #undef RESETIGN 1002 } 1003 /* FALLTHROUGH */ 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 u_int32_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 u_int32_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 u_int32_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 u_int32_t reg; 1908 const u_int8_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 u_int32_t reg; 1926 const u_int8_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 u_int32_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 u_int32_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 u_int32_t miirom; 2215 u_int16_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 u_int8_t *romdata) 2350 { 2351 u_int32_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 u_int8_t *romdata) 2376 { 2377 int i; 2378 u_int16_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, u_int8_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, u_int8_t *enaddr) 2449 { 2450 static const u_int8_t testpat[] = 2451 { 0xff, 0, 0x55, 0xaa, 0xff, 0, 0x55, 0xaa }; 2452 int i; 2453 u_int32_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 = *(u_int16_t *) &enaddr[0]; 2546 2547 cksum <<= 1; 2548 if (cksum > 0xffff) 2549 cksum -= 0xffff; 2550 2551 cksum += *(u_int16_t *) &enaddr[2]; 2552 if (cksum > 0xffff) 2553 cksum -= 0xffff; 2554 2555 cksum <<= 1; 2556 if (cksum > 0xffff) 2557 cksum -= 0xffff; 2558 2559 cksum += *(u_int16_t *) &enaddr[4]; 2560 if (cksum >= 0xffff) 2561 cksum -= 0xffff; 2562 2563 if (cksum != *(u_int16_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 u_int32_t *sp; 2582 struct tulip_txsoft *txs; 2583 u_int8_t enaddr[ETHER_ADDR_LEN]; 2584 u_int32_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 u_int32_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 u_int32_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 u_int32_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, u_int32_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 u_int32_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(struct device *self) 3237 { 3238 struct tulip_softc *sc = (struct tulip_softc *)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(struct device *self) 3268 { 3269 struct tulip_softc *sc = (struct tulip_softc *)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(struct device *self) 3297 { 3298 struct tulip_softc *sc = (struct tulip_softc *)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(struct device *self, int phy, int reg) 3368 { 3369 struct tulip_softc *sc = (void *) 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(struct device *self, int phy, int reg, int val) 3381 { 3382 struct tulip_softc *sc = (void *) 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 u_int32_t 3393 tlp_sio_mii_bitbang_read(struct device *self) 3394 { 3395 struct tulip_softc *sc = (void *) 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(struct device *self, u_int32_t val) 3407 { 3408 struct tulip_softc *sc = (void *) 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(struct device *self, int phy, int reg) 3420 { 3421 struct tulip_softc *sc = (void *) self; 3422 u_int32_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(struct device *self, int phy, int reg, int val) 3451 { 3452 struct tulip_softc *sc = (void *) 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(struct device *self, int phy, int reg) 3492 { 3493 struct tulip_softc *sc = (struct tulip_softc *)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(struct device *self, int phy, int reg, int val) 3513 { 3514 struct tulip_softc *sc = (struct tulip_softc *)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 u_int8_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(u_int8_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 u_int8_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(u_int8_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 u_int8_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) printf("%s%s", sep, str); sep = ", " 4035 4036 printf("%s: ", device_xname(&sc->sc_dev)); 4037 for (ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 4038 ife != NULL; ife = TAILQ_NEXT(ife, ifm_list)) { 4039 tm = ife->ifm_aux; 4040 if (tm == NULL) { 4041 #ifdef DIAGNOSTIC 4042 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 4043 panic("tlp_print_media"); 4044 #endif 4045 PRINT("auto"); 4046 } else if (tm->tm_type != TULIP_ROM_MB_21140_MII && 4047 tm->tm_type != TULIP_ROM_MB_21142_MII) { 4048 PRINT(tm->tm_name); 4049 } 4050 } 4051 printf("\n"); 4052 4053 #undef PRINT 4054 } 4055 4056 static void 4057 tlp_nway_activate(struct tulip_softc *sc, int media) 4058 { 4059 struct ifmedia_entry *ife; 4060 4061 ife = ifmedia_match(&sc->sc_mii.mii_media, media, 0); 4062 #ifdef DIAGNOSTIC 4063 if (ife == NULL) 4064 panic("tlp_nway_activate"); 4065 #endif 4066 sc->sc_nway_active = ife; 4067 } 4068 4069 static void 4070 tlp_get_minst(struct tulip_softc *sc) 4071 { 4072 4073 if ((sc->sc_media_seen & 4074 ~((1 << TULIP_ROM_MB_21140_MII) | 4075 (1 << TULIP_ROM_MB_21142_MII))) == 0) { 4076 /* 4077 * We have not yet seen any SIA/SYM media (but are 4078 * about to; that's why we're called!), so assign 4079 * the current media instance to be the `internal media' 4080 * instance, and advance it so any MII media gets a 4081 * fresh one (used to selecting/isolating a PHY). 4082 */ 4083 sc->sc_tlp_minst = sc->sc_mii.mii_instance++; 4084 } 4085 } 4086 4087 /* 4088 * SIA Utility functions. 4089 */ 4090 static void tlp_sia_update_link(struct tulip_softc *); 4091 static void tlp_sia_get(struct tulip_softc *, struct ifmediareq *); 4092 static int tlp_sia_set(struct tulip_softc *); 4093 static int tlp_sia_media(struct tulip_softc *, struct ifmedia_entry *); 4094 static void tlp_sia_fixup(struct tulip_softc *); 4095 4096 static void 4097 tlp_sia_update_link(struct tulip_softc *sc) 4098 { 4099 struct ifmedia_entry *ife; 4100 struct tulip_21x4x_media *tm; 4101 u_int32_t siastat; 4102 4103 ife = TULIP_CURRENT_MEDIA(sc); 4104 tm = ife->ifm_aux; 4105 4106 sc->sc_flags &= ~(TULIPF_LINK_UP|TULIPF_LINK_VALID); 4107 4108 siastat = TULIP_READ(sc, CSR_SIASTAT); 4109 4110 /* 4111 * Note that when we do SIA link tests, we are assuming that 4112 * the chip is really in the mode that the current media setting 4113 * reflects. If we're not, then the link tests will not be 4114 * accurate! 4115 */ 4116 switch (IFM_SUBTYPE(ife->ifm_media)) { 4117 case IFM_10_T: 4118 sc->sc_flags |= TULIPF_LINK_VALID; 4119 if ((siastat & SIASTAT_LS10) == 0) 4120 sc->sc_flags |= TULIPF_LINK_UP; 4121 break; 4122 4123 case IFM_100_TX: 4124 case IFM_100_T4: 4125 sc->sc_flags |= TULIPF_LINK_VALID; 4126 if ((siastat & SIASTAT_LS100) == 0) 4127 sc->sc_flags |= TULIPF_LINK_UP; 4128 break; 4129 } 4130 4131 switch (sc->sc_chip) { 4132 case TULIP_CHIP_21142: 4133 case TULIP_CHIP_21143: 4134 /* 4135 * On these chips, we can tell more information about 4136 * AUI/BNC. Note that the AUI/BNC selection is made 4137 * in a different register; for our purpose, it's all 4138 * AUI. 4139 */ 4140 switch (IFM_SUBTYPE(ife->ifm_media)) { 4141 case IFM_10_2: 4142 case IFM_10_5: 4143 sc->sc_flags |= TULIPF_LINK_VALID; 4144 if (siastat & SIASTAT_ARA) { 4145 TULIP_WRITE(sc, CSR_SIASTAT, SIASTAT_ARA); 4146 sc->sc_flags |= TULIPF_LINK_UP; 4147 } 4148 break; 4149 4150 default: 4151 /* 4152 * If we're SYM media and can detect the link 4153 * via the GPIO facility, prefer that status 4154 * over LS100. 4155 */ 4156 if (tm->tm_type == TULIP_ROM_MB_21143_SYM && 4157 tm->tm_actmask != 0) { 4158 sc->sc_flags = (sc->sc_flags & 4159 ~TULIPF_LINK_UP) | TULIPF_LINK_VALID; 4160 if (TULIP_ISSET(sc, CSR_SIAGEN, 4161 tm->tm_actmask) == tm->tm_actdata) 4162 sc->sc_flags |= TULIPF_LINK_UP; 4163 } 4164 } 4165 break; 4166 4167 default: 4168 /* Nothing. */ 4169 break; 4170 } 4171 } 4172 4173 static void 4174 tlp_sia_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 4175 { 4176 struct ifmedia_entry *ife; 4177 4178 ifmr->ifm_status = 0; 4179 4180 tlp_sia_update_link(sc); 4181 4182 ife = TULIP_CURRENT_MEDIA(sc); 4183 4184 if (sc->sc_flags & TULIPF_LINK_VALID) 4185 ifmr->ifm_status |= IFM_AVALID; 4186 if (sc->sc_flags & TULIPF_LINK_UP) 4187 ifmr->ifm_status |= IFM_ACTIVE; 4188 ifmr->ifm_active = ife->ifm_media; 4189 } 4190 4191 static void 4192 tlp_sia_fixup(struct tulip_softc *sc) 4193 { 4194 struct ifmedia_entry *ife; 4195 struct tulip_21x4x_media *tm; 4196 u_int32_t siaconn, siatxrx, siagen; 4197 4198 switch (sc->sc_chip) { 4199 case TULIP_CHIP_82C115: 4200 case TULIP_CHIP_MX98713A: 4201 case TULIP_CHIP_MX98715: 4202 case TULIP_CHIP_MX98715A: 4203 case TULIP_CHIP_MX98715AEC_X: 4204 case TULIP_CHIP_MX98725: 4205 siaconn = PMAC_SIACONN_MASK; 4206 siatxrx = PMAC_SIATXRX_MASK; 4207 siagen = PMAC_SIAGEN_MASK; 4208 break; 4209 4210 default: 4211 /* No fixups required on any other chips. */ 4212 return; 4213 } 4214 4215 for (ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 4216 ife != NULL; ife = TAILQ_NEXT(ife, ifm_list)) { 4217 tm = ife->ifm_aux; 4218 if (tm == NULL) 4219 continue; 4220 4221 tm->tm_siaconn &= siaconn; 4222 tm->tm_siatxrx &= siatxrx; 4223 tm->tm_siagen &= siagen; 4224 } 4225 } 4226 4227 static int 4228 tlp_sia_set(struct tulip_softc *sc) 4229 { 4230 4231 return (tlp_sia_media(sc, TULIP_CURRENT_MEDIA(sc))); 4232 } 4233 4234 static int 4235 tlp_sia_media(struct tulip_softc *sc, struct ifmedia_entry *ife) 4236 { 4237 struct tulip_21x4x_media *tm; 4238 4239 tm = ife->ifm_aux; 4240 4241 /* 4242 * XXX This appears to be necessary on a bunch of the clone chips. 4243 */ 4244 delay(20000); 4245 4246 /* 4247 * Idle the chip. 4248 */ 4249 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4250 4251 /* 4252 * Program the SIA. It's important to write in this order, 4253 * resetting the SIA first. 4254 */ 4255 TULIP_WRITE(sc, CSR_SIACONN, 0); /* SRL bit clear */ 4256 delay(1000); 4257 4258 TULIP_WRITE(sc, CSR_SIATXRX, tm->tm_siatxrx); 4259 4260 switch (sc->sc_chip) { 4261 case TULIP_CHIP_21142: 4262 case TULIP_CHIP_21143: 4263 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpctl); 4264 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen | tm->tm_gpdata); 4265 break; 4266 default: 4267 TULIP_WRITE(sc, CSR_SIAGEN, tm->tm_siagen); 4268 } 4269 4270 TULIP_WRITE(sc, CSR_SIACONN, tm->tm_siaconn); 4271 4272 /* 4273 * Set the OPMODE bits for this media and write OPMODE. 4274 * This will resume the transmit and receive processes. 4275 */ 4276 sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode; 4277 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4278 4279 return (0); 4280 } 4281 4282 /* 4283 * 21140 GPIO utility functions. 4284 */ 4285 static void tlp_21140_gpio_update_link(struct tulip_softc *); 4286 4287 static void 4288 tlp_21140_gpio_update_link(struct tulip_softc *sc) 4289 { 4290 struct ifmedia_entry *ife; 4291 struct tulip_21x4x_media *tm; 4292 4293 ife = TULIP_CURRENT_MEDIA(sc); 4294 tm = ife->ifm_aux; 4295 4296 sc->sc_flags &= ~(TULIPF_LINK_UP|TULIPF_LINK_VALID); 4297 4298 if (tm->tm_actmask != 0) { 4299 sc->sc_flags |= TULIPF_LINK_VALID; 4300 if (TULIP_ISSET(sc, CSR_GPP, tm->tm_actmask) == 4301 tm->tm_actdata) 4302 sc->sc_flags |= TULIPF_LINK_UP; 4303 } 4304 } 4305 4306 void 4307 tlp_21140_gpio_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 4308 { 4309 struct ifmedia_entry *ife; 4310 4311 ifmr->ifm_status = 0; 4312 4313 tlp_21140_gpio_update_link(sc); 4314 4315 ife = TULIP_CURRENT_MEDIA(sc); 4316 4317 if (sc->sc_flags & TULIPF_LINK_VALID) 4318 ifmr->ifm_status |= IFM_AVALID; 4319 if (sc->sc_flags & TULIPF_LINK_UP) 4320 ifmr->ifm_status |= IFM_ACTIVE; 4321 ifmr->ifm_active = ife->ifm_media; 4322 } 4323 4324 int 4325 tlp_21140_gpio_set(struct tulip_softc *sc) 4326 { 4327 struct ifmedia_entry *ife; 4328 struct tulip_21x4x_media *tm; 4329 4330 ife = TULIP_CURRENT_MEDIA(sc); 4331 tm = ife->ifm_aux; 4332 4333 /* 4334 * Idle the chip. 4335 */ 4336 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 4337 4338 /* 4339 * Set the GPIO pins for this media, to flip any 4340 * relays, etc. 4341 */ 4342 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 4343 delay(10); 4344 TULIP_WRITE(sc, CSR_GPP, tm->tm_gpdata); 4345 4346 /* 4347 * Set the OPMODE bits for this media and write OPMODE. 4348 * This will resume the transmit and receive processes. 4349 */ 4350 sc->sc_opmode = (sc->sc_opmode & ~OPMODE_MEDIA_BITS) | tm->tm_opmode; 4351 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 4352 4353 return (0); 4354 } 4355 4356 /* 4357 * 21040 and 21041 media switches. 4358 */ 4359 static void tlp_21040_tmsw_init(struct tulip_softc *); 4360 static void tlp_21040_tp_tmsw_init(struct tulip_softc *); 4361 static void tlp_21040_auibnc_tmsw_init(struct tulip_softc *); 4362 static void tlp_21041_tmsw_init(struct tulip_softc *); 4363 4364 const struct tulip_mediasw tlp_21040_mediasw = { 4365 tlp_21040_tmsw_init, tlp_sia_get, tlp_sia_set 4366 }; 4367 4368 const struct tulip_mediasw tlp_21040_tp_mediasw = { 4369 tlp_21040_tp_tmsw_init, tlp_sia_get, tlp_sia_set 4370 }; 4371 4372 const struct tulip_mediasw tlp_21040_auibnc_mediasw = { 4373 tlp_21040_auibnc_tmsw_init, tlp_sia_get, tlp_sia_set 4374 }; 4375 4376 const struct tulip_mediasw tlp_21041_mediasw = { 4377 tlp_21041_tmsw_init, tlp_sia_get, tlp_sia_set 4378 }; 4379 4380 static void 4381 tlp_21040_tmsw_init(struct tulip_softc *sc) 4382 { 4383 static const u_int8_t media[] = { 4384 TULIP_ROM_MB_MEDIA_TP, 4385 TULIP_ROM_MB_MEDIA_TP_FDX, 4386 TULIP_ROM_MB_MEDIA_AUI, 4387 }; 4388 struct tulip_21x4x_media *tm; 4389 4390 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4391 tlp_mediastatus); 4392 4393 tlp_add_srom_media(sc, 0, NULL, NULL, media, 3); 4394 4395 /* 4396 * No SROM type for External SIA. 4397 */ 4398 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4399 tm->tm_name = "manual"; 4400 tm->tm_opmode = 0; 4401 tm->tm_siaconn = SIACONN_21040_EXTSIA; 4402 tm->tm_siatxrx = SIATXRX_21040_EXTSIA; 4403 tm->tm_siagen = SIAGEN_21040_EXTSIA; 4404 ifmedia_add(&sc->sc_mii.mii_media, 4405 IFM_MAKEWORD(IFM_ETHER, IFM_MANUAL, 0, sc->sc_tlp_minst), 0, tm); 4406 4407 /* 4408 * XXX Autosense not yet supported. 4409 */ 4410 4411 /* XXX This should be auto-sense. */ 4412 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4413 4414 tlp_print_media(sc); 4415 } 4416 4417 static void 4418 tlp_21040_tp_tmsw_init(struct tulip_softc *sc) 4419 { 4420 static const u_int8_t media[] = { 4421 TULIP_ROM_MB_MEDIA_TP, 4422 TULIP_ROM_MB_MEDIA_TP_FDX, 4423 }; 4424 4425 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4426 tlp_mediastatus); 4427 4428 tlp_add_srom_media(sc, 0, NULL, NULL, media, 2); 4429 4430 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4431 4432 tlp_print_media(sc); 4433 } 4434 4435 static void 4436 tlp_21040_auibnc_tmsw_init(struct tulip_softc *sc) 4437 { 4438 static const u_int8_t media[] = { 4439 TULIP_ROM_MB_MEDIA_AUI, 4440 }; 4441 4442 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4443 tlp_mediastatus); 4444 4445 tlp_add_srom_media(sc, 0, NULL, NULL, media, 1); 4446 4447 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_5); 4448 4449 tlp_print_media(sc); 4450 } 4451 4452 static void 4453 tlp_21041_tmsw_init(struct tulip_softc *sc) 4454 { 4455 static const u_int8_t media[] = { 4456 TULIP_ROM_MB_MEDIA_TP, 4457 TULIP_ROM_MB_MEDIA_TP_FDX, 4458 TULIP_ROM_MB_MEDIA_BNC, 4459 TULIP_ROM_MB_MEDIA_AUI, 4460 }; 4461 int i, defmedia, devcnt, leaf_offset, mb_offset, m_cnt; 4462 const struct tulip_srom_to_ifmedia *tsti; 4463 struct tulip_21x4x_media *tm; 4464 u_int16_t romdef; 4465 u_int8_t mb; 4466 4467 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 4468 tlp_mediastatus); 4469 4470 if (tlp_isv_srom(sc->sc_srom) == 0) { 4471 not_isv_srom: 4472 /* 4473 * If we have a board without the standard 21041 SROM format, 4474 * we just assume all media are present and try and pick a 4475 * reasonable default. 4476 */ 4477 tlp_add_srom_media(sc, 0, NULL, NULL, media, 4); 4478 4479 /* 4480 * XXX Autosense not yet supported. 4481 */ 4482 4483 /* XXX This should be auto-sense. */ 4484 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 4485 4486 tlp_print_media(sc); 4487 return; 4488 } 4489 4490 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 4491 for (i = 0; i < devcnt; i++) { 4492 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 4493 break; 4494 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 4495 sc->sc_devno) 4496 break; 4497 } 4498 4499 if (i == devcnt) 4500 goto not_isv_srom; 4501 4502 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 4503 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 4504 mb_offset = leaf_offset + TULIP_ROM_IL_MEDIAn_BLOCK_BASE; 4505 m_cnt = sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 4506 4507 for (; m_cnt != 0; 4508 m_cnt--, mb_offset += TULIP_ROM_MB_SIZE(mb)) { 4509 mb = sc->sc_srom[mb_offset]; 4510 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4511 switch (mb & TULIP_ROM_MB_MEDIA_CODE) { 4512 case TULIP_ROM_MB_MEDIA_TP_FDX: 4513 case TULIP_ROM_MB_MEDIA_TP: 4514 case TULIP_ROM_MB_MEDIA_BNC: 4515 case TULIP_ROM_MB_MEDIA_AUI: 4516 tsti = tlp_srom_to_ifmedia(mb & 4517 TULIP_ROM_MB_MEDIA_CODE); 4518 4519 tlp_srom_media_info(sc, tsti, tm); 4520 4521 /* 4522 * Override our default SIA settings if the 4523 * SROM contains its own. 4524 */ 4525 if (mb & TULIP_ROM_MB_EXT) { 4526 tm->tm_siaconn = TULIP_ROM_GETW(sc->sc_srom, 4527 mb_offset + TULIP_ROM_MB_CSR13); 4528 tm->tm_siatxrx = TULIP_ROM_GETW(sc->sc_srom, 4529 mb_offset + TULIP_ROM_MB_CSR14); 4530 tm->tm_siagen = TULIP_ROM_GETW(sc->sc_srom, 4531 mb_offset + TULIP_ROM_MB_CSR15); 4532 } 4533 4534 ifmedia_add(&sc->sc_mii.mii_media, 4535 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4536 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4537 break; 4538 4539 default: 4540 printf("%s: unknown media code 0x%02x\n", 4541 device_xname(&sc->sc_dev), 4542 mb & TULIP_ROM_MB_MEDIA_CODE); 4543 free(tm, M_DEVBUF); 4544 } 4545 } 4546 4547 /* 4548 * XXX Autosense not yet supported. 4549 */ 4550 4551 romdef = TULIP_ROM_GETW(sc->sc_srom, leaf_offset + 4552 TULIP_ROM_IL_SELECT_CONN_TYPE); 4553 switch (romdef) { 4554 case SELECT_CONN_TYPE_TP: 4555 case SELECT_CONN_TYPE_TP_AUTONEG: 4556 case SELECT_CONN_TYPE_TP_NOLINKPASS: 4557 defmedia = IFM_ETHER|IFM_10_T; 4558 break; 4559 4560 case SELECT_CONN_TYPE_TP_FDX: 4561 defmedia = IFM_ETHER|IFM_10_T|IFM_FDX; 4562 break; 4563 4564 case SELECT_CONN_TYPE_BNC: 4565 defmedia = IFM_ETHER|IFM_10_2; 4566 break; 4567 4568 case SELECT_CONN_TYPE_AUI: 4569 defmedia = IFM_ETHER|IFM_10_5; 4570 break; 4571 #if 0 /* XXX */ 4572 case SELECT_CONN_TYPE_ASENSE: 4573 case SELECT_CONN_TYPE_ASENSE_AUTONEG: 4574 defmedia = IFM_ETHER|IFM_AUTO; 4575 break; 4576 #endif 4577 default: 4578 defmedia = 0; 4579 } 4580 4581 if (defmedia == 0) { 4582 /* 4583 * XXX We should default to auto-sense. 4584 */ 4585 defmedia = IFM_ETHER|IFM_10_T; 4586 } 4587 4588 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 4589 4590 tlp_print_media(sc); 4591 } 4592 4593 /* 4594 * DECchip 2114x ISV media switch. 4595 */ 4596 static void tlp_2114x_isv_tmsw_init(struct tulip_softc *); 4597 static void tlp_2114x_isv_tmsw_get(struct tulip_softc *, 4598 struct ifmediareq *); 4599 static int tlp_2114x_isv_tmsw_set(struct tulip_softc *); 4600 4601 const struct tulip_mediasw tlp_2114x_isv_mediasw = { 4602 tlp_2114x_isv_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set 4603 }; 4604 4605 static void tlp_2114x_nway_get(struct tulip_softc *, struct ifmediareq *); 4606 static int tlp_2114x_nway_set(struct tulip_softc *); 4607 4608 static void tlp_2114x_nway_statchg(struct device *); 4609 static int tlp_2114x_nway_service(struct tulip_softc *, int); 4610 static void tlp_2114x_nway_auto(struct tulip_softc *); 4611 static void tlp_2114x_nway_status(struct tulip_softc *); 4612 4613 static void 4614 tlp_2114x_isv_tmsw_init(struct tulip_softc *sc) 4615 { 4616 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 4617 struct ifmedia_entry *ife; 4618 struct mii_softc *phy; 4619 struct tulip_21x4x_media *tm; 4620 const struct tulip_srom_to_ifmedia *tsti; 4621 int i, devcnt, leaf_offset, m_cnt, type, length; 4622 int defmedia, miidef; 4623 u_int16_t word; 4624 u_int8_t *cp, *ncp; 4625 4626 defmedia = miidef = 0; 4627 4628 sc->sc_mii.mii_ifp = ifp; 4629 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 4630 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 4631 sc->sc_mii.mii_statchg = sc->sc_statchg; 4632 4633 /* 4634 * Ignore `instance'; we may get a mixture of SIA and MII 4635 * media, and `instance' is used to isolate or select the 4636 * PHY on the MII as appropriate. Note that duplicate media 4637 * are disallowed, so ignoring `instance' is safe. 4638 */ 4639 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, tlp_mediachange, 4640 tlp_mediastatus); 4641 4642 devcnt = sc->sc_srom[TULIP_ROM_CHIP_COUNT]; 4643 for (i = 0; i < devcnt; i++) { 4644 if (sc->sc_srom[TULIP_ROM_CHIP_COUNT] == 1) 4645 break; 4646 if (sc->sc_srom[TULIP_ROM_CHIPn_DEVICE_NUMBER(i)] == 4647 sc->sc_devno) 4648 break; 4649 } 4650 4651 if (i == devcnt) { 4652 aprint_error_dev(&sc->sc_dev, "unable to locate info leaf in SROM\n"); 4653 return; 4654 } 4655 4656 leaf_offset = TULIP_ROM_GETW(sc->sc_srom, 4657 TULIP_ROM_CHIPn_INFO_LEAF_OFFSET(i)); 4658 4659 /* XXX SELECT CONN TYPE */ 4660 4661 cp = &sc->sc_srom[leaf_offset + TULIP_ROM_IL_MEDIA_COUNT]; 4662 4663 /* 4664 * On some chips, the first thing in the Info Leaf is the 4665 * GPIO pin direction data. 4666 */ 4667 switch (sc->sc_chip) { 4668 case TULIP_CHIP_21140: 4669 case TULIP_CHIP_21140A: 4670 case TULIP_CHIP_MX98713: 4671 case TULIP_CHIP_AX88140: 4672 case TULIP_CHIP_AX88141: 4673 sc->sc_gp_dir = *cp++; 4674 break; 4675 4676 default: 4677 /* Nothing. */ 4678 break; 4679 } 4680 4681 /* Get the media count. */ 4682 m_cnt = *cp++; 4683 4684 if (m_cnt == 0) { 4685 sc->sc_mediasw = &tlp_sio_mii_mediasw; 4686 (*sc->sc_mediasw->tmsw_init)(sc); 4687 return; 4688 } 4689 4690 for (; m_cnt != 0; cp = ncp, m_cnt--) { 4691 /* 4692 * Determine the type and length of this media block. 4693 * The 21143 is spec'd to always use extended format blocks, 4694 * but some cards don't set the bit to indicate this. 4695 * Hopefully there are no cards which really don't use 4696 * extended format blocks. 4697 */ 4698 if ((*cp & 0x80) == 0 && sc->sc_chip != TULIP_CHIP_21143) { 4699 length = 4; 4700 type = TULIP_ROM_MB_21140_GPR; 4701 } else { 4702 length = (*cp++ & 0x7f) - 1; 4703 type = *cp++ & 0x3f; 4704 } 4705 4706 /* Compute the start of the next block. */ 4707 ncp = cp + length; 4708 4709 /* Now, parse the block. */ 4710 switch (type) { 4711 case TULIP_ROM_MB_21140_GPR: 4712 tlp_get_minst(sc); 4713 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_GPR; 4714 4715 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4716 4717 tm->tm_type = TULIP_ROM_MB_21140_GPR; 4718 tm->tm_get = tlp_21140_gpio_get; 4719 tm->tm_set = tlp_21140_gpio_set; 4720 4721 /* First is the media type code. */ 4722 tsti = tlp_srom_to_ifmedia(cp[0] & 4723 TULIP_ROM_MB_MEDIA_CODE); 4724 if (tsti == NULL) { 4725 /* Invalid media code. */ 4726 free(tm, M_DEVBUF); 4727 break; 4728 } 4729 4730 /* Get defaults. */ 4731 tlp_srom_media_info(sc, tsti, tm); 4732 4733 /* Next is any GPIO info for this media. */ 4734 tm->tm_gpdata = cp[1]; 4735 4736 /* 4737 * Next is a word containing OPMODE information 4738 * and info on how to detect if this media is 4739 * active. 4740 */ 4741 word = TULIP_ROM_GETW(cp, 2); 4742 tm->tm_opmode &= OPMODE_FD; 4743 tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word); 4744 if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) { 4745 tm->tm_actmask = 4746 TULIP_ROM_MB_BITPOS(word); 4747 tm->tm_actdata = 4748 (word & TULIP_ROM_MB_POLARITY) ? 4749 0 : tm->tm_actmask; 4750 } 4751 4752 ifmedia_add(&sc->sc_mii.mii_media, 4753 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4754 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4755 break; 4756 4757 case TULIP_ROM_MB_21140_MII: 4758 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21140_MII; 4759 4760 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4761 4762 tm->tm_type = TULIP_ROM_MB_21140_MII; 4763 tm->tm_get = tlp_mii_getmedia; 4764 tm->tm_set = tlp_mii_setmedia; 4765 tm->tm_opmode = OPMODE_PS; 4766 4767 if (sc->sc_reset == NULL) 4768 sc->sc_reset = tlp_21140_reset; 4769 4770 /* First is the PHY number. */ 4771 tm->tm_phyno = *cp++; 4772 4773 /* Next is the MII select sequence length and offset. */ 4774 tm->tm_gp_length = *cp++; 4775 tm->tm_gp_offset = cp - &sc->sc_srom[0]; 4776 cp += tm->tm_gp_length; 4777 4778 /* Next is the MII reset sequence length and offset. */ 4779 tm->tm_reset_length = *cp++; 4780 tm->tm_reset_offset = cp - &sc->sc_srom[0]; 4781 cp += tm->tm_reset_length; 4782 4783 /* 4784 * The following items are left in the media block 4785 * that we don't particularly care about: 4786 * 4787 * capabilities W 4788 * advertisement W 4789 * full duplex W 4790 * tx threshold W 4791 * 4792 * These appear to be bits in the PHY registers, 4793 * which our MII code handles on its own. 4794 */ 4795 4796 /* 4797 * Before we probe the MII bus, we need to reset 4798 * it and issue the selection sequence. 4799 */ 4800 4801 /* Set the direction of the pins... */ 4802 TULIP_WRITE(sc, CSR_GPP, GPP_GPC|sc->sc_gp_dir); 4803 4804 for (i = 0; i < tm->tm_reset_length; i++) { 4805 delay(10); 4806 TULIP_WRITE(sc, CSR_GPP, 4807 sc->sc_srom[tm->tm_reset_offset + i]); 4808 } 4809 4810 for (i = 0; i < tm->tm_gp_length; i++) { 4811 delay(10); 4812 TULIP_WRITE(sc, CSR_GPP, 4813 sc->sc_srom[tm->tm_gp_offset + i]); 4814 } 4815 4816 /* If there were no sequences, just lower the pins. */ 4817 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 4818 delay(10); 4819 TULIP_WRITE(sc, CSR_GPP, 0); 4820 } 4821 4822 /* 4823 * Now, probe the MII for the PHY. Note, we know 4824 * the location of the PHY on the bus, but we don't 4825 * particularly care; the MII code just likes to 4826 * search the whole thing anyhow. 4827 */ 4828 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, 4829 MII_PHY_ANY, tm->tm_phyno, 0); 4830 4831 /* 4832 * Now, search for the PHY we hopefully just 4833 * configured. If it's not configured into the 4834 * kernel, we lose. The PHY's default media always 4835 * takes priority. 4836 */ 4837 for (phy = LIST_FIRST(&sc->sc_mii.mii_phys); 4838 phy != NULL; 4839 phy = LIST_NEXT(phy, mii_list)) 4840 if (phy->mii_offset == tm->tm_phyno) 4841 break; 4842 if (phy == NULL) { 4843 aprint_error_dev(&sc->sc_dev, "unable to configure MII\n"); 4844 break; 4845 } 4846 4847 sc->sc_flags |= TULIPF_HAS_MII; 4848 sc->sc_tick = tlp_mii_tick; 4849 miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 4850 phy->mii_inst); 4851 4852 /* 4853 * Okay, now that we've found the PHY and the MII 4854 * layer has added all of the media associated 4855 * with that PHY, we need to traverse the media 4856 * list, and add our `tm' to each entry's `aux' 4857 * pointer. 4858 * 4859 * We do this by looking for media with our 4860 * PHY's `instance'. 4861 */ 4862 for (ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 4863 ife != NULL; 4864 ife = TAILQ_NEXT(ife, ifm_list)) { 4865 if (IFM_INST(ife->ifm_media) != phy->mii_inst) 4866 continue; 4867 ife->ifm_aux = tm; 4868 } 4869 break; 4870 4871 case TULIP_ROM_MB_21142_SIA: 4872 tlp_get_minst(sc); 4873 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_SIA; 4874 4875 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4876 4877 tm->tm_type = TULIP_ROM_MB_21142_SIA; 4878 tm->tm_get = tlp_sia_get; 4879 tm->tm_set = tlp_sia_set; 4880 4881 /* First is the media type code. */ 4882 tsti = tlp_srom_to_ifmedia(cp[0] & 4883 TULIP_ROM_MB_MEDIA_CODE); 4884 if (tsti == NULL) { 4885 /* Invalid media code. */ 4886 free(tm, M_DEVBUF); 4887 break; 4888 } 4889 4890 /* Get defaults. */ 4891 tlp_srom_media_info(sc, tsti, tm); 4892 4893 /* 4894 * Override our default SIA settings if the 4895 * SROM contains its own. 4896 */ 4897 if (cp[0] & 0x40) { 4898 tm->tm_siaconn = TULIP_ROM_GETW(cp, 1); 4899 tm->tm_siatxrx = TULIP_ROM_GETW(cp, 3); 4900 tm->tm_siagen = TULIP_ROM_GETW(cp, 5); 4901 cp += 7; 4902 } else 4903 cp++; 4904 4905 /* Next is GPIO control/data. */ 4906 tm->tm_gpctl = TULIP_ROM_GETW(cp, 0) << 16; 4907 tm->tm_gpdata = TULIP_ROM_GETW(cp, 2) << 16; 4908 4909 ifmedia_add(&sc->sc_mii.mii_media, 4910 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 4911 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 4912 break; 4913 4914 case TULIP_ROM_MB_21142_MII: 4915 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21142_MII; 4916 4917 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 4918 4919 tm->tm_type = TULIP_ROM_MB_21142_MII; 4920 tm->tm_get = tlp_mii_getmedia; 4921 tm->tm_set = tlp_mii_setmedia; 4922 tm->tm_opmode = OPMODE_PS; 4923 4924 if (sc->sc_reset == NULL) 4925 sc->sc_reset = tlp_21142_reset; 4926 4927 /* First is the PHY number. */ 4928 tm->tm_phyno = *cp++; 4929 4930 /* Next is the MII select sequence length and offset. */ 4931 tm->tm_gp_length = *cp++; 4932 tm->tm_gp_offset = cp - &sc->sc_srom[0]; 4933 cp += tm->tm_gp_length * 2; 4934 4935 /* Next is the MII reset sequence length and offset. */ 4936 tm->tm_reset_length = *cp++; 4937 tm->tm_reset_offset = cp - &sc->sc_srom[0]; 4938 cp += tm->tm_reset_length * 2; 4939 4940 /* 4941 * The following items are left in the media block 4942 * that we don't particularly care about: 4943 * 4944 * capabilities W 4945 * advertisement W 4946 * full duplex W 4947 * tx threshold W 4948 * MII interrupt W 4949 * 4950 * These appear to be bits in the PHY registers, 4951 * which our MII code handles on its own. 4952 */ 4953 4954 /* 4955 * Before we probe the MII bus, we need to reset 4956 * it and issue the selection sequence. 4957 */ 4958 4959 cp = &sc->sc_srom[tm->tm_reset_offset]; 4960 for (i = 0; i < tm->tm_reset_length; i++, cp += 2) { 4961 delay(10); 4962 TULIP_WRITE(sc, CSR_SIAGEN, 4963 TULIP_ROM_GETW(cp, 0) << 16); 4964 } 4965 4966 cp = &sc->sc_srom[tm->tm_gp_offset]; 4967 for (i = 0; i < tm->tm_gp_length; i++, cp += 2) { 4968 delay(10); 4969 TULIP_WRITE(sc, CSR_SIAGEN, 4970 TULIP_ROM_GETW(cp, 0) << 16); 4971 } 4972 4973 /* If there were no sequences, just lower the pins. */ 4974 if (tm->tm_reset_length == 0 && tm->tm_gp_length == 0) { 4975 delay(10); 4976 TULIP_WRITE(sc, CSR_SIAGEN, 0); 4977 } 4978 4979 /* 4980 * Now, probe the MII for the PHY. Note, we know 4981 * the location of the PHY on the bus, but we don't 4982 * particularly care; the MII code just likes to 4983 * search the whole thing anyhow. 4984 */ 4985 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, 4986 MII_PHY_ANY, tm->tm_phyno, 0); 4987 4988 /* 4989 * Now, search for the PHY we hopefully just 4990 * configured. If it's not configured into the 4991 * kernel, we lose. The PHY's default media always 4992 * takes priority. 4993 */ 4994 for (phy = LIST_FIRST(&sc->sc_mii.mii_phys); 4995 phy != NULL; 4996 phy = LIST_NEXT(phy, mii_list)) 4997 if (phy->mii_offset == tm->tm_phyno) 4998 break; 4999 if (phy == NULL) { 5000 aprint_error_dev(&sc->sc_dev, "unable to configure MII\n"); 5001 break; 5002 } 5003 5004 sc->sc_flags |= TULIPF_HAS_MII; 5005 sc->sc_tick = tlp_mii_tick; 5006 miidef = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 5007 phy->mii_inst); 5008 5009 /* 5010 * Okay, now that we've found the PHY and the MII 5011 * layer has added all of the media associated 5012 * with that PHY, we need to traverse the media 5013 * list, and add our `tm' to each entry's `aux' 5014 * pointer. 5015 * 5016 * We do this by looking for media with our 5017 * PHY's `instance'. 5018 */ 5019 for (ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 5020 ife != NULL; 5021 ife = TAILQ_NEXT(ife, ifm_list)) { 5022 if (IFM_INST(ife->ifm_media) != phy->mii_inst) 5023 continue; 5024 ife->ifm_aux = tm; 5025 } 5026 break; 5027 5028 case TULIP_ROM_MB_21143_SYM: 5029 tlp_get_minst(sc); 5030 sc->sc_media_seen |= 1 << TULIP_ROM_MB_21143_SYM; 5031 5032 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5033 5034 tm->tm_type = TULIP_ROM_MB_21143_SYM; 5035 tm->tm_get = tlp_sia_get; 5036 tm->tm_set = tlp_sia_set; 5037 5038 /* First is the media type code. */ 5039 tsti = tlp_srom_to_ifmedia(cp[0] & 5040 TULIP_ROM_MB_MEDIA_CODE); 5041 if (tsti == NULL) { 5042 /* Invalid media code. */ 5043 free(tm, M_DEVBUF); 5044 break; 5045 } 5046 5047 /* Get defaults. */ 5048 tlp_srom_media_info(sc, tsti, tm); 5049 5050 /* Next is GPIO control/data. */ 5051 tm->tm_gpctl = TULIP_ROM_GETW(cp, 1) << 16; 5052 tm->tm_gpdata = TULIP_ROM_GETW(cp, 3) << 16; 5053 5054 /* 5055 * Next is a word containing OPMODE information 5056 * and info on how to detect if this media is 5057 * active. 5058 */ 5059 word = TULIP_ROM_GETW(cp, 5); 5060 tm->tm_opmode &= OPMODE_FD; 5061 tm->tm_opmode |= TULIP_ROM_MB_OPMODE(word); 5062 if ((word & TULIP_ROM_MB_NOINDICATOR) == 0) { 5063 tm->tm_actmask = 5064 TULIP_ROM_MB_BITPOS(word); 5065 tm->tm_actdata = 5066 (word & TULIP_ROM_MB_POLARITY) ? 5067 0 : tm->tm_actmask; 5068 } 5069 5070 ifmedia_add(&sc->sc_mii.mii_media, 5071 IFM_MAKEWORD(IFM_ETHER, tsti->tsti_subtype, 5072 tsti->tsti_options, sc->sc_tlp_minst), 0, tm); 5073 break; 5074 5075 case TULIP_ROM_MB_21143_RESET: 5076 printf("%s: 21143 reset block\n", device_xname(&sc->sc_dev)); 5077 break; 5078 5079 default: 5080 printf("%s: unknown ISV media block type 0x%02x\n", 5081 device_xname(&sc->sc_dev), type); 5082 } 5083 } 5084 5085 /* 5086 * Deal with the case where no media is configured. 5087 */ 5088 if (TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list) == NULL) { 5089 printf("%s: no media found!\n", device_xname(&sc->sc_dev)); 5090 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5091 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5092 return; 5093 } 5094 5095 /* 5096 * Pick the default media. 5097 */ 5098 if (miidef != 0) 5099 defmedia = miidef; 5100 else { 5101 switch (sc->sc_chip) { 5102 case TULIP_CHIP_21140: 5103 case TULIP_CHIP_21140A: 5104 /* XXX should come from SROM */ 5105 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0); 5106 if (ifmedia_match(&sc->sc_mii.mii_media, defmedia, 5107 sc->sc_mii.mii_media.ifm_mask) == NULL) { 5108 /* 5109 * There is not a 10baseT media. 5110 * Fall back to the first found one. 5111 */ 5112 ife = TAILQ_FIRST(&sc->sc_mii.mii_media.ifm_list); 5113 defmedia = ife->ifm_media; 5114 } 5115 break; 5116 5117 case TULIP_CHIP_21142: 5118 case TULIP_CHIP_21143: 5119 case TULIP_CHIP_MX98713A: 5120 case TULIP_CHIP_MX98715: 5121 case TULIP_CHIP_MX98715A: 5122 case TULIP_CHIP_MX98715AEC_X: 5123 case TULIP_CHIP_MX98725: 5124 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5125 tm->tm_name = "auto"; 5126 tm->tm_get = tlp_2114x_nway_get; 5127 tm->tm_set = tlp_2114x_nway_set; 5128 5129 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0); 5130 ifmedia_add(&sc->sc_mii.mii_media, defmedia, 0, tm); 5131 5132 sc->sc_statchg = tlp_2114x_nway_statchg; 5133 sc->sc_tick = tlp_2114x_nway_tick; 5134 break; 5135 5136 default: 5137 defmedia = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0); 5138 break; 5139 } 5140 } 5141 5142 ifmedia_set(&sc->sc_mii.mii_media, defmedia); 5143 5144 /* 5145 * Display any non-MII media we've located. 5146 */ 5147 if (sc->sc_media_seen & 5148 ~((1 << TULIP_ROM_MB_21140_MII) | (1 << TULIP_ROM_MB_21142_MII))) 5149 tlp_print_media(sc); 5150 5151 tlp_sia_fixup(sc); 5152 } 5153 5154 static void 5155 tlp_2114x_nway_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5156 { 5157 5158 (void) tlp_2114x_nway_service(sc, MII_POLLSTAT); 5159 ifmr->ifm_status = sc->sc_mii.mii_media_status; 5160 ifmr->ifm_active = sc->sc_mii.mii_media_active; 5161 } 5162 5163 static int 5164 tlp_2114x_nway_set(struct tulip_softc *sc) 5165 { 5166 5167 return (tlp_2114x_nway_service(sc, MII_MEDIACHG)); 5168 } 5169 5170 static void 5171 tlp_2114x_nway_statchg(struct device *self) 5172 { 5173 struct tulip_softc *sc = (struct tulip_softc *)self; 5174 struct mii_data *mii = &sc->sc_mii; 5175 struct ifmedia_entry *ife; 5176 5177 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE) 5178 return; 5179 5180 if ((ife = ifmedia_match(&mii->mii_media, mii->mii_media_active, 5181 mii->mii_media.ifm_mask)) == NULL) { 5182 printf("tlp_2114x_nway_statchg: no match for media 0x%x/0x%x\n", 5183 mii->mii_media_active, ~mii->mii_media.ifm_mask); 5184 panic("tlp_2114x_nway_statchg"); 5185 } 5186 5187 tlp_sia_media(sc, ife); 5188 } 5189 5190 static void 5191 tlp_2114x_nway_tick(void *arg) 5192 { 5193 struct tulip_softc *sc = arg; 5194 struct mii_data *mii = &sc->sc_mii; 5195 int s, ticks; 5196 5197 if (!device_is_active(&sc->sc_dev)) 5198 return; 5199 5200 s = splnet(); 5201 tlp_2114x_nway_service(sc, MII_TICK); 5202 if ((sc->sc_flags & TULIPF_LINK_UP) == 0 && 5203 (mii->mii_media_status & IFM_ACTIVE) != 0 && 5204 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { 5205 sc->sc_flags |= TULIPF_LINK_UP; 5206 tlp_start(&sc->sc_ethercom.ec_if); 5207 } else if ((sc->sc_flags & TULIPF_LINK_UP) != 0 && 5208 (mii->mii_media_status & IFM_ACTIVE) == 0) { 5209 sc->sc_flags &= ~TULIPF_LINK_UP; 5210 } 5211 splx(s); 5212 5213 if ((sc->sc_flags & TULIPF_LINK_UP) == 0) 5214 ticks = hz >> 3; 5215 else 5216 ticks = hz; 5217 callout_reset(&sc->sc_tick_callout, ticks, tlp_2114x_nway_tick, sc); 5218 } 5219 5220 /* 5221 * Support for the 2114X internal NWay block. This is constructed 5222 * somewhat like a PHY driver for simplicity. 5223 */ 5224 5225 static int 5226 tlp_2114x_nway_service(struct tulip_softc *sc, int cmd) 5227 { 5228 struct mii_data *mii = &sc->sc_mii; 5229 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5230 5231 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5232 return (0); 5233 5234 switch (cmd) { 5235 case MII_POLLSTAT: 5236 /* Nothing special to do here. */ 5237 break; 5238 5239 case MII_MEDIACHG: 5240 switch (IFM_SUBTYPE(ife->ifm_media)) { 5241 case IFM_AUTO: 5242 goto restart; 5243 default: 5244 /* Manual setting doesn't go through here. */ 5245 printf("tlp_2114x_nway_service: oops!\n"); 5246 return (EINVAL); 5247 } 5248 break; 5249 5250 case MII_TICK: 5251 /* 5252 * Only used for autonegotiation. 5253 */ 5254 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 5255 break; 5256 5257 /* 5258 * Check to see if we have link. If we do, we don't 5259 * need to restart the autonegotiation process. 5260 */ 5261 #if 0 5262 if (mii->mii_media_status & IFM_ACTIVE) 5263 #else 5264 if (sc->sc_flags & TULIPF_LINK_UP) 5265 #endif 5266 break; 5267 5268 /* 5269 * Only retry autonegotiation every 5 seconds. 5270 */ 5271 if (++sc->sc_nway_ticks != (5 << 3)) 5272 break; 5273 5274 restart: 5275 sc->sc_nway_ticks = 0; 5276 ife->ifm_data = IFM_NONE; 5277 tlp_2114x_nway_auto(sc); 5278 break; 5279 } 5280 5281 /* Update the media status. */ 5282 tlp_2114x_nway_status(sc); 5283 5284 /* 5285 * Callback if something changed. Manually configuration goes through 5286 * tlp_sia_set() anyway, so ignore that here. 5287 */ 5288 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO && 5289 ife->ifm_data != mii->mii_media_active) { 5290 (*sc->sc_statchg)(&sc->sc_dev); 5291 ife->ifm_data = mii->mii_media_active; 5292 } 5293 return (0); 5294 } 5295 5296 static void 5297 tlp_2114x_nway_auto(struct tulip_softc *sc) 5298 { 5299 uint32_t siastat, siatxrx; 5300 5301 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 5302 5303 sc->sc_opmode &= ~(OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_FD); 5304 sc->sc_opmode |= OPMODE_TTM|OPMODE_HBD; 5305 siatxrx = 0xffbf; /* XXX magic number */ 5306 5307 /* Compute the link code word to advertise. */ 5308 if (sc->sc_sia_cap & BMSR_100T4) 5309 siatxrx |= SIATXRX_T4; 5310 if (sc->sc_sia_cap & BMSR_100TXFDX) 5311 siatxrx |= SIATXRX_TXF; 5312 if (sc->sc_sia_cap & BMSR_100TXHDX) 5313 siatxrx |= SIATXRX_THX; 5314 if (sc->sc_sia_cap & BMSR_10TFDX) 5315 sc->sc_opmode |= OPMODE_FD; 5316 if (sc->sc_sia_cap & BMSR_10THDX) 5317 siatxrx |= SIATXRX_TH; 5318 5319 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 5320 5321 TULIP_WRITE(sc, CSR_SIACONN, 0); 5322 delay(1000); 5323 TULIP_WRITE(sc, CSR_SIATXRX, siatxrx); 5324 TULIP_WRITE(sc, CSR_SIACONN, SIACONN_SRL); 5325 5326 siastat = TULIP_READ(sc, CSR_SIASTAT); 5327 siastat &= ~(SIASTAT_ANS|SIASTAT_LPC|SIASTAT_TRA|SIASTAT_ARA| 5328 SIASTAT_LS100|SIASTAT_LS10|SIASTAT_MRA); 5329 siastat |= SIASTAT_ANS_TXDIS; 5330 TULIP_WRITE(sc, CSR_SIASTAT, siastat); 5331 } 5332 5333 static void 5334 tlp_2114x_nway_status(struct tulip_softc *sc) 5335 { 5336 struct mii_data *mii = &sc->sc_mii; 5337 uint32_t siatxrx, siastat, anlpar; 5338 5339 mii->mii_media_status = IFM_AVALID; 5340 mii->mii_media_active = IFM_ETHER; 5341 5342 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5343 return; 5344 5345 siastat = TULIP_READ(sc, CSR_SIASTAT); 5346 siatxrx = TULIP_READ(sc, CSR_SIATXRX); 5347 5348 if (siatxrx & SIATXRX_ANE) { 5349 if ((siastat & SIASTAT_ANS) != SIASTAT_ANS_FLPGOOD) { 5350 /* Erg, still trying, I guess... */ 5351 mii->mii_media_active |= IFM_NONE; 5352 return; 5353 } 5354 5355 if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100)) 5356 mii->mii_media_status |= IFM_ACTIVE; 5357 5358 if (siastat & SIASTAT_LPN) { 5359 anlpar = SIASTAT_GETLPC(siastat); 5360 if (anlpar & ANLPAR_T4 && 5361 sc->sc_sia_cap & BMSR_100T4) 5362 mii->mii_media_active |= IFM_100_T4; 5363 else if (anlpar & ANLPAR_TX_FD && 5364 sc->sc_sia_cap & BMSR_100TXFDX) 5365 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 5366 else if (anlpar & ANLPAR_TX && 5367 sc->sc_sia_cap & BMSR_100TXHDX) 5368 mii->mii_media_active |= IFM_100_TX; 5369 else if (anlpar & ANLPAR_10_FD && 5370 sc->sc_sia_cap & BMSR_10TFDX) 5371 mii->mii_media_active |= IFM_10_T|IFM_FDX; 5372 else if (anlpar & ANLPAR_10 && 5373 sc->sc_sia_cap & BMSR_10THDX) 5374 mii->mii_media_active |= IFM_10_T; 5375 else 5376 mii->mii_media_active |= IFM_NONE; 5377 } else { 5378 /* 5379 * If the other side doesn't support NWAY, then the 5380 * best we can do is determine if we have a 10Mbps or 5381 * 100Mbps link. There's no way to know if the link 5382 * is full or half duplex, so we default to half duplex 5383 * and hope that the user is clever enough to manually 5384 * change the media settings if we're wrong. 5385 */ 5386 if ((siastat & SIASTAT_LS100) == 0) 5387 mii->mii_media_active |= IFM_100_TX; 5388 else if ((siastat & SIASTAT_LS10) == 0) 5389 mii->mii_media_active |= IFM_10_T; 5390 else 5391 mii->mii_media_active |= IFM_NONE; 5392 } 5393 } else { 5394 if (~siastat & (SIASTAT_LS10 | SIASTAT_LS100)) 5395 mii->mii_media_status |= IFM_ACTIVE; 5396 5397 if (sc->sc_opmode & OPMODE_TTM) 5398 mii->mii_media_active |= IFM_10_T; 5399 else 5400 mii->mii_media_active |= IFM_100_TX; 5401 if (sc->sc_opmode & OPMODE_FD) 5402 mii->mii_media_active |= IFM_FDX; 5403 } 5404 } 5405 5406 static void 5407 tlp_2114x_isv_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5408 { 5409 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 5410 struct tulip_21x4x_media *tm = ife->ifm_aux; 5411 5412 (*tm->tm_get)(sc, ifmr); 5413 } 5414 5415 static int 5416 tlp_2114x_isv_tmsw_set(struct tulip_softc *sc) 5417 { 5418 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur; 5419 struct tulip_21x4x_media *tm = ife->ifm_aux; 5420 5421 /* 5422 * Check to see if we need to reset the chip, and do it. The 5423 * reset path will get the OPMODE register right the next 5424 * time through. 5425 */ 5426 if (TULIP_MEDIA_NEEDSRESET(sc, tm->tm_opmode)) 5427 return (tlp_init(&sc->sc_ethercom.ec_if)); 5428 5429 return ((*tm->tm_set)(sc)); 5430 } 5431 5432 /* 5433 * MII-on-SIO media switch. Handles only MII attached to the SIO. 5434 */ 5435 static void tlp_sio_mii_tmsw_init(struct tulip_softc *); 5436 5437 const struct tulip_mediasw tlp_sio_mii_mediasw = { 5438 tlp_sio_mii_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5439 }; 5440 5441 static void 5442 tlp_sio_mii_tmsw_init(struct tulip_softc *sc) 5443 { 5444 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5445 5446 /* 5447 * We don't attach any media info structures to the ifmedia 5448 * entries, so if we're using a pre-init function that needs 5449 * that info, override it to one that doesn't. 5450 */ 5451 if (sc->sc_preinit == tlp_2114x_preinit) 5452 sc->sc_preinit = tlp_2114x_mii_preinit; 5453 5454 sc->sc_mii.mii_ifp = ifp; 5455 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 5456 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 5457 sc->sc_mii.mii_statchg = sc->sc_statchg; 5458 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5459 tlp_mediastatus); 5460 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5461 MII_OFFSET_ANY, 0); 5462 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5463 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5464 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5465 } else { 5466 sc->sc_flags |= TULIPF_HAS_MII; 5467 sc->sc_tick = tlp_mii_tick; 5468 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5469 } 5470 } 5471 5472 /* 5473 * Lite-On PNIC media switch. Must handle MII or internal NWAY. 5474 */ 5475 static void tlp_pnic_tmsw_init(struct tulip_softc *); 5476 static void tlp_pnic_tmsw_get(struct tulip_softc *, struct ifmediareq *); 5477 static int tlp_pnic_tmsw_set(struct tulip_softc *); 5478 5479 const struct tulip_mediasw tlp_pnic_mediasw = { 5480 tlp_pnic_tmsw_init, tlp_pnic_tmsw_get, tlp_pnic_tmsw_set 5481 }; 5482 5483 static void tlp_pnic_nway_statchg(struct device *); 5484 static void tlp_pnic_nway_tick(void *); 5485 static int tlp_pnic_nway_service(struct tulip_softc *, int); 5486 static void tlp_pnic_nway_reset(struct tulip_softc *); 5487 static int tlp_pnic_nway_auto(struct tulip_softc *, int); 5488 static void tlp_pnic_nway_auto_timeout(void *); 5489 static void tlp_pnic_nway_status(struct tulip_softc *); 5490 static void tlp_pnic_nway_acomp(struct tulip_softc *); 5491 5492 static void 5493 tlp_pnic_tmsw_init(struct tulip_softc *sc) 5494 { 5495 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5496 const char *sep = ""; 5497 5498 #define ADD(m, c) ifmedia_add(&sc->sc_mii.mii_media, (m), (c), NULL) 5499 #define PRINT(str) printf("%s%s", sep, str); sep = ", " 5500 5501 sc->sc_mii.mii_ifp = ifp; 5502 sc->sc_mii.mii_readreg = tlp_pnic_mii_readreg; 5503 sc->sc_mii.mii_writereg = tlp_pnic_mii_writereg; 5504 sc->sc_mii.mii_statchg = sc->sc_statchg; 5505 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5506 tlp_mediastatus); 5507 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5508 MII_OFFSET_ANY, 0); 5509 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5510 /* XXX What about AUI/BNC support? */ 5511 printf("%s: ", device_xname(&sc->sc_dev)); 5512 5513 tlp_pnic_nway_reset(sc); 5514 5515 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), 5516 PNIC_NWAY_TW|PNIC_NWAY_CAP10T); 5517 PRINT("10baseT"); 5518 5519 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, 0), 5520 PNIC_NWAY_TW|PNIC_NWAY_FD|PNIC_NWAY_CAP10TFDX); 5521 PRINT("10baseT-FDX"); 5522 5523 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, 0), 5524 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_CAP100TX); 5525 PRINT("100baseTX"); 5526 5527 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, 0), 5528 PNIC_NWAY_TW|PNIC_NWAY_100|PNIC_NWAY_FD| 5529 PNIC_NWAY_CAP100TXFDX); 5530 PRINT("100baseTX-FDX"); 5531 5532 ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 5533 PNIC_NWAY_TW|PNIC_NWAY_RN|PNIC_NWAY_NW| 5534 PNIC_NWAY_CAP10T|PNIC_NWAY_CAP10TFDX| 5535 PNIC_NWAY_CAP100TXFDX|PNIC_NWAY_CAP100TX); 5536 PRINT("auto"); 5537 5538 printf("\n"); 5539 5540 sc->sc_statchg = tlp_pnic_nway_statchg; 5541 sc->sc_tick = tlp_pnic_nway_tick; 5542 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5543 } else { 5544 sc->sc_flags |= TULIPF_HAS_MII; 5545 sc->sc_tick = tlp_mii_tick; 5546 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5547 } 5548 5549 #undef ADD 5550 #undef PRINT 5551 } 5552 5553 static void 5554 tlp_pnic_tmsw_get(struct tulip_softc *sc, struct ifmediareq *ifmr) 5555 { 5556 struct mii_data *mii = &sc->sc_mii; 5557 5558 if (sc->sc_flags & TULIPF_HAS_MII) 5559 tlp_mii_getmedia(sc, ifmr); 5560 else { 5561 mii->mii_media_status = 0; 5562 mii->mii_media_active = IFM_NONE; 5563 tlp_pnic_nway_service(sc, MII_POLLSTAT); 5564 ifmr->ifm_status = sc->sc_mii.mii_media_status; 5565 ifmr->ifm_active = sc->sc_mii.mii_media_active; 5566 } 5567 } 5568 5569 static int 5570 tlp_pnic_tmsw_set(struct tulip_softc *sc) 5571 { 5572 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5573 struct mii_data *mii = &sc->sc_mii; 5574 5575 if (sc->sc_flags & TULIPF_HAS_MII) { 5576 /* 5577 * Make sure the built-in Tx jabber timer is disabled. 5578 */ 5579 TULIP_WRITE(sc, CSR_PNIC_ENDEC, PNIC_ENDEC_JDIS); 5580 5581 return (tlp_mii_setmedia(sc)); 5582 } 5583 5584 if (ifp->if_flags & IFF_UP) { 5585 mii->mii_media_status = 0; 5586 mii->mii_media_active = IFM_NONE; 5587 return (tlp_pnic_nway_service(sc, MII_MEDIACHG)); 5588 } 5589 5590 return (0); 5591 } 5592 5593 static void 5594 tlp_pnic_nway_statchg(struct device *self) 5595 { 5596 struct tulip_softc *sc = (struct tulip_softc *)self; 5597 5598 /* Idle the transmit and receive processes. */ 5599 tlp_idle(sc, OPMODE_ST|OPMODE_SR); 5600 5601 sc->sc_opmode &= ~(OPMODE_TTM|OPMODE_FD|OPMODE_PS|OPMODE_PCS| 5602 OPMODE_SCR|OPMODE_HBD); 5603 5604 if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_10_T) { 5605 sc->sc_opmode |= OPMODE_TTM; 5606 TULIP_WRITE(sc, CSR_GPP, 5607 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 0) | 5608 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 5609 } else { 5610 sc->sc_opmode |= OPMODE_PS|OPMODE_PCS|OPMODE_SCR|OPMODE_HBD; 5611 TULIP_WRITE(sc, CSR_GPP, 5612 GPP_PNIC_OUT(GPP_PNIC_PIN_SPEED_RLY, 1) | 5613 GPP_PNIC_OUT(GPP_PNIC_PIN_100M_LPKB, 1)); 5614 } 5615 5616 if (sc->sc_mii.mii_media_active & IFM_FDX) 5617 sc->sc_opmode |= OPMODE_FD|OPMODE_HBD; 5618 5619 /* 5620 * Write new OPMODE bits. This also restarts the transmit 5621 * and receive processes. 5622 */ 5623 TULIP_WRITE(sc, CSR_OPMODE, sc->sc_opmode); 5624 } 5625 5626 static void 5627 tlp_pnic_nway_tick(void *arg) 5628 { 5629 struct tulip_softc *sc = arg; 5630 int s; 5631 5632 if (!device_is_active(&sc->sc_dev)) 5633 return; 5634 5635 s = splnet(); 5636 tlp_pnic_nway_service(sc, MII_TICK); 5637 splx(s); 5638 5639 callout_reset(&sc->sc_tick_callout, hz, tlp_pnic_nway_tick, sc); 5640 } 5641 5642 /* 5643 * Support for the Lite-On PNIC internal NWay block. This is constructed 5644 * somewhat like a PHY driver for simplicity. 5645 */ 5646 5647 static int 5648 tlp_pnic_nway_service(struct tulip_softc *sc, int cmd) 5649 { 5650 struct mii_data *mii = &sc->sc_mii; 5651 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5652 5653 if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 5654 return (0); 5655 5656 switch (cmd) { 5657 case MII_POLLSTAT: 5658 /* Nothing special to do here. */ 5659 break; 5660 5661 case MII_MEDIACHG: 5662 switch (IFM_SUBTYPE(ife->ifm_media)) { 5663 case IFM_AUTO: 5664 (void) tlp_pnic_nway_auto(sc, 1); 5665 break; 5666 case IFM_100_T4: 5667 /* 5668 * XXX Not supported as a manual setting right now. 5669 */ 5670 return (EINVAL); 5671 default: 5672 /* 5673 * NWAY register data is stored in the ifmedia entry. 5674 */ 5675 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 5676 } 5677 break; 5678 5679 case MII_TICK: 5680 /* 5681 * Only used for autonegotiation. 5682 */ 5683 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 5684 return (0); 5685 5686 /* 5687 * Check to see if we have link. If we do, we don't 5688 * need to restart the autonegotiation process. 5689 */ 5690 if (sc->sc_flags & TULIPF_LINK_UP) 5691 return (0); 5692 5693 /* 5694 * Only retry autonegotiation every 5 seconds. 5695 */ 5696 if (++sc->sc_nway_ticks != 5) 5697 return (0); 5698 5699 sc->sc_nway_ticks = 0; 5700 tlp_pnic_nway_reset(sc); 5701 if (tlp_pnic_nway_auto(sc, 0) == EJUSTRETURN) 5702 return (0); 5703 break; 5704 } 5705 5706 /* Update the media status. */ 5707 tlp_pnic_nway_status(sc); 5708 5709 /* Callback if something changed. */ 5710 if ((sc->sc_nway_active == NULL || 5711 sc->sc_nway_active->ifm_media != mii->mii_media_active) || 5712 cmd == MII_MEDIACHG) { 5713 (*sc->sc_statchg)(&sc->sc_dev); 5714 tlp_nway_activate(sc, mii->mii_media_active); 5715 } 5716 return (0); 5717 } 5718 5719 static void 5720 tlp_pnic_nway_reset(struct tulip_softc *sc) 5721 { 5722 5723 TULIP_WRITE(sc, CSR_PNIC_NWAY, PNIC_NWAY_RS); 5724 delay(100); 5725 TULIP_WRITE(sc, CSR_PNIC_NWAY, 0); 5726 } 5727 5728 static int 5729 tlp_pnic_nway_auto(struct tulip_softc *sc, int waitfor) 5730 { 5731 struct mii_data *mii = &sc->sc_mii; 5732 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 5733 u_int32_t reg; 5734 int i; 5735 5736 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) 5737 TULIP_WRITE(sc, CSR_PNIC_NWAY, ife->ifm_data); 5738 5739 if (waitfor) { 5740 /* Wait 500ms for it to complete. */ 5741 for (i = 0; i < 500; i++) { 5742 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5743 if (reg & PNIC_NWAY_LPAR_MASK) { 5744 tlp_pnic_nway_acomp(sc); 5745 return (0); 5746 } 5747 delay(1000); 5748 } 5749 #if 0 5750 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 5751 aprint_error_dev(&sc->sc_dev, "autonegotiation failed to complete\n"); 5752 #endif 5753 5754 /* 5755 * Don't need to worry about clearing DOINGAUTO. 5756 * If that's set, a timeout is pending, and it will 5757 * clear the flag. 5758 */ 5759 return (EIO); 5760 } 5761 5762 /* 5763 * Just let it finish asynchronously. This is for the benefit of 5764 * the tick handler driving autonegotiation. Don't want 500ms 5765 * delays all the time while the system is running! 5766 */ 5767 if ((sc->sc_flags & TULIPF_DOINGAUTO) == 0) { 5768 sc->sc_flags |= TULIPF_DOINGAUTO; 5769 callout_reset(&sc->sc_nway_callout, hz >> 1, 5770 tlp_pnic_nway_auto_timeout, sc); 5771 } 5772 return (EJUSTRETURN); 5773 } 5774 5775 static void 5776 tlp_pnic_nway_auto_timeout(void *arg) 5777 { 5778 struct tulip_softc *sc = arg; 5779 u_int32_t reg; 5780 int s; 5781 5782 s = splnet(); 5783 sc->sc_flags &= ~TULIPF_DOINGAUTO; 5784 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5785 #if 0 5786 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) 5787 aprint_error_dev(&sc->sc_dev, "autonegotiation failed to complete\n"); 5788 #endif 5789 5790 tlp_pnic_nway_acomp(sc); 5791 5792 /* Update the media status. */ 5793 (void) tlp_pnic_nway_service(sc, MII_POLLSTAT); 5794 splx(s); 5795 } 5796 5797 static void 5798 tlp_pnic_nway_status(struct tulip_softc *sc) 5799 { 5800 struct mii_data *mii = &sc->sc_mii; 5801 u_int32_t reg; 5802 5803 mii->mii_media_status = IFM_AVALID; 5804 mii->mii_media_active = IFM_ETHER; 5805 5806 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5807 5808 if (sc->sc_flags & TULIPF_LINK_UP) 5809 mii->mii_media_status |= IFM_ACTIVE; 5810 5811 if (reg & PNIC_NWAY_NW) { 5812 if ((reg & PNIC_NWAY_LPAR_MASK) == 0) { 5813 /* Erg, still trying, I guess... */ 5814 mii->mii_media_active |= IFM_NONE; 5815 return; 5816 } 5817 5818 #if 0 5819 if (reg & PNIC_NWAY_LPAR100T4) 5820 mii->mii_media_active |= IFM_100_T4; 5821 else 5822 #endif 5823 if (reg & PNIC_NWAY_LPAR100TXFDX) 5824 mii->mii_media_active |= IFM_100_TX|IFM_FDX; 5825 else if (reg & PNIC_NWAY_LPAR100TX) 5826 mii->mii_media_active |= IFM_100_TX; 5827 else if (reg & PNIC_NWAY_LPAR10TFDX) 5828 mii->mii_media_active |= IFM_10_T|IFM_FDX; 5829 else if (reg & PNIC_NWAY_LPAR10T) 5830 mii->mii_media_active |= IFM_10_T; 5831 else 5832 mii->mii_media_active |= IFM_NONE; 5833 } else { 5834 if (reg & PNIC_NWAY_100) 5835 mii->mii_media_active |= IFM_100_TX; 5836 else 5837 mii->mii_media_active |= IFM_10_T; 5838 if (reg & PNIC_NWAY_FD) 5839 mii->mii_media_active |= IFM_FDX; 5840 } 5841 } 5842 5843 static void 5844 tlp_pnic_nway_acomp(struct tulip_softc *sc) 5845 { 5846 u_int32_t reg; 5847 5848 reg = TULIP_READ(sc, CSR_PNIC_NWAY); 5849 reg &= ~(PNIC_NWAY_FD|PNIC_NWAY_100|PNIC_NWAY_RN); 5850 5851 if (reg & (PNIC_NWAY_LPAR100TXFDX|PNIC_NWAY_LPAR100TX)) 5852 reg |= PNIC_NWAY_100; 5853 if (reg & (PNIC_NWAY_LPAR10TFDX|PNIC_NWAY_LPAR100TXFDX)) 5854 reg |= PNIC_NWAY_FD; 5855 5856 TULIP_WRITE(sc, CSR_PNIC_NWAY, reg); 5857 } 5858 5859 /* 5860 * Macronix PMAC and Lite-On PNIC-II media switch: 5861 * 5862 * MX98713 and MX98713A 21140-like MII or GPIO media. 5863 * 5864 * MX98713A 21143-like MII or SIA/SYM media. 5865 * 5866 * MX98715, MX98715A, MX98725, 21143-like SIA/SYM media. 5867 * 82C115, MX98715AEC-C, -E 5868 * 5869 * So, what we do here is fake MII-on-SIO or ISV media info, and 5870 * use the ISV media switch get/set functions to handle the rest. 5871 */ 5872 5873 static void tlp_pmac_tmsw_init(struct tulip_softc *); 5874 5875 const struct tulip_mediasw tlp_pmac_mediasw = { 5876 tlp_pmac_tmsw_init, tlp_2114x_isv_tmsw_get, tlp_2114x_isv_tmsw_set 5877 }; 5878 5879 const struct tulip_mediasw tlp_pmac_mii_mediasw = { 5880 tlp_pmac_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5881 }; 5882 5883 static void 5884 tlp_pmac_tmsw_init(struct tulip_softc *sc) 5885 { 5886 static const u_int8_t media[] = { 5887 TULIP_ROM_MB_MEDIA_TP, 5888 TULIP_ROM_MB_MEDIA_TP_FDX, 5889 TULIP_ROM_MB_MEDIA_100TX, 5890 TULIP_ROM_MB_MEDIA_100TX_FDX, 5891 }; 5892 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5893 struct tulip_21x4x_media *tm; 5894 5895 sc->sc_mii.mii_ifp = ifp; 5896 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 5897 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 5898 sc->sc_mii.mii_statchg = sc->sc_statchg; 5899 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5900 tlp_mediastatus); 5901 if (sc->sc_chip == TULIP_CHIP_MX98713 || 5902 sc->sc_chip == TULIP_CHIP_MX98713A) { 5903 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, 5904 MII_PHY_ANY, MII_OFFSET_ANY, 0); 5905 if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL) { 5906 sc->sc_flags |= TULIPF_HAS_MII; 5907 sc->sc_tick = tlp_mii_tick; 5908 sc->sc_preinit = tlp_2114x_mii_preinit; 5909 sc->sc_mediasw = &tlp_pmac_mii_mediasw; 5910 ifmedia_set(&sc->sc_mii.mii_media, 5911 IFM_ETHER|IFM_AUTO); 5912 return; 5913 } 5914 } 5915 5916 switch (sc->sc_chip) { 5917 case TULIP_CHIP_MX98713: 5918 tlp_add_srom_media(sc, TULIP_ROM_MB_21140_GPR, 5919 tlp_21140_gpio_get, tlp_21140_gpio_set, media, 4); 5920 5921 /* 5922 * XXX Should implement auto-sense for this someday, 5923 * XXX when we do the same for the 21140. 5924 */ 5925 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T); 5926 break; 5927 5928 default: 5929 tlp_add_srom_media(sc, TULIP_ROM_MB_21142_SIA, 5930 tlp_sia_get, tlp_sia_set, media, 2); 5931 tlp_add_srom_media(sc, TULIP_ROM_MB_21143_SYM, 5932 tlp_sia_get, tlp_sia_set, media + 2, 2); 5933 5934 tm = malloc(sizeof(*tm), M_DEVBUF, M_WAITOK|M_ZERO); 5935 tm->tm_name = "auto"; 5936 tm->tm_get = tlp_2114x_nway_get; 5937 tm->tm_set = tlp_2114x_nway_set; 5938 ifmedia_add(&sc->sc_mii.mii_media, 5939 IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 0, tm); 5940 5941 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5942 sc->sc_statchg = tlp_2114x_nway_statchg; 5943 sc->sc_tick = tlp_2114x_nway_tick; 5944 break; 5945 } 5946 5947 tlp_print_media(sc); 5948 tlp_sia_fixup(sc); 5949 5950 /* Set the LED modes. */ 5951 tlp_pmac_reset(sc); 5952 5953 sc->sc_reset = tlp_pmac_reset; 5954 } 5955 5956 /* 5957 * ADMtek AL981 media switch. Only has internal PHY. 5958 */ 5959 static void tlp_al981_tmsw_init(struct tulip_softc *); 5960 5961 const struct tulip_mediasw tlp_al981_mediasw = { 5962 tlp_al981_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5963 }; 5964 5965 static void 5966 tlp_al981_tmsw_init(struct tulip_softc *sc) 5967 { 5968 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 5969 5970 sc->sc_mii.mii_ifp = ifp; 5971 sc->sc_mii.mii_readreg = tlp_al981_mii_readreg; 5972 sc->sc_mii.mii_writereg = tlp_al981_mii_writereg; 5973 sc->sc_mii.mii_statchg = sc->sc_statchg; 5974 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 5975 tlp_mediastatus); 5976 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 5977 MII_OFFSET_ANY, 0); 5978 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 5979 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 5980 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 5981 } else { 5982 sc->sc_flags |= TULIPF_HAS_MII; 5983 sc->sc_tick = tlp_mii_tick; 5984 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 5985 } 5986 } 5987 5988 /* 5989 * ADMtek AN983/985 media switch. Only has internal PHY, but 5990 * on an SIO-like interface. Unfortunately, we can't use the 5991 * standard SIO media switch, because the AN985 "ghosts" the 5992 * singly PHY at every address. 5993 */ 5994 static void tlp_an985_tmsw_init(struct tulip_softc *); 5995 5996 const struct tulip_mediasw tlp_an985_mediasw = { 5997 tlp_an985_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 5998 }; 5999 6000 static void 6001 tlp_an985_tmsw_init(struct tulip_softc *sc) 6002 { 6003 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6004 6005 sc->sc_mii.mii_ifp = ifp; 6006 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6007 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6008 sc->sc_mii.mii_statchg = sc->sc_statchg; 6009 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6010 tlp_mediastatus); 6011 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 6012 MII_OFFSET_ANY, 0); 6013 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6014 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6015 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6016 } else { 6017 sc->sc_flags |= TULIPF_HAS_MII; 6018 sc->sc_tick = tlp_mii_tick; 6019 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6020 } 6021 } 6022 6023 /* 6024 * Davicom DM9102 media switch. Internal PHY and possibly HomePNA. 6025 */ 6026 static void tlp_dm9102_tmsw_init(struct tulip_softc *); 6027 static void tlp_dm9102_tmsw_getmedia(struct tulip_softc *, 6028 struct ifmediareq *); 6029 static int tlp_dm9102_tmsw_setmedia(struct tulip_softc *); 6030 6031 const struct tulip_mediasw tlp_dm9102_mediasw = { 6032 tlp_dm9102_tmsw_init, tlp_dm9102_tmsw_getmedia, 6033 tlp_dm9102_tmsw_setmedia 6034 }; 6035 6036 static void 6037 tlp_dm9102_tmsw_init(struct tulip_softc *sc) 6038 { 6039 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6040 u_int32_t opmode; 6041 6042 sc->sc_mii.mii_ifp = ifp; 6043 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6044 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6045 sc->sc_mii.mii_statchg = sc->sc_statchg; 6046 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6047 tlp_mediastatus); 6048 6049 /* PHY block already reset via tlp_reset(). */ 6050 6051 /* 6052 * Configure OPMODE properly for the internal MII interface. 6053 */ 6054 switch (sc->sc_chip) { 6055 case TULIP_CHIP_DM9102: 6056 opmode = OPMODE_MBO|OPMODE_HBD|OPMODE_PS; 6057 break; 6058 6059 case TULIP_CHIP_DM9102A: 6060 opmode = OPMODE_MBO|OPMODE_HBD; 6061 break; 6062 6063 default: 6064 opmode = 0; 6065 break; 6066 } 6067 6068 TULIP_WRITE(sc, CSR_OPMODE, opmode); 6069 6070 /* Now, probe the internal MII for the internal PHY. */ 6071 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 6072 MII_OFFSET_ANY, 0); 6073 6074 /* 6075 * XXX Figure out what to do about the HomePNA portion 6076 * XXX of the DM9102A. 6077 */ 6078 6079 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6080 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6081 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6082 } else { 6083 sc->sc_flags |= TULIPF_HAS_MII; 6084 sc->sc_tick = tlp_mii_tick; 6085 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6086 } 6087 } 6088 6089 static void 6090 tlp_dm9102_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr) 6091 { 6092 6093 /* XXX HomePNA on DM9102A. */ 6094 tlp_mii_getmedia(sc, ifmr); 6095 } 6096 6097 static int 6098 tlp_dm9102_tmsw_setmedia(struct tulip_softc *sc) 6099 { 6100 6101 /* XXX HomePNA on DM9102A. */ 6102 return (tlp_mii_setmedia(sc)); 6103 } 6104 6105 /* 6106 * ASIX AX88140A/AX88141 media switch. Internal PHY or MII. 6107 */ 6108 6109 static void tlp_asix_tmsw_init(struct tulip_softc *); 6110 static void tlp_asix_tmsw_getmedia(struct tulip_softc *, 6111 struct ifmediareq *); 6112 static int tlp_asix_tmsw_setmedia(struct tulip_softc *); 6113 6114 const struct tulip_mediasw tlp_asix_mediasw = { 6115 tlp_asix_tmsw_init, tlp_asix_tmsw_getmedia, 6116 tlp_asix_tmsw_setmedia 6117 }; 6118 6119 static void 6120 tlp_asix_tmsw_init(struct tulip_softc *sc) 6121 { 6122 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6123 u_int32_t opmode; 6124 6125 sc->sc_mii.mii_ifp = ifp; 6126 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6127 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6128 sc->sc_mii.mii_statchg = sc->sc_statchg; 6129 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6130 tlp_mediastatus); 6131 6132 /* 6133 * Configure OPMODE properly for the internal MII interface. 6134 */ 6135 switch (sc->sc_chip) { 6136 case TULIP_CHIP_AX88140: 6137 case TULIP_CHIP_AX88141: 6138 opmode = OPMODE_HBD|OPMODE_PS; 6139 break; 6140 default: 6141 opmode = 0; 6142 break; 6143 } 6144 6145 TULIP_WRITE(sc, CSR_OPMODE, opmode); 6146 6147 /* Now, probe the internal MII for the internal PHY. */ 6148 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 6149 MII_OFFSET_ANY, 0); 6150 6151 /* XXX Figure how to handle the PHY. */ 6152 6153 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6154 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6155 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6156 } else { 6157 sc->sc_flags |= TULIPF_HAS_MII; 6158 sc->sc_tick = tlp_mii_tick; 6159 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6160 } 6161 6162 6163 } 6164 6165 static void 6166 tlp_asix_tmsw_getmedia(struct tulip_softc *sc, struct ifmediareq *ifmr) 6167 { 6168 6169 /* XXX PHY handling. */ 6170 tlp_mii_getmedia(sc, ifmr); 6171 } 6172 6173 static int 6174 tlp_asix_tmsw_setmedia(struct tulip_softc *sc) 6175 { 6176 6177 /* XXX PHY handling. */ 6178 return (tlp_mii_setmedia(sc)); 6179 } 6180 6181 /* 6182 * RS7112 media switch. Handles only MII attached to the SIO. 6183 * We only have a PHY at 1. 6184 */ 6185 void tlp_rs7112_tmsw_init(struct tulip_softc *); 6186 6187 const struct tulip_mediasw tlp_rs7112_mediasw = { 6188 tlp_rs7112_tmsw_init, tlp_mii_getmedia, tlp_mii_setmedia 6189 }; 6190 6191 void 6192 tlp_rs7112_tmsw_init(struct tulip_softc *sc) 6193 { 6194 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 6195 6196 /* 6197 * We don't attach any media info structures to the ifmedia 6198 * entries, so if we're using a pre-init function that needs 6199 * that info, override it to one that doesn't. 6200 */ 6201 if (sc->sc_preinit == tlp_2114x_preinit) 6202 sc->sc_preinit = tlp_2114x_mii_preinit; 6203 6204 sc->sc_mii.mii_ifp = ifp; 6205 sc->sc_mii.mii_readreg = tlp_bitbang_mii_readreg; 6206 sc->sc_mii.mii_writereg = tlp_bitbang_mii_writereg; 6207 sc->sc_mii.mii_statchg = sc->sc_statchg; 6208 ifmedia_init(&sc->sc_mii.mii_media, 0, tlp_mediachange, 6209 tlp_mediastatus); 6210 6211 /* 6212 * The RS7112 reports a PHY at 0 (possibly HomePNA?) 6213 * and 1 (ethernet). We attach ethernet only. 6214 */ 6215 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, 6216 MII_OFFSET_ANY, 0); 6217 6218 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 6219 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 6220 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 6221 } else { 6222 sc->sc_flags |= TULIPF_HAS_MII; 6223 sc->sc_tick = tlp_mii_tick; 6224 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 6225 } 6226 } 6227