seeq8005.c revision 1.47
1/* $NetBSD: seeq8005.c,v 1.47 2012/05/09 07:52:52 martin Exp $ */ 2 3/* 4 * Copyright (c) 2000, 2001 Ben Harris 5 * Copyright (c) 1995-1998 Mark Brinicombe 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Mark Brinicombe 19 * for the NetBSD Project. 20 * 4. The name of the company nor the name of the author may be used to 21 * endorse or promote products derived from this software without specific 22 * prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36/* 37 * seeq8005.c - SEEQ 8005 device driver 38 */ 39/* 40 * This driver currently supports the following chips: 41 * SEEQ 8005 Advanced Ethernet Data Link Controller 42 * SEEQ 80C04 Ethernet Data Link Controller 43 * SEEQ 80C04A AutoDUPLEX CMOS Ethernet Data Link Controller 44 */ 45/* 46 * More information on the 8004 and 8005 AEDLC controllers can be found in 47 * the SEEQ Technology Inc 1992 Data Comm Devices data book. 48 * 49 * This data book may no longer be available as these are rather old chips 50 * (1991 - 1993) 51 */ 52/* 53 * This driver is based on the arm32 ea(4) driver, hence the names of many 54 * of the functions. 55 */ 56/* 57 * Bugs/possible improvements: 58 * - Does not currently support DMA 59 * - Does not transmit multiple packets in one go 60 * - Does not support 8-bit busses 61 */ 62 63#include <sys/cdefs.h> 64__KERNEL_RCSID(0, "$NetBSD: seeq8005.c,v 1.47 2012/05/09 07:52:52 martin Exp $"); 65 66#include <sys/param.h> 67#include <sys/systm.h> 68#include <sys/endian.h> 69#include <sys/errno.h> 70#include <sys/ioctl.h> 71#include <sys/mbuf.h> 72#include <sys/socket.h> 73#include <sys/syslog.h> 74#include <sys/device.h> 75 76#include <net/if.h> 77#include <net/if_dl.h> 78#include <net/if_types.h> 79#include <net/if_ether.h> 80#include <net/if_media.h> 81 82#include <net/bpf.h> 83#include <net/bpfdesc.h> 84 85#include <sys/rnd.h> 86 87#include <sys/bus.h> 88#include <sys/intr.h> 89 90#include <dev/ic/seeq8005reg.h> 91#include <dev/ic/seeq8005var.h> 92 93/*#define SEEQ_DEBUG*/ 94 95/* for debugging convenience */ 96#ifdef SEEQ8005_DEBUG 97#define SEEQ_DEBUG_MISC 1 98#define SEEQ_DEBUG_TX 2 99#define SEEQ_DEBUG_RX 4 100#define SEEQ_DEBUG_PKT 8 101#define SEEQ_DEBUG_TXINT 16 102#define SEEQ_DEBUG_RXINT 32 103int seeq8005_debug = 0; 104#define DPRINTF(f, x) { if (seeq8005_debug & (f)) printf x; } 105#else 106#define DPRINTF(f, x) 107#endif 108 109#define SEEQ_TX_BUFFER_SIZE 0x800 /* (> ETHER_MAX_LEN) */ 110 111#define SEEQ_READ16(sc, iot, ioh, reg) \ 112 ((sc)->sc_flags & SF_8BIT ? \ 113 (bus_space_read_1((iot), (ioh), (reg)) | \ 114 (bus_space_read_1((iot), (ioh), (reg) + 1) << 8)) : \ 115 (bus_space_read_2((iot), (ioh), (reg)))) 116 117#define SEEQ_WRITE16(sc, iot, ioh, reg, val) do { \ 118 if ((sc)->sc_flags & SF_8BIT) { \ 119 bus_space_write_1((iot), (ioh), (reg), (val) & 0xff); \ 120 bus_space_write_1((iot), (ioh), (reg) + 1, (val) >> 8); \ 121 } else \ 122 bus_space_write_2((iot), (ioh), (reg), (val)); \ 123} while (/*CONSTCOND*/0) 124 125/* 126 * prototypes 127 */ 128 129static int ea_init(struct ifnet *); 130static int ea_ioctl(struct ifnet *, u_long, void *); 131static void ea_start(struct ifnet *); 132static void ea_watchdog(struct ifnet *); 133static void ea_chipreset(struct seeq8005_softc *); 134static void ea_ramtest(struct seeq8005_softc *); 135static int ea_stoptx(struct seeq8005_softc *); 136static int ea_stoprx(struct seeq8005_softc *); 137static void ea_stop(struct ifnet *, int); 138static void ea_await_fifo_empty(struct seeq8005_softc *); 139static void ea_await_fifo_full(struct seeq8005_softc *); 140static void ea_writebuf(struct seeq8005_softc *, u_char *, int, size_t); 141static void ea_readbuf(struct seeq8005_softc *, u_char *, int, size_t); 142static void ea_select_buffer(struct seeq8005_softc *, int); 143static void ea_set_address(struct seeq8005_softc *, int, const u_int8_t *); 144static void ea_read(struct seeq8005_softc *, int, int); 145static struct mbuf *ea_get(struct seeq8005_softc *, int, int, struct ifnet *); 146static void ea_txint(struct seeq8005_softc *); 147static void ea_rxint(struct seeq8005_softc *); 148static void eatxpacket(struct seeq8005_softc *); 149static int ea_writembuf(struct seeq8005_softc *, struct mbuf *, int); 150static void ea_mc_reset(struct seeq8005_softc *); 151static void ea_mc_reset_8004(struct seeq8005_softc *); 152static void ea_mc_reset_8005(struct seeq8005_softc *); 153static int ea_mediachange(struct ifnet *); 154static void ea_mediastatus(struct ifnet *, struct ifmediareq *); 155 156static u_char* padbuf = NULL; 157 158 159/* 160 * Attach chip. 161 */ 162 163void 164seeq8005_attach(struct seeq8005_softc *sc, const u_int8_t *myaddr, int *media, 165 int nmedia, int defmedia) 166{ 167 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 168 bus_space_tag_t iot = sc->sc_iot; 169 bus_space_handle_t ioh = sc->sc_ioh; 170 u_int id; 171 172 KASSERT(myaddr != NULL); 173 printf(" address %s", ether_sprintf(myaddr)); 174 175 /* Stop the board. */ 176 177 ea_chipreset(sc); 178 179 /* Work out data bus width. */ 180 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_PTR, 0x1234); 181 if (SEEQ_READ16(sc, iot, ioh, SEEQ_RX_PTR) != 0x1234) { 182 /* Try 8-bit mode */ 183 sc->sc_flags |= SF_8BIT; 184 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_PTR, 0x1234); 185 if (SEEQ_READ16(sc, iot, ioh, SEEQ_RX_PTR) != 0x1234) { 186 aprint_normal("\n"); 187 aprint_error_dev(&sc->sc_dev, "Cannot determine data bus width\n"); 188 return; 189 } 190 } 191 192 printf(", %d-bit", sc->sc_flags & SF_8BIT ? 8 : 16); 193 194 /* Get the product ID */ 195 196 ea_select_buffer(sc, SEEQ_BUFCODE_PRODUCTID); 197 id = SEEQ_READ16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN); 198 199 switch (id & SEEQ_PRODUCTID_MASK) { 200 case SEEQ_PRODUCTID_8004: 201 sc->sc_variant = SEEQ_8004; 202 switch (id & SEEQ_PRODUCTID_REV_MASK) { 203 case SEEQ_PRODUCTID_REV_80C04: 204 printf(", SEEQ 80C04\n"); 205 break; 206 case SEEQ_PRODUCTID_REV_80C04A: 207 printf(", SEEQ 80C04A\n"); 208 break; 209 default: 210 /* Unknown SEEQ 8004 variants */ 211 printf(", SEEQ 8004 rev %x\n", 212 id & SEEQ_PRODUCTID_REV_MASK); 213 break; 214 } 215 break; 216 default: /* XXX */ 217 sc->sc_variant = SEEQ_8005; 218 printf(", SEEQ 8005\n"); 219 break; 220 } 221 222 /* Both the 8004 and 8005 are designed for 64K Buffer memory */ 223 sc->sc_buffersize = SEEQ_MAX_BUFFER_SIZE; 224 225 /* 226 * Set up tx and rx buffers. 227 * 228 * We use approximately a quarter of the packet memory for TX 229 * buffers and the rest for RX buffers 230 */ 231 /* sc->sc_tx_bufs = sc->sc_buffersize / SEEQ_TX_BUFFER_SIZE / 4; */ 232 sc->sc_tx_bufs = 1; 233 sc->sc_tx_bufsize = sc->sc_tx_bufs * SEEQ_TX_BUFFER_SIZE; 234 sc->sc_rx_bufsize = sc->sc_buffersize - sc->sc_tx_bufsize; 235 sc->sc_enabled = 0; 236 237 /* Test the RAM */ 238 ea_ramtest(sc); 239 240 printf("%s: %dKB packet memory, txbuf=%dKB (%d buffers), rxbuf=%dKB", 241 device_xname(&sc->sc_dev), sc->sc_buffersize >> 10, 242 sc->sc_tx_bufsize >> 10, sc->sc_tx_bufs, sc->sc_rx_bufsize >> 10); 243 244 if (padbuf == NULL) { 245 padbuf = malloc(ETHER_MIN_LEN - ETHER_CRC_LEN, M_DEVBUF, 246 M_ZERO | M_NOWAIT); 247 if (padbuf == NULL) { 248 aprint_error_dev(&sc->sc_dev, "can't allocate pad buffer\n"); 249 return; 250 } 251 } 252 253 /* Initialise ifnet structure. */ 254 255 strlcpy(ifp->if_xname, device_xname(&sc->sc_dev), IFNAMSIZ); 256 ifp->if_softc = sc; 257 ifp->if_start = ea_start; 258 ifp->if_ioctl = ea_ioctl; 259 ifp->if_init = ea_init; 260 ifp->if_stop = ea_stop; 261 ifp->if_watchdog = ea_watchdog; 262 ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST | IFF_NOTRAILERS; 263 if (sc->sc_variant == SEEQ_8004) 264 ifp->if_flags |= IFF_SIMPLEX; 265 IFQ_SET_READY(&ifp->if_snd); 266 267 /* Initialize media goo. */ 268 ifmedia_init(&sc->sc_media, 0, ea_mediachange, ea_mediastatus); 269 if (media != NULL) { 270 int i; 271 272 for (i = 0; i < nmedia; i++) 273 ifmedia_add(&sc->sc_media, media[i], 0, NULL); 274 ifmedia_set(&sc->sc_media, defmedia); 275 } else { 276 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL); 277 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL); 278 } 279 280 /* We can support 802.1Q VLAN-sized frames. */ 281 sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU; 282 283 /* Now we can attach the interface. */ 284 285 if_attach(ifp); 286 ether_ifattach(ifp, myaddr); 287 288 printf("\n"); 289 290 /* After \n because it can print a line of its own. */ 291 rnd_attach_source(&sc->rnd_source, device_xname(&sc->sc_dev), 292 RND_TYPE_NET, 0); 293} 294 295/* 296 * Media change callback. 297 */ 298static int 299ea_mediachange(struct ifnet *ifp) 300{ 301 struct seeq8005_softc *sc = ifp->if_softc; 302 303 if (sc->sc_mediachange) 304 return ((*sc->sc_mediachange)(sc)); 305 return (EINVAL); 306} 307 308/* 309 * Media status callback. 310 */ 311static void 312ea_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 313{ 314 struct seeq8005_softc *sc = ifp->if_softc; 315 316 if (sc->sc_enabled == 0) { 317 ifmr->ifm_active = IFM_ETHER | IFM_NONE; 318 ifmr->ifm_status = 0; 319 return; 320 } 321 322 if (sc->sc_mediastatus) 323 (*sc->sc_mediastatus)(sc, ifmr); 324} 325 326/* 327 * Test the RAM on the ethernet card. 328 */ 329 330void 331ea_ramtest(struct seeq8005_softc *sc) 332{ 333 bus_space_tag_t iot = sc->sc_iot; 334 bus_space_handle_t ioh = sc->sc_ioh; 335 int loop; 336 u_int sum = 0; 337 338 /* 339 * Test the buffer memory on the board. 340 * Write simple pattens to it and read them back. 341 */ 342 343 /* Set up the whole buffer RAM for writing */ 344 345 ea_select_buffer(sc, SEEQ_BUFCODE_TX_EAP); 346 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, (SEEQ_MAX_BUFFER_SIZE >> 8) - 1); 347 SEEQ_WRITE16(sc, iot, ioh, SEEQ_TX_PTR, 0x0000); 348 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_PTR, SEEQ_MAX_BUFFER_SIZE - 2); 349 350#define SEEQ_RAMTEST_LOOP(value) \ 351do { \ 352 /* Set the write start address and write a pattern */ \ 353 ea_writebuf(sc, NULL, 0x0000, 0); \ 354 for (loop = 0; loop < SEEQ_MAX_BUFFER_SIZE; loop += 2) \ 355 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, (value)); \ 356 \ 357 /* Set the read start address and verify the pattern */ \ 358 ea_readbuf(sc, NULL, 0x0000, 0); \ 359 for (loop = 0; loop < SEEQ_MAX_BUFFER_SIZE; loop += 2) \ 360 if (SEEQ_READ16(sc, iot, ioh, SEEQ_BUFWIN) != (value)) \ 361 ++sum; \ 362} while (/*CONSTCOND*/0) 363 364 SEEQ_RAMTEST_LOOP(loop); 365 SEEQ_RAMTEST_LOOP(loop ^ (SEEQ_MAX_BUFFER_SIZE - 1)); 366 SEEQ_RAMTEST_LOOP(0xaa55); 367 SEEQ_RAMTEST_LOOP(0x55aa); 368 369 /* Report */ 370 371 if (sum > 0) 372 aprint_error_dev(&sc->sc_dev, "buffer RAM failed self test, %d faults\n", sum); 373} 374 375 376/* 377 * Stop the tx interface. 378 * 379 * Returns 0 if the tx was already stopped or 1 if it was active 380 */ 381 382static int 383ea_stoptx(struct seeq8005_softc *sc) 384{ 385 bus_space_tag_t iot = sc->sc_iot; 386 bus_space_handle_t ioh = sc->sc_ioh; 387 int timeout; 388 int status; 389 390 DPRINTF(SEEQ_DEBUG_TX, ("ea_stoptx()\n")); 391 392 sc->sc_enabled = 0; 393 394 status = SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS); 395 if (!(status & SEEQ_STATUS_TX_ON)) 396 return 0; 397 398 /* Stop any tx and wait for confirmation */ 399 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 400 sc->sc_command | SEEQ_CMD_TX_OFF); 401 402 timeout = 20000; 403 do { 404 status = SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS); 405 delay(1); 406 } while ((status & SEEQ_STATUS_TX_ON) && --timeout > 0); 407 if (timeout == 0) 408 log(LOG_ERR, "%s: timeout waiting for tx termination\n", 409 device_xname(&sc->sc_dev)); 410 411 /* Clear any pending tx interrupt */ 412 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 413 sc->sc_command | SEEQ_CMD_TX_INTACK); 414 return 1; 415} 416 417 418/* 419 * Stop the rx interface. 420 * 421 * Returns 0 if the tx was already stopped or 1 if it was active 422 */ 423 424static int 425ea_stoprx(struct seeq8005_softc *sc) 426{ 427 bus_space_tag_t iot = sc->sc_iot; 428 bus_space_handle_t ioh = sc->sc_ioh; 429 int timeout; 430 int status; 431 432 DPRINTF(SEEQ_DEBUG_RX, ("ea_stoprx()\n")); 433 434 status = SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS); 435 if (!(status & SEEQ_STATUS_RX_ON)) 436 return 0; 437 438 /* Stop any rx and wait for confirmation */ 439 440 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 441 sc->sc_command | SEEQ_CMD_RX_OFF); 442 443 timeout = 20000; 444 do { 445 status = SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS); 446 } while ((status & SEEQ_STATUS_RX_ON) && --timeout > 0); 447 if (timeout == 0) 448 log(LOG_ERR, "%s: timeout waiting for rx termination\n", 449 device_xname(&sc->sc_dev)); 450 451 /* Clear any pending rx interrupt */ 452 453 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 454 sc->sc_command | SEEQ_CMD_RX_INTACK); 455 return 1; 456} 457 458 459/* 460 * Stop interface. 461 * Stop all IO and shut the interface down 462 */ 463 464/* ARGSUSED */ 465static void 466ea_stop(struct ifnet *ifp, int disable) 467{ 468 struct seeq8005_softc *sc = ifp->if_softc; 469 bus_space_tag_t iot = sc->sc_iot; 470 bus_space_handle_t ioh = sc->sc_ioh; 471 472 DPRINTF(SEEQ_DEBUG_MISC, ("ea_stop()\n")); 473 474 /* Stop all IO */ 475 ea_stoptx(sc); 476 ea_stoprx(sc); 477 478 /* Disable rx and tx interrupts */ 479 sc->sc_command &= (SEEQ_CMD_RX_INTEN | SEEQ_CMD_TX_INTEN); 480 481 /* Clear any pending interrupts */ 482 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 483 sc->sc_command | SEEQ_CMD_RX_INTACK | 484 SEEQ_CMD_TX_INTACK | SEEQ_CMD_DMA_INTACK | 485 SEEQ_CMD_BW_INTACK); 486 487 if (sc->sc_variant == SEEQ_8004) { 488 /* Put the chip to sleep */ 489 ea_select_buffer(sc, SEEQ_BUFCODE_CONFIG3); 490 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, 491 sc->sc_config3 | SEEQ_CFG3_SLEEP); 492 } 493 494 /* Cancel any watchdog timer */ 495 sc->sc_ethercom.ec_if.if_timer = 0; 496} 497 498 499/* 500 * Reset the chip 501 * Following this the software registers are reset 502 */ 503 504static void 505ea_chipreset(struct seeq8005_softc *sc) 506{ 507 bus_space_tag_t iot = sc->sc_iot; 508 bus_space_handle_t ioh = sc->sc_ioh; 509 510 DPRINTF(SEEQ_DEBUG_MISC, ("ea_chipreset()\n")); 511 512 /* Reset the controller. Min of 4us delay here */ 513 514 /* 515 * This can be called before we know whether the chip is in 8- or 516 * 16-bit mode, so we do a reset in both modes. The 16-bit reset is 517 * harmless in 8-bit mode, so we do that second. 518 */ 519 520 /* In 16-bit mode, this will munge the PreamSelect bit. */ 521 bus_space_write_1(iot, ioh, SEEQ_CONFIG2 + 1, SEEQ_CFG2_RESET >> 8); 522 delay(4); 523 /* In 8-bit mode, this will zero the bottom half of config reg 2. */ 524 bus_space_write_2(iot, ioh, SEEQ_CONFIG2, SEEQ_CFG2_RESET); 525 delay(4); 526 527 sc->sc_command = 0; 528 sc->sc_config1 = 0; 529 sc->sc_config2 = 0; 530 sc->sc_config3 = 0; 531} 532 533 534/* 535 * If the DMA FIFO's in write mode, wait for it to empty. Needed when 536 * switching the FIFO from write to read. We also use it when changing 537 * the address for writes. 538 */ 539static void 540ea_await_fifo_empty(struct seeq8005_softc *sc) 541{ 542 bus_space_tag_t iot = sc->sc_iot; 543 bus_space_handle_t ioh = sc->sc_ioh; 544 int timeout; 545 546 timeout = 20000; 547 if ((SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS) & 548 SEEQ_STATUS_FIFO_DIR) != 0) 549 return; /* FIFO is reading anyway. */ 550 while (--timeout > 0) 551 if (SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS) & 552 SEEQ_STATUS_FIFO_EMPTY) 553 return; 554 log(LOG_ERR, "%s: DMA FIFO failed to empty\n", device_xname(&sc->sc_dev)); 555} 556 557/* 558 * Wait for the DMA FIFO to fill before reading from it. 559 */ 560static void 561ea_await_fifo_full(struct seeq8005_softc *sc) 562{ 563 bus_space_tag_t iot = sc->sc_iot; 564 bus_space_handle_t ioh = sc->sc_ioh; 565 int timeout; 566 567 timeout = 20000; 568 while (--timeout > 0) 569 if (SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS) & 570 SEEQ_STATUS_FIFO_FULL) 571 return; 572 log(LOG_ERR, "%s: DMA FIFO failed to fill\n", device_xname(&sc->sc_dev)); 573} 574 575/* 576 * write to the buffer memory on the interface 577 * 578 * The buffer address is set to ADDR. 579 * If len != 0 then data is copied from the address starting at buf 580 * to the interface buffer. 581 * BUF must be usable as a u_int16_t *. 582 * If LEN is odd, it must be safe to overwrite one extra byte. 583 */ 584 585static void 586ea_writebuf(struct seeq8005_softc *sc, u_char *buf, int addr, size_t len) 587{ 588 bus_space_tag_t iot = sc->sc_iot; 589 bus_space_handle_t ioh = sc->sc_ioh; 590 591 DPRINTF(SEEQ_DEBUG_MISC, ("writebuf: st=%04x\n", 592 SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS))); 593 594#ifdef DIAGNOSTIC 595 if (__predict_false(!ALIGNED_POINTER(buf, u_int16_t))) 596 panic("%s: unaligned writebuf", device_xname(&sc->sc_dev)); 597 if (__predict_false(addr >= SEEQ_MAX_BUFFER_SIZE)) 598 panic("%s: writebuf out of range", device_xname(&sc->sc_dev)); 599#endif 600 601 if (addr != -1) { 602 ea_await_fifo_empty(sc); 603 604 ea_select_buffer(sc, SEEQ_BUFCODE_LOCAL_MEM); 605 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 606 sc->sc_command | SEEQ_CMD_FIFO_WRITE); 607 SEEQ_WRITE16(sc, iot, ioh, SEEQ_DMA_ADDR, addr); 608 } 609 610 if (len > 0) { 611 if (sc->sc_flags & SF_8BIT) 612 bus_space_write_multi_1(iot, ioh, SEEQ_BUFWIN, 613 (u_int8_t *)buf, len); 614 else 615 bus_space_write_multi_2(iot, ioh, SEEQ_BUFWIN, 616 /* LINTED: alignment checked above */ 617 (u_int16_t *)buf, len / 2); 618 } 619 if (!(sc->sc_flags & SF_8BIT) && len % 2) { 620 /* Write the last byte */ 621 bus_space_write_2(iot, ioh, SEEQ_BUFWIN, buf[len - 1]); 622 } 623 /* Leave FIFO to empty in the background */ 624} 625 626 627/* 628 * read from the buffer memory on the interface 629 * 630 * The buffer address is set to ADDR. 631 * If len != 0 then data is copied from the interface buffer to the 632 * address starting at buf. 633 * BUF must be usable as a u_int16_t *. 634 * If LEN is odd, it must be safe to overwrite one extra byte. 635 */ 636 637static void 638ea_readbuf(struct seeq8005_softc *sc, u_char *buf, int addr, size_t len) 639{ 640 bus_space_tag_t iot = sc->sc_iot; 641 bus_space_handle_t ioh = sc->sc_ioh; 642 int runup; 643 644 DPRINTF(SEEQ_DEBUG_MISC, ("readbuf: st=%04x addr=%04x len=%d\n", 645 SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS), addr, len)); 646 647#ifdef DIAGNOSTIC 648 if (__predict_false(!ALIGNED_POINTER(buf, u_int16_t))) 649 panic("%s: unaligned readbuf", device_xname(&sc->sc_dev)); 650 if (__predict_false(addr >= SEEQ_MAX_BUFFER_SIZE)) 651 panic("%s: readbuf out of range", device_xname(&sc->sc_dev)); 652#endif 653 654 if (addr != -1) { 655 /* 656 * SEEQ 80C04 bug: 657 * Starting reading from certain addresses seems to cause 658 * us to get bogus results, so we avoid them. 659 */ 660 runup = 0; 661 if (sc->sc_variant == SEEQ_8004 && 662 ((addr & 0x00ff) == 0x00ea || 663 (addr & 0x00ff) == 0x00ee || 664 (addr & 0x00ff) == 0x00f0)) 665 runup = (addr & 0x00ff) - 0x00e8; 666 667 ea_await_fifo_empty(sc); 668 669 ea_select_buffer(sc, SEEQ_BUFCODE_LOCAL_MEM); 670 671 /* 672 * 80C04 bug workaround. I found this in the old arm32 "eb" 673 * driver. I've no idea what it does, but it seems to stop 674 * the chip mangling data so often. 675 */ 676 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 677 sc->sc_command | SEEQ_CMD_FIFO_WRITE); 678 ea_await_fifo_empty(sc); 679 680 SEEQ_WRITE16(sc, iot, ioh, SEEQ_DMA_ADDR, addr - runup); 681 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 682 sc->sc_command | SEEQ_CMD_FIFO_READ); 683 684 ea_await_fifo_full(sc); 685 while (runup > 0) { 686 /* LINTED: Reading a volatile _does_ have an effect */ 687 (void)SEEQ_READ16(sc, iot, ioh, SEEQ_BUFWIN); 688 runup -= 2; 689 } 690 } 691 692 if (len > 0) { 693 if (sc->sc_flags & SF_8BIT) 694 bus_space_read_multi_1(iot, ioh, SEEQ_BUFWIN, 695 (u_int8_t *)buf, len); 696 else 697 bus_space_read_multi_2(iot, ioh, SEEQ_BUFWIN, 698 /* LINTED: pointer alignment checked above */ 699 (u_int16_t *)buf, len / 2); 700 } 701 if (!(sc->sc_flags & SF_8BIT) && len % 2) { 702 /* Read the last byte */ 703 buf[len - 1] = bus_space_read_2(iot, ioh, SEEQ_BUFWIN); 704 } 705} 706 707static void 708ea_select_buffer(struct seeq8005_softc *sc, int bufcode) 709{ 710 711 SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_CONFIG1, 712 sc->sc_config1 | bufcode); 713} 714 715/* Must be called at splnet */ 716static void 717ea_set_address(struct seeq8005_softc *sc, int which, const u_int8_t *ea) 718{ 719 int i; 720 721 ea_select_buffer(sc, SEEQ_BUFCODE_STATION_ADDR0 + which); 722 for (i = 0; i < ETHER_ADDR_LEN; ++i) 723 SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN, 724 ea[i]); 725} 726 727/* 728 * Initialize interface. 729 * 730 * This should leave the interface in a state for packet reception and 731 * transmission. 732 */ 733 734static int 735ea_init(struct ifnet *ifp) 736{ 737 struct seeq8005_softc *sc = ifp->if_softc; 738 bus_space_tag_t iot = sc->sc_iot; 739 bus_space_handle_t ioh = sc->sc_ioh; 740 int s; 741 742 DPRINTF(SEEQ_DEBUG_MISC, ("ea_init()\n")); 743 744 s = splnet(); 745 746 /* First, reset the board. */ 747 748 ea_chipreset(sc); 749 750 /* Set up defaults for the registers */ 751 752 sc->sc_command = 0; 753 sc->sc_config1 = 0; 754#if BYTE_ORDER == BIG_ENDIAN 755 sc->sc_config2 = SEEQ_CFG2_BYTESWAP; 756#else 757 sc->sc_config2 = 0; 758#endif 759 sc->sc_config3 = 0; 760 761 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, sc->sc_command); 762 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG1, sc->sc_config1); 763 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 764 if (sc->sc_variant == SEEQ_8004) { 765 ea_select_buffer(sc, SEEQ_BUFCODE_CONFIG3); 766 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, sc->sc_config3); 767 } 768 769 /* Write the station address - the receiver must be off */ 770 ea_set_address(sc, 0, (const u_int8_t *)CLLADDR(ifp->if_sadl)); 771 772 /* Split board memory into Rx and Tx. */ 773 ea_select_buffer(sc, SEEQ_BUFCODE_TX_EAP); 774 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, (sc->sc_tx_bufsize>> 8) - 1); 775 776 if (sc->sc_variant == SEEQ_8004) { 777 /* Make the interface IFF_SIMPLEX. */ 778 sc->sc_config2 |= SEEQ_CFG2_RX_TX_DISABLE; 779 /* Enable reception of long packets (for vlan(4)). */ 780 sc->sc_config2 |= SEEQ_CFG2_PASS_LONGSHORT; 781 } 782 783 /* Configure rx. */ 784 ea_mc_reset(sc); 785 if (ifp->if_flags & IFF_PROMISC) 786 sc->sc_config1 = SEEQ_CFG1_PROMISCUOUS; 787 else if ((ifp->if_flags & IFF_ALLMULTI) || sc->sc_variant == SEEQ_8004) 788 sc->sc_config1 = SEEQ_CFG1_MULTICAST; 789 else 790 sc->sc_config1 = SEEQ_CFG1_BROADCAST; 791 sc->sc_config1 |= SEEQ_CFG1_STATION_ADDR0; 792 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG1, sc->sc_config1); 793 794 /* Setup the Rx pointers */ 795 sc->sc_rx_ptr = sc->sc_tx_bufsize; 796 797 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_PTR, sc->sc_rx_ptr); 798 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_END, sc->sc_rx_ptr >> 8); 799 800 801 /* Place a NULL header at the beginning of the receive area */ 802 ea_writebuf(sc, NULL, sc->sc_rx_ptr, 0); 803 804 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, 0x0000); 805 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, 0x0000); 806 807 808 /* Configure TX. */ 809 DPRINTF(SEEQ_DEBUG_MISC, ("Configuring tx...\n")); 810 811 SEEQ_WRITE16(sc, iot, ioh, SEEQ_TX_PTR, 0x0000); 812 813 sc->sc_config2 |= SEEQ_CFG2_OUTPUT; 814 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 815 816 /* Reset tx buffer pointers */ 817 sc->sc_tx_cur = 0; 818 sc->sc_tx_used = 0; 819 sc->sc_tx_next = 0; 820 821 /* Place a NULL header at the beginning of the transmit area */ 822 ea_writebuf(sc, NULL, 0x0000, 0); 823 824 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, 0x0000); 825 SEEQ_WRITE16(sc, iot, ioh, SEEQ_BUFWIN, 0x0000); 826 827 sc->sc_command |= SEEQ_CMD_TX_INTEN; 828 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, sc->sc_command); 829 830 /* Turn on Rx */ 831 sc->sc_command |= SEEQ_CMD_RX_INTEN; 832 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 833 sc->sc_command | SEEQ_CMD_RX_ON); 834 835 /* TX_ON gets set by ea_txpacket when there's something to transmit. */ 836 837 838 /* Set flags appropriately. */ 839 ifp->if_flags |= IFF_RUNNING; 840 ifp->if_flags &= ~IFF_OACTIVE; 841 sc->sc_enabled = 1; 842 843 /* And start output. */ 844 ea_start(ifp); 845 846 splx(s); 847 return 0; 848} 849 850/* 851 * Start output on interface. Get datagrams from the queue and output them, 852 * giving the receiver a chance between datagrams. Call only from splnet or 853 * interrupt level! 854 */ 855 856static void 857ea_start(struct ifnet *ifp) 858{ 859 struct seeq8005_softc *sc = ifp->if_softc; 860 int s; 861 862 s = splnet(); 863 DPRINTF(SEEQ_DEBUG_TX, ("ea_start()...\n")); 864 865 /* 866 * Don't do anything if output is active. seeq8005intr() will call 867 * us (actually eatxpacket()) back when the card's ready for more 868 * frames. 869 */ 870 if (ifp->if_flags & IFF_OACTIVE) 871 return; 872 873 /* Mark interface as output active */ 874 875 ifp->if_flags |= IFF_OACTIVE; 876 877 /* tx packets */ 878 879 eatxpacket(sc); 880 splx(s); 881} 882 883 884/* 885 * Transfer a packet to the interface buffer and start transmission 886 * 887 * Called at splnet() 888 */ 889 890void 891eatxpacket(struct seeq8005_softc *sc) 892{ 893 bus_space_tag_t iot = sc->sc_iot; 894 bus_space_handle_t ioh = sc->sc_ioh; 895 struct mbuf *m0; 896 struct ifnet *ifp; 897 898 ifp = &sc->sc_ethercom.ec_if; 899 900 /* Dequeue the next packet. */ 901 IFQ_DEQUEUE(&ifp->if_snd, m0); 902 903 /* If there's nothing to send, return. */ 904 if (!m0) { 905 ifp->if_flags &= ~IFF_OACTIVE; 906 sc->sc_config2 |= SEEQ_CFG2_OUTPUT; 907 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 908 DPRINTF(SEEQ_DEBUG_TX, ("tx finished\n")); 909 return; 910 } 911 912 /* Give the packet to the bpf, if any. */ 913 bpf_mtap(ifp, m0); 914 915 DPRINTF(SEEQ_DEBUG_TX, ("Tx new packet\n")); 916 917 sc->sc_config2 &= ~SEEQ_CFG2_OUTPUT; 918 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 919 920 ea_writembuf(sc, m0, 0x0000); 921 m_freem(m0); 922 923 SEEQ_WRITE16(sc, iot, ioh, SEEQ_TX_PTR, 0x0000); 924 925 /* Now transmit the datagram. */ 926 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 927 sc->sc_command | SEEQ_CMD_TX_ON); 928 929 /* Make sure we notice if the chip goes silent on us. */ 930 ifp->if_timer = 5; 931 932 DPRINTF(SEEQ_DEBUG_TX, 933 ("st=%04x\n", SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS))); 934 DPRINTF(SEEQ_DEBUG_TX, ("tx: queued\n")); 935} 936 937/* 938 * Copy a packet from an mbuf to the transmit buffer on the card. 939 * 940 * Puts a valid Tx header at the start of the packet, and a null header at 941 * the end. 942 */ 943static int 944ea_writembuf(struct seeq8005_softc *sc, struct mbuf *m0, int bufstart) 945{ 946 struct mbuf *m; 947 int len, nextpacket; 948 u_int8_t hdr[4]; 949 950 /* 951 * Copy the datagram to the packet buffer. 952 */ 953 len = 0; 954 for (m = m0; m; m = m->m_next) { 955 if (m->m_len == 0) 956 continue; 957 ea_writebuf(sc, mtod(m, u_char *), bufstart + 4 + len, 958 m->m_len); 959 len += m->m_len; 960 } 961 962 if (len < ETHER_MIN_LEN) { 963 ea_writebuf(sc, padbuf, bufstart + 4 + len, 964 ETHER_MIN_LEN - len); 965 len = ETHER_MIN_LEN; 966 } 967 968 /* Follow it with a NULL packet header */ 969 memset(hdr, 0, 4); 970 ea_writebuf(sc, hdr, bufstart + 4 + len, 4); 971 SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN, 0x0000); 972 SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_BUFWIN, 0x0000); 973 974 /* Ok we now have a packet len bytes long in our packet buffer */ 975 DPRINTF(SEEQ_DEBUG_TX, ("ea_writembuf: length=%d\n", len)); 976 977 /* Write the packet header */ 978 nextpacket = len + 4; 979 hdr[0] = (nextpacket >> 8) & 0xff; 980 hdr[1] = nextpacket & 0xff; 981 hdr[2] = SEEQ_PKTCMD_TX | SEEQ_PKTCMD_DATA_FOLLOWS | 982 SEEQ_TXCMD_XMIT_SUCCESS_INT | SEEQ_TXCMD_COLLISION_INT; 983 hdr[3] = 0; /* Status byte -- will be update by hardware. */ 984 ea_writebuf(sc, hdr, 0x0000, 4); 985 986 return len; 987} 988 989/* 990 * Ethernet controller interrupt. 991 */ 992 993int 994seeq8005intr(void *arg) 995{ 996 struct seeq8005_softc *sc = arg; 997 bus_space_tag_t iot = sc->sc_iot; 998 bus_space_handle_t ioh = sc->sc_ioh; 999 int status, handled; 1000 1001 handled = 0; 1002 1003 /* Get the controller status */ 1004 status = SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS); 1005 1006 /* Tx interrupt ? */ 1007 if (status & SEEQ_STATUS_TX_INT) { 1008 handled = 1; 1009 1010 /* Acknowledge the interrupt */ 1011 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 1012 sc->sc_command | SEEQ_CMD_TX_INTACK); 1013 1014 ea_txint(sc); 1015 } 1016 1017 1018 /* Rx interrupt ? */ 1019 if (status & SEEQ_STATUS_RX_INT) { 1020 handled = 1; 1021 1022 /* Acknowledge the interrupt */ 1023 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 1024 sc->sc_command | SEEQ_CMD_RX_INTACK); 1025 1026 /* Processes the received packets */ 1027 ea_rxint(sc); 1028 } 1029 1030 if (handled) 1031 rnd_add_uint32(&sc->rnd_source, status); 1032 1033 return handled; 1034} 1035 1036static void 1037ea_txint(struct seeq8005_softc *sc) 1038{ 1039 struct ifnet *ifp = &sc->sc_ethercom.ec_if; 1040 bus_space_tag_t iot = sc->sc_iot; 1041 bus_space_handle_t ioh = sc->sc_ioh; 1042 u_int8_t txhdr[4]; 1043 u_int txstatus; 1044 1045 ea_readbuf(sc, txhdr, 0x0000, 4); 1046 1047 DPRINTF(SEEQ_DEBUG_TX, ("txstatus=%02x %02x %02x %02x\n", 1048 txhdr[0], txhdr[1], txhdr[2], txhdr[3])); 1049 txstatus = txhdr[3]; 1050 1051 /* 1052 * If SEEQ_TXSTAT_COLLISION is set then we received at least 1053 * one collision. On the 8004 we can find out exactly how many 1054 * collisions occurred. 1055 * 1056 * The SEEQ_PKTSTAT_DONE will be set if the transmission has 1057 * completed. 1058 * 1059 * If SEEQ_TXSTAT_COLLISION16 is set then 16 collisions 1060 * occurred and the packet transmission was aborted. 1061 * This situation is untested as present. 1062 * 1063 * The SEEQ_TXSTAT_BABBLE is untested as it should only be set 1064 * when we deliberately transmit oversized packets (e.g. for 1065 * 802.1Q). 1066 */ 1067 if (txstatus & SEEQ_TXSTAT_COLLISION) { 1068 switch (sc->sc_variant) { 1069 case SEEQ_8004: { 1070 int colls; 1071 1072 /* 1073 * The 8004 contains a 4 bit collision count 1074 * in the status register. 1075 */ 1076 1077 /* This appears to be broken on 80C04.AE */ 1078/* ifp->if_collisions += 1079 (txstatus >> SEEQ_TXSTAT_COLLISIONS_SHIFT) 1080 & SEEQ_TXSTAT_COLLISION_MASK;*/ 1081 1082 /* Use the TX Collision register */ 1083 ea_select_buffer(sc, SEEQ_BUFCODE_TX_COLLS); 1084 colls = bus_space_read_1(iot, ioh, SEEQ_BUFWIN); 1085 ifp->if_collisions += colls; 1086 break; 1087 } 1088 case SEEQ_8005: 1089 /* We known there was at least 1 collision */ 1090 ifp->if_collisions++; 1091 break; 1092 } 1093 } else if (txstatus & SEEQ_TXSTAT_COLLISION16) { 1094 printf("seeq_intr: col16 %x\n", txstatus); 1095 ifp->if_collisions += 16; 1096 ifp->if_oerrors++; 1097 } 1098 1099 /* Have we completed transmission on the packet ? */ 1100 if (txstatus & SEEQ_PKTSTAT_DONE) { 1101 /* Clear watchdog timer. */ 1102 ifp->if_timer = 0; 1103 ifp->if_flags &= ~IFF_OACTIVE; 1104 1105 /* Update stats */ 1106 ifp->if_opackets++; 1107 1108 /* Tx next packet */ 1109 1110 eatxpacket(sc); 1111 } 1112} 1113 1114void 1115ea_rxint(struct seeq8005_softc *sc) 1116{ 1117 bus_space_tag_t iot = sc->sc_iot; 1118 bus_space_handle_t ioh = sc->sc_ioh; 1119 u_int addr; 1120 int len; 1121 int ctrl; 1122 int ptr; 1123 int status; 1124 u_int8_t rxhdr[4]; 1125 struct ifnet *ifp; 1126 1127 ifp = &sc->sc_ethercom.ec_if; 1128 1129 1130 /* We start from the last rx pointer position */ 1131 addr = sc->sc_rx_ptr; 1132 sc->sc_config2 &= ~SEEQ_CFG2_OUTPUT; 1133 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 1134 1135 do { 1136 /* Read rx header */ 1137 ea_readbuf(sc, rxhdr, addr, 4); 1138 1139 /* Split the packet header */ 1140 ptr = (rxhdr[0] << 8) | rxhdr[1]; 1141 ctrl = rxhdr[2]; 1142 status = rxhdr[3]; 1143 1144 DPRINTF(SEEQ_DEBUG_RX, 1145 ("addr=%04x ptr=%04x ctrl=%02x status=%02x\n", 1146 addr, ptr, ctrl, status)); 1147 1148 /* Zero packet ptr ? then must be null header so exit */ 1149 if (ptr == 0) break; 1150 1151 /* Sanity-check the next-packet pointer and flags. */ 1152 if (__predict_false(ptr < sc->sc_tx_bufsize || 1153 (ctrl & SEEQ_PKTCMD_TX))) { 1154 ++ifp->if_ierrors; 1155 log(LOG_ERR, 1156 "%s: Rx chain corrupt at %04x (ptr = %04x)\n", 1157 device_xname(&sc->sc_dev), addr, ptr); 1158 ea_init(ifp); 1159 return; 1160 } 1161 1162 /* Get packet length */ 1163 len = (ptr - addr) - 4; 1164 1165 if (len < 0) 1166 len += sc->sc_rx_bufsize; 1167 DPRINTF(SEEQ_DEBUG_RX, ("len=%04x\n", len)); 1168 1169 /* Has the packet rx completed ? if not then exit */ 1170 if ((status & SEEQ_PKTSTAT_DONE) == 0) 1171 break; 1172 1173 /* 1174 * Did we have any errors? then note error and go to 1175 * next packet 1176 */ 1177 if (__predict_false(status & 1178 (SEEQ_RXSTAT_CRC_ERROR | SEEQ_RXSTAT_DRIBBLE_ERROR | 1179 SEEQ_RXSTAT_SHORT_FRAME))) { 1180 ++ifp->if_ierrors; 1181 log(LOG_WARNING, 1182 "%s: rx packet error at %04x (err=%02x)\n", 1183 device_xname(&sc->sc_dev), addr, status & 0x0f); 1184 /* XXX shouldn't need to reset if it's genuine. */ 1185 ea_init(ifp); 1186 return; 1187 } 1188 /* 1189 * Is the packet too big? We allow slightly oversize packets 1190 * for vlan(4) and tcpdump purposes, but the rest of the world 1191 * wants incoming packets in a single mbuf cluster. 1192 */ 1193 if (__predict_false(len > MCLBYTES)) { 1194 ++ifp->if_ierrors; 1195 log(LOG_ERR, 1196 "%s: rx packet size error at %04x (len=%d)\n", 1197 device_xname(&sc->sc_dev), addr, len); 1198 sc->sc_config2 |= SEEQ_CFG2_OUTPUT; 1199 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, 1200 sc->sc_config2); 1201 ea_init(ifp); 1202 return; 1203 } 1204 1205 ifp->if_ipackets++; 1206 /* Pass data up to upper levels. */ 1207 ea_read(sc, addr + 4, len); 1208 1209 addr = ptr; 1210 } while (len != 0); 1211 1212 sc->sc_config2 |= SEEQ_CFG2_OUTPUT; 1213 SEEQ_WRITE16(sc, iot, ioh, SEEQ_CONFIG2, sc->sc_config2); 1214 1215 DPRINTF(SEEQ_DEBUG_RX, ("new rx ptr=%04x\n", addr)); 1216 1217 /* Store new rx pointer */ 1218 sc->sc_rx_ptr = addr; 1219 SEEQ_WRITE16(sc, iot, ioh, SEEQ_RX_END, sc->sc_rx_ptr >> 8); 1220 1221 /* Make sure the receiver is on */ 1222 SEEQ_WRITE16(sc, iot, ioh, SEEQ_COMMAND, 1223 sc->sc_command | SEEQ_CMD_RX_ON); 1224} 1225 1226 1227/* 1228 * Pass a packet up to the higher levels. 1229 */ 1230 1231static void 1232ea_read(struct seeq8005_softc *sc, int addr, int len) 1233{ 1234 struct mbuf *m; 1235 struct ifnet *ifp; 1236 1237 ifp = &sc->sc_ethercom.ec_if; 1238 1239 /* Pull packet off interface. */ 1240 m = ea_get(sc, addr, len, ifp); 1241 if (m == 0) 1242 return; 1243 1244 /* 1245 * Check if there's a BPF listener on this interface. 1246 * If so, hand off the raw packet to bpf. 1247 */ 1248 bpf_mtap(ifp, m); 1249 1250 (*ifp->if_input)(ifp, m); 1251} 1252 1253/* 1254 * Pull read data off a interface. Len is length of data, with local net 1255 * header stripped. We copy the data into mbufs. When full cluster sized 1256 * units are present we copy into clusters. 1257 */ 1258 1259struct mbuf * 1260ea_get(struct seeq8005_softc *sc, int addr, int totlen, struct ifnet *ifp) 1261{ 1262 struct mbuf *top, **mp, *m; 1263 int len; 1264 u_int cp, epkt; 1265 1266 cp = addr; 1267 epkt = cp + totlen; 1268 1269 MGETHDR(m, M_DONTWAIT, MT_DATA); 1270 if (m == 0) 1271 return 0; 1272 m->m_pkthdr.rcvif = ifp; 1273 m->m_pkthdr.len = totlen; 1274 m->m_len = MHLEN; 1275 top = 0; 1276 mp = ⊤ 1277 1278 while (totlen > 0) { 1279 if (top) { 1280 MGET(m, M_DONTWAIT, MT_DATA); 1281 if (m == 0) { 1282 m_freem(top); 1283 return 0; 1284 } 1285 m->m_len = MLEN; 1286 } 1287 len = min(totlen, epkt - cp); 1288 if (len >= MINCLSIZE) { 1289 MCLGET(m, M_DONTWAIT); 1290 if (m->m_flags & M_EXT) 1291 m->m_len = len = min(len, MCLBYTES); 1292 else 1293 len = m->m_len; 1294 } else { 1295 /* 1296 * Place initial small packet/header at end of mbuf. 1297 */ 1298 if (len < m->m_len) { 1299 if (top == 0 && len + max_linkhdr <= m->m_len) 1300 m->m_data += max_linkhdr; 1301 m->m_len = len; 1302 } else 1303 len = m->m_len; 1304 } 1305 if (top == 0) { 1306 /* Make sure the payload is aligned */ 1307 char *newdata = (char *) 1308 ALIGN((char*)m->m_data + 1309 sizeof(struct ether_header)) - 1310 sizeof(struct ether_header); 1311 len -= newdata - m->m_data; 1312 m->m_len = len; 1313 m->m_data = newdata; 1314 } 1315 ea_readbuf(sc, mtod(m, u_char *), 1316 cp < SEEQ_MAX_BUFFER_SIZE ? cp : cp - sc->sc_rx_bufsize, 1317 len); 1318 cp += len; 1319 *mp = m; 1320 mp = &m->m_next; 1321 totlen -= len; 1322 if (cp == epkt) 1323 cp = addr; 1324 } 1325 1326 return top; 1327} 1328 1329/* 1330 * Process an ioctl request. Mostly boilerplate. 1331 */ 1332static int 1333ea_ioctl(struct ifnet *ifp, u_long cmd, void *data) 1334{ 1335 struct seeq8005_softc *sc = ifp->if_softc; 1336 int s, error = 0; 1337 1338 s = splnet(); 1339 switch (cmd) { 1340 1341 default: 1342 error = ether_ioctl(ifp, cmd, data); 1343 if (error == ENETRESET) { 1344 /* 1345 * Multicast list has changed; set the hardware filter 1346 * accordingly. 1347 */ 1348 if (ifp->if_flags & IFF_RUNNING) 1349 ea_mc_reset(sc); 1350 error = 0; 1351 } 1352 break; 1353 } 1354 1355 splx(s); 1356 return error; 1357} 1358 1359/* Must be called at splnet() */ 1360 1361static void 1362ea_mc_reset(struct seeq8005_softc *sc) 1363{ 1364 1365 switch (sc->sc_variant) { 1366 case SEEQ_8004: 1367 ea_mc_reset_8004(sc); 1368 return; 1369 case SEEQ_8005: 1370 ea_mc_reset_8005(sc); 1371 return; 1372 } 1373} 1374 1375static void 1376ea_mc_reset_8004(struct seeq8005_softc *sc) 1377{ 1378 struct ethercom *ec = &sc->sc_ethercom; 1379 struct ifnet *ifp = &ec->ec_if; 1380 struct ether_multi *enm; 1381 u_int32_t crc; 1382 int i; 1383 struct ether_multistep step; 1384 u_int8_t af[8]; 1385 1386 /* 1387 * Set up multicast address filter by passing all multicast addresses 1388 * through a crc generator, and then using bits 2 - 7 as an index 1389 * into the 64 bit logical address filter. The high order bits 1390 * selects the word, while the rest of the bits select the bit within 1391 * the word. 1392 */ 1393 1394 if (ifp->if_flags & IFF_PROMISC) { 1395 ifp->if_flags |= IFF_ALLMULTI; 1396 for (i = 0; i < 8; i++) 1397 af[i] = 0xff; 1398 return; 1399 } 1400 for (i = 0; i < 8; i++) 1401 af[i] = 0; 1402 ETHER_FIRST_MULTI(step, ec, enm); 1403 while (enm != NULL) { 1404 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 1405 sizeof(enm->enm_addrlo)) != 0) { 1406 /* 1407 * We must listen to a range of multicast addresses. 1408 * For now, just accept all multicasts, rather than 1409 * trying to set only those filter bits needed to match 1410 * the range. (At this time, the only use of address 1411 * ranges is for IP multicast routing, for which the 1412 * range is big enough to require all bits set.) 1413 */ 1414 ifp->if_flags |= IFF_ALLMULTI; 1415 for (i = 0; i < 8; i++) 1416 af[i] = 0xff; 1417 break; 1418 } 1419 1420 crc = ether_crc32_be(enm->enm_addrlo, sizeof(enm->enm_addrlo)); 1421 1422 /* Just want the 6 most significant bits. */ 1423 crc = (crc >> 2) & 0x3f; 1424 1425 /* Turn on the corresponding bit in the filter. */ 1426 af[crc >> 3] |= 1 << (crc & 0x7); 1427 1428 ETHER_NEXT_MULTI(step, enm); 1429 } 1430 ifp->if_flags &= ~IFF_ALLMULTI; 1431 1432 ea_select_buffer(sc, SEEQ_BUFCODE_MULTICAST); 1433 for (i = 0; i < 8; ++i) 1434 bus_space_write_1(sc->sc_iot, sc->sc_ioh, 1435 SEEQ_BUFWIN, af[i]); 1436} 1437 1438static void 1439ea_mc_reset_8005(struct seeq8005_softc *sc) 1440{ 1441 struct ether_multi *enm; 1442 struct ether_multistep step; 1443 int naddr, maxaddrs; 1444 1445 naddr = 0; 1446 maxaddrs = 5; 1447 ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); 1448 while (enm != NULL) { 1449 /* Have we got space? */ 1450 if (naddr >= maxaddrs || 1451 memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { 1452 sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI; 1453 ea_ioctl(&sc->sc_ethercom.ec_if, SIOCSIFFLAGS, NULL); 1454 return; 1455 } 1456 ea_set_address(sc, 1 + naddr, enm->enm_addrlo); 1457 sc->sc_config1 |= SEEQ_CFG1_STATION_ADDR1 << naddr; 1458 naddr++; 1459 ETHER_NEXT_MULTI(step, enm); 1460 } 1461 for (; naddr < maxaddrs; naddr++) 1462 sc->sc_config1 &= ~(SEEQ_CFG1_STATION_ADDR1 << naddr); 1463 SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_CONFIG1, 1464 sc->sc_config1); 1465} 1466 1467/* 1468 * Device timeout routine. 1469 */ 1470 1471static void 1472ea_watchdog(struct ifnet *ifp) 1473{ 1474 struct seeq8005_softc *sc = ifp->if_softc; 1475 1476 log(LOG_ERR, "%s: lost Tx interrupt (status = 0x%04x)\n", 1477 device_xname(&sc->sc_dev), 1478 SEEQ_READ16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_STATUS)); 1479 ifp->if_oerrors++; 1480 1481 /* Kick the interface */ 1482 1483 ea_init(ifp); 1484 1485 ifp->if_timer = 0; 1486} 1487 1488/* End of if_ea.c */ 1489