1 /* $OpenBSD: aic6915.c,v 1.23 2020/07/10 13:26:37 patrick Exp $ */ 2 /* $NetBSD: aic6915.c,v 1.15 2005/12/24 20:27:29 perry Exp $ */ 3 4 /*- 5 * Copyright (c) 2001 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Jason R. Thorpe. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * Device driver for the Adaptec AIC-6915 (``Starfire'') 35 * 10/100 Ethernet controller. 36 */ 37 38 #include "bpfilter.h" 39 40 #include <sys/param.h> 41 #include <sys/endian.h> 42 #include <sys/systm.h> 43 #include <sys/timeout.h> 44 #include <sys/mbuf.h> 45 #include <sys/malloc.h> 46 #include <sys/kernel.h> 47 #include <sys/socket.h> 48 #include <sys/ioctl.h> 49 #include <sys/errno.h> 50 #include <sys/device.h> 51 52 #include <net/if.h> 53 #include <net/if_dl.h> 54 55 #include <netinet/in.h> 56 #include <netinet/if_ether.h> 57 58 #include <net/if_media.h> 59 60 #if NBPFILTER > 0 61 #include <net/bpf.h> 62 #endif 63 64 #include <machine/bus.h> 65 #include <machine/intr.h> 66 67 #include <dev/mii/miivar.h> 68 69 #include <dev/ic/aic6915.h> 70 71 void sf_start(struct ifnet *); 72 void sf_watchdog(struct ifnet *); 73 int sf_ioctl(struct ifnet *, u_long, caddr_t); 74 int sf_init(struct ifnet *); 75 void sf_stop(struct ifnet *, int); 76 77 void sf_txintr(struct sf_softc *); 78 void sf_rxintr(struct sf_softc *); 79 void sf_stats_update(struct sf_softc *); 80 81 void sf_reset(struct sf_softc *); 82 void sf_macreset(struct sf_softc *); 83 void sf_rxdrain(struct sf_softc *); 84 int sf_add_rxbuf(struct sf_softc *, int); 85 uint8_t sf_read_eeprom(struct sf_softc *, int); 86 void sf_set_filter(struct sf_softc *); 87 88 int sf_mii_read(struct device *, int, int); 89 void sf_mii_write(struct device *, int, int, int); 90 void sf_mii_statchg(struct device *); 91 92 void sf_tick(void *); 93 94 int sf_mediachange(struct ifnet *); 95 void sf_mediastatus(struct ifnet *, struct ifmediareq *); 96 97 uint32_t sf_reg_read(struct sf_softc *, bus_addr_t); 98 void sf_reg_write(struct sf_softc *, bus_addr_t , uint32_t); 99 100 void sf_set_filter_perfect(struct sf_softc *, int , uint8_t *); 101 void sf_set_filter_hash(struct sf_softc *, uint8_t *); 102 103 struct cfdriver sf_cd = { 104 NULL, "sf", DV_IFNET 105 }; 106 107 #define sf_funcreg_read(sc, reg) \ 108 bus_space_read_4((sc)->sc_st, (sc)->sc_sh_func, (reg)) 109 #define sf_funcreg_write(sc, reg, val) \ 110 bus_space_write_4((sc)->sc_st, (sc)->sc_sh_func, (reg), (val)) 111 112 uint32_t 113 sf_reg_read(struct sf_softc *sc, bus_addr_t reg) 114 { 115 116 if (__predict_false(sc->sc_iomapped)) { 117 bus_space_write_4(sc->sc_st, sc->sc_sh, SF_IndirectIoAccess, 118 reg); 119 return (bus_space_read_4(sc->sc_st, sc->sc_sh, 120 SF_IndirectIoDataPort)); 121 } 122 123 return (bus_space_read_4(sc->sc_st, sc->sc_sh, reg)); 124 } 125 126 void 127 sf_reg_write(struct sf_softc *sc, bus_addr_t reg, uint32_t val) 128 { 129 130 if (__predict_false(sc->sc_iomapped)) { 131 bus_space_write_4(sc->sc_st, sc->sc_sh, SF_IndirectIoAccess, 132 reg); 133 bus_space_write_4(sc->sc_st, sc->sc_sh, SF_IndirectIoDataPort, 134 val); 135 return; 136 } 137 138 bus_space_write_4(sc->sc_st, sc->sc_sh, reg, val); 139 } 140 141 #define sf_genreg_read(sc, reg) \ 142 sf_reg_read((sc), (reg) + SF_GENREG_OFFSET) 143 #define sf_genreg_write(sc, reg, val) \ 144 sf_reg_write((sc), (reg) + SF_GENREG_OFFSET, (val)) 145 146 /* 147 * sf_attach: 148 * 149 * Attach a Starfire interface to the system. 150 */ 151 void 152 sf_attach(struct sf_softc *sc) 153 { 154 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 155 int i, rseg, error; 156 bus_dma_segment_t seg; 157 u_int8_t enaddr[ETHER_ADDR_LEN]; 158 159 timeout_set(&sc->sc_mii_timeout, sf_tick, sc); 160 161 /* 162 * If we're I/O mapped, the functional register handle is 163 * the same as the base handle. If we're memory mapped, 164 * carve off a chunk of the register space for the functional 165 * registers, to save on arithmetic later. 166 */ 167 if (sc->sc_iomapped) 168 sc->sc_sh_func = sc->sc_sh; 169 else { 170 if ((error = bus_space_subregion(sc->sc_st, sc->sc_sh, 171 SF_GENREG_OFFSET, SF_FUNCREG_SIZE, &sc->sc_sh_func)) != 0) { 172 printf("%s: unable to sub-region functional " 173 "registers, error = %d\n", sc->sc_dev.dv_xname, 174 error); 175 return; 176 } 177 } 178 179 /* 180 * Initialize the transmit threshold for this interface. The 181 * manual describes the default as 4 * 16 bytes. We start out 182 * at 10 * 16 bytes, to avoid a bunch of initial underruns on 183 * several platforms. 184 */ 185 sc->sc_txthresh = 10; 186 187 /* 188 * Allocate the control data structures, and create and load the 189 * DMA map for it. 190 */ 191 if ((error = bus_dmamem_alloc(sc->sc_dmat, 192 sizeof(struct sf_control_data), PAGE_SIZE, 0, &seg, 1, &rseg, 193 BUS_DMA_NOWAIT)) != 0) { 194 printf("%s: unable to allocate control data, error = %d\n", 195 sc->sc_dev.dv_xname, error); 196 goto fail_0; 197 } 198 199 if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 200 sizeof(struct sf_control_data), (caddr_t *)&sc->sc_control_data, 201 BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) { 202 printf("%s: unable to map control data, error = %d\n", 203 sc->sc_dev.dv_xname, error); 204 goto fail_1; 205 } 206 207 if ((error = bus_dmamap_create(sc->sc_dmat, 208 sizeof(struct sf_control_data), 1, 209 sizeof(struct sf_control_data), 0, BUS_DMA_NOWAIT, 210 &sc->sc_cddmamap)) != 0) { 211 printf("%s: unable to create control data DMA map, " 212 "error = %d\n", sc->sc_dev.dv_xname, error); 213 goto fail_2; 214 } 215 216 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap, 217 sc->sc_control_data, sizeof(struct sf_control_data), NULL, 218 BUS_DMA_NOWAIT)) != 0) { 219 printf("%s: unable to load control data DMA map, error = %d\n", 220 sc->sc_dev.dv_xname, error); 221 goto fail_3; 222 } 223 224 /* 225 * Create the transmit buffer DMA maps. 226 */ 227 for (i = 0; i < SF_NTXDESC; i++) { 228 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 229 SF_NTXFRAGS, MCLBYTES, 0, BUS_DMA_NOWAIT, 230 &sc->sc_txsoft[i].ds_dmamap)) != 0) { 231 printf("%s: unable to create tx DMA map %d, " 232 "error = %d\n", sc->sc_dev.dv_xname, i, error); 233 goto fail_4; 234 } 235 } 236 237 /* 238 * Create the receive buffer DMA maps. 239 */ 240 for (i = 0; i < SF_NRXDESC; i++) { 241 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 242 MCLBYTES, 0, BUS_DMA_NOWAIT, 243 &sc->sc_rxsoft[i].ds_dmamap)) != 0) { 244 printf("%s: unable to create rx DMA map %d, " 245 "error = %d\n", sc->sc_dev.dv_xname, i, error); 246 goto fail_5; 247 } 248 } 249 250 /* 251 * Reset the chip to a known state. 252 */ 253 sf_reset(sc); 254 255 /* 256 * Read the Ethernet address from the EEPROM. 257 */ 258 for (i = 0; i < ETHER_ADDR_LEN; i++) 259 enaddr[i] = sf_read_eeprom(sc, (15 + (ETHER_ADDR_LEN - 1)) - i); 260 261 printf(", address %s\n", ether_sprintf(enaddr)); 262 263 #ifdef DEBUG 264 if (sf_funcreg_read(sc, SF_PciDeviceConfig) & PDC_System64) 265 printf("%s: 64-bit PCI slot detected\n", sc->sc_dev.dv_xname); 266 #endif 267 268 /* 269 * Initialize our media structures and probe the MII. 270 */ 271 sc->sc_mii.mii_ifp = ifp; 272 sc->sc_mii.mii_readreg = sf_mii_read; 273 sc->sc_mii.mii_writereg = sf_mii_write; 274 sc->sc_mii.mii_statchg = sf_mii_statchg; 275 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, sf_mediachange, 276 sf_mediastatus); 277 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 278 MII_OFFSET_ANY, 0); 279 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 280 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL); 281 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); 282 } else 283 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 284 bcopy(enaddr, sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN); 285 bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ); 286 ifp = &sc->sc_arpcom.ac_if; 287 ifp->if_softc = sc; 288 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 289 ifp->if_ioctl = sf_ioctl; 290 ifp->if_start = sf_start; 291 ifp->if_watchdog = sf_watchdog; 292 ifq_set_maxlen(&ifp->if_snd, SF_NTXDESC_MASK); 293 294 /* 295 * Attach the interface. 296 */ 297 if_attach(ifp); 298 ether_ifattach(ifp); 299 return; 300 301 /* 302 * Free any resources we've allocated during the failed attach 303 * attempt. Do this in reverse order an fall through. 304 */ 305 fail_5: 306 for (i = 0; i < SF_NRXDESC; i++) { 307 if (sc->sc_rxsoft[i].ds_dmamap != NULL) 308 bus_dmamap_destroy(sc->sc_dmat, 309 sc->sc_rxsoft[i].ds_dmamap); 310 } 311 fail_4: 312 for (i = 0; i < SF_NTXDESC; i++) { 313 if (sc->sc_txsoft[i].ds_dmamap != NULL) 314 bus_dmamap_destroy(sc->sc_dmat, 315 sc->sc_txsoft[i].ds_dmamap); 316 } 317 bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap); 318 fail_3: 319 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap); 320 fail_2: 321 bus_dmamem_unmap(sc->sc_dmat, (caddr_t) sc->sc_control_data, 322 sizeof(struct sf_control_data)); 323 fail_1: 324 bus_dmamem_free(sc->sc_dmat, &seg, rseg); 325 fail_0: 326 return; 327 } 328 329 /* 330 * sf_start: [ifnet interface function] 331 * 332 * Start packet transmission on the interface. 333 */ 334 void 335 sf_start(struct ifnet *ifp) 336 { 337 struct sf_softc *sc = ifp->if_softc; 338 struct mbuf *m0, *m; 339 struct sf_txdesc0 *txd; 340 struct sf_descsoft *ds; 341 bus_dmamap_t dmamap; 342 int error, producer, last = -1, opending, seg; 343 344 /* 345 * Remember the previous number of pending transmits. 346 */ 347 opending = sc->sc_txpending; 348 349 /* 350 * Find out where we're sitting. 351 */ 352 producer = SF_TXDINDEX_TO_HOST( 353 TDQPI_HiPrTxProducerIndex_get( 354 sf_funcreg_read(sc, SF_TxDescQueueProducerIndex))); 355 356 /* 357 * Loop through the send queue, setting up transmit descriptors 358 * until we drain the queue, or use up all available transmit 359 * descriptors. Leave a blank one at the end for sanity's sake. 360 */ 361 while (sc->sc_txpending < (SF_NTXDESC - 1)) { 362 /* 363 * Grab a packet off the queue. 364 */ 365 m0 = ifq_deq_begin(&ifp->if_snd); 366 if (m0 == NULL) 367 break; 368 m = NULL; 369 370 /* 371 * Get the transmit descriptor. 372 */ 373 txd = &sc->sc_txdescs[producer]; 374 ds = &sc->sc_txsoft[producer]; 375 dmamap = ds->ds_dmamap; 376 377 /* 378 * Load the DMA map. If this fails, the packet either 379 * didn't fit in the allotted number of frags, or we were 380 * short on resources. In this case, we'll copy and try 381 * again. 382 */ 383 if (bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0, 384 BUS_DMA_WRITE|BUS_DMA_NOWAIT) != 0) { 385 MGETHDR(m, M_DONTWAIT, MT_DATA); 386 if (m == NULL) { 387 ifq_deq_rollback(&ifp->if_snd, m0); 388 printf("%s: unable to allocate Tx mbuf\n", 389 sc->sc_dev.dv_xname); 390 break; 391 } 392 if (m0->m_pkthdr.len > MHLEN) { 393 MCLGET(m, M_DONTWAIT); 394 if ((m->m_flags & M_EXT) == 0) { 395 ifq_deq_rollback(&ifp->if_snd, m0); 396 printf("%s: unable to allocate Tx " 397 "cluster\n", sc->sc_dev.dv_xname); 398 m_freem(m); 399 break; 400 } 401 } 402 m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t)); 403 m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len; 404 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, 405 m, BUS_DMA_WRITE|BUS_DMA_NOWAIT); 406 if (error) { 407 ifq_deq_rollback(&ifp->if_snd, m0); 408 printf("%s: unable to load Tx buffer, " 409 "error = %d\n", sc->sc_dev.dv_xname, error); 410 m_freem(m); 411 break; 412 } 413 } 414 415 /* 416 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. 417 */ 418 ifq_deq_commit(&ifp->if_snd, m0); 419 if (m != NULL) { 420 m_freem(m0); 421 m0 = m; 422 } 423 424 /* Initialize the descriptor. */ 425 txd->td_word0 = 426 htole32(TD_W0_ID | TD_W0_CRCEN | m0->m_pkthdr.len); 427 if (producer == (SF_NTXDESC - 1)) 428 txd->td_word0 |= TD_W0_END; 429 txd->td_word1 = htole32(dmamap->dm_nsegs); 430 for (seg = 0; seg < dmamap->dm_nsegs; seg++) { 431 txd->td_frags[seg].fr_addr = 432 htole32(dmamap->dm_segs[seg].ds_addr); 433 txd->td_frags[seg].fr_len = 434 htole32(dmamap->dm_segs[seg].ds_len); 435 } 436 437 /* Sync the descriptor and the DMA map. */ 438 SF_CDTXDSYNC(sc, producer, BUS_DMASYNC_PREWRITE); 439 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize, 440 BUS_DMASYNC_PREWRITE); 441 442 /* 443 * Store a pointer to the packet so we can free it later. 444 */ 445 ds->ds_mbuf = m0; 446 447 /* Advance the Tx pointer. */ 448 sc->sc_txpending++; 449 last = producer; 450 producer = SF_NEXTTX(producer); 451 452 #if NBPFILTER > 0 453 /* 454 * Pass the packet to any BPF listeners. 455 */ 456 if (ifp->if_bpf) 457 bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT); 458 #endif 459 } 460 461 if (sc->sc_txpending == (SF_NTXDESC - 1)) { 462 /* No more slots left; notify upper layer. */ 463 ifq_set_oactive(&ifp->if_snd); 464 } 465 466 if (sc->sc_txpending != opending) { 467 KASSERT(last != -1); 468 /* 469 * We enqueued packets. Cause a transmit interrupt to 470 * happen on the last packet we enqueued, and give the 471 * new descriptors to the chip by writing the new 472 * producer index. 473 */ 474 sc->sc_txdescs[last].td_word0 |= TD_W0_INTR; 475 SF_CDTXDSYNC(sc, last, BUS_DMASYNC_PREWRITE); 476 477 sf_funcreg_write(sc, SF_TxDescQueueProducerIndex, 478 TDQPI_HiPrTxProducerIndex(SF_TXDINDEX_TO_CHIP(producer))); 479 480 /* Set a watchdog timer in case the chip flakes out. */ 481 ifp->if_timer = 5; 482 } 483 } 484 485 /* 486 * sf_watchdog: [ifnet interface function] 487 * 488 * Watchdog timer handler. 489 */ 490 void 491 sf_watchdog(struct ifnet *ifp) 492 { 493 struct sf_softc *sc = ifp->if_softc; 494 495 printf("%s: device timeout\n", sc->sc_dev.dv_xname); 496 ifp->if_oerrors++; 497 498 (void) sf_init(ifp); 499 500 /* Try to get more packets going. */ 501 sf_start(ifp); 502 } 503 504 /* 505 * sf_ioctl: [ifnet interface function] 506 * 507 * Handle control requests from the operator. 508 */ 509 int 510 sf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 511 { 512 struct sf_softc *sc = (struct sf_softc *)ifp->if_softc; 513 struct ifreq *ifr = (struct ifreq *) data; 514 int s, error = 0; 515 516 s = splnet(); 517 518 switch (cmd) { 519 case SIOCSIFADDR: 520 ifp->if_flags |= IFF_UP; 521 if (!(ifp->if_flags & IFF_RUNNING)) 522 sf_init(ifp); 523 break; 524 525 case SIOCSIFFLAGS: 526 if (ifp->if_flags & IFF_UP) { 527 if (ifp->if_flags & IFF_RUNNING && 528 ((ifp->if_flags ^ sc->sc_flags) & 529 IFF_PROMISC)) { 530 sf_set_filter(sc); 531 } else { 532 if (!(ifp->if_flags & IFF_RUNNING)) 533 sf_init(ifp); 534 } 535 } else { 536 if (ifp->if_flags & IFF_RUNNING) 537 sf_stop(ifp, 1); 538 } 539 sc->sc_flags = ifp->if_flags; 540 break; 541 542 case SIOCGIFMEDIA: 543 case SIOCSIFMEDIA: 544 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); 545 break; 546 547 default: 548 error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data); 549 } 550 551 if (error == ENETRESET) { 552 if (ifp->if_flags & IFF_RUNNING) 553 sf_set_filter(sc); 554 error = 0; 555 } 556 557 /* Try to get more packets going. */ 558 sf_start(ifp); 559 560 splx(s); 561 return (error); 562 } 563 564 /* 565 * sf_intr: 566 * 567 * Interrupt service routine. 568 */ 569 int 570 sf_intr(void *arg) 571 { 572 struct sf_softc *sc = arg; 573 uint32_t isr; 574 int handled = 0, wantinit = 0; 575 576 for (;;) { 577 /* Reading clears all interrupts we're interested in. */ 578 isr = sf_funcreg_read(sc, SF_InterruptStatus); 579 if ((isr & IS_PCIPadInt) == 0) 580 break; 581 582 handled = 1; 583 584 /* Handle receive interrupts. */ 585 if (isr & IS_RxQ1DoneInt) 586 sf_rxintr(sc); 587 588 /* Handle transmit completion interrupts. */ 589 if (isr & (IS_TxDmaDoneInt|IS_TxQueueDoneInt)) 590 sf_txintr(sc); 591 592 /* Handle abnormal interrupts. */ 593 if (isr & IS_AbnormalInterrupt) { 594 /* Statistics. */ 595 if (isr & IS_StatisticWrapInt) 596 sf_stats_update(sc); 597 598 /* DMA errors. */ 599 if (isr & IS_DmaErrInt) { 600 wantinit = 1; 601 printf("%s: WARNING: DMA error\n", 602 sc->sc_dev.dv_xname); 603 } 604 605 /* Transmit FIFO underruns. */ 606 if (isr & IS_TxDataLowInt) { 607 if (sc->sc_txthresh < 0xff) 608 sc->sc_txthresh++; 609 #ifdef DEBUG 610 printf("%s: transmit FIFO underrun, new " 611 "threshold: %d bytes\n", 612 sc->sc_dev.dv_xname, 613 sc->sc_txthresh * 16); 614 #endif 615 sf_funcreg_write(sc, SF_TransmitFrameCSR, 616 sc->sc_TransmitFrameCSR | 617 TFCSR_TransmitThreshold(sc->sc_txthresh)); 618 sf_funcreg_write(sc, SF_TxDescQueueCtrl, 619 sc->sc_TxDescQueueCtrl | 620 TDQC_TxHighPriorityFifoThreshold( 621 sc->sc_txthresh)); 622 } 623 } 624 } 625 626 if (handled) { 627 /* Reset the interface, if necessary. */ 628 if (wantinit) 629 sf_init(&sc->sc_arpcom.ac_if); 630 631 /* Try and get more packets going. */ 632 sf_start(&sc->sc_arpcom.ac_if); 633 } 634 635 return (handled); 636 } 637 638 /* 639 * sf_txintr: 640 * 641 * Helper -- handle transmit completion interrupts. 642 */ 643 void 644 sf_txintr(struct sf_softc *sc) 645 { 646 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 647 struct sf_descsoft *ds; 648 uint32_t cqci, tcd; 649 int consumer, producer, txidx; 650 651 try_again: 652 cqci = sf_funcreg_read(sc, SF_CompletionQueueConsumerIndex); 653 654 consumer = CQCI_TxCompletionConsumerIndex_get(cqci); 655 producer = CQPI_TxCompletionProducerIndex_get( 656 sf_funcreg_read(sc, SF_CompletionQueueProducerIndex)); 657 658 if (consumer == producer) 659 return; 660 661 ifq_clr_oactive(&ifp->if_snd); 662 663 while (consumer != producer) { 664 SF_CDTXCSYNC(sc, consumer, BUS_DMASYNC_POSTREAD); 665 tcd = letoh32(sc->sc_txcomp[consumer].tcd_word0); 666 667 txidx = SF_TCD_INDEX_TO_HOST(TCD_INDEX(tcd)); 668 #ifdef DIAGNOSTIC 669 if ((tcd & TCD_PR) == 0) 670 printf("%s: Tx queue mismatch, index %d\n", 671 sc->sc_dev.dv_xname, txidx); 672 #endif 673 /* 674 * NOTE: stats are updated later. We're just 675 * releasing packets that have been DMA'd to 676 * the chip. 677 */ 678 ds = &sc->sc_txsoft[txidx]; 679 SF_CDTXDSYNC(sc, txidx, BUS_DMASYNC_POSTWRITE); 680 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 681 0, ds->ds_dmamap->dm_mapsize, 682 BUS_DMASYNC_POSTWRITE); 683 m_freem(ds->ds_mbuf); 684 ds->ds_mbuf = NULL; 685 686 consumer = SF_NEXTTCD(consumer); 687 sc->sc_txpending--; 688 } 689 690 /* XXXJRT -- should be KDASSERT() */ 691 KASSERT(sc->sc_txpending >= 0); 692 693 /* If all packets are done, cancel the watchdog timer. */ 694 if (sc->sc_txpending == 0) 695 ifp->if_timer = 0; 696 697 /* Update the consumer index. */ 698 sf_funcreg_write(sc, SF_CompletionQueueConsumerIndex, 699 (cqci & ~CQCI_TxCompletionConsumerIndex(0x7ff)) | 700 CQCI_TxCompletionConsumerIndex(consumer)); 701 702 /* Double check for new completions. */ 703 goto try_again; 704 } 705 706 /* 707 * sf_rxintr: 708 * 709 * Helper -- handle receive interrupts. 710 */ 711 void 712 sf_rxintr(struct sf_softc *sc) 713 { 714 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 715 struct sf_descsoft *ds; 716 struct sf_rcd_full *rcd; 717 struct mbuf_list ml = MBUF_LIST_INITIALIZER(); 718 struct mbuf *m; 719 uint32_t cqci, word0; 720 int consumer, producer, bufproducer, rxidx, len; 721 722 cqci = sf_funcreg_read(sc, SF_CompletionQueueConsumerIndex); 723 724 consumer = CQCI_RxCompletionQ1ConsumerIndex_get(cqci); 725 producer = CQPI_RxCompletionQ1ProducerIndex_get( 726 sf_funcreg_read(sc, SF_CompletionQueueProducerIndex)); 727 bufproducer = RXQ1P_RxDescQ1Producer_get( 728 sf_funcreg_read(sc, SF_RxDescQueue1Ptrs)); 729 730 if (consumer == producer) 731 return; 732 733 while (consumer != producer) { 734 rcd = &sc->sc_rxcomp[consumer]; 735 SF_CDRXCSYNC(sc, consumer, 736 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 737 SF_CDRXCSYNC(sc, consumer, 738 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 739 740 word0 = letoh32(rcd->rcd_word0); 741 rxidx = RCD_W0_EndIndex(word0); 742 743 ds = &sc->sc_rxsoft[rxidx]; 744 745 consumer = SF_NEXTRCD(consumer); 746 bufproducer = SF_NEXTRX(bufproducer); 747 748 if ((word0 & RCD_W0_OK) == 0) { 749 SF_INIT_RXDESC(sc, rxidx); 750 continue; 751 } 752 753 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0, 754 ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 755 756 /* 757 * No errors; receive the packet. Note that we have 758 * configured the Starfire to NOT transfer the CRC 759 * with the packet. 760 */ 761 len = RCD_W0_Length(word0); 762 763 #ifndef __STRICT_ALIGNMENT 764 /* 765 * Allocate a new mbuf cluster. If that fails, we are 766 * out of memory, and must drop the packet and recycle 767 * the buffer that's already attached to this descriptor. 768 */ 769 m = ds->ds_mbuf; 770 if (sf_add_rxbuf(sc, rxidx) != 0) { 771 ifp->if_ierrors++; 772 SF_INIT_RXDESC(sc, rxidx); 773 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0, 774 ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 775 continue; 776 } 777 #else 778 /* 779 * The Starfire's receive buffer must be 4-byte aligned. 780 * But this means that the data after the Ethernet header 781 * is misaligned. We must allocate a new buffer and 782 * copy the data, shifted forward 2 bytes. 783 */ 784 MGETHDR(m, M_DONTWAIT, MT_DATA); 785 if (m == NULL) { 786 dropit: 787 ifp->if_ierrors++; 788 SF_INIT_RXDESC(sc, rxidx); 789 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0, 790 ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 791 continue; 792 } 793 if (len > (MHLEN - 2)) { 794 MCLGET(m, M_DONTWAIT); 795 if ((m->m_flags & M_EXT) == 0) { 796 m_freem(m); 797 goto dropit; 798 } 799 } 800 m->m_data += 2; 801 802 /* 803 * Note that we use cluster for incoming frames, so the 804 * buffer is virtually contiguous. 805 */ 806 memcpy(mtod(m, caddr_t), mtod(ds->ds_mbuf, caddr_t), len); 807 808 /* Allow the receive descriptor to continue using its mbuf. */ 809 SF_INIT_RXDESC(sc, rxidx); 810 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0, 811 ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 812 #endif /* __STRICT_ALIGNMENT */ 813 814 m->m_pkthdr.len = m->m_len = len; 815 816 ml_enqueue(&ml, m); 817 } 818 819 if_input(ifp, &ml); 820 821 /* Update the chip's pointers. */ 822 sf_funcreg_write(sc, SF_CompletionQueueConsumerIndex, 823 (cqci & ~CQCI_RxCompletionQ1ConsumerIndex(0x7ff)) | 824 CQCI_RxCompletionQ1ConsumerIndex(consumer)); 825 sf_funcreg_write(sc, SF_RxDescQueue1Ptrs, 826 RXQ1P_RxDescQ1Producer(bufproducer)); 827 } 828 829 /* 830 * sf_tick: 831 * 832 * One second timer, used to tick the MII and update stats. 833 */ 834 void 835 sf_tick(void *arg) 836 { 837 struct sf_softc *sc = arg; 838 int s; 839 840 s = splnet(); 841 mii_tick(&sc->sc_mii); 842 sf_stats_update(sc); 843 splx(s); 844 845 timeout_add_sec(&sc->sc_mii_timeout, 1); 846 } 847 848 /* 849 * sf_stats_update: 850 * 851 * Read the statitistics counters. 852 */ 853 void 854 sf_stats_update(struct sf_softc *sc) 855 { 856 struct sf_stats stats; 857 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 858 uint32_t *p; 859 u_int i; 860 861 p = &stats.TransmitOKFrames; 862 for (i = 0; i < (sizeof(stats) / sizeof(uint32_t)); i++) { 863 *p++ = sf_genreg_read(sc, 864 SF_STATS_BASE + (i * sizeof(uint32_t))); 865 sf_genreg_write(sc, SF_STATS_BASE + (i * sizeof(uint32_t)), 0); 866 } 867 868 ifp->if_collisions += stats.SingleCollisionFrames + 869 stats.MultipleCollisionFrames; 870 871 ifp->if_oerrors += stats.TransmitAbortDueToExcessiveCollisions + 872 stats.TransmitAbortDueToExcessingDeferral + 873 stats.FramesLostDueToInternalTransmitErrors; 874 875 ifp->if_ierrors += stats.ReceiveCRCErrors + stats.AlignmentErrors + 876 stats.ReceiveFramesTooLong + stats.ReceiveFramesTooShort + 877 stats.ReceiveFramesJabbersError + 878 stats.FramesLostDueToInternalReceiveErrors; 879 } 880 881 /* 882 * sf_reset: 883 * 884 * Perform a soft reset on the Starfire. 885 */ 886 void 887 sf_reset(struct sf_softc *sc) 888 { 889 int i; 890 891 sf_funcreg_write(sc, SF_GeneralEthernetCtrl, 0); 892 893 sf_macreset(sc); 894 895 sf_funcreg_write(sc, SF_PciDeviceConfig, PDC_SoftReset); 896 for (i = 0; i < 1000; i++) { 897 delay(10); 898 if ((sf_funcreg_read(sc, SF_PciDeviceConfig) & 899 PDC_SoftReset) == 0) 900 break; 901 } 902 903 if (i == 1000) { 904 printf("%s: reset failed to complete\n", sc->sc_dev.dv_xname); 905 sf_funcreg_write(sc, SF_PciDeviceConfig, 0); 906 } 907 908 delay(1000); 909 } 910 911 /* 912 * sf_macreset: 913 * 914 * Reset the MAC portion of the Starfire. 915 */ 916 void 917 sf_macreset(struct sf_softc *sc) 918 { 919 920 sf_genreg_write(sc, SF_MacConfig1, sc->sc_MacConfig1 | MC1_SoftRst); 921 delay(1000); 922 sf_genreg_write(sc, SF_MacConfig1, sc->sc_MacConfig1); 923 } 924 925 /* 926 * sf_init: [ifnet interface function] 927 * 928 * Initialize the interface. Must be called at splnet(). 929 */ 930 int 931 sf_init(struct ifnet *ifp) 932 { 933 struct sf_softc *sc = ifp->if_softc; 934 struct sf_descsoft *ds; 935 int error = 0; 936 u_int i; 937 938 /* 939 * Cancel any pending I/O. 940 */ 941 sf_stop(ifp, 0); 942 943 /* 944 * Reset the Starfire to a known state. 945 */ 946 sf_reset(sc); 947 948 /* Clear the stat counters. */ 949 for (i = 0; i < sizeof(struct sf_stats); i += sizeof(uint32_t)) 950 sf_genreg_write(sc, SF_STATS_BASE + i, 0); 951 952 /* 953 * Initialize the transmit descriptor ring. 954 */ 955 memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs)); 956 sf_funcreg_write(sc, SF_TxDescQueueHighAddr, 0); 957 sf_funcreg_write(sc, SF_HiPrTxDescQueueBaseAddr, SF_CDTXDADDR(sc, 0)); 958 sf_funcreg_write(sc, SF_LoPrTxDescQueueBaseAddr, 0); 959 960 /* 961 * Initialize the transmit completion ring. 962 */ 963 for (i = 0; i < SF_NTCD; i++) { 964 sc->sc_txcomp[i].tcd_word0 = TCD_DMA_ID; 965 SF_CDTXCSYNC(sc, i, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 966 } 967 sf_funcreg_write(sc, SF_CompletionQueueHighAddr, 0); 968 sf_funcreg_write(sc, SF_TxCompletionQueueCtrl, SF_CDTXCADDR(sc, 0)); 969 970 /* 971 * Initialize the receive descriptor ring. 972 */ 973 for (i = 0; i < SF_NRXDESC; i++) { 974 ds = &sc->sc_rxsoft[i]; 975 if (ds->ds_mbuf == NULL) { 976 if ((error = sf_add_rxbuf(sc, i)) != 0) { 977 printf("%s: unable to allocate or map rx " 978 "buffer %d, error = %d\n", 979 sc->sc_dev.dv_xname, i, error); 980 /* 981 * XXX Should attempt to run with fewer receive 982 * XXX buffers instead of just failing. 983 */ 984 sf_rxdrain(sc); 985 goto out; 986 } 987 } else 988 SF_INIT_RXDESC(sc, i); 989 } 990 sf_funcreg_write(sc, SF_RxDescQueueHighAddress, 0); 991 sf_funcreg_write(sc, SF_RxDescQueue1LowAddress, SF_CDRXDADDR(sc, 0)); 992 sf_funcreg_write(sc, SF_RxDescQueue2LowAddress, 0); 993 994 /* 995 * Initialize the receive completion ring. 996 */ 997 for (i = 0; i < SF_NRCD; i++) { 998 sc->sc_rxcomp[i].rcd_word0 = RCD_W0_ID; 999 sc->sc_rxcomp[i].rcd_word1 = 0; 1000 sc->sc_rxcomp[i].rcd_word2 = 0; 1001 sc->sc_rxcomp[i].rcd_timestamp = 0; 1002 SF_CDRXCSYNC(sc, i, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1003 } 1004 sf_funcreg_write(sc, SF_RxCompletionQueue1Ctrl, SF_CDRXCADDR(sc, 0) | 1005 RCQ1C_RxCompletionQ1Type(3)); 1006 sf_funcreg_write(sc, SF_RxCompletionQueue2Ctrl, 0); 1007 1008 /* 1009 * Initialize the Tx CSR. 1010 */ 1011 sc->sc_TransmitFrameCSR = 0; 1012 sf_funcreg_write(sc, SF_TransmitFrameCSR, 1013 sc->sc_TransmitFrameCSR | 1014 TFCSR_TransmitThreshold(sc->sc_txthresh)); 1015 1016 /* 1017 * Initialize the Tx descriptor control register. 1018 */ 1019 sc->sc_TxDescQueueCtrl = TDQC_SkipLength(0) | 1020 TDQC_TxDmaBurstSize(4) | /* default */ 1021 TDQC_MinFrameSpacing(3) | /* 128 bytes */ 1022 TDQC_TxDescType(0); 1023 sf_funcreg_write(sc, SF_TxDescQueueCtrl, 1024 sc->sc_TxDescQueueCtrl | 1025 TDQC_TxHighPriorityFifoThreshold(sc->sc_txthresh)); 1026 1027 /* 1028 * Initialize the Rx descriptor control registers. 1029 */ 1030 sf_funcreg_write(sc, SF_RxDescQueue1Ctrl, 1031 RDQ1C_RxQ1BufferLength(MCLBYTES) | 1032 RDQ1C_RxDescSpacing(0)); 1033 sf_funcreg_write(sc, SF_RxDescQueue2Ctrl, 0); 1034 1035 /* 1036 * Initialize the Tx descriptor producer indices. 1037 */ 1038 sf_funcreg_write(sc, SF_TxDescQueueProducerIndex, 1039 TDQPI_HiPrTxProducerIndex(0) | 1040 TDQPI_LoPrTxProducerIndex(0)); 1041 1042 /* 1043 * Initialize the Rx descriptor producer indices. 1044 */ 1045 sf_funcreg_write(sc, SF_RxDescQueue1Ptrs, 1046 RXQ1P_RxDescQ1Producer(SF_NRXDESC - 1)); 1047 sf_funcreg_write(sc, SF_RxDescQueue2Ptrs, 1048 RXQ2P_RxDescQ2Producer(0)); 1049 1050 /* 1051 * Initialize the Tx and Rx completion queue consumer indices. 1052 */ 1053 sf_funcreg_write(sc, SF_CompletionQueueConsumerIndex, 1054 CQCI_TxCompletionConsumerIndex(0) | 1055 CQCI_RxCompletionQ1ConsumerIndex(0)); 1056 sf_funcreg_write(sc, SF_RxHiPrCompletionPtrs, 0); 1057 1058 /* 1059 * Initialize the Rx DMA control register. 1060 */ 1061 sf_funcreg_write(sc, SF_RxDmaCtrl, 1062 RDC_RxHighPriorityThreshold(6) | /* default */ 1063 RDC_RxBurstSize(4)); /* default */ 1064 1065 /* 1066 * Set the receive filter. 1067 */ 1068 sc->sc_RxAddressFilteringCtl = 0; 1069 sf_set_filter(sc); 1070 1071 /* 1072 * Set MacConfig1. When we set the media, MacConfig1 will 1073 * actually be written and the MAC part reset. 1074 */ 1075 sc->sc_MacConfig1 = MC1_PadEn; 1076 1077 /* 1078 * Set the media. 1079 */ 1080 mii_mediachg(&sc->sc_mii); 1081 1082 /* 1083 * Initialize the interrupt register. 1084 */ 1085 sc->sc_InterruptEn = IS_PCIPadInt | IS_RxQ1DoneInt | 1086 IS_TxQueueDoneInt | IS_TxDmaDoneInt | IS_DmaErrInt | 1087 IS_StatisticWrapInt; 1088 sf_funcreg_write(sc, SF_InterruptEn, sc->sc_InterruptEn); 1089 1090 sf_funcreg_write(sc, SF_PciDeviceConfig, PDC_IntEnable | 1091 PDC_PCIMstDmaEn | (1 << PDC_FifoThreshold_SHIFT)); 1092 1093 /* 1094 * Start the transmit and receive processes. 1095 */ 1096 sf_funcreg_write(sc, SF_GeneralEthernetCtrl, 1097 GEC_TxDmaEn|GEC_RxDmaEn|GEC_TransmitEn|GEC_ReceiveEn); 1098 1099 /* Start the on second clock. */ 1100 timeout_add_sec(&sc->sc_mii_timeout, 1); 1101 1102 /* 1103 * Note that the interface is now running. 1104 */ 1105 ifp->if_flags |= IFF_RUNNING; 1106 ifq_clr_oactive(&ifp->if_snd); 1107 1108 out: 1109 if (error) { 1110 ifp->if_flags &= ~IFF_RUNNING; 1111 ifq_clr_oactive(&ifp->if_snd); 1112 ifp->if_timer = 0; 1113 printf("%s: interface not running\n", sc->sc_dev.dv_xname); 1114 } 1115 return (error); 1116 } 1117 1118 /* 1119 * sf_rxdrain: 1120 * 1121 * Drain the receive queue. 1122 */ 1123 void 1124 sf_rxdrain(struct sf_softc *sc) 1125 { 1126 struct sf_descsoft *ds; 1127 int i; 1128 1129 for (i = 0; i < SF_NRXDESC; i++) { 1130 ds = &sc->sc_rxsoft[i]; 1131 if (ds->ds_mbuf != NULL) { 1132 bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap); 1133 m_freem(ds->ds_mbuf); 1134 ds->ds_mbuf = NULL; 1135 } 1136 } 1137 } 1138 1139 /* 1140 * sf_stop: [ifnet interface function] 1141 * 1142 * Stop transmission on the interface. 1143 */ 1144 void 1145 sf_stop(struct ifnet *ifp, int disable) 1146 { 1147 struct sf_softc *sc = ifp->if_softc; 1148 struct sf_descsoft *ds; 1149 int i; 1150 1151 /* Stop the one second clock. */ 1152 timeout_del(&sc->sc_mii_timeout); 1153 1154 /* Down the MII. */ 1155 mii_down(&sc->sc_mii); 1156 1157 /* Disable interrupts. */ 1158 sf_funcreg_write(sc, SF_InterruptEn, 0); 1159 1160 /* Stop the transmit and receive processes. */ 1161 sf_funcreg_write(sc, SF_GeneralEthernetCtrl, 0); 1162 1163 /* 1164 * Release any queued transmit buffers. 1165 */ 1166 for (i = 0; i < SF_NTXDESC; i++) { 1167 ds = &sc->sc_txsoft[i]; 1168 if (ds->ds_mbuf != NULL) { 1169 bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap); 1170 m_freem(ds->ds_mbuf); 1171 ds->ds_mbuf = NULL; 1172 } 1173 } 1174 sc->sc_txpending = 0; 1175 1176 if (disable) 1177 sf_rxdrain(sc); 1178 1179 /* 1180 * Mark the interface down and cancel the watchdog timer. 1181 */ 1182 ifp->if_flags &= ~IFF_RUNNING; 1183 ifq_clr_oactive(&ifp->if_snd); 1184 ifp->if_timer = 0; 1185 } 1186 1187 /* 1188 * sf_read_eeprom: 1189 * 1190 * Read from the Starfire EEPROM. 1191 */ 1192 uint8_t 1193 sf_read_eeprom(struct sf_softc *sc, int offset) 1194 { 1195 uint32_t reg; 1196 1197 reg = sf_genreg_read(sc, SF_EEPROM_BASE + (offset & ~3)); 1198 1199 return ((reg >> (8 * (offset & 3))) & 0xff); 1200 } 1201 1202 /* 1203 * sf_add_rxbuf: 1204 * 1205 * Add a receive buffer to the indicated descriptor. 1206 */ 1207 int 1208 sf_add_rxbuf(struct sf_softc *sc, int idx) 1209 { 1210 struct sf_descsoft *ds = &sc->sc_rxsoft[idx]; 1211 struct mbuf *m; 1212 int error; 1213 1214 MGETHDR(m, M_DONTWAIT, MT_DATA); 1215 if (m == NULL) 1216 return (ENOBUFS); 1217 1218 MCLGET(m, M_DONTWAIT); 1219 if ((m->m_flags & M_EXT) == 0) { 1220 m_freem(m); 1221 return (ENOBUFS); 1222 } 1223 1224 if (ds->ds_mbuf != NULL) 1225 bus_dmamap_unload(sc->sc_dmat, ds->ds_dmamap); 1226 1227 ds->ds_mbuf = m; 1228 1229 error = bus_dmamap_load(sc->sc_dmat, ds->ds_dmamap, 1230 m->m_ext.ext_buf, m->m_ext.ext_size, NULL, 1231 BUS_DMA_READ|BUS_DMA_NOWAIT); 1232 if (error) { 1233 printf("%s: can't load rx DMA map %d, error = %d\n", 1234 sc->sc_dev.dv_xname, idx, error); 1235 panic("sf_add_rxbuf"); /* XXX */ 1236 } 1237 1238 bus_dmamap_sync(sc->sc_dmat, ds->ds_dmamap, 0, 1239 ds->ds_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); 1240 1241 SF_INIT_RXDESC(sc, idx); 1242 1243 return (0); 1244 } 1245 1246 void 1247 sf_set_filter_perfect(struct sf_softc *sc, int slot, uint8_t *enaddr) 1248 { 1249 uint32_t reg0, reg1, reg2; 1250 1251 reg0 = enaddr[5] | (enaddr[4] << 8); 1252 reg1 = enaddr[3] | (enaddr[2] << 8); 1253 reg2 = enaddr[1] | (enaddr[0] << 8); 1254 1255 sf_genreg_write(sc, SF_PERFECT_BASE + (slot * 0x10) + 0, reg0); 1256 sf_genreg_write(sc, SF_PERFECT_BASE + (slot * 0x10) + 4, reg1); 1257 sf_genreg_write(sc, SF_PERFECT_BASE + (slot * 0x10) + 8, reg2); 1258 } 1259 1260 void 1261 sf_set_filter_hash(struct sf_softc *sc, uint8_t *enaddr) 1262 { 1263 uint32_t hash, slot, reg; 1264 1265 hash = ether_crc32_be(enaddr, ETHER_ADDR_LEN) >> 23; 1266 slot = hash >> 4; 1267 1268 reg = sf_genreg_read(sc, SF_HASH_BASE + (slot * 0x10)); 1269 reg |= 1 << (hash & 0xf); 1270 sf_genreg_write(sc, SF_HASH_BASE + (slot * 0x10), reg); 1271 } 1272 1273 /* 1274 * sf_set_filter: 1275 * 1276 * Set the Starfire receive filter. 1277 */ 1278 void 1279 sf_set_filter(struct sf_softc *sc) 1280 { 1281 struct arpcom *ac = &sc->sc_arpcom; 1282 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 1283 struct ether_multi *enm; 1284 struct ether_multistep step; 1285 int i; 1286 1287 /* Start by clearing the perfect and hash tables. */ 1288 for (i = 0; i < SF_PERFECT_SIZE; i += sizeof(uint32_t)) 1289 sf_genreg_write(sc, SF_PERFECT_BASE + i, 0); 1290 1291 for (i = 0; i < SF_HASH_SIZE; i += sizeof(uint32_t)) 1292 sf_genreg_write(sc, SF_HASH_BASE + i, 0); 1293 1294 /* 1295 * Clear the perfect and hash mode bits. 1296 */ 1297 sc->sc_RxAddressFilteringCtl &= 1298 ~(RAFC_PerfectFilteringMode(3) | RAFC_HashFilteringMode(3)); 1299 1300 if (ifp->if_flags & IFF_BROADCAST) 1301 sc->sc_RxAddressFilteringCtl |= RAFC_PassBroadcast; 1302 else 1303 sc->sc_RxAddressFilteringCtl &= ~RAFC_PassBroadcast; 1304 1305 if (ifp->if_flags & IFF_PROMISC) { 1306 sc->sc_RxAddressFilteringCtl |= RAFC_PromiscuousMode; 1307 goto allmulti; 1308 } else 1309 sc->sc_RxAddressFilteringCtl &= ~RAFC_PromiscuousMode; 1310 1311 /* 1312 * Set normal perfect filtering mode. 1313 */ 1314 sc->sc_RxAddressFilteringCtl |= RAFC_PerfectFilteringMode(1); 1315 1316 /* 1317 * First, write the station address to the perfect filter 1318 * table. 1319 */ 1320 sf_set_filter_perfect(sc, 0, LLADDR(ifp->if_sadl)); 1321 1322 if (ac->ac_multirangecnt > 0) 1323 goto allmulti; 1324 1325 /* 1326 * Now set the hash bits for each multicast address in our 1327 * list. 1328 */ 1329 ETHER_FIRST_MULTI(step, ac, enm); 1330 if (enm == NULL) 1331 goto done; 1332 while (enm != NULL) { 1333 sf_set_filter_hash(sc, enm->enm_addrlo); 1334 ETHER_NEXT_MULTI(step, enm); 1335 } 1336 1337 /* 1338 * Set "hash only multicast dest, match regardless of VLAN ID". 1339 */ 1340 sc->sc_RxAddressFilteringCtl |= RAFC_HashFilteringMode(2); 1341 goto done; 1342 1343 allmulti: 1344 /* 1345 * XXX RAFC_PassMulticast is sub-optimal if using VLAN mode. 1346 */ 1347 sc->sc_RxAddressFilteringCtl |= RAFC_PassMulticast; 1348 ifp->if_flags |= IFF_ALLMULTI; 1349 1350 done: 1351 sf_funcreg_write(sc, SF_RxAddressFilteringCtl, 1352 sc->sc_RxAddressFilteringCtl); 1353 } 1354 1355 /* 1356 * sf_mii_read: [mii interface function] 1357 * 1358 * Read from the MII. 1359 */ 1360 int 1361 sf_mii_read(struct device *self, int phy, int reg) 1362 { 1363 struct sf_softc *sc = (void *) self; 1364 uint32_t v; 1365 int i; 1366 1367 for (i = 0; i < 1000; i++) { 1368 v = sf_genreg_read(sc, SF_MII_PHY_REG(phy, reg)); 1369 if (v & MiiDataValid) 1370 break; 1371 delay(1); 1372 } 1373 1374 if ((v & MiiDataValid) == 0) 1375 return (0); 1376 1377 if (MiiRegDataPort(v) == 0xffff) 1378 return (0); 1379 1380 return (MiiRegDataPort(v)); 1381 } 1382 1383 /* 1384 * sf_mii_write: [mii interface function] 1385 * 1386 * Write to the MII. 1387 */ 1388 void 1389 sf_mii_write(struct device *self, int phy, int reg, int val) 1390 { 1391 struct sf_softc *sc = (void *) self; 1392 int i; 1393 1394 sf_genreg_write(sc, SF_MII_PHY_REG(phy, reg), val); 1395 1396 for (i = 0; i < 1000; i++) { 1397 if ((sf_genreg_read(sc, SF_MII_PHY_REG(phy, reg)) & 1398 MiiBusy) == 0) 1399 return; 1400 delay(1); 1401 } 1402 1403 printf("%s: MII write timed out\n", sc->sc_dev.dv_xname); 1404 } 1405 1406 /* 1407 * sf_mii_statchg: [mii interface function] 1408 * 1409 * Callback from the PHY when the media changes. 1410 */ 1411 void 1412 sf_mii_statchg(struct device *self) 1413 { 1414 struct sf_softc *sc = (void *) self; 1415 uint32_t ipg; 1416 1417 if (sc->sc_mii.mii_media_active & IFM_FDX) { 1418 sc->sc_MacConfig1 |= MC1_FullDuplex; 1419 ipg = 0x15; 1420 } else { 1421 sc->sc_MacConfig1 &= ~MC1_FullDuplex; 1422 ipg = 0x11; 1423 } 1424 1425 sf_genreg_write(sc, SF_MacConfig1, sc->sc_MacConfig1); 1426 sf_macreset(sc); 1427 1428 sf_genreg_write(sc, SF_BkToBkIPG, ipg); 1429 } 1430 1431 /* 1432 * sf_mediastatus: [ifmedia interface function] 1433 * 1434 * Callback from ifmedia to request current media status. 1435 */ 1436 void 1437 sf_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 1438 { 1439 struct sf_softc *sc = ifp->if_softc; 1440 1441 mii_pollstat(&sc->sc_mii); 1442 ifmr->ifm_status = sc->sc_mii.mii_media_status; 1443 ifmr->ifm_active = sc->sc_mii.mii_media_active; 1444 } 1445 1446 /* 1447 * sf_mediachange: [ifmedia interface function] 1448 * 1449 * Callback from ifmedia to request new media setting. 1450 */ 1451 int 1452 sf_mediachange(struct ifnet *ifp) 1453 { 1454 struct sf_softc *sc = ifp->if_softc; 1455 1456 if (ifp->if_flags & IFF_UP) 1457 mii_mediachg(&sc->sc_mii); 1458 return (0); 1459 } 1460