1 /* $NetBSD: sgec.c,v 1.53 2020/03/15 22:19:00 thorpej Exp $ */ 2 /* 3 * Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 /* 27 * Driver for the SGEC (Second Generation Ethernet Controller), sitting 28 * on for example the VAX 4000/300 (KA670). 29 * 30 * The SGEC looks like a mixture of the DEQNA and the TULIP. Fun toy. 31 * 32 * Even though the chip is capable to use virtual addresses (read the 33 * System Page Table directly) this driver doesn't do so, and there 34 * is no benefit in doing it either in NetBSD of today. 35 * 36 * Things that is still to do: 37 * Collect statistics. 38 * Use imperfect filtering when many multicast addresses. 39 */ 40 41 #include <sys/cdefs.h> 42 __KERNEL_RCSID(0, "$NetBSD: sgec.c,v 1.53 2020/03/15 22:19:00 thorpej Exp $"); 43 44 #include "opt_inet.h" 45 46 #include <sys/param.h> 47 #include <sys/mbuf.h> 48 #include <sys/socket.h> 49 #include <sys/device.h> 50 #include <sys/systm.h> 51 #include <sys/sockio.h> 52 53 #include <net/if.h> 54 #include <net/if_ether.h> 55 #include <net/if_dl.h> 56 #include <net/bpf.h> 57 58 #include <netinet/in.h> 59 #include <netinet/if_inarp.h> 60 61 #include <sys/bus.h> 62 63 #include <dev/ic/sgecreg.h> 64 #include <dev/ic/sgecvar.h> 65 66 static void zeinit(struct ze_softc *); 67 static void zestart(struct ifnet *); 68 static int zeioctl(struct ifnet *, u_long, void *); 69 static int ze_add_rxbuf(struct ze_softc *, int); 70 static void ze_setup(struct ze_softc *); 71 static void zetimeout(struct ifnet *); 72 static bool zereset(struct ze_softc *); 73 74 #define ZE_WCSR(csr, val) \ 75 bus_space_write_4(sc->sc_iot, sc->sc_ioh, csr, val) 76 #define ZE_RCSR(csr) \ 77 bus_space_read_4(sc->sc_iot, sc->sc_ioh, csr) 78 79 /* 80 * Interface exists: make available by filling in network interface 81 * record. System will initialize the interface when it is ready 82 * to accept packets. 83 */ 84 void 85 sgec_attach(struct ze_softc *sc) 86 { 87 struct ifnet *ifp = &sc->sc_if; 88 struct ze_tdes *tp; 89 struct ze_rdes *rp; 90 bus_dma_segment_t seg; 91 int i, rseg, error; 92 93 /* 94 * Allocate DMA safe memory for descriptors and setup memory. 95 */ 96 error = bus_dmamem_alloc(sc->sc_dmat, sizeof(struct ze_cdata), 97 PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT); 98 if (error) { 99 aprint_error(": unable to allocate control data, error = %d\n", 100 error); 101 goto fail_0; 102 } 103 104 error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, sizeof(struct ze_cdata), 105 (void **)&sc->sc_zedata, BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 106 if (error) { 107 aprint_error( 108 ": unable to map control data, error = %d\n", error); 109 goto fail_1; 110 } 111 112 error = bus_dmamap_create(sc->sc_dmat, sizeof(struct ze_cdata), 1, 113 sizeof(struct ze_cdata), 0, BUS_DMA_NOWAIT, &sc->sc_cmap); 114 if (error) { 115 aprint_error( 116 ": unable to create control data DMA map, error = %d\n", 117 error); 118 goto fail_2; 119 } 120 121 error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmap, sc->sc_zedata, 122 sizeof(struct ze_cdata), NULL, BUS_DMA_NOWAIT); 123 if (error) { 124 aprint_error( 125 ": unable to load control data DMA map, error = %d\n", 126 error); 127 goto fail_3; 128 } 129 130 /* 131 * Zero the newly allocated memory. 132 */ 133 memset(sc->sc_zedata, 0, sizeof(struct ze_cdata)); 134 135 /* 136 * Create the transmit descriptor DMA maps. 137 */ 138 for (i = 0; error == 0 && i < TXDESCS; i++) { 139 error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, TXDESCS - 1, 140 MCLBYTES, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, 141 &sc->sc_xmtmap[i]); 142 } 143 if (error) { 144 aprint_error(": unable to create tx DMA map %d, error = %d\n", 145 i, error); 146 goto fail_4; 147 } 148 149 /* 150 * Create receive buffer DMA maps. 151 */ 152 for (i = 0; error == 0 && i < RXDESCS; i++) { 153 error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 154 MCLBYTES, 0, BUS_DMA_NOWAIT, &sc->sc_rcvmap[i]); 155 } 156 if (error) { 157 aprint_error(": unable to create rx DMA map %d, error = %d\n", 158 i, error); 159 goto fail_5; 160 } 161 162 /* 163 * Pre-allocate the receive buffers. 164 */ 165 for (i = 0; error == 0 && i < RXDESCS; i++) { 166 error = ze_add_rxbuf(sc, i); 167 } 168 169 if (error) { 170 aprint_error( 171 ": unable to allocate or map rx buffer %d, error = %d\n", 172 i, error); 173 goto fail_6; 174 } 175 176 /* For vmstat -i 177 */ 178 evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL, 179 device_xname(sc->sc_dev), "intr"); 180 evcnt_attach_dynamic(&sc->sc_rxintrcnt, EVCNT_TYPE_INTR, 181 &sc->sc_intrcnt, device_xname(sc->sc_dev), "rx intr"); 182 evcnt_attach_dynamic(&sc->sc_txintrcnt, EVCNT_TYPE_INTR, 183 &sc->sc_intrcnt, device_xname(sc->sc_dev), "tx intr"); 184 evcnt_attach_dynamic(&sc->sc_txdraincnt, EVCNT_TYPE_INTR, 185 &sc->sc_intrcnt, device_xname(sc->sc_dev), "tx drain"); 186 evcnt_attach_dynamic(&sc->sc_nobufintrcnt, EVCNT_TYPE_INTR, 187 &sc->sc_intrcnt, device_xname(sc->sc_dev), "nobuf intr"); 188 evcnt_attach_dynamic(&sc->sc_nointrcnt, EVCNT_TYPE_INTR, 189 &sc->sc_intrcnt, device_xname(sc->sc_dev), "no intr"); 190 191 /* 192 * Create ring loops of the buffer chains. 193 * This is only done once. 194 */ 195 sc->sc_pzedata = (struct ze_cdata *)sc->sc_cmap->dm_segs[0].ds_addr; 196 197 rp = sc->sc_zedata->zc_recv; 198 rp[RXDESCS].ze_framelen = ZE_FRAMELEN_OW; 199 rp[RXDESCS].ze_rdes1 = ZE_RDES1_CA; 200 rp[RXDESCS].ze_bufaddr = (char *)sc->sc_pzedata->zc_recv; 201 202 tp = sc->sc_zedata->zc_xmit; 203 tp[TXDESCS].ze_tdr = ZE_TDR_OW; 204 tp[TXDESCS].ze_tdes1 = ZE_TDES1_CA; 205 tp[TXDESCS].ze_bufaddr = (char *)sc->sc_pzedata->zc_xmit; 206 207 if (zereset(sc)) 208 return; 209 210 strcpy(ifp->if_xname, device_xname(sc->sc_dev)); 211 ifp->if_softc = sc; 212 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 213 ifp->if_start = zestart; 214 ifp->if_ioctl = zeioctl; 215 ifp->if_watchdog = zetimeout; 216 IFQ_SET_READY(&ifp->if_snd); 217 218 /* 219 * Attach the interface. 220 */ 221 if_attach(ifp); 222 ether_ifattach(ifp, sc->sc_enaddr); 223 224 aprint_normal("\n"); 225 aprint_normal_dev(sc->sc_dev, "hardware address %s\n", 226 ether_sprintf(sc->sc_enaddr)); 227 return; 228 229 /* 230 * Free any resources we've allocated during the failed attach 231 * attempt. Do this in reverse order and fall through. 232 */ 233 fail_6: 234 for (i = 0; i < RXDESCS; i++) { 235 if (sc->sc_rxmbuf[i] != NULL) { 236 bus_dmamap_unload(sc->sc_dmat, sc->sc_rcvmap[i]); 237 m_freem(sc->sc_rxmbuf[i]); 238 } 239 } 240 fail_5: 241 for (i = 0; i < TXDESCS; i++) { 242 if (sc->sc_xmtmap[i] != NULL) 243 bus_dmamap_destroy(sc->sc_dmat, sc->sc_xmtmap[i]); 244 } 245 fail_4: 246 for (i = 0; i < RXDESCS; i++) { 247 if (sc->sc_rcvmap[i] != NULL) 248 bus_dmamap_destroy(sc->sc_dmat, sc->sc_rcvmap[i]); 249 } 250 bus_dmamap_unload(sc->sc_dmat, sc->sc_cmap); 251 fail_3: 252 bus_dmamap_destroy(sc->sc_dmat, sc->sc_cmap); 253 fail_2: 254 bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_zedata, 255 sizeof(struct ze_cdata)); 256 fail_1: 257 bus_dmamem_free(sc->sc_dmat, &seg, rseg); 258 fail_0: 259 return; 260 } 261 262 /* 263 * Initialization of interface. 264 */ 265 void 266 zeinit(struct ze_softc *sc) 267 { 268 struct ifnet *ifp = &sc->sc_if; 269 struct ze_cdata *zc = sc->sc_zedata; 270 int i; 271 272 /* 273 * Reset the interface. 274 */ 275 if (zereset(sc)) 276 return; 277 278 sc->sc_nexttx = sc->sc_inq = sc->sc_lastack = sc->sc_txcnt = 0; 279 /* 280 * Release and init transmit descriptors. 281 */ 282 for (i = 0; i < TXDESCS; i++) { 283 if (sc->sc_xmtmap[i]->dm_nsegs > 0) 284 bus_dmamap_unload(sc->sc_dmat, sc->sc_xmtmap[i]); 285 if (sc->sc_txmbuf[i]) { 286 m_freem(sc->sc_txmbuf[i]); 287 sc->sc_txmbuf[i] = 0; 288 } 289 zc->zc_xmit[i].ze_tdr = 0; /* Clear valid bit */ 290 } 291 292 293 /* 294 * Init receive descriptors. 295 */ 296 for (i = 0; i < RXDESCS; i++) 297 zc->zc_recv[i].ze_framelen = ZE_FRAMELEN_OW; 298 sc->sc_nextrx = 0; 299 300 ZE_WCSR(ZE_CSR6, ZE_NICSR6_IE | ZE_NICSR6_BL_8 | ZE_NICSR6_ST | 301 ZE_NICSR6_SR | ZE_NICSR6_DC); 302 303 ifp->if_flags |= IFF_RUNNING; 304 305 /* 306 * Send a setup frame. 307 * This will start the transmit machinery as well. 308 */ 309 ze_setup(sc); 310 311 } 312 313 /* 314 * Start output on interface. 315 */ 316 void 317 zestart(struct ifnet *ifp) 318 { 319 struct ze_softc *sc = ifp->if_softc; 320 struct ze_cdata *zc = sc->sc_zedata; 321 paddr_t buffer; 322 struct mbuf *m; 323 int nexttx, starttx; 324 int len, i, totlen, error; 325 int old_inq = sc->sc_inq; 326 uint16_t orword, tdr = 0; 327 bus_dmamap_t map; 328 329 while (sc->sc_inq < (TXDESCS - 1)) { 330 331 if (sc->sc_setup) { 332 ze_setup(sc); 333 continue; 334 } 335 nexttx = sc->sc_nexttx; 336 IFQ_POLL(&sc->sc_if.if_snd, m); 337 if (m == 0) 338 goto out; 339 /* 340 * Count number of mbufs in chain. 341 * Always do DMA directly from mbufs, therefore the transmit 342 * ring is really big. 343 */ 344 map = sc->sc_xmtmap[nexttx]; 345 error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 346 BUS_DMA_WRITE); 347 if (error) { 348 aprint_error_dev(sc->sc_dev, 349 "zestart: load_mbuf failed: %d", error); 350 goto out; 351 } 352 353 if (map->dm_nsegs >= TXDESCS) 354 panic("zestart"); /* XXX */ 355 356 if ((map->dm_nsegs + sc->sc_inq) >= (TXDESCS - 1)) { 357 bus_dmamap_unload(sc->sc_dmat, map); 358 goto out; 359 } 360 361 /* 362 * m now points to a mbuf chain that can be loaded. 363 * Loop around and set it. 364 */ 365 totlen = 0; 366 orword = ZE_TDES1_FS; 367 starttx = nexttx; 368 for (i = 0; i < map->dm_nsegs; i++) { 369 buffer = map->dm_segs[i].ds_addr; 370 len = map->dm_segs[i].ds_len; 371 372 KASSERT(len > 0); 373 374 totlen += len; 375 /* Word alignment calc */ 376 if (totlen == m->m_pkthdr.len) { 377 sc->sc_txcnt += map->dm_nsegs; 378 if (sc->sc_txcnt >= TXDESCS * 3 / 4) { 379 orword |= ZE_TDES1_IC; 380 sc->sc_txcnt = 0; 381 } 382 orword |= ZE_TDES1_LS; 383 sc->sc_txmbuf[nexttx] = m; 384 } 385 zc->zc_xmit[nexttx].ze_bufsize = len; 386 zc->zc_xmit[nexttx].ze_bufaddr = (char *)buffer; 387 zc->zc_xmit[nexttx].ze_tdes1 = orword; 388 zc->zc_xmit[nexttx].ze_tdr = tdr; 389 390 if (++nexttx == TXDESCS) 391 nexttx = 0; 392 orword = 0; 393 tdr = ZE_TDR_OW; 394 } 395 396 sc->sc_inq += map->dm_nsegs; 397 398 IFQ_DEQUEUE(&ifp->if_snd, m); 399 #ifdef DIAGNOSTIC 400 if (totlen != m->m_pkthdr.len) 401 panic("zestart: len fault"); 402 #endif 403 /* 404 * Turn ownership of the packet over to the device. 405 */ 406 zc->zc_xmit[starttx].ze_tdr = ZE_TDR_OW; 407 408 /* 409 * Kick off the transmit logic, if it is stopped. 410 */ 411 if ((ZE_RCSR(ZE_CSR5) & ZE_NICSR5_TS) != ZE_NICSR5_TS_RUN) 412 ZE_WCSR(ZE_CSR1, -1); 413 sc->sc_nexttx = nexttx; 414 415 bpf_mtap(ifp, m, BPF_D_OUT); 416 } 417 418 out: if (old_inq < sc->sc_inq) 419 ifp->if_timer = 5; /* If transmit logic dies */ 420 } 421 422 int 423 sgec_intr(struct ze_softc *sc) 424 { 425 struct ze_cdata *zc = sc->sc_zedata; 426 struct ifnet *ifp = &sc->sc_if; 427 struct mbuf *m; 428 int csr, len; 429 430 csr = ZE_RCSR(ZE_CSR5); 431 if ((csr & ZE_NICSR5_IS) == 0) { /* Wasn't we */ 432 sc->sc_nointrcnt.ev_count++; 433 return 0; 434 } 435 ZE_WCSR(ZE_CSR5, csr); 436 437 if (csr & ZE_NICSR5_RU) 438 sc->sc_nobufintrcnt.ev_count++; 439 440 if (csr & ZE_NICSR5_RI) { 441 sc->sc_rxintrcnt.ev_count++; 442 while ((zc->zc_recv[sc->sc_nextrx].ze_framelen & 443 ZE_FRAMELEN_OW) == 0) { 444 445 m = sc->sc_rxmbuf[sc->sc_nextrx]; 446 len = zc->zc_recv[sc->sc_nextrx].ze_framelen; 447 ze_add_rxbuf(sc, sc->sc_nextrx); 448 if (++sc->sc_nextrx == RXDESCS) 449 sc->sc_nextrx = 0; 450 if (len < ETHER_MIN_LEN) { 451 if_statinc(ifp, if_ierrors); 452 m_freem(m); 453 } else { 454 m_set_rcvif(m, ifp); 455 m->m_pkthdr.len = m->m_len = 456 len - ETHER_CRC_LEN; 457 if_percpuq_enqueue(ifp->if_percpuq, m); 458 } 459 } 460 } 461 462 if (csr & ZE_NICSR5_TI) 463 sc->sc_txintrcnt.ev_count++; 464 if (sc->sc_lastack != sc->sc_nexttx) { 465 int lastack; 466 for (lastack = sc->sc_lastack; lastack != sc->sc_nexttx; ) { 467 bus_dmamap_t map; 468 int nlastack; 469 470 if ((zc->zc_xmit[lastack].ze_tdr & ZE_TDR_OW) != 0) 471 break; 472 473 if ((zc->zc_xmit[lastack].ze_tdes1 & ZE_TDES1_DT) == 474 ZE_TDES1_DT_SETUP) { 475 if (++lastack == TXDESCS) 476 lastack = 0; 477 sc->sc_inq--; 478 continue; 479 } 480 481 KASSERT(zc->zc_xmit[lastack].ze_tdes1 & ZE_TDES1_FS); 482 map = sc->sc_xmtmap[lastack]; 483 KASSERT(map->dm_nsegs > 0); 484 nlastack = (lastack + map->dm_nsegs - 1) % TXDESCS; 485 if (zc->zc_xmit[nlastack].ze_tdr & ZE_TDR_OW) 486 break; 487 lastack = nlastack; 488 if (sc->sc_txcnt > map->dm_nsegs) 489 sc->sc_txcnt -= map->dm_nsegs; 490 else 491 sc->sc_txcnt = 0; 492 sc->sc_inq -= map->dm_nsegs; 493 KASSERT(zc->zc_xmit[lastack].ze_tdes1 & ZE_TDES1_LS); 494 if_statinc(ifp, if_opackets); 495 bus_dmamap_unload(sc->sc_dmat, map); 496 KASSERT(sc->sc_txmbuf[lastack]); 497 m_freem(sc->sc_txmbuf[lastack]); 498 sc->sc_txmbuf[lastack] = 0; 499 if (++lastack == TXDESCS) 500 lastack = 0; 501 } 502 if (lastack != sc->sc_lastack) { 503 sc->sc_txdraincnt.ev_count++; 504 sc->sc_lastack = lastack; 505 if (sc->sc_inq == 0) 506 ifp->if_timer = 0; 507 zestart(ifp); /* Put in more in queue */ 508 } 509 } 510 return 1; 511 } 512 513 /* 514 * Process an ioctl request. 515 */ 516 int 517 zeioctl(struct ifnet *ifp, u_long cmd, void *data) 518 { 519 struct ze_softc *sc = ifp->if_softc; 520 struct ifaddr *ifa = data; 521 int s = splnet(), error = 0; 522 523 switch (cmd) { 524 525 case SIOCINITIFADDR: 526 ifp->if_flags |= IFF_UP; 527 switch (ifa->ifa_addr->sa_family) { 528 #ifdef INET 529 case AF_INET: 530 zeinit(sc); 531 arp_ifinit(ifp, ifa); 532 break; 533 #endif 534 } 535 break; 536 537 case SIOCSIFFLAGS: 538 if ((error = ifioctl_common(ifp, cmd, data)) != 0) 539 break; 540 /* XXX re-use ether_ioctl() */ 541 switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { 542 case IFF_RUNNING: 543 /* 544 * If interface is marked down and it is running, 545 * stop it. (by disabling receive mechanism). 546 */ 547 ZE_WCSR(ZE_CSR6, ZE_RCSR(ZE_CSR6) & 548 ~(ZE_NICSR6_ST | ZE_NICSR6_SR)); 549 ifp->if_flags &= ~IFF_RUNNING; 550 break; 551 case IFF_UP: 552 /* 553 * If interface it marked up and it is stopped, then 554 * start it. 555 */ 556 zeinit(sc); 557 break; 558 case IFF_UP | IFF_RUNNING: 559 /* 560 * Send a new setup packet to match any new changes. 561 * (Like IFF_PROMISC etc) 562 */ 563 ze_setup(sc); 564 break; 565 case 0: 566 break; 567 } 568 break; 569 570 case SIOCADDMULTI: 571 case SIOCDELMULTI: 572 /* 573 * Update our multicast list. 574 */ 575 if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { 576 /* 577 * Multicast list has changed; set the hardware filter 578 * accordingly. 579 */ 580 if (ifp->if_flags & IFF_RUNNING) 581 ze_setup(sc); 582 error = 0; 583 } 584 break; 585 586 default: 587 error = ether_ioctl(ifp, cmd, data); 588 589 } 590 splx(s); 591 return error; 592 } 593 594 /* 595 * Add a receive buffer to the indicated descriptor. 596 */ 597 int 598 ze_add_rxbuf(struct ze_softc *sc, int i) 599 { 600 struct mbuf *m; 601 struct ze_rdes *rp; 602 int error; 603 604 MGETHDR(m, M_DONTWAIT, MT_DATA); 605 if (m == NULL) 606 return ENOBUFS; 607 608 MCLAIM(m, &sc->sc_ec.ec_rx_mowner); 609 MCLGET(m, M_DONTWAIT); 610 if ((m->m_flags & M_EXT) == 0) { 611 m_freem(m); 612 return ENOBUFS; 613 } 614 615 if (sc->sc_rxmbuf[i] != NULL) 616 bus_dmamap_unload(sc->sc_dmat, sc->sc_rcvmap[i]); 617 618 error = bus_dmamap_load(sc->sc_dmat, sc->sc_rcvmap[i], 619 m->m_ext.ext_buf, m->m_ext.ext_size, NULL, 620 BUS_DMA_READ | BUS_DMA_NOWAIT); 621 if (error) 622 panic("%s: can't load rx DMA map %d, error = %d", 623 device_xname(sc->sc_dev), i, error); 624 sc->sc_rxmbuf[i] = m; 625 626 bus_dmamap_sync(sc->sc_dmat, sc->sc_rcvmap[i], 0, 627 sc->sc_rcvmap[i]->dm_mapsize, BUS_DMASYNC_PREREAD); 628 629 /* 630 * We know that the mbuf cluster is page aligned. Also, be sure 631 * that the IP header will be longword aligned. 632 */ 633 m->m_data += 2; 634 rp = &sc->sc_zedata->zc_recv[i]; 635 rp->ze_bufsize = (m->m_ext.ext_size - 2); 636 rp->ze_bufaddr = (char *)sc->sc_rcvmap[i]->dm_segs[0].ds_addr + 2; 637 rp->ze_framelen = ZE_FRAMELEN_OW; 638 639 return 0; 640 } 641 642 /* 643 * Create a setup packet and put in queue for sending. 644 */ 645 void 646 ze_setup(struct ze_softc *sc) 647 { 648 struct ethercom *ec = &sc->sc_ec; 649 struct ether_multi *enm; 650 struct ether_multistep step; 651 struct ze_cdata *zc = sc->sc_zedata; 652 struct ifnet *ifp = &sc->sc_if; 653 const uint8_t *enaddr = CLLADDR(ifp->if_sadl); 654 int j, idx, reg; 655 656 if (sc->sc_inq == (TXDESCS - 1)) { 657 sc->sc_setup = 1; 658 return; 659 } 660 sc->sc_setup = 0; 661 /* 662 * Init the setup packet with valid info. 663 */ 664 memset(zc->zc_setup, 0xff, sizeof(zc->zc_setup)); /* Broadcast */ 665 memcpy(zc->zc_setup, enaddr, ETHER_ADDR_LEN); 666 667 /* 668 * Multicast handling. The SGEC can handle up to 16 direct 669 * ethernet addresses. 670 */ 671 j = 16; 672 ifp->if_flags &= ~IFF_ALLMULTI; 673 ETHER_LOCK(ec); 674 ETHER_FIRST_MULTI(step, ec, enm); 675 while (enm != NULL) { 676 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) { 677 ifp->if_flags |= IFF_ALLMULTI; 678 break; 679 } 680 memcpy(&zc->zc_setup[j], enm->enm_addrlo, ETHER_ADDR_LEN); 681 j += 8; 682 ETHER_NEXT_MULTI(step, enm); 683 if ((enm != NULL)&& (j == 128)) { 684 ifp->if_flags |= IFF_ALLMULTI; 685 break; 686 } 687 } 688 ETHER_UNLOCK(ec); 689 690 /* 691 * ALLMULTI implies PROMISC in this driver. 692 */ 693 if (ifp->if_flags & IFF_ALLMULTI) 694 ifp->if_flags |= IFF_PROMISC; 695 else if (ifp->if_pcount == 0) 696 ifp->if_flags &= ~IFF_PROMISC; 697 698 /* 699 * Fiddle with the receive logic. 700 */ 701 reg = ZE_RCSR(ZE_CSR6); 702 DELAY(10); 703 ZE_WCSR(ZE_CSR6, reg & ~ZE_NICSR6_SR); /* Stop rx */ 704 reg &= ~ZE_NICSR6_AF; 705 if (ifp->if_flags & IFF_PROMISC) 706 reg |= ZE_NICSR6_AF_PROM; 707 else if (ifp->if_flags & IFF_ALLMULTI) 708 reg |= ZE_NICSR6_AF_ALLM; 709 DELAY(10); 710 ZE_WCSR(ZE_CSR6, reg); 711 /* 712 * Only send a setup packet if needed. 713 */ 714 if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) == 0) { 715 idx = sc->sc_nexttx; 716 zc->zc_xmit[idx].ze_tdes1 = ZE_TDES1_DT_SETUP; 717 zc->zc_xmit[idx].ze_bufsize = 128; 718 zc->zc_xmit[idx].ze_bufaddr = sc->sc_pzedata->zc_setup; 719 zc->zc_xmit[idx].ze_tdr = ZE_TDR_OW; 720 721 if ((ZE_RCSR(ZE_CSR5) & ZE_NICSR5_TS) != ZE_NICSR5_TS_RUN) 722 ZE_WCSR(ZE_CSR1, -1); 723 724 sc->sc_inq++; 725 if (++sc->sc_nexttx == TXDESCS) 726 sc->sc_nexttx = 0; 727 } 728 } 729 730 /* 731 * Check for dead transmit logic. 732 */ 733 void 734 zetimeout(struct ifnet *ifp) 735 { 736 struct ze_softc *sc = ifp->if_softc; 737 738 if (sc->sc_inq == 0) 739 return; 740 741 aprint_error_dev(sc->sc_dev, "xmit logic died, resetting...\n"); 742 /* 743 * Do a reset of interface, to get it going again. 744 * Will it work by just restart the transmit logic? 745 */ 746 zeinit(sc); 747 } 748 749 /* 750 * Reset chip: 751 * Set/reset the reset flag. 752 * Write interrupt vector. 753 * Write ring buffer addresses. 754 * Write SBR. 755 */ 756 bool 757 zereset(struct ze_softc *sc) 758 { 759 int reg, i; 760 761 ZE_WCSR(ZE_CSR6, ZE_NICSR6_RE); 762 DELAY(50000); 763 if (ZE_RCSR(ZE_CSR6) & ZE_NICSR5_SF) { 764 aprint_error_dev(sc->sc_dev, "selftest failed\n"); 765 return true; 766 } 767 768 /* 769 * Get the vector that were set at match time, and remember it. 770 * WHICH VECTOR TO USE? Take one unused. XXX 771 * Funny way to set vector described in the programmers manual. 772 */ 773 reg = ZE_NICSR0_IPL14 | sc->sc_intvec | 0x1fff0003; /* SYNC/ASYNC??? */ 774 i = 10; 775 do { 776 if (i-- == 0) { 777 aprint_error_dev(sc->sc_dev, 778 "failing SGEC CSR0 init\n"); 779 return true; 780 } 781 ZE_WCSR(ZE_CSR0, reg); 782 } while (ZE_RCSR(ZE_CSR0) != reg); 783 784 ZE_WCSR(ZE_CSR3, (vaddr_t)sc->sc_pzedata->zc_recv); 785 ZE_WCSR(ZE_CSR4, (vaddr_t)sc->sc_pzedata->zc_xmit); 786 return false; 787 } 788