1 /* $NetBSD: if_le.c,v 1.15 1994/12/12 18:59:12 gwr Exp $ */ 2 3 /*- 4 * Copyright (c) 1982, 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)if_le.c 8.2 (Berkeley) 10/30/93 36 */ 37 38 #include "bpfilter.h" 39 40 /* 41 * AMD 7990 LANCE 42 */ 43 #include <sys/param.h> 44 #include <sys/device.h> 45 #include <sys/systm.h> 46 #include <sys/kernel.h> 47 #include <sys/mbuf.h> 48 #include <sys/buf.h> 49 #include <sys/socket.h> 50 #include <sys/syslog.h> 51 #include <sys/ioctl.h> 52 #include <sys/malloc.h> 53 #include <sys/errno.h> 54 55 #include <net/if.h> 56 #include <net/netisr.h> 57 #include <net/route.h> 58 59 #if NBPFILTER > 0 60 #include <sys/select.h> 61 #include <net/bpf.h> 62 #include <net/bpfdesc.h> 63 #endif 64 65 #ifdef INET 66 #include <netinet/in.h> 67 #include <netinet/in_systm.h> 68 #include <netinet/in_var.h> 69 #include <netinet/ip.h> 70 #include <netinet/if_ether.h> 71 #endif 72 73 #ifdef NS 74 #include <netns/ns.h> 75 #include <netns/ns_if.h> 76 #endif 77 78 #ifdef APPLETALK 79 #include <netddp/atalk.h> 80 #endif 81 82 #include <machine/autoconf.h> 83 #include <machine/cpu.h> 84 85 #include "if_lereg.h" 86 #include "if_le.h" 87 #include "if_le_subr.h" 88 89 /* 90 * The lance has only 24 address lines. When it accesses memory, 91 * the high address lines are hard-wired to 0xFF, so we must: 92 * (1) put what we want the LANCE to see above 0xFF000000, and 93 * (2) mask our CPU addresses down to 24 bits for the LANCE. 94 */ 95 #define LANCE_ADDR(x) ((u_int)(x) & 0xFFffff) 96 97 /* console error messages */ 98 int ledebug = 0; 99 100 #ifdef PACKETSTATS 101 long lexpacketsizes[LEMTU+1]; 102 long lerpacketsizes[LEMTU+1]; 103 #endif 104 105 /* autoconfiguration driver */ 106 void le_attach(struct device *, struct device *, void *); 107 108 struct cfdriver lecd = { 109 NULL, "le", le_md_match, le_attach, 110 DV_IFNET, sizeof(struct le_softc), 111 }; 112 113 /* Forwards */ 114 void lesetladrf(struct le_softc *); 115 void lereset(struct device *); 116 int leinit(int); 117 int lestart(struct ifnet *); 118 void lexint(struct le_softc *); 119 void lerint(struct le_softc *); 120 void leread(struct le_softc *, char *, int); 121 int leput(char *, struct mbuf *); 122 struct mbuf *leget(char *, int, int, struct ifnet *); 123 int leioctl(struct ifnet *, u_long, caddr_t); 124 void leerror(struct le_softc *, int); 125 void lererror(struct le_softc *, char *); 126 void lexerror(struct le_softc *); 127 int lewatchdog(int); /* XXX */ 128 129 /* 130 * Interface exists: make available by filling in network interface 131 * record. System will initialize the interface when it is ready 132 * to accept packets. 133 */ 134 void 135 le_attach(parent, self, aux) 136 struct device *parent; 137 struct device *self; 138 void *aux; 139 { 140 struct le_softc *sc = (void *) self; 141 volatile struct lereg2 *ler2; 142 struct ifnet *ifp = &sc->sc_if; 143 int pri; 144 u_int a; 145 caddr_t dvma_malloc(); 146 147 le_md_attach(parent, self, aux); 148 printf(" hwaddr %s\n", ether_sprintf(sc->sc_addr)); 149 150 /* 151 * Setup for transmit/receive 152 * 153 * According to Van, some versions of the Lance only use this 154 * address to receive packets; it doesn't put them in 155 * output packets. We'll want to make sure that lestart() 156 * installs the address. 157 */ 158 ler2 = sc->sc_r2; 159 ler2->ler2_padr[0] = sc->sc_addr[1]; 160 ler2->ler2_padr[1] = sc->sc_addr[0]; 161 ler2->ler2_padr[2] = sc->sc_addr[3]; 162 ler2->ler2_padr[3] = sc->sc_addr[2]; 163 ler2->ler2_padr[4] = sc->sc_addr[5]; 164 ler2->ler2_padr[5] = sc->sc_addr[4]; 165 a = LANCE_ADDR(ler2->ler2_rmd); 166 ler2->ler2_rlen = LE_RLEN | (a >> 16); 167 ler2->ler2_rdra = a; 168 a = LANCE_ADDR(ler2->ler2_tmd); 169 ler2->ler2_tlen = LE_TLEN | (a >> 16); 170 ler2->ler2_tdra = a; 171 172 /* 173 * Set up event counters. 174 */ 175 evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt); 176 evcnt_attach(&sc->sc_dev, "errs", &sc->sc_errcnt); 177 178 /* 179 * Initialize and attach S/W interface 180 */ 181 ifp->if_unit = sc->sc_dev.dv_unit; 182 ifp->if_name = lecd.cd_name; 183 ifp->if_ioctl = leioctl; 184 ifp->if_output = ether_output; 185 ifp->if_start = lestart; 186 ifp->if_watchdog = lewatchdog; /* XXX */ 187 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 188 #ifdef IFF_NOTRAILERS 189 /* XXX still compile when the blasted things are gone... */ 190 ifp->if_flags |= IFF_NOTRAILERS; 191 #endif 192 if_attach(ifp); 193 ether_ifattach(ifp); 194 #if NBPFILTER > 0 195 bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, 196 sizeof(struct ether_header)); 197 #endif 198 } 199 200 /* 201 * Setup the logical address filter 202 */ 203 void 204 lesetladrf(sc) 205 register struct le_softc *sc; 206 { 207 register volatile struct lereg2 *ler2 = sc->sc_r2; 208 register struct ifnet *ifp = &sc->sc_if; 209 register struct ether_multi *enm; 210 register u_char *cp, c; 211 register u_long crc; 212 register int i, len; 213 struct ether_multistep step; 214 215 /* 216 * Set up multicast address filter by passing all multicast 217 * addresses through a crc generator, and then using the high 218 * order 6 bits as a index into the 64 bit logical address 219 * filter. The high order two bits select the word, while the 220 * rest of the bits select the bit within the word. 221 */ 222 223 ler2->ler2_ladrf[0] = 0; 224 ler2->ler2_ladrf[1] = 0; 225 ler2->ler2_ladrf[2] = 0; 226 ler2->ler2_ladrf[3] = 0; 227 ifp->if_flags &= ~IFF_ALLMULTI; 228 ETHER_FIRST_MULTI(step, &sc->sc_ac, enm); 229 while (enm != NULL) { 230 if (bcmp((caddr_t)&enm->enm_addrlo, 231 (caddr_t)&enm->enm_addrhi, sizeof(enm->enm_addrlo)) != 0) { 232 /* 233 * We must listen to a range of multicast 234 * addresses. For now, just accept all 235 * multicasts, rather than trying to set only 236 * those filter bits needed to match the range. 237 * (At this time, the only use of address 238 * ranges is for IP multicast routing, for 239 * which the range is big enough to require all 240 * bits set.) 241 */ 242 ler2->ler2_ladrf[0] = 0xffff; 243 ler2->ler2_ladrf[1] = 0xffff; 244 ler2->ler2_ladrf[2] = 0xffff; 245 ler2->ler2_ladrf[3] = 0xffff; 246 ifp->if_flags |= IFF_ALLMULTI; 247 return; 248 } 249 250 /* 251 * One would think, given the AM7990 document's polynomial 252 * of 0x04c11db6, that this should be 0x6db88320 (the bit 253 * reversal of the AMD value), but that is not right. See 254 * the BASIC listing: bit 0 (our bit 31) must then be set. 255 */ 256 cp = (unsigned char *)&enm->enm_addrlo; 257 crc = 0xffffffff; 258 for (len = 6; --len >= 0;) { 259 c = *cp++; 260 for (i = 0; i < 8; i++) { 261 if ((c & 0x01) ^ (crc & 0x01)) { 262 crc >>= 1; 263 crc = crc ^ 0xedb88320; 264 } else 265 crc >>= 1; 266 c >>= 1; 267 } 268 } 269 /* Just want the 6 most significant bits. */ 270 crc = crc >> 26; 271 272 /* Turn on the corresponding bit in the filter. */ 273 ler2->ler2_ladrf[crc >> 4] |= 1 << (crc & 0xf); 274 275 ETHER_NEXT_MULTI(step, enm); 276 } 277 } 278 279 void 280 lereset(dev) 281 struct device *dev; 282 { 283 struct le_softc *sc = (struct le_softc *)dev; 284 volatile struct lereg1 *ler1 = sc->sc_r1; 285 volatile struct lereg2 *ler2 = sc->sc_r2; 286 int i, timo, stat; 287 u_int a; 288 289 if (ledebug) 290 printf("%s: resetting, reg %x, ram %x\n", 291 sc->sc_dev.dv_xname, sc->sc_r1, sc->sc_r2); 292 293 #ifdef DIAGNOSTIC 294 i = getsr(); 295 if ((i & PSL_IPL) < PSL_IPL3) 296 panic("lereset at low ipl, sr=%x", i); 297 #endif 298 299 #if NBPFILTER > 0 300 if (sc->sc_if.if_flags & IFF_PROMISC) 301 ler2->ler2_mode = LE_MODE_NORMAL | LE_MODE_PROM; 302 else 303 #endif 304 ler2->ler2_mode = LE_MODE_NORMAL; 305 ler1->ler1_rap = LE_CSR0; 306 ler1->ler1_rdp = LE_C0_STOP; 307 308 /* Setup the logical address filter */ 309 lesetladrf(sc); 310 311 /* init receive and transmit rings */ 312 for (i = 0; i < LERBUF; i++) { 313 a = LANCE_ADDR(&ler2->ler2_rbuf[i][0]); 314 ler2->ler2_rmd[i].rmd0 = a; 315 ler2->ler2_rmd[i].rmd1_hadr = a >> 16; 316 ler2->ler2_rmd[i].rmd1_bits = LE_R1_OWN; 317 ler2->ler2_rmd[i].rmd2 = -LEMTU | LE_XMD2_ONES; 318 ler2->ler2_rmd[i].rmd3 = 0; 319 } 320 for (i = 0; i < LETBUF; i++) { 321 a = LANCE_ADDR(&ler2->ler2_tbuf[i][0]); 322 ler2->ler2_tmd[i].tmd0 = a; 323 ler2->ler2_tmd[i].tmd1_hadr = a >> 16; 324 ler2->ler2_tmd[i].tmd1_bits = 0; 325 ler2->ler2_tmd[i].tmd2 = LE_XMD2_ONES; 326 ler2->ler2_tmd[i].tmd3 = 0; 327 } 328 329 bzero(&ler2->ler2_rbuf[0][0], (LERBUF + LETBUF) * LEMTU); 330 331 /* lance will stuff packet into receive buffer 0 next */ 332 sc->sc_rmd = 0; 333 334 /* 335 * Tell the chip where to find the initialization block. 336 * Note that CSR1, CSR2, and CSR3 may only be accessed 337 * while the STOP bit is set in CSR0. 338 */ 339 a = LANCE_ADDR(&ler2->ler2_mode); 340 ler1->ler1_rap = LE_CSR1; 341 ler1->ler1_rdp = a; 342 ler1->ler1_rap = LE_CSR2; 343 ler1->ler1_rdp = a >> 16; 344 ler1->ler1_rap = LE_CSR3; 345 ler1->ler1_rdp = LE_C3_CONFIG; 346 ler1->ler1_rap = LE_CSR0; 347 ler1->ler1_rdp = LE_C0_INIT; 348 timo = 10000; 349 while (((stat = ler1->ler1_rdp) & (LE_C0_ERR | LE_C0_IDON)) == 0) { 350 delay(100); /* XXX */ 351 if (--timo == 0) { 352 printf("%s: init timeout, stat=%b\n", 353 sc->sc_dev.dv_xname, stat, LE_C0_BITS); 354 break; 355 } 356 } 357 if (stat & LE_C0_ERR) { 358 printf("%s: init failed, stat=%b\n", 359 sc->sc_dev.dv_xname, stat, LE_C0_BITS); 360 sc->sc_if.if_flags &= ~IFF_RUNNING; /* XXX */ 361 return; 362 } 363 ler1->ler1_rdp = LE_C0_IDON; /* clear IDON */ 364 ler1->ler1_rdp = LE_C0_STRT | LE_C0_INEA; 365 sc->sc_if.if_flags &= ~IFF_OACTIVE; 366 delay(100); /* XXX */ 367 } 368 369 /* 370 * Device timeout/watchdog routine. Entered if the device neglects to 371 * generate an interrupt after a transmit has been started on it. 372 */ 373 int 374 lewatchdog(unit) 375 int unit; 376 { 377 struct le_softc *sc = lecd.cd_devs[unit]; 378 int s; 379 380 log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname); 381 sc->sc_if.if_oerrors++; 382 383 #ifdef DIAGNOSTIC 384 s = getsr(); 385 if ((s & PSL_IPL) > PSL_IPL3) 386 panic("lewatchdog would lower spl, sr=%x", s); 387 #endif 388 389 s = splimp(); /* XXX - Can this lower the IPL? */ 390 lereset(&sc->sc_dev); 391 lestart(&sc->sc_if); 392 splx(s); 393 } 394 395 /* 396 * Initialization of interface 397 */ 398 int 399 leinit(unit) 400 int unit; 401 { 402 struct le_softc *sc = lecd.cd_devs[unit]; 403 struct ifnet *ifp = &sc->sc_if; 404 int s; 405 406 /* not yet, if address still unknown */ 407 if (ifp->if_addrlist == (struct ifaddr *)0) { 408 if (ledebug) 409 printf("leinit: no address yet\n"); 410 return (0); 411 } 412 if ((ifp->if_flags & IFF_RUNNING) == 0) { 413 s = splimp(); 414 if (ledebug) 415 printf("le: initializing unit %d, reg %x, ram %x\n", 416 unit, sc->sc_r1, sc->sc_r2); 417 ifp->if_flags |= IFF_RUNNING; 418 lereset(&sc->sc_dev); 419 lestart(ifp); 420 splx(s); 421 } 422 return (0); 423 } 424 425 /* 426 * Start output on interface. Get another datagram to send 427 * off of the interface queue, and copy it to the interface 428 * before starting the output. 429 */ 430 int 431 lestart(ifp) 432 register struct ifnet *ifp; 433 { 434 register struct le_softc *sc = lecd.cd_devs[ifp->if_unit]; 435 register volatile struct letmd *tmd; 436 register struct mbuf *m; 437 register int len; 438 439 #ifdef DIAGNOSTIC 440 int s = getsr(); 441 if ((s & PSL_IPL) < PSL_IPL3) 442 panic("lestart at low ipl, sr=%x", s); 443 #endif 444 445 if ((sc->sc_if.if_flags & IFF_RUNNING) == 0) { 446 if (ledebug) 447 printf("lestart: not running\n"); 448 return (0); 449 } 450 IF_DEQUEUE(&sc->sc_if.if_snd, m); 451 if (m == 0) { 452 if (ledebug & 2) 453 printf("lestart: send queue empty\n"); 454 return (0); 455 } 456 len = leput(sc->sc_r2->ler2_tbuf[0], m); 457 #if NBPFILTER > 0 458 /* 459 * If bpf is listening on this interface, let it 460 * see the packet before we commit it to the wire. 461 */ 462 if (sc->sc_if.if_bpf) 463 bpf_tap(sc->sc_if.if_bpf, sc->sc_r2->ler2_tbuf[0], len); 464 #endif 465 466 #ifdef PACKETSTATS 467 if (len <= LEMTU) 468 lexpacketsizes[len]++; 469 #endif 470 tmd = sc->sc_r2->ler2_tmd; 471 tmd->tmd3 = 0; 472 tmd->tmd2 = -len | LE_XMD2_ONES; 473 tmd->tmd1_bits = LE_T1_OWN | LE_T1_STP | LE_T1_ENP; 474 sc->sc_if.if_flags |= IFF_OACTIVE; 475 476 /* Set a timer just in case we never hear from the board again. */ 477 ifp->if_timer = 2; 478 479 return (0); 480 } 481 482 int 483 le_intr(arg) 484 register void *arg; 485 { 486 register struct le_softc *sc = arg; 487 register volatile struct lereg1 *ler1 = sc->sc_r1; 488 register int csr0; 489 490 csr0 = ler1->ler1_rdp; 491 492 if ((csr0 & LE_C0_INTR) == 0) 493 return (0); 494 495 if (ledebug & 2) 496 printf("[%s: intr, stat %b]\n", 497 sc->sc_dev.dv_xname, csr0, LE_C0_BITS); 498 499 sc->sc_intrcnt.ev_count++; 500 501 if (csr0 & LE_C0_ERR) { 502 sc->sc_errcnt.ev_count++; 503 leerror(sc, csr0); 504 if (csr0 & LE_C0_MERR) { 505 sc->sc_merr++; 506 lereset(&sc->sc_dev); 507 return (1); 508 } 509 if (csr0 & LE_C0_BABL) 510 sc->sc_babl++; 511 if (csr0 & LE_C0_CERR) 512 sc->sc_cerr++; 513 if (csr0 & LE_C0_MISS) 514 sc->sc_miss++; 515 ler1->ler1_rdp = LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_INEA; 516 } 517 if ((csr0 & LE_C0_RXON) == 0) { 518 sc->sc_rxoff++; 519 lereset(&sc->sc_dev); 520 return (1); 521 } 522 if ((csr0 & LE_C0_TXON) == 0) { 523 sc->sc_txoff++; 524 lereset(&sc->sc_dev); 525 return (1); 526 } 527 if (csr0 & LE_C0_RINT) { 528 /* interrupt is cleared in lerint */ 529 lerint(sc); 530 } 531 if (csr0 & LE_C0_TINT) { 532 ler1->ler1_rdp = LE_C0_TINT|LE_C0_INEA; 533 lexint(sc); 534 } 535 return (1); 536 } 537 538 /* 539 * Ethernet interface transmitter interrupt. 540 * Start another output if more data to send. 541 */ 542 void 543 lexint(sc) 544 register struct le_softc *sc; 545 { 546 register volatile struct letmd *tmd = sc->sc_r2->ler2_tmd; 547 548 sc->sc_lestats.lexints++; 549 if ((sc->sc_if.if_flags & IFF_OACTIVE) == 0) { 550 sc->sc_xint++; 551 return; 552 } 553 if (tmd->tmd1_bits & LE_T1_OWN) { 554 sc->sc_xown++; 555 return; 556 } 557 if (tmd->tmd1_bits & LE_T1_ERR) { 558 err: 559 lexerror(sc); 560 sc->sc_if.if_oerrors++; 561 if (tmd->tmd3 & (LE_T3_BUFF|LE_T3_UFLO)) { 562 sc->sc_uflo++; 563 lereset(&sc->sc_dev); 564 } else if (tmd->tmd3 & LE_T3_LCOL) 565 sc->sc_if.if_collisions++; 566 else if (tmd->tmd3 & LE_T3_RTRY) 567 sc->sc_if.if_collisions += 16; 568 } 569 else if (tmd->tmd3 & LE_T3_BUFF) 570 /* XXX documentation says BUFF not included in ERR */ 571 goto err; 572 else if (tmd->tmd1_bits & LE_T1_ONE) 573 sc->sc_if.if_collisions++; 574 else if (tmd->tmd1_bits & LE_T1_MORE) 575 /* what is the real number? */ 576 sc->sc_if.if_collisions += 2; 577 else 578 sc->sc_if.if_opackets++; 579 sc->sc_if.if_flags &= ~IFF_OACTIVE; 580 sc->sc_if.if_timer = 0; /* XXX */ 581 lestart(&sc->sc_if); 582 } 583 584 #define LENEXTRMP \ 585 if (++bix == LERBUF) bix = 0, rmd = sc->sc_r2->ler2_rmd; else ++rmd 586 587 /* 588 * Ethernet interface receiver interrupt. 589 * If input error just drop packet. 590 * Decapsulate packet based on type and pass to type specific 591 * higher-level input routine. 592 */ 593 void 594 lerint(sc) 595 register struct le_softc *sc; 596 { 597 register int bix = sc->sc_rmd; 598 register volatile struct lermd *rmd = &sc->sc_r2->ler2_rmd[bix]; 599 600 sc->sc_lestats.lerints++; 601 /* 602 * Out of sync with hardware, should never happen? 603 */ 604 if (rmd->rmd1_bits & LE_R1_OWN) { 605 do { 606 sc->sc_lestats.lerscans++; 607 LENEXTRMP; 608 } while ((rmd->rmd1_bits & LE_R1_OWN) && bix != sc->sc_rmd); 609 if (bix == sc->sc_rmd) 610 printf("%s: RINT with no buffer\n", 611 sc->sc_dev.dv_xname); 612 } else 613 sc->sc_lestats.lerhits++; 614 615 /* 616 * Process all buffers with valid data 617 */ 618 while ((rmd->rmd1_bits & LE_R1_OWN) == 0) { 619 int len = rmd->rmd3; 620 621 /* Clear interrupt to avoid race condition */ 622 sc->sc_r1->ler1_rdp = LE_C0_RINT|LE_C0_INEA; 623 624 if (rmd->rmd1_bits & LE_R1_ERR) { 625 sc->sc_rmd = bix; 626 lererror(sc, "bad packet"); 627 sc->sc_if.if_ierrors++; 628 } else if ((rmd->rmd1_bits & (LE_R1_STP|LE_R1_ENP)) != 629 (LE_R1_STP|LE_R1_ENP)) { 630 /* XXX make a define for LE_R1_STP|LE_R1_ENP? */ 631 /* 632 * Find the end of the packet so we can see how long 633 * it was. We still throw it away. 634 */ 635 do { 636 sc->sc_r1->ler1_rdp = LE_C0_RINT|LE_C0_INEA; 637 rmd->rmd3 = 0; 638 rmd->rmd1_bits = LE_R1_OWN; 639 LENEXTRMP; 640 } while (!(rmd->rmd1_bits & 641 (LE_R1_OWN|LE_R1_ERR|LE_R1_STP|LE_R1_ENP))); 642 sc->sc_rmd = bix; 643 lererror(sc, "chained buffer"); 644 sc->sc_rxlen++; 645 /* 646 * If search terminated without successful completion 647 * we reset the hardware (conservative). 648 */ 649 if ((rmd->rmd1_bits & 650 (LE_R1_OWN|LE_R1_ERR|LE_R1_STP|LE_R1_ENP)) != 651 LE_R1_ENP) { 652 lereset(&sc->sc_dev); 653 return; 654 } 655 } else { 656 leread(sc, sc->sc_r2->ler2_rbuf[bix], len); 657 #ifdef PACKETSTATS 658 lerpacketsizes[len]++; 659 #endif 660 sc->sc_lestats.lerbufs++; 661 } 662 rmd->rmd3 = 0; 663 rmd->rmd1_bits = LE_R1_OWN; 664 LENEXTRMP; 665 } 666 sc->sc_rmd = bix; 667 } 668 669 void 670 leread(sc, pkt, len) 671 register struct le_softc *sc; 672 char *pkt; 673 int len; 674 { 675 register struct ether_header *et; 676 register struct ifnet *ifp = &sc->sc_if; 677 struct mbuf *m; 678 struct ifqueue *inq; 679 int flags; 680 681 ifp->if_ipackets++; 682 et = (struct ether_header *)pkt; 683 et->ether_type = ntohs((u_short)et->ether_type); 684 /* adjust input length to account for header and CRC */ 685 len -= sizeof(struct ether_header) + 4; 686 687 if (len <= 0) { 688 if (ledebug) 689 log(LOG_WARNING, 690 "%s: ierror(runt packet): from %s: len=%d\n", 691 sc->sc_dev.dv_xname, 692 ether_sprintf(et->ether_shost), len); 693 sc->sc_runt++; 694 ifp->if_ierrors++; 695 return; 696 } 697 698 /* Setup mbuf flags we'll need later */ 699 flags = 0; 700 if (bcmp((caddr_t)etherbroadcastaddr, 701 (caddr_t)et->ether_dhost, sizeof(etherbroadcastaddr)) == 0) 702 flags |= M_BCAST; 703 if (et->ether_dhost[0] & 1) 704 flags |= M_MCAST; 705 706 #if NBPFILTER > 0 707 /* 708 * Check if there's a bpf filter listening on this interface. 709 * If so, hand off the raw packet to enet, then discard things 710 * not destined for us (but be sure to keep broadcast/multicast). 711 */ 712 if (ifp->if_bpf) { 713 bpf_tap(ifp->if_bpf, pkt, 714 len + sizeof(struct ether_header)); 715 if ((flags & (M_BCAST | M_MCAST)) == 0 && 716 bcmp(et->ether_dhost, sc->sc_addr, 717 sizeof(et->ether_dhost)) != 0) 718 return; 719 } 720 #endif 721 m = leget(pkt, len, 0, ifp); 722 if (m == 0) 723 return; 724 725 ether_input(ifp, et, m); 726 } 727 728 /* 729 * Routine to copy from mbuf chain to transmit 730 * buffer in board local memory. 731 * 732 * ### this can be done by remapping in some cases 733 */ 734 int 735 leput(lebuf, m) 736 register char *lebuf; 737 register struct mbuf *m; 738 { 739 register struct mbuf *mp; 740 register int len, tlen = 0; 741 742 for (mp = m; mp; mp = mp->m_next) { 743 len = mp->m_len; 744 if (len == 0) 745 continue; 746 tlen += len; 747 bcopy(mtod(mp, char *), lebuf, len); 748 lebuf += len; 749 } 750 m_freem(m); 751 if (tlen < LEMINSIZE) { 752 bzero(lebuf, LEMINSIZE - tlen); 753 tlen = LEMINSIZE; 754 } 755 return (tlen); 756 } 757 758 /* 759 * Routine to copy from board local memory into mbufs. 760 */ 761 struct mbuf * 762 leget(lebuf, totlen, off0, ifp) 763 char *lebuf; 764 int totlen, off0; 765 struct ifnet *ifp; 766 { 767 register struct mbuf *m; 768 struct mbuf *top = 0, **mp = ⊤ 769 register int off = off0, len; 770 register char *cp; 771 char *epkt; 772 773 lebuf += sizeof(struct ether_header); 774 cp = lebuf; 775 epkt = cp + totlen; 776 if (off) { 777 cp += off + 2 * sizeof(u_short); 778 totlen -= 2 * sizeof(u_short); 779 } 780 781 MGETHDR(m, M_DONTWAIT, MT_DATA); 782 if (m == 0) 783 return (0); 784 m->m_pkthdr.rcvif = ifp; 785 m->m_pkthdr.len = totlen; 786 m->m_len = MHLEN; 787 788 while (totlen > 0) { 789 if (top) { 790 MGET(m, M_DONTWAIT, MT_DATA); 791 if (m == 0) { 792 m_freem(top); 793 return (0); 794 } 795 m->m_len = MLEN; 796 } 797 len = min(totlen, epkt - cp); 798 if (len >= MINCLSIZE) { 799 MCLGET(m, M_DONTWAIT); 800 if (m->m_flags & M_EXT) 801 m->m_len = len = min(len, MCLBYTES); 802 else 803 len = m->m_len; 804 } else { 805 /* 806 * Place initial small packet/header at end of mbuf. 807 */ 808 if (len < m->m_len) { 809 if (top == 0 && len + max_linkhdr <= m->m_len) 810 m->m_data += max_linkhdr; 811 m->m_len = len; 812 } else 813 len = m->m_len; 814 } 815 bcopy(cp, mtod(m, caddr_t), (unsigned)len); 816 cp += len; 817 *mp = m; 818 mp = &m->m_next; 819 totlen -= len; 820 if (cp == epkt) 821 cp = lebuf; 822 } 823 return (top); 824 } 825 826 /* 827 * Process an ioctl request. 828 */ 829 int 830 leioctl(ifp, cmd, data) 831 register struct ifnet *ifp; 832 u_long cmd; 833 caddr_t data; 834 { 835 register struct ifaddr *ifa; 836 register struct le_softc *sc = lecd.cd_devs[ifp->if_unit]; 837 register volatile struct lereg1 *ler1; 838 int s, error; 839 840 /* Make sure attach was called. */ 841 if (sc->sc_r1 == NULL) 842 return (ENXIO); 843 844 error = 0; 845 s = splimp(); 846 switch (cmd) { 847 848 case SIOCSIFADDR: 849 ifa = (struct ifaddr *)data; 850 ifp->if_flags |= IFF_UP; 851 switch (ifa->ifa_addr->sa_family) { 852 #ifdef INET 853 case AF_INET: 854 /* before arpwhohas */ 855 if ((ifp->if_flags & IFF_RUNNING) == 0) /* XXX */ 856 (void)leinit(ifp->if_unit); 857 ((struct arpcom *)ifp)->ac_ipaddr = 858 IA_SIN(ifa)->sin_addr; 859 arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr); 860 break; 861 #endif 862 #ifdef NS 863 case AF_NS: 864 { 865 register struct ns_addr *ina = &(IA_SNS(ifa)->sns_addr); 866 867 if (ns_nullhost(*ina)) 868 ina->x_host = *(union ns_host *)(sc->sc_addr); 869 else { 870 /* 871 * The manual says we can't change the address 872 * while the receiver is armed, 873 * so reset everything 874 */ 875 ifp->if_flags &= ~IFF_RUNNING; 876 bcopy((caddr_t)ina->x_host.c_host, 877 (caddr_t)sc->sc_addr, sizeof(sc->sc_addr)); 878 } 879 (void)leinit(ifp->if_unit); /* does le_setaddr() */ 880 break; 881 } 882 #endif 883 default: 884 (void)leinit(ifp->if_unit); 885 break; 886 } 887 break; 888 889 case SIOCSIFFLAGS: 890 ler1 = sc->sc_r1; 891 if ((ifp->if_flags & IFF_UP) == 0 && 892 ifp->if_flags & IFF_RUNNING) { 893 ler1->ler1_rdp = LE_C0_STOP; 894 ifp->if_flags &= ~IFF_RUNNING; 895 } else if (ifp->if_flags & IFF_UP && 896 (ifp->if_flags & IFF_RUNNING) == 0) 897 (void)leinit(ifp->if_unit); 898 /* 899 * If the state of the promiscuous bit changes, the interface 900 * must be reset to effect the change. 901 */ 902 if (((ifp->if_flags ^ sc->sc_iflags) & IFF_PROMISC) && 903 (ifp->if_flags & IFF_RUNNING)) { 904 sc->sc_iflags = ifp->if_flags; 905 lereset(&sc->sc_dev); 906 lestart(ifp); 907 } 908 break; 909 910 case SIOCADDMULTI: 911 error = ether_addmulti((struct ifreq *)data, &sc->sc_ac); 912 goto update_multicast; 913 914 case SIOCDELMULTI: 915 error = ether_delmulti((struct ifreq *)data, &sc->sc_ac); 916 update_multicast: 917 if (error == ENETRESET) { 918 /* 919 * Multicast list has changed; set the hardware 920 * filter accordingly. 921 */ 922 lereset(&sc->sc_dev); 923 lestart(ifp); /* XXX */ 924 error = 0; 925 } 926 break; 927 928 default: 929 error = EINVAL; 930 } 931 splx(s); 932 return (error); 933 } 934 935 void 936 leerror(sc, stat) 937 register struct le_softc *sc; 938 int stat; 939 { 940 if (!ledebug) 941 return; 942 943 /* 944 * Not all transceivers implement heartbeat 945 * so we only log CERR once. 946 */ 947 if ((stat & LE_C0_CERR) && sc->sc_cerr) 948 return; 949 log(LOG_WARNING, "%s: error: stat=%b\n", 950 sc->sc_dev.dv_xname, stat, LE_C0_BITS); 951 } 952 953 void 954 lererror(sc, msg) 955 register struct le_softc *sc; 956 char *msg; 957 { 958 register volatile struct lermd *rmd; 959 int len; 960 961 if (!ledebug) 962 return; 963 964 rmd = &sc->sc_r2->ler2_rmd[sc->sc_rmd]; 965 len = rmd->rmd3; 966 log(LOG_WARNING, "%s: ierror(%s): from %s: buf=%d, len=%d, rmd1=%b\n", 967 sc->sc_dev.dv_xname, msg, len > 11 ? 968 ether_sprintf((u_char *)&sc->sc_r2->ler2_rbuf[sc->sc_rmd][6]) : 969 "unknown", 970 sc->sc_rmd, len, rmd->rmd1_bits, LE_R1_BITS); 971 } 972 973 void 974 lexerror(sc) 975 register struct le_softc *sc; 976 { 977 register volatile struct letmd *tmd; 978 register int len, tmd3, tdr; 979 980 if (!ledebug) 981 return; 982 983 tmd = sc->sc_r2->ler2_tmd; 984 tmd3 = tmd->tmd3; 985 tdr = tmd3 & LE_T3_TDR_MASK; 986 len = -(tmd->tmd2 & ~LE_XMD2_ONES); 987 log(LOG_WARNING, 988 "%s: oerror: to %s: buf=%d, len=%d, tmd1=%b, tmd3=%b, tdr=%d (%d nsecs)\n", 989 sc->sc_dev.dv_xname, len > 5 ? 990 ether_sprintf((u_char *)&sc->sc_r2->ler2_tbuf[0][0]) : "unknown", 991 0, len, 992 tmd->tmd1_bits, LE_T1_BITS, 993 tmd3, LE_T3_BITS, tdr, tdr * 100); 994 } 995