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