|
|
1.1 ! root 1: /* 3c503.c: A shared-memory NS8390 ethernet driver for linux. */ ! 2: /* ! 3: Written 1992-94 by Donald Becker. ! 4: ! 5: Copyright 1993 United States Government as represented by the ! 6: Director, National Security Agency. This software may be used and ! 7: distributed according to the terms of the GNU Public License, ! 8: incorporated herein by reference. ! 9: ! 10: The author may be reached as [email protected], or C/O ! 11: Center of Excellence in Space Data and Information Sciences ! 12: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 ! 13: ! 14: This driver should work with the 3c503 and 3c503/16. It should be used ! 15: in shared memory mode for best performance, although it may also work ! 16: in programmed-I/O mode. ! 17: ! 18: Sources: ! 19: EtherLink II Technical Reference Manual, ! 20: EtherLink II/16 Technical Reference Manual Supplement, ! 21: 3Com Corporation, 5400 Bayfront Plaza, Santa Clara CA 95052-8145 ! 22: ! 23: The Crynwr 3c503 packet driver. ! 24: ! 25: Changelog: ! 26: ! 27: Paul Gortmaker : add support for the 2nd 8kB of RAM on 16 bit cards. ! 28: Paul Gortmaker : multiple card support for module users. ! 29: ! 30: */ ! 31: ! 32: static const char *version = ! 33: "3c503.c:v1.10 9/23/93 Donald Becker ([email protected])\n"; ! 34: ! 35: #include <linux/module.h> ! 36: ! 37: #include <linux/kernel.h> ! 38: #include <linux/sched.h> ! 39: #include <linux/errno.h> ! 40: #include <linux/string.h> ! 41: #include <linux/delay.h> ! 42: #include <linux/netdevice.h> ! 43: #include <linux/etherdevice.h> ! 44: ! 45: #include <asm/io.h> ! 46: #include <asm/system.h> ! 47: ! 48: #include "8390.h" ! 49: #include "3c503.h" ! 50: ! 51: ! 52: int el2_probe(struct device *dev); ! 53: int el2_pio_probe(struct device *dev); ! 54: int el2_probe1(struct device *dev, int ioaddr); ! 55: ! 56: /* A zero-terminated list of I/O addresses to be probed in PIO mode. */ ! 57: static unsigned int netcard_portlist[] = ! 58: { 0x300,0x310,0x330,0x350,0x250,0x280,0x2a0,0x2e0,0}; ! 59: ! 60: #define EL2_IO_EXTENT 16 ! 61: ! 62: #ifdef HAVE_DEVLIST ! 63: /* The 3c503 uses two entries, one for the safe memory-mapped probe and ! 64: the other for the typical I/O probe. */ ! 65: struct netdev_entry el2_drv = ! 66: {"3c503", el2_probe, EL1_IO_EXTENT, 0}; ! 67: struct netdev_entry el2pio_drv = ! 68: {"3c503pio", el2_pioprobe1, EL1_IO_EXTENT, netcard_portlist}; ! 69: #endif ! 70: ! 71: static int el2_open(struct device *dev); ! 72: static int el2_close(struct device *dev); ! 73: static void el2_reset_8390(struct device *dev); ! 74: static void el2_init_card(struct device *dev); ! 75: static void el2_block_output(struct device *dev, int count, ! 76: const unsigned char *buf, const start_page); ! 77: static void el2_block_input(struct device *dev, int count, struct sk_buff *skb, ! 78: int ring_offset); ! 79: static void el2_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, ! 80: int ring_page); ! 81: ! 82: ! 83: /* This routine probes for a memory-mapped 3c503 board by looking for ! 84: the "location register" at the end of the jumpered boot PROM space. ! 85: This works even if a PROM isn't there. ! 86: ! 87: If the ethercard isn't found there is an optional probe for ! 88: ethercard jumpered to programmed-I/O mode. ! 89: */ ! 90: int ! 91: el2_probe(struct device *dev) ! 92: { ! 93: int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0}; ! 94: int base_addr = dev->base_addr; ! 95: ! 96: if (base_addr > 0x1ff) /* Check a single specified location. */ ! 97: return el2_probe1(dev, base_addr); ! 98: else if (base_addr != 0) /* Don't probe at all. */ ! 99: return ENXIO; ! 100: ! 101: for (addr = addrs; *addr; addr++) { ! 102: int i; ! 103: unsigned int base_bits = readb(*addr); ! 104: /* Find first set bit. */ ! 105: for(i = 7; i >= 0; i--, base_bits >>= 1) ! 106: if (base_bits & 0x1) ! 107: break; ! 108: if (base_bits != 1) ! 109: continue; ! 110: if (check_region(netcard_portlist[i], EL2_IO_EXTENT)) ! 111: continue; ! 112: if (el2_probe1(dev, netcard_portlist[i]) == 0) ! 113: return 0; ! 114: } ! 115: #if ! defined(no_probe_nonshared_memory) && ! defined (HAVE_DEVLIST) ! 116: return el2_pio_probe(dev); ! 117: #else ! 118: return ENODEV; ! 119: #endif ! 120: } ! 121: ! 122: #ifndef HAVE_DEVLIST ! 123: /* Try all of the locations that aren't obviously empty. This touches ! 124: a lot of locations, and is much riskier than the code above. */ ! 125: int ! 126: el2_pio_probe(struct device *dev) ! 127: { ! 128: int i; ! 129: int base_addr = dev ? dev->base_addr : 0; ! 130: ! 131: if (base_addr > 0x1ff) /* Check a single specified location. */ ! 132: return el2_probe1(dev, base_addr); ! 133: else if (base_addr != 0) /* Don't probe at all. */ ! 134: return ENXIO; ! 135: ! 136: for (i = 0; netcard_portlist[i]; i++) { ! 137: int ioaddr = netcard_portlist[i]; ! 138: if (check_region(ioaddr, EL2_IO_EXTENT)) ! 139: continue; ! 140: if (el2_probe1(dev, ioaddr) == 0) ! 141: return 0; ! 142: } ! 143: ! 144: return ENODEV; ! 145: } ! 146: #endif ! 147: ! 148: /* Probe for the Etherlink II card at I/O port base IOADDR, ! 149: returning non-zero on success. If found, set the station ! 150: address and memory parameters in DEVICE. */ ! 151: int ! 152: el2_probe1(struct device *dev, int ioaddr) ! 153: { ! 154: int i, iobase_reg, membase_reg, saved_406, wordlength; ! 155: static unsigned version_printed = 0; ! 156: unsigned long vendor_id; ! 157: ! 158: /* Reset and/or avoid any lurking NE2000 */ ! 159: if (inb(ioaddr + 0x408) == 0xff) { ! 160: udelay(1000); ! 161: return ENODEV; ! 162: } ! 163: ! 164: /* We verify that it's a 3C503 board by checking the first three octets ! 165: of its ethernet address. */ ! 166: iobase_reg = inb(ioaddr+0x403); ! 167: membase_reg = inb(ioaddr+0x404); ! 168: /* ASIC location registers should be 0 or have only a single bit set. */ ! 169: if ( (iobase_reg & (iobase_reg - 1)) ! 170: || (membase_reg & (membase_reg - 1))) { ! 171: return ENODEV; ! 172: } ! 173: saved_406 = inb_p(ioaddr + 0x406); ! 174: outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */ ! 175: outb_p(ECNTRL_THIN, ioaddr + 0x406); ! 176: /* Map the station addr PROM into the lower I/O ports. We now check ! 177: for both the old and new 3Com prefix */ ! 178: outb(ECNTRL_SAPROM|ECNTRL_THIN, ioaddr + 0x406); ! 179: vendor_id = inb(ioaddr)*0x10000 + inb(ioaddr + 1)*0x100 + inb(ioaddr + 2); ! 180: if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) { ! 181: /* Restore the register we frobbed. */ ! 182: outb(saved_406, ioaddr + 0x406); ! 183: return ENODEV; ! 184: } ! 185: ! 186: /* We should have a "dev" from Space.c or the static module table. */ ! 187: if (dev == NULL) { ! 188: printk("3c503.c: Passed a NULL device.\n"); ! 189: dev = init_etherdev(0, 0); ! 190: } ! 191: ! 192: if (ei_debug && version_printed++ == 0) ! 193: printk(version); ! 194: ! 195: dev->base_addr = ioaddr; ! 196: ! 197: /* Allocate dev->priv and fill in 8390 specific dev fields. */ ! 198: if (ethdev_init(dev)) { ! 199: printk ("3c503: unable to allocate memory for dev->priv.\n"); ! 200: return -ENOMEM; ! 201: } ! 202: ! 203: printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr); ! 204: ! 205: /* Retrieve and print the ethernet address. */ ! 206: for (i = 0; i < 6; i++) ! 207: printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i)); ! 208: ! 209: /* Map the 8390 back into the window. */ ! 210: outb(ECNTRL_THIN, ioaddr + 0x406); ! 211: ! 212: /* Check for EL2/16 as described in tech. man. */ ! 213: outb_p(E8390_PAGE0, ioaddr + E8390_CMD); ! 214: outb_p(0, ioaddr + EN0_DCFG); ! 215: outb_p(E8390_PAGE2, ioaddr + E8390_CMD); ! 216: wordlength = inb_p(ioaddr + EN0_DCFG) & ENDCFG_WTS; ! 217: outb_p(E8390_PAGE0, ioaddr + E8390_CMD); ! 218: ! 219: /* Probe for, turn on and clear the board's shared memory. */ ! 220: if (ei_debug > 2) printk(" memory jumpers %2.2x ", membase_reg); ! 221: outb(EGACFR_NORM, ioaddr + 0x405); /* Enable RAM */ ! 222: ! 223: /* This should be probed for (or set via an ioctl()) at run-time. ! 224: Right now we use a sleazy hack to pass in the interface number ! 225: at boot-time via the low bits of the mem_end field. That value is ! 226: unused, and the low bits would be discarded even if it was used. */ ! 227: #if defined(EI8390_THICK) || defined(EL2_AUI) ! 228: ei_status.interface_num = 1; ! 229: #else ! 230: ei_status.interface_num = dev->mem_end & 0xf; ! 231: #endif ! 232: printk(", using %sternal xcvr.\n", ei_status.interface_num == 0 ? "in" : "ex"); ! 233: ! 234: if ((membase_reg & 0xf0) == 0) { ! 235: dev->mem_start = 0; ! 236: ei_status.name = "3c503-PIO"; ! 237: } else { ! 238: dev->mem_start = ((membase_reg & 0xc0) ? 0xD8000 : 0xC8000) + ! 239: ((membase_reg & 0xA0) ? 0x4000 : 0); ! 240: ! 241: #define EL2_MEMSIZE (EL2_MB1_STOP_PG - EL2_MB1_START_PG)*256 ! 242: #ifdef EL2MEMTEST ! 243: /* This has never found an error, but someone might care. ! 244: Note that it only tests the 2nd 8kB on 16kB 3c503/16 ! 245: cards between card addr. 0x2000 and 0x3fff. */ ! 246: { /* Check the card's memory. */ ! 247: unsigned long mem_base = dev->mem_start; ! 248: unsigned int test_val = 0xbbadf00d; ! 249: writel(0xba5eba5e, mem_base); ! 250: for (i = sizeof(test_val); i < EL2_MEMSIZE; i+=sizeof(test_val)) { ! 251: writel(test_val, mem_base + i); ! 252: if (readl(mem_base) != 0xba5eba5e ! 253: || readl(mem_base + i) != test_val) { ! 254: printk("3c503.c: memory failure or memory address conflict.\n"); ! 255: dev->mem_start = 0; ! 256: ei_status.name = "3c503-PIO"; ! 257: break; ! 258: } ! 259: test_val += 0x55555555; ! 260: writel(0, mem_base + i); ! 261: } ! 262: } ! 263: #endif /* EL2MEMTEST */ ! 264: ! 265: dev->mem_end = dev->rmem_end = dev->mem_start + EL2_MEMSIZE; ! 266: ! 267: if (wordlength) { /* No Tx pages to skip over to get to Rx */ ! 268: dev->rmem_start = dev->mem_start; ! 269: ei_status.name = "3c503/16"; ! 270: } else { ! 271: dev->rmem_start = TX_PAGES*256 + dev->mem_start; ! 272: ei_status.name = "3c503"; ! 273: } ! 274: } ! 275: ! 276: /* ! 277: Divide up the memory on the card. This is the same regardless of ! 278: whether shared-mem or PIO is used. For 16 bit cards (16kB RAM), ! 279: we use the entire 8k of bank1 for an Rx ring. We only use 3k ! 280: of the bank0 for 2 full size Tx packet slots. For 8 bit cards, ! 281: (8kB RAM) we use 3kB of bank1 for two Tx slots, and the remaining ! 282: 5kB for an Rx ring. */ ! 283: ! 284: if (wordlength) { ! 285: ei_status.tx_start_page = EL2_MB0_START_PG; ! 286: ei_status.rx_start_page = EL2_MB1_START_PG; ! 287: } else { ! 288: ei_status.tx_start_page = EL2_MB1_START_PG; ! 289: ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES; ! 290: } ! 291: ! 292: /* Finish setting the board's parameters. */ ! 293: ei_status.stop_page = EL2_MB1_STOP_PG; ! 294: ei_status.word16 = wordlength; ! 295: ei_status.reset_8390 = &el2_reset_8390; ! 296: ei_status.get_8390_hdr = &el2_get_8390_hdr; ! 297: ei_status.block_input = &el2_block_input; ! 298: ei_status.block_output = &el2_block_output; ! 299: ! 300: request_region(ioaddr, EL2_IO_EXTENT, ei_status.name); ! 301: ! 302: if (dev->irq == 2) ! 303: dev->irq = 9; ! 304: else if (dev->irq > 5 && dev->irq != 9) { ! 305: printk("3c503: configured interrupt %d invalid, will use autoIRQ.\n", ! 306: dev->irq); ! 307: dev->irq = 0; ! 308: } ! 309: ! 310: ei_status.saved_irq = dev->irq; ! 311: ! 312: dev->start = 0; ! 313: dev->open = &el2_open; ! 314: dev->stop = &el2_close; ! 315: ! 316: if (dev->mem_start) ! 317: printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n", ! 318: dev->name, ei_status.name, (wordlength+1)<<3, ! 319: dev->mem_start, dev->mem_end-1); ! 320: ! 321: else ! 322: printk("\n%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n", ! 323: dev->name, ei_status.name, (wordlength+1)<<3); ! 324: ! 325: return 0; ! 326: } ! 327: ! 328: static int ! 329: el2_open(struct device *dev) ! 330: { ! 331: ! 332: if (dev->irq < 2) { ! 333: int irqlist[] = {5, 9, 3, 4, 0}; ! 334: int *irqp = irqlist; ! 335: ! 336: outb(EGACFR_NORM, E33G_GACFR); /* Enable RAM and interrupts. */ ! 337: do { ! 338: if (request_irq (*irqp, NULL, 0, "bogus") != -EBUSY) { ! 339: /* Twinkle the interrupt, and check if it's seen. */ ! 340: autoirq_setup(0); ! 341: outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); ! 342: outb_p(0x00, E33G_IDCFR); ! 343: if (*irqp == autoirq_report(0) /* It's a good IRQ line! */ ! 344: && request_irq (dev->irq = *irqp, &ei_interrupt, 0, ei_status.name) == 0) ! 345: break; ! 346: } ! 347: } while (*++irqp); ! 348: if (*irqp == 0) { ! 349: outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ ! 350: return -EAGAIN; ! 351: } ! 352: } else { ! 353: if (request_irq(dev->irq, &ei_interrupt, 0, ei_status.name)) { ! 354: return -EAGAIN; ! 355: } ! 356: } ! 357: ! 358: el2_init_card(dev); ! 359: ei_open(dev); ! 360: MOD_INC_USE_COUNT; ! 361: return 0; ! 362: } ! 363: ! 364: static int ! 365: el2_close(struct device *dev) ! 366: { ! 367: free_irq(dev->irq); ! 368: dev->irq = ei_status.saved_irq; ! 369: irq2dev_map[dev->irq] = NULL; ! 370: outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ ! 371: ! 372: ei_close(dev); ! 373: MOD_DEC_USE_COUNT; ! 374: return 0; ! 375: } ! 376: ! 377: /* This is called whenever we have a unrecoverable failure: ! 378: transmit timeout ! 379: Bad ring buffer packet header ! 380: */ ! 381: static void ! 382: el2_reset_8390(struct device *dev) ! 383: { ! 384: if (ei_debug > 1) { ! 385: printk("%s: Resetting the 3c503 board...", dev->name); ! 386: printk("%#lx=%#02x %#lx=%#02x %#lx=%#02x...", E33G_IDCFR, inb(E33G_IDCFR), ! 387: E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR)); ! 388: } ! 389: outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL); ! 390: ei_status.txing = 0; ! 391: outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); ! 392: el2_init_card(dev); ! 393: if (ei_debug > 1) printk("done\n"); ! 394: } ! 395: ! 396: /* Initialize the 3c503 GA registers after a reset. */ ! 397: static void ! 398: el2_init_card(struct device *dev) ! 399: { ! 400: /* Unmap the station PROM and select the DIX or BNC connector. */ ! 401: outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); ! 402: ! 403: /* Set ASIC copy of rx's first and last+1 buffer pages */ ! 404: /* These must be the same as in the 8390. */ ! 405: outb(ei_status.rx_start_page, E33G_STARTPG); ! 406: outb(ei_status.stop_page, E33G_STOPPG); ! 407: ! 408: /* Point the vector pointer registers somewhere ?harmless?. */ ! 409: outb(0xff, E33G_VP2); /* Point at the ROM restart location 0xffff0 */ ! 410: outb(0xff, E33G_VP1); ! 411: outb(0x00, E33G_VP0); ! 412: /* Turn off all interrupts until we're opened. */ ! 413: outb_p(0x00, dev->base_addr + EN0_IMR); ! 414: /* Enable IRQs iff started. */ ! 415: outb(EGACFR_NORM, E33G_GACFR); ! 416: ! 417: /* Set the interrupt line. */ ! 418: outb_p((0x04 << (dev->irq == 9 ? 2 : dev->irq)), E33G_IDCFR); ! 419: outb_p(8, E33G_DRQCNT); /* Set burst size to 8 */ ! 420: outb_p(0x20, E33G_DMAAH); /* Put a valid addr in the GA DMA */ ! 421: outb_p(0x00, E33G_DMAAL); ! 422: return; /* We always succeed */ ! 423: } ! 424: ! 425: /* Either use the shared memory (if enabled on the board) or put the packet ! 426: out through the ASIC FIFO. The latter is probably much slower. */ ! 427: static void ! 428: el2_block_output(struct device *dev, int count, ! 429: const unsigned char *buf, const start_page) ! 430: { ! 431: int i; /* Buffer index */ ! 432: int boguscount = 0; /* timeout counter */ ! 433: ! 434: if (ei_status.word16) /* Tx packets go into bank 0 on EL2/16 card */ ! 435: outb(EGACFR_RSEL|EGACFR_TCM, E33G_GACFR); ! 436: else ! 437: outb(EGACFR_NORM, E33G_GACFR); ! 438: ! 439: if (dev->mem_start) { /* Shared memory transfer */ ! 440: unsigned long dest_addr = dev->mem_start + ! 441: ((start_page - ei_status.tx_start_page) << 8); ! 442: memcpy_toio(dest_addr, buf, count); ! 443: outb(EGACFR_NORM, E33G_GACFR); /* Back to bank1 in case on bank0 */ ! 444: return; ! 445: } ! 446: /* No shared memory, put the packet out the slow way. */ ! 447: /* Set up then start the internal memory transfer to Tx Start Page */ ! 448: outb(0x00, E33G_DMAAL); ! 449: outb_p(start_page, E33G_DMAAH); ! 450: outb_p((ei_status.interface_num ? ECNTRL_AUI : ECNTRL_THIN ) | ECNTRL_OUTPUT ! 451: | ECNTRL_START, E33G_CNTRL); ! 452: ! 453: /* This is the byte copy loop: it should probably be tuned for ! 454: speed once everything is working. I think it is possible ! 455: to output 8 bytes between each check of the status bit. */ ! 456: for(i = 0; i < count; i++) { ! 457: if (i % 8 == 0) ! 458: while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0) ! 459: if (++boguscount > (i<<3) + 32) { ! 460: printk("%s: FIFO blocked in el2_block_output (at %d of %d, bc=%d).\n", ! 461: dev->name, i, count, boguscount); ! 462: outb(EGACFR_NORM, E33G_GACFR); /* To MB1 for EL2/16 */ ! 463: return; ! 464: } ! 465: outb(buf[i], E33G_FIFOH); ! 466: } ! 467: outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); ! 468: outb(EGACFR_NORM, E33G_GACFR); /* Back to bank1 in case on bank0 */ ! 469: return; ! 470: } ! 471: ! 472: /* Read the 4 byte, page aligned 8390 specific header. */ ! 473: static void ! 474: el2_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page) ! 475: { ! 476: unsigned int i; ! 477: unsigned long hdr_start = dev->mem_start + ((ring_page - EL2_MB1_START_PG)<<8); ! 478: unsigned long fifo_watchdog; ! 479: ! 480: if (dev->mem_start) { /* Use the shared memory. */ ! 481: #ifdef notdef ! 482: /* Officially this is what we are doing, but the readl() is faster */ ! 483: memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr)); ! 484: #else ! 485: ((unsigned int*)hdr)[0] = readl(hdr_start); ! 486: #endif ! 487: return; ! 488: } ! 489: ! 490: /* No shared memory, use programmed I/O. Ugh. */ ! 491: outb(0, E33G_DMAAL); ! 492: outb_p(ring_page & 0xff, E33G_DMAAH); ! 493: outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT ! 494: | ECNTRL_START, E33G_CNTRL); ! 495: ! 496: /* Header is < 8 bytes, so only check the FIFO at the beginning. */ ! 497: fifo_watchdog = jiffies; ! 498: while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0) { ! 499: if (jiffies - fifo_watchdog > 2*HZ/100) { ! 500: printk("%s: FIFO blocked in el2_get_8390_hdr.\n", dev->name); ! 501: break; ! 502: } ! 503: } ! 504: ! 505: for(i = 0; i < sizeof(struct e8390_pkt_hdr); i++) ! 506: ((char *)(hdr))[i] = inb_p(E33G_FIFOH); ! 507: ! 508: outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); ! 509: } ! 510: ! 511: /* Returns the new ring pointer. */ ! 512: static void ! 513: el2_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset) ! 514: { ! 515: int boguscount = 0; ! 516: int end_of_ring = dev->rmem_end; ! 517: unsigned int i; ! 518: ! 519: /* Maybe enable shared memory just be to be safe... nahh.*/ ! 520: if (dev->mem_start) { /* Use the shared memory. */ ! 521: ring_offset -= (EL2_MB1_START_PG<<8); ! 522: if (dev->mem_start + ring_offset + count > end_of_ring) { ! 523: /* We must wrap the input move. */ ! 524: int semi_count = end_of_ring - (dev->mem_start + ring_offset); ! 525: memcpy_fromio(skb->data, dev->mem_start + ring_offset, semi_count); ! 526: count -= semi_count; ! 527: memcpy_fromio(skb->data + semi_count, dev->rmem_start, count); ! 528: } else { ! 529: /* Packet is in one chunk -- we can copy + cksum. */ ! 530: eth_io_copy_and_sum(skb, dev->mem_start + ring_offset, count, 0); ! 531: } ! 532: return; ! 533: } ! 534: /* No shared memory, use programmed I/O. */ ! 535: outb(ring_offset & 0xff, E33G_DMAAL); ! 536: outb_p((ring_offset >> 8) & 0xff, E33G_DMAAH); ! 537: outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT ! 538: | ECNTRL_START, E33G_CNTRL); ! 539: ! 540: /* This is the byte copy loop: it should probably be tuned for ! 541: speed once everything is working. */ ! 542: for(i = 0; i < count; i++) { ! 543: if (i % 8 == 0) ! 544: while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0) ! 545: if (++boguscount > (i<<3) + 32) { ! 546: printk("%s: FIFO blocked in el2_block_input() (at %d of %d, bc=%d).\n", ! 547: dev->name, i, count, boguscount); ! 548: boguscount = 0; ! 549: break; ! 550: } ! 551: (skb->data)[i] = inb_p(E33G_FIFOH); ! 552: } ! 553: outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); ! 554: } ! 555: ! 556: ! 557: #ifdef MODULE ! 558: #define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */ ! 559: #define NAMELEN 8 /* # of chars for storing dev->name */ ! 560: static char namelist[NAMELEN * MAX_EL2_CARDS] = { 0, }; ! 561: static struct device dev_el2[MAX_EL2_CARDS] = { ! 562: { ! 563: NULL, /* assign a chunk of namelist[] below */ ! 564: 0, 0, 0, 0, ! 565: 0, 0, ! 566: 0, 0, 0, NULL, NULL ! 567: }, ! 568: }; ! 569: ! 570: static int io[MAX_EL2_CARDS] = { 0, }; ! 571: static int irq[MAX_EL2_CARDS] = { 0, }; ! 572: static int xcvr[MAX_EL2_CARDS] = { 0, }; /* choose int. or ext. xcvr */ ! 573: ! 574: /* This is set up so that only a single autoprobe takes place per call. ! 575: ISA device autoprobes on a running machine are not recommended. */ ! 576: int ! 577: init_module(void) ! 578: { ! 579: int this_dev, found = 0; ! 580: ! 581: for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) { ! 582: struct device *dev = &dev_el2[this_dev]; ! 583: dev->name = namelist+(NAMELEN*this_dev); ! 584: dev->irq = irq[this_dev]; ! 585: dev->base_addr = io[this_dev]; ! 586: dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */ ! 587: dev->init = el2_probe; ! 588: if (io[this_dev] == 0) { ! 589: if (this_dev != 0) break; /* only autoprobe 1st one */ ! 590: printk(KERN_NOTICE "3c503.c: Presently autoprobing (not recommended) for a single card.\n"); ! 591: } ! 592: if (register_netdev(dev) != 0) { ! 593: printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]); ! 594: if (found != 0) return 0; /* Got at least one. */ ! 595: return -ENXIO; ! 596: } ! 597: found++; ! 598: } ! 599: ! 600: return 0; ! 601: } ! 602: ! 603: void ! 604: cleanup_module(void) ! 605: { ! 606: int this_dev; ! 607: ! 608: for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) { ! 609: struct device *dev = &dev_el2[this_dev]; ! 610: if (dev->priv != NULL) { ! 611: /* NB: el2_close() handles free_irq + irq2dev map */ ! 612: kfree(dev->priv); ! 613: dev->priv = NULL; ! 614: release_region(dev->base_addr, EL2_IO_EXTENT); ! 615: unregister_netdev(dev); ! 616: } ! 617: } ! 618: } ! 619: #endif /* MODULE */ ! 620: ! 621: /* ! 622: * Local variables: ! 623: * version-control: t ! 624: * kept-new-versions: 5 ! 625: * c-indent-level: 4 ! 626: * End: ! 627: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.