|
|
1.1 ! root 1: /* ewrk3.c: A DIGITAL EtherWORKS 3 ethernet driver for Linux. ! 2: ! 3: Written 1994 by David C. Davies. ! 4: ! 5: Copyright 1994 Digital Equipment Corporation. ! 6: ! 7: This software may be used and distributed according to the terms of ! 8: the GNU Public License, incorporated herein by reference. ! 9: ! 10: This driver is written for the Digital Equipment Corporation series ! 11: of EtherWORKS ethernet cards: ! 12: ! 13: DE203 Turbo (BNC) ! 14: DE204 Turbo (TP) ! 15: DE205 Turbo (TP BNC) ! 16: ! 17: The driver has been tested on a relatively busy network using the DE205 ! 18: card and benchmarked with 'ttcp': it transferred 16M of data at 975kB/s ! 19: (7.8Mb/s) to a DECstation 5000/200. ! 20: ! 21: The author may be reached at [email protected]. ! 22: ! 23: ========================================================================= ! 24: This driver has been written substantially from scratch, although its ! 25: inheritance of style and stack interface from 'depca.c' and in turn from ! 26: Donald Becker's 'lance.c' should be obvious. ! 27: ! 28: The DE203/4/5 boards all use a new proprietary chip in place of the ! 29: LANCE chip used in prior cards (DEPCA, DE100, DE200/1/2, DE210, DE422). ! 30: Use the depca.c driver in the standard distribution for the LANCE based ! 31: cards from DIGITAL; this driver will not work with them. ! 32: ! 33: The DE203/4/5 cards have 2 main modes: shared memory and I/O only. I/O ! 34: only makes all the card accesses through I/O transactions and no high ! 35: (shared) memory is used. This mode provides a >48% performance penalty ! 36: and is deprecated in this driver, although allowed to provide initial ! 37: setup when hardstrapped. ! 38: ! 39: The shared memory mode comes in 3 flavours: 2kB, 32kB and 64kB. There is ! 40: no point in using any mode other than the 2kB mode - their performances ! 41: are virtually identical, although the driver has been tested in the 2kB ! 42: and 32kB modes. I would suggest you uncomment the line: ! 43: ! 44: FORCE_2K_MODE; ! 45: ! 46: to allow the driver to configure the card as a 2kB card at your current ! 47: base address, thus leaving more room to clutter your system box with ! 48: other memory hungry boards. ! 49: ! 50: As many ISA and EISA cards can be supported under this driver as you ! 51: wish, limited primarily by the available IRQ lines, rather than by the ! 52: available I/O addresses (24 ISA, 16 EISA). I have checked different ! 53: configurations of multiple depca cards and ewrk3 cards and have not ! 54: found a problem yet (provided you have at least depca.c v0.38) ... ! 55: ! 56: The board IRQ setting must be at an unused IRQ which is auto-probed ! 57: using Donald Becker's autoprobe routines. All these cards are at ! 58: {5,10,11,15}. ! 59: ! 60: No 16MB memory limitation should exist with this driver as DMA is not ! 61: used and the common memory area is in low memory on the network card (my ! 62: current system has 20MB and I've not had problems yet). ! 63: ! 64: The ability to load this driver as a loadable module has been included ! 65: and used extensively during the driver development (to save those long ! 66: reboot sequences). To utilise this ability, you have to do 8 things: ! 67: ! 68: 0) have a copy of the loadable modules code installed on your system. ! 69: 1) copy ewrk3.c from the /linux/drivers/net directory to your favourite ! 70: temporary directory. ! 71: 2) edit the source code near line 1898 to reflect the I/O address and ! 72: IRQ you're using. ! 73: 3) compile ewrk3.c, but include -DMODULE in the command line to ensure ! 74: that the correct bits are compiled (see end of source code). ! 75: 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a ! 76: kernel with the ewrk3 configuration turned off and reboot. ! 77: 5) insmod ewrk3.o ! 78: [Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y] ! 79: 6) run the net startup bits for your new eth?? interface manually ! 80: (usually /etc/rc.inet[12] at boot time). ! 81: 7) enjoy! ! 82: ! 83: Note that autoprobing is not allowed in loadable modules - the system is ! 84: already up and running and you're messing with interrupts. ! 85: ! 86: To unload a module, turn off the associated interface ! 87: 'ifconfig eth?? down' then 'rmmod ewrk3'. ! 88: ! 89: Promiscuous mode has been turned off in this driver, but all the ! 90: multicast address bits have been turned on. This improved the send ! 91: performance on a busy network by about 13%. ! 92: ! 93: Ioctl's have now been provided (primarily because I wanted to grab some ! 94: packet size statistics). They are patterned after 'plipconfig.c' from a ! 95: suggestion by Alan Cox. Using these ioctls, you can enable promiscuous ! 96: mode, add/delete multicast addresses, change the hardware address, get ! 97: packet size distribution statistics and muck around with the control and ! 98: status register. I'll add others if and when the need arises. ! 99: ! 100: TO DO: ! 101: ------ ! 102: ! 103: ! 104: Revision History ! 105: ---------------- ! 106: ! 107: Version Date Description ! 108: ! 109: 0.1 26-aug-94 Initial writing. ALPHA code release. ! 110: 0.11 31-aug-94 Fixed: 2k mode memory base calc., ! 111: LeMAC version calc., ! 112: IRQ vector assignments during autoprobe. ! 113: 0.12 31-aug-94 Tested working on LeMAC2 (DE20[345]-AC) card. ! 114: Fixed up MCA hash table algorithm. ! 115: 0.20 4-sep-94 Added IOCTL functionality. ! 116: 0.21 14-sep-94 Added I/O mode. ! 117: 0.21axp 15-sep-94 Special version for ALPHA AXP Linux V1.0. ! 118: 0.22 16-sep-94 Added more IOCTLs & tidied up. ! 119: 0.23 21-sep-94 Added transmit cut through. ! 120: 0.24 31-oct-94 Added uid checks in some ioctls. ! 121: 0.30 1-nov-94 BETA code release. ! 122: 0.31 5-dec-94 Added check/allocate region code. ! 123: 0.32 16-jan-95 Broadcast packet fix. ! 124: 0.33 10-Feb-95 Fix recognition bug reported by <[email protected]>. ! 125: 0.40 27-Dec-95 Rationalise MODULE and autoprobe code. ! 126: Rewrite for portability & updated. ! 127: ALPHA support from <[email protected]> ! 128: Added verify_area() calls in ewrk3_ioctl() from ! 129: suggestion by <[email protected]>. ! 130: Add new multicasting code. ! 131: 0.41 20-Jan-96 Fix IRQ set up problem reported by ! 132: <[email protected]>. ! 133: 0.42 22-Apr-96 Fix alloc_device() bug <[email protected]> ! 134: 0.43 16-Aug-96 Update alloc_device() to conform to de4x5.c ! 135: ! 136: ========================================================================= ! 137: */ ! 138: ! 139: static const char *version = "ewrk3.c:v0.43 96/8/16 [email protected]\n"; ! 140: ! 141: #include <linux/module.h> ! 142: ! 143: #include <linux/kernel.h> ! 144: #include <linux/sched.h> ! 145: #include <linux/string.h> ! 146: #include <linux/ptrace.h> ! 147: #include <linux/errno.h> ! 148: #include <linux/ioport.h> ! 149: #include <linux/malloc.h> ! 150: #include <linux/interrupt.h> ! 151: #include <linux/delay.h> ! 152: #include <asm/bitops.h> ! 153: #include <asm/io.h> ! 154: #include <asm/dma.h> ! 155: #include <asm/segment.h> ! 156: ! 157: #include <linux/netdevice.h> ! 158: #include <linux/etherdevice.h> ! 159: #include <linux/skbuff.h> ! 160: ! 161: #include <linux/time.h> ! 162: #include <linux/types.h> ! 163: #include <linux/unistd.h> ! 164: #include <linux/ctype.h> ! 165: ! 166: #include "ewrk3.h" ! 167: ! 168: #ifdef EWRK3_DEBUG ! 169: static int ewrk3_debug = EWRK3_DEBUG; ! 170: #else ! 171: static int ewrk3_debug = 1; ! 172: #endif ! 173: ! 174: #define EWRK3_NDA 0xffe0 /* No Device Address */ ! 175: ! 176: #define PROBE_LENGTH 32 ! 177: #define ETH_PROM_SIG 0xAA5500FFUL ! 178: ! 179: #ifndef EWRK3_SIGNATURE ! 180: #define EWRK3_SIGNATURE {"DE203","DE204","DE205",""} ! 181: #define EWRK3_STRLEN 8 ! 182: #endif ! 183: ! 184: #ifndef EWRK3_RAM_BASE_ADDRESSES ! 185: #define EWRK3_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0x00000} ! 186: #endif ! 187: ! 188: /* ! 189: ** Sets up the I/O area for the autoprobe. ! 190: */ ! 191: #define EWRK3_IO_BASE 0x100 /* Start address for probe search */ ! 192: #define EWRK3_IOP_INC 0x20 /* I/O address increment */ ! 193: #define EWRK3_TOTAL_SIZE 0x20 /* required I/O address length */ ! 194: ! 195: #ifndef MAX_NUM_EWRK3S ! 196: #define MAX_NUM_EWRK3S 21 ! 197: #endif ! 198: ! 199: #ifndef EWRK3_EISA_IO_PORTS ! 200: #define EWRK3_EISA_IO_PORTS 0x0c00 /* I/O port base address, slot 0 */ ! 201: #endif ! 202: ! 203: #ifndef MAX_EISA_SLOTS ! 204: #define MAX_EISA_SLOTS 16 ! 205: #define EISA_SLOT_INC 0x1000 ! 206: #endif ! 207: ! 208: #define CRC_POLYNOMIAL_BE 0x04c11db7UL /* Ethernet CRC, big endian */ ! 209: #define CRC_POLYNOMIAL_LE 0xedb88320UL /* Ethernet CRC, little endian */ ! 210: ! 211: #define QUEUE_PKT_TIMEOUT (1*HZ) /* Jiffies */ ! 212: ! 213: /* ! 214: ** EtherWORKS 3 shared memory window sizes ! 215: */ ! 216: #define IO_ONLY 0x00 ! 217: #define SHMEM_2K 0x800 ! 218: #define SHMEM_32K 0x8000 ! 219: #define SHMEM_64K 0x10000 ! 220: ! 221: /* ! 222: ** EtherWORKS 3 IRQ ENABLE/DISABLE ! 223: */ ! 224: #define ENABLE_IRQs { \ ! 225: icr |= lp->irq_mask;\ ! 226: outb(icr, EWRK3_ICR); /* Enable the IRQs */\ ! 227: } ! 228: ! 229: #define DISABLE_IRQs { \ ! 230: icr = inb(EWRK3_ICR);\ ! 231: icr &= ~lp->irq_mask;\ ! 232: outb(icr, EWRK3_ICR); /* Disable the IRQs */\ ! 233: } ! 234: ! 235: /* ! 236: ** EtherWORKS 3 START/STOP ! 237: */ ! 238: #define START_EWRK3 { \ ! 239: csr = inb(EWRK3_CSR);\ ! 240: csr &= ~(CSR_TXD|CSR_RXD);\ ! 241: outb(csr, EWRK3_CSR); /* Enable the TX and/or RX */\ ! 242: } ! 243: ! 244: #define STOP_EWRK3 { \ ! 245: csr = (CSR_TXD|CSR_RXD);\ ! 246: outb(csr, EWRK3_CSR); /* Disable the TX and/or RX */\ ! 247: } ! 248: ! 249: /* ! 250: ** The EtherWORKS 3 private structure ! 251: */ ! 252: #define EWRK3_PKT_STAT_SZ 16 ! 253: #define EWRK3_PKT_BIN_SZ 128 /* Should be >=100 unless you ! 254: increase EWRK3_PKT_STAT_SZ */ ! 255: ! 256: struct ewrk3_private { ! 257: char adapter_name[80]; /* Name exported to /proc/ioports */ ! 258: u_long shmem_base; /* Shared memory start address */ ! 259: u_long shmem_length; /* Shared memory window length */ ! 260: struct enet_statistics stats; /* Public stats */ ! 261: struct { ! 262: u32 bins[EWRK3_PKT_STAT_SZ]; /* Private stats counters */ ! 263: u32 unicast; ! 264: u32 multicast; ! 265: u32 broadcast; ! 266: u32 excessive_collisions; ! 267: u32 tx_underruns; ! 268: u32 excessive_underruns; ! 269: } pktStats; ! 270: u_char irq_mask; /* Adapter IRQ mask bits */ ! 271: u_char mPage; /* Maximum 2kB Page number */ ! 272: u_char lemac; /* Chip rev. level */ ! 273: u_char hard_strapped; /* Don't allow a full open */ ! 274: u_char lock; /* Lock the page register */ ! 275: u_char txc; /* Transmit cut through */ ! 276: u_char *mctbl; /* Pointer to the multicast table */ ! 277: }; ! 278: ! 279: /* ! 280: ** Force the EtherWORKS 3 card to be in 2kB MODE ! 281: */ ! 282: #define FORCE_2K_MODE { \ ! 283: shmem_length = SHMEM_2K;\ ! 284: outb(((mem_start - 0x80000) >> 11), EWRK3_MBR);\ ! 285: } ! 286: ! 287: /* ! 288: ** Public Functions ! 289: */ ! 290: static int ewrk3_open(struct device *dev); ! 291: static int ewrk3_queue_pkt(struct sk_buff *skb, struct device *dev); ! 292: static void ewrk3_interrupt(int irq, void *dev_id, struct pt_regs *regs); ! 293: static int ewrk3_close(struct device *dev); ! 294: static struct enet_statistics *ewrk3_get_stats(struct device *dev); ! 295: static void set_multicast_list(struct device *dev); ! 296: static int ewrk3_ioctl(struct device *dev, struct ifreq *rq, int cmd); ! 297: ! 298: /* ! 299: ** Private functions ! 300: */ ! 301: static int ewrk3_hw_init(struct device *dev, u_long iobase); ! 302: static void ewrk3_init(struct device *dev); ! 303: static int ewrk3_rx(struct device *dev); ! 304: static int ewrk3_tx(struct device *dev); ! 305: ! 306: static void EthwrkSignature(char * name, char *eeprom_image); ! 307: static int DevicePresent(u_long iobase); ! 308: static void SetMulticastFilter(struct device *dev); ! 309: static int EISA_signature(char *name, s32 eisa_id); ! 310: ! 311: static int Read_EEPROM(u_long iobase, u_char eaddr); ! 312: static int Write_EEPROM(short data, u_long iobase, u_char eaddr); ! 313: static u_char get_hw_addr (struct device *dev, u_char *eeprom_image, char chipType); ! 314: ! 315: static void isa_probe(struct device *dev, u_long iobase); ! 316: static void eisa_probe(struct device *dev, u_long iobase); ! 317: static struct device *alloc_device(struct device *dev, u_long iobase); ! 318: static int ewrk3_dev_index(char *s); ! 319: static struct device *insert_device(struct device *dev, u_long iobase, int (*init)(struct device *)); ! 320: ! 321: ! 322: #ifdef MODULE ! 323: int init_module(void); ! 324: void cleanup_module(void); ! 325: static int autoprobed = 1, loading_module = 1; ! 326: ! 327: # else ! 328: static u_char irq[] = {5,0,10,3,11,9,15,12}; ! 329: static int autoprobed = 0, loading_module = 0; ! 330: ! 331: #endif /* MODULE */ ! 332: ! 333: static char name[EWRK3_STRLEN + 1]; ! 334: static int num_ewrk3s = 0, num_eth = 0; ! 335: ! 336: /* ! 337: ** Miscellaneous defines... ! 338: */ ! 339: #define INIT_EWRK3 {\ ! 340: outb(EEPROM_INIT, EWRK3_IOPR);\ ! 341: udelay(1000);\ ! 342: } ! 343: ! 344: ! 345: ! 346: ! 347: int ewrk3_probe(struct device *dev) ! 348: { ! 349: int tmp = num_ewrk3s, status = -ENODEV; ! 350: u_long iobase = dev->base_addr; ! 351: ! 352: if ((iobase == 0) && loading_module){ ! 353: printk("Autoprobing is not supported when loading a module based driver.\n"); ! 354: status = -EIO; ! 355: } else { /* First probe for the Ethernet */ ! 356: /* Address PROM pattern */ ! 357: isa_probe(dev, iobase); ! 358: eisa_probe(dev, iobase); ! 359: ! 360: if ((tmp == num_ewrk3s) && (iobase != 0) && loading_module) { ! 361: printk("%s: ewrk3_probe() cannot find device at 0x%04lx.\n", dev->name, ! 362: iobase); ! 363: } ! 364: ! 365: /* ! 366: ** Walk the device list to check that at least one device ! 367: ** initialised OK ! 368: */ ! 369: for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next); ! 370: ! 371: if (dev->priv) status = 0; ! 372: if (iobase == 0) autoprobed = 1; ! 373: } ! 374: ! 375: return status; ! 376: } ! 377: ! 378: static int ! 379: ewrk3_hw_init(struct device *dev, u_long iobase) ! 380: { ! 381: struct ewrk3_private *lp; ! 382: int i, status=0; ! 383: u_long mem_start, shmem_length; ! 384: u_char cr, cmr, icr, nicsr, lemac, hard_strapped = 0; ! 385: u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0; ! 386: ! 387: /* ! 388: ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot. ! 389: ** This also disables the EISA_ENABLE bit in the EISA Control Register. ! 390: */ ! 391: if (iobase > 0x400) eisa_cr = inb(EISA_CR); ! 392: INIT_EWRK3; ! 393: ! 394: nicsr = inb(EWRK3_CSR); ! 395: ! 396: icr = inb(EWRK3_ICR); ! 397: icr &= 0x70; ! 398: outb(icr, EWRK3_ICR); /* Disable all the IRQs */ ! 399: ! 400: if (nicsr == (CSR_TXD|CSR_RXD)) { ! 401: ! 402: /* Check that the EEPROM is alive and well and not living on Pluto... */ ! 403: for (chksum=0, i=0; i<EEPROM_MAX; i+=2) { ! 404: union { ! 405: short val; ! 406: char c[2]; ! 407: } tmp; ! 408: ! 409: tmp.val = (short)Read_EEPROM(iobase, (i>>1)); ! 410: eeprom_image[i] = tmp.c[0]; ! 411: eeprom_image[i+1] = tmp.c[1]; ! 412: chksum += eeprom_image[i] + eeprom_image[i+1]; ! 413: } ! 414: ! 415: if (chksum != 0) { /* Bad EEPROM Data! */ ! 416: printk("%s: Device has a bad on-board EEPROM.\n", dev->name); ! 417: status = -ENXIO; ! 418: } else { ! 419: EthwrkSignature(name, eeprom_image); ! 420: if (*name != '\0') { /* found a EWRK3 device */ ! 421: dev->base_addr = iobase; ! 422: ! 423: if (iobase > 0x400) { ! 424: outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */ ! 425: } ! 426: ! 427: lemac = eeprom_image[EEPROM_CHIPVER]; ! 428: cmr = inb(EWRK3_CMR); ! 429: ! 430: if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) || ! 431: ((lemac == LeMAC2) && !(cmr & CMR_HS))) { ! 432: printk("%s: %s at %#4lx", dev->name, name, iobase); ! 433: hard_strapped = 1; ! 434: } else if ((iobase&0x0fff)==EWRK3_EISA_IO_PORTS) { ! 435: /* EISA slot address */ ! 436: printk("%s: %s at %#4lx (EISA slot %ld)", ! 437: dev->name, name, iobase, ((iobase>>12)&0x0f)); ! 438: } else { /* ISA port address */ ! 439: printk("%s: %s at %#4lx", dev->name, name, iobase); ! 440: } ! 441: ! 442: if (!status) { ! 443: printk(", h/w address "); ! 444: if (lemac!=LeMAC2) DevicePresent(iobase);/* need after EWRK3_INIT */ ! 445: status = get_hw_addr(dev, eeprom_image, lemac); ! 446: for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */ ! 447: printk("%2.2x:", dev->dev_addr[i]); ! 448: } ! 449: printk("%2.2x,\n", dev->dev_addr[i]); ! 450: ! 451: if (status) { ! 452: printk(" which has an EEPROM CRC error.\n"); ! 453: status = -ENXIO; ! 454: } else { ! 455: if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */ ! 456: cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS); ! 457: if (eeprom_image[EEPROM_MISC0] & READ_AHEAD) cmr |= CMR_RA; ! 458: if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND) cmr |= CMR_WB; ! 459: if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL) cmr |= CMR_POLARITY; ! 460: if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK) cmr |= CMR_LINK; ! 461: if (eeprom_image[EEPROM_MISC0] & _0WS_ENA) cmr |= CMR_0WS; ! 462: } ! 463: if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM) cmr |= CMR_DRAM; ! 464: outb(cmr, EWRK3_CMR); ! 465: ! 466: cr = inb(EWRK3_CR); /* Set up the Control Register */ ! 467: cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD; ! 468: if (cr & SETUP_APD) cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS; ! 469: cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS; ! 470: cr |= eeprom_image[EEPROM_MISC0] & ENA_16; ! 471: outb(cr, EWRK3_CR); ! 472: ! 473: /* ! 474: ** Determine the base address and window length for the EWRK3 ! 475: ** RAM from the memory base register. ! 476: */ ! 477: mem_start = inb(EWRK3_MBR); ! 478: shmem_length = 0; ! 479: if (mem_start != 0) { ! 480: if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) { ! 481: mem_start *= SHMEM_64K; ! 482: shmem_length = SHMEM_64K; ! 483: } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) { ! 484: mem_start *= SHMEM_32K; ! 485: shmem_length = SHMEM_32K; ! 486: } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) { ! 487: mem_start = mem_start * SHMEM_2K + 0x80000; ! 488: shmem_length = SHMEM_2K; ! 489: } else { ! 490: status = -ENXIO; ! 491: } ! 492: } ! 493: ! 494: /* ! 495: ** See the top of this source code for comments about ! 496: ** uncommenting this line. ! 497: */ ! 498: /* FORCE_2K_MODE;*/ ! 499: ! 500: if (!status) { ! 501: if (hard_strapped) { ! 502: printk(" is hard strapped.\n"); ! 503: } else if (mem_start) { ! 504: printk(" has a %dk RAM window", (int)(shmem_length >> 10)); ! 505: printk(" at 0x%.5lx", mem_start); ! 506: } else { ! 507: printk(" is in I/O only mode"); ! 508: } ! 509: ! 510: /* private area & initialise */ ! 511: dev->priv = (void *) kmalloc(sizeof(struct ewrk3_private), ! 512: GFP_KERNEL); ! 513: if (dev->priv == NULL) { ! 514: return -ENOMEM; ! 515: } ! 516: lp = (struct ewrk3_private *)dev->priv; ! 517: memset(dev->priv, 0, sizeof(struct ewrk3_private)); ! 518: lp->shmem_base = mem_start; ! 519: lp->shmem_length = shmem_length; ! 520: lp->lemac = lemac; ! 521: lp->hard_strapped = hard_strapped; ! 522: ! 523: lp->mPage = 64; ! 524: if (cmr & CMR_DRAM) lp->mPage <<= 1 ;/* 2 DRAMS on module */ ! 525: ! 526: sprintf(lp->adapter_name,"%s (%s)", name, dev->name); ! 527: request_region(iobase, EWRK3_TOTAL_SIZE, lp->adapter_name); ! 528: ! 529: lp->irq_mask = ICR_TNEM|ICR_TXDM|ICR_RNEM|ICR_RXDM; ! 530: ! 531: if (!hard_strapped) { ! 532: /* ! 533: ** Enable EWRK3 board interrupts for autoprobing ! 534: */ ! 535: icr |= ICR_IE; /* Enable interrupts */ ! 536: outb(icr, EWRK3_ICR); ! 537: ! 538: /* The DMA channel may be passed in on this parameter. */ ! 539: dev->dma = 0; ! 540: ! 541: /* To auto-IRQ we enable the initialization-done and DMA err, ! 542: interrupts. For now we will always get a DMA error. */ ! 543: if (dev->irq < 2) { ! 544: #ifndef MODULE ! 545: u_char irqnum; ! 546: ! 547: autoirq_setup(0); ! 548: ! 549: /* ! 550: ** Trigger a TNE interrupt. ! 551: */ ! 552: icr |=ICR_TNEM; ! 553: outb(1,EWRK3_TDQ); /* Write to the TX done queue */ ! 554: outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */ ! 555: ! 556: irqnum = irq[((icr & IRQ_SEL) >> 4)]; ! 557: ! 558: dev->irq = autoirq_report(1); ! 559: if ((dev->irq) && (irqnum == dev->irq)) { ! 560: printk(" and uses IRQ%d.\n", dev->irq); ! 561: } else { ! 562: if (!dev->irq) { ! 563: printk(" and failed to detect IRQ line.\n"); ! 564: } else if ((irqnum == 1) && (lemac == LeMAC2)) { ! 565: printk(" and an illegal IRQ line detected.\n"); ! 566: } else { ! 567: printk(", but incorrect IRQ line detected.\n"); ! 568: } ! 569: status = -ENXIO; ! 570: } ! 571: ! 572: DISABLE_IRQs; /* Mask all interrupts */ ! 573: ! 574: #endif /* MODULE */ ! 575: } else { ! 576: printk(" and requires IRQ%d.\n", dev->irq); ! 577: } ! 578: } ! 579: if (status) release_region(iobase, EWRK3_TOTAL_SIZE); ! 580: } else { ! 581: status = -ENXIO; ! 582: } ! 583: } ! 584: } ! 585: } else { ! 586: status = -ENXIO; ! 587: } ! 588: } ! 589: ! 590: if (!status) { ! 591: if (ewrk3_debug > 1) { ! 592: printk(version); ! 593: } ! 594: ! 595: /* The EWRK3-specific entries in the device structure. */ ! 596: dev->open = &ewrk3_open; ! 597: dev->hard_start_xmit = &ewrk3_queue_pkt; ! 598: dev->stop = &ewrk3_close; ! 599: dev->get_stats = &ewrk3_get_stats; ! 600: dev->set_multicast_list = &set_multicast_list; ! 601: dev->do_ioctl = &ewrk3_ioctl; ! 602: ! 603: dev->mem_start = 0; ! 604: ! 605: /* Fill in the generic field of the device structure. */ ! 606: ether_setup(dev); ! 607: } ! 608: } else { ! 609: status = -ENXIO; ! 610: } ! 611: ! 612: return status; ! 613: } ! 614: ! 615: ! 616: static int ! 617: ewrk3_open(struct device *dev) ! 618: { ! 619: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 620: u_long iobase = dev->base_addr; ! 621: int i, status = 0; ! 622: u_char icr, csr; ! 623: ! 624: /* ! 625: ** Stop the TX and RX... ! 626: */ ! 627: STOP_EWRK3; ! 628: ! 629: if (!lp->hard_strapped) { ! 630: irq2dev_map[dev->irq] = dev; /* For latched interrupts */ ! 631: ! 632: if (request_irq(dev->irq, (void *)ewrk3_interrupt, 0, "ewrk3", NULL)) { ! 633: printk("ewrk3_open(): Requested IRQ%d is busy\n",dev->irq); ! 634: status = -EAGAIN; ! 635: } else { ! 636: ! 637: /* ! 638: ** Re-initialize the EWRK3... ! 639: */ ! 640: ewrk3_init(dev); ! 641: ! 642: if (ewrk3_debug > 1){ ! 643: printk("%s: ewrk3 open with irq %d\n",dev->name,dev->irq); ! 644: printk(" physical address: "); ! 645: for (i=0;i<5;i++){ ! 646: printk("%2.2x:",(u_char)dev->dev_addr[i]); ! 647: } ! 648: printk("%2.2x\n",(u_char)dev->dev_addr[i]); ! 649: if (lp->shmem_length == 0) { ! 650: printk(" no shared memory, I/O only mode\n"); ! 651: } else { ! 652: printk(" start of shared memory: 0x%08lx\n",lp->shmem_base); ! 653: printk(" window length: 0x%04lx\n",lp->shmem_length); ! 654: } ! 655: printk(" # of DRAMS: %d\n",((inb(EWRK3_CMR) & 0x02) ? 2 : 1)); ! 656: printk(" csr: 0x%02x\n", inb(EWRK3_CSR)); ! 657: printk(" cr: 0x%02x\n", inb(EWRK3_CR)); ! 658: printk(" icr: 0x%02x\n", inb(EWRK3_ICR)); ! 659: printk(" cmr: 0x%02x\n", inb(EWRK3_CMR)); ! 660: printk(" fmqc: 0x%02x\n", inb(EWRK3_FMQC)); ! 661: } ! 662: ! 663: dev->tbusy = 0; ! 664: dev->start = 1; ! 665: dev->interrupt = UNMASK_INTERRUPTS; ! 666: ! 667: /* ! 668: ** Unmask EWRK3 board interrupts ! 669: */ ! 670: icr = inb(EWRK3_ICR); ! 671: ENABLE_IRQs; ! 672: ! 673: } ! 674: } else { ! 675: dev->start = 0; ! 676: dev->tbusy = 1; ! 677: printk("%s: ewrk3 available for hard strapped set up only.\n", dev->name); ! 678: printk(" Run the 'ewrk3setup' utility or remove the hard straps.\n"); ! 679: } ! 680: ! 681: MOD_INC_USE_COUNT; ! 682: ! 683: return status; ! 684: } ! 685: ! 686: /* ! 687: ** Initialize the EtherWORKS 3 operating conditions ! 688: */ ! 689: static void ! 690: ewrk3_init(struct device *dev) ! 691: { ! 692: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 693: u_char csr, page; ! 694: u_long iobase = dev->base_addr; ! 695: ! 696: /* ! 697: ** Enable any multicasts ! 698: */ ! 699: set_multicast_list(dev); ! 700: ! 701: /* ! 702: ** Clean out any remaining entries in all the queues here ! 703: */ ! 704: while (inb(EWRK3_TQ)); ! 705: while (inb(EWRK3_TDQ)); ! 706: while (inb(EWRK3_RQ)); ! 707: while (inb(EWRK3_FMQ)); ! 708: ! 709: /* ! 710: ** Write a clean free memory queue ! 711: */ ! 712: for (page=1;page<lp->mPage;page++) { /* Write the free page numbers */ ! 713: outb(page, EWRK3_FMQ); /* to the Free Memory Queue */ ! 714: } ! 715: ! 716: lp->lock = 0; /* Ensure there are no locks */ ! 717: ! 718: START_EWRK3; /* Enable the TX and/or RX */ ! 719: } ! 720: ! 721: /* ! 722: ** Writes a socket buffer to the free page queue ! 723: */ ! 724: static int ! 725: ewrk3_queue_pkt(struct sk_buff *skb, struct device *dev) ! 726: { ! 727: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 728: u_long iobase = dev->base_addr; ! 729: int status = 0; ! 730: u_char icr, csr; ! 731: ! 732: /* Transmitter timeout, serious problems. */ ! 733: if (dev->tbusy || lp->lock) { ! 734: int tickssofar = jiffies - dev->trans_start; ! 735: if (tickssofar < QUEUE_PKT_TIMEOUT) { ! 736: status = -1; ! 737: } else if (!lp->hard_strapped) { ! 738: printk("%s: transmit timed/locked out, status %04x, resetting.\n", ! 739: dev->name, inb(EWRK3_CSR)); ! 740: ! 741: /* ! 742: ** Mask all board interrupts ! 743: */ ! 744: DISABLE_IRQs; ! 745: ! 746: /* ! 747: ** Stop the TX and RX... ! 748: */ ! 749: STOP_EWRK3; ! 750: ! 751: ewrk3_init(dev); ! 752: ! 753: /* ! 754: ** Unmask EWRK3 board interrupts ! 755: */ ! 756: ENABLE_IRQs; ! 757: ! 758: dev->tbusy=0; ! 759: dev->trans_start = jiffies; ! 760: dev_kfree_skb(skb, FREE_WRITE); ! 761: } ! 762: } else if (skb == NULL) { ! 763: dev_tint(dev); ! 764: } else if (skb->len > 0) { ! 765: ! 766: /* ! 767: ** Block a timer-based transmit from overlapping. This could better be ! 768: ** done with atomic_swap(1, dev->tbusy), but set_bit() works as well. ! 769: */ ! 770: if (set_bit(0, (void*)&dev->tbusy) != 0) ! 771: printk("%s: Transmitter access conflict.\n", dev->name); ! 772: ! 773: DISABLE_IRQs; /* So that the page # remains correct */ ! 774: ! 775: /* ! 776: ** Get a free page from the FMQ when resources are available ! 777: */ ! 778: if (inb(EWRK3_FMQC) > 0) { ! 779: u_long buf = 0; ! 780: u_char page; ! 781: ! 782: if ((page = inb(EWRK3_FMQ)) < lp->mPage) { ! 783: /* ! 784: ** Set up shared memory window and pointer into the window ! 785: */ ! 786: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */ ! 787: if (lp->shmem_length == IO_ONLY) { ! 788: outb(page, EWRK3_IOPR); ! 789: } else if (lp->shmem_length == SHMEM_2K) { ! 790: buf = lp->shmem_base; ! 791: outb(page, EWRK3_MPR); ! 792: } else if (lp->shmem_length == SHMEM_32K) { ! 793: buf = ((((short)page << 11) & 0x7800) + lp->shmem_base); ! 794: outb((page >> 4), EWRK3_MPR); ! 795: } else if (lp->shmem_length == SHMEM_64K) { ! 796: buf = ((((short)page << 11) & 0xf800) + lp->shmem_base); ! 797: outb((page >> 5), EWRK3_MPR); ! 798: } else { ! 799: status = -1; ! 800: printk("%s: Oops - your private data area is hosed!\n",dev->name); ! 801: } ! 802: ! 803: if (!status) { ! 804: ! 805: /* ! 806: ** Set up the buffer control structures and copy the data from ! 807: ** the socket buffer to the shared memory . ! 808: */ ! 809: ! 810: if (lp->shmem_length == IO_ONLY) { ! 811: int i; ! 812: u_char *p = skb->data; ! 813: ! 814: outb((char)(TCR_QMODE | TCR_PAD | TCR_IFC), EWRK3_DATA); ! 815: outb((char)(skb->len & 0xff), EWRK3_DATA); ! 816: outb((char)((skb->len >> 8) & 0xff), EWRK3_DATA); ! 817: outb((char)0x04, EWRK3_DATA); ! 818: for (i=0; i<skb->len; i++) { ! 819: outb(*p++, EWRK3_DATA); ! 820: } ! 821: outb(page, EWRK3_TQ); /* Start sending pkt */ ! 822: } else { ! 823: writeb((char)(TCR_QMODE|TCR_PAD|TCR_IFC), (char *)buf);/* ctrl byte*/ ! 824: buf+=1; ! 825: writeb((char)(skb->len & 0xff), (char *)buf);/* length (16 bit xfer)*/ ! 826: buf+=1; ! 827: if (lp->txc) { ! 828: writeb((char)(((skb->len >> 8) & 0xff) | XCT), (char *)buf); ! 829: buf+=1; ! 830: writeb(0x04, (char *)buf); /* index byte */ ! 831: buf+=1; ! 832: writeb(0x00, (char *)(buf + skb->len)); /* Write the XCT flag */ ! 833: memcpy_toio(buf, skb->data, PRELOAD);/* Write PRELOAD bytes*/ ! 834: outb(page, EWRK3_TQ); /* Start sending pkt */ ! 835: memcpy_toio(buf+PRELOAD, skb->data+PRELOAD, skb->len-PRELOAD); ! 836: writeb(0xff, (char *)(buf + skb->len)); /* Write the XCT flag */ ! 837: } else { ! 838: writeb((char)((skb->len >> 8) & 0xff), (char *)buf); ! 839: buf+=1; ! 840: writeb(0x04, (char *)buf); /* index byte */ ! 841: buf+=1; ! 842: memcpy_toio((char *)buf, skb->data, skb->len);/* Write data bytes */ ! 843: outb(page, EWRK3_TQ); /* Start sending pkt */ ! 844: } ! 845: } ! 846: ! 847: dev->trans_start = jiffies; ! 848: dev_kfree_skb (skb, FREE_WRITE); ! 849: ! 850: } else { /* return unused page to the free memory queue */ ! 851: outb(page, EWRK3_FMQ); ! 852: } ! 853: lp->lock = 0; /* unlock the page register */ ! 854: } else { ! 855: printk("ewrk3_queue_pkt(): Invalid free memory page (%d).\n", ! 856: (u_char) page); ! 857: } ! 858: } else { ! 859: printk("ewrk3_queue_pkt(): No free resources...\n"); ! 860: printk("ewrk3_queue_pkt(): CSR: %02x ICR: %02x FMQC: %02x\n",inb(EWRK3_CSR),inb(EWRK3_ICR),inb(EWRK3_FMQC)); ! 861: } ! 862: ! 863: /* Check for free resources: clear 'tbusy' if there are some */ ! 864: if (inb(EWRK3_FMQC) > 0) { ! 865: dev->tbusy = 0; ! 866: } ! 867: ! 868: ENABLE_IRQs; ! 869: } ! 870: ! 871: return status; ! 872: } ! 873: ! 874: /* ! 875: ** The EWRK3 interrupt handler. ! 876: */ ! 877: static void ! 878: ewrk3_interrupt(int irq, void *dev_id, struct pt_regs * regs) ! 879: { ! 880: struct device *dev = (struct device *)(irq2dev_map[irq]); ! 881: struct ewrk3_private *lp; ! 882: u_long iobase; ! 883: u_char icr, cr, csr; ! 884: ! 885: if (dev == NULL) { ! 886: printk ("ewrk3_interrupt(): irq %d for unknown device.\n", irq); ! 887: } else { ! 888: lp = (struct ewrk3_private *)dev->priv; ! 889: iobase = dev->base_addr; ! 890: ! 891: if (dev->interrupt) ! 892: printk("%s: Re-entering the interrupt handler.\n", dev->name); ! 893: ! 894: dev->interrupt = MASK_INTERRUPTS; ! 895: ! 896: /* get the interrupt information */ ! 897: csr = inb(EWRK3_CSR); ! 898: ! 899: /* ! 900: ** Mask the EWRK3 board interrupts and turn on the LED ! 901: */ ! 902: DISABLE_IRQs; ! 903: ! 904: cr = inb(EWRK3_CR); ! 905: cr |= CR_LED; ! 906: outb(cr, EWRK3_CR); ! 907: ! 908: if (csr & CSR_RNE) /* Rx interrupt (packet[s] arrived) */ ! 909: ewrk3_rx(dev); ! 910: ! 911: if (csr & CSR_TNE) /* Tx interrupt (packet sent) */ ! 912: ewrk3_tx(dev); ! 913: ! 914: /* ! 915: ** Now deal with the TX/RX disable flags. These are set when there ! 916: ** are no more resources. If resources free up then enable these ! 917: ** interrupts, otherwise mask them - failure to do this will result ! 918: ** in the system hanging in an interrupt loop. ! 919: */ ! 920: if (inb(EWRK3_FMQC)) { /* any resources available? */ ! 921: lp->irq_mask |= ICR_TXDM|ICR_RXDM;/* enable the interrupt source */ ! 922: csr &= ~(CSR_TXD|CSR_RXD);/* ensure restart of a stalled TX or RX */ ! 923: outb(csr, EWRK3_CSR); ! 924: dev->tbusy = 0; /* clear TX busy flag */ ! 925: mark_bh(NET_BH); ! 926: } else { ! 927: lp->irq_mask &= ~(ICR_TXDM|ICR_RXDM);/* disable the interrupt source */ ! 928: } ! 929: ! 930: /* Unmask the EWRK3 board interrupts and turn off the LED */ ! 931: cr &= ~CR_LED; ! 932: outb(cr, EWRK3_CR); ! 933: ! 934: dev->interrupt = UNMASK_INTERRUPTS; ! 935: ENABLE_IRQs; ! 936: } ! 937: ! 938: return; ! 939: } ! 940: ! 941: static int ! 942: ewrk3_rx(struct device *dev) ! 943: { ! 944: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 945: u_long iobase = dev->base_addr; ! 946: int i, status = 0; ! 947: u_char page, tmpPage = 0, tmpLock = 0; ! 948: u_long buf = 0; ! 949: ! 950: while (inb(EWRK3_RQC) && !status) { /* Whilst there's incoming data */ ! 951: if ((page = inb(EWRK3_RQ)) < lp->mPage) {/* Get next entry's buffer page */ ! 952: /* ! 953: ** Preempt any process using the current page register. Check for ! 954: ** an existing lock to reduce time taken in I/O transactions. ! 955: */ ! 956: if ((tmpLock = set_bit(0, (void *)&lp->lock)) == 1) { /* Assert lock */ ! 957: if (lp->shmem_length == IO_ONLY) { /* Get existing page */ ! 958: tmpPage = inb(EWRK3_IOPR); ! 959: } else { ! 960: tmpPage = inb(EWRK3_MPR); ! 961: } ! 962: } ! 963: ! 964: /* ! 965: ** Set up shared memory window and pointer into the window ! 966: */ ! 967: if (lp->shmem_length == IO_ONLY) { ! 968: outb(page, EWRK3_IOPR); ! 969: } else if (lp->shmem_length == SHMEM_2K) { ! 970: buf = lp->shmem_base; ! 971: outb(page, EWRK3_MPR); ! 972: } else if (lp->shmem_length == SHMEM_32K) { ! 973: buf = ((((short)page << 11) & 0x7800) + lp->shmem_base); ! 974: outb((page >> 4), EWRK3_MPR); ! 975: } else if (lp->shmem_length == SHMEM_64K) { ! 976: buf = ((((short)page << 11) & 0xf800) + lp->shmem_base); ! 977: outb((page >> 5), EWRK3_MPR); ! 978: } else { ! 979: status = -1; ! 980: printk("%s: Oops - your private data area is hosed!\n",dev->name); ! 981: } ! 982: ! 983: if (!status) { ! 984: char rx_status; ! 985: int pkt_len; ! 986: ! 987: if (lp->shmem_length == IO_ONLY) { ! 988: rx_status = inb(EWRK3_DATA); ! 989: pkt_len = inb(EWRK3_DATA); ! 990: pkt_len |= ((u_short)inb(EWRK3_DATA) << 8); ! 991: } else { ! 992: rx_status = readb(buf); ! 993: buf+=1; ! 994: pkt_len = readw(buf); ! 995: buf+=3; ! 996: } ! 997: ! 998: if (!(rx_status & R_ROK)) { /* There was an error. */ ! 999: lp->stats.rx_errors++; /* Update the error stats. */ ! 1000: if (rx_status & R_DBE) lp->stats.rx_frame_errors++; ! 1001: if (rx_status & R_CRC) lp->stats.rx_crc_errors++; ! 1002: if (rx_status & R_PLL) lp->stats.rx_fifo_errors++; ! 1003: } else { ! 1004: struct sk_buff *skb; ! 1005: ! 1006: if ((skb = dev_alloc_skb(pkt_len+2)) != NULL) { ! 1007: unsigned char *p; ! 1008: skb->dev = dev; ! 1009: skb_reserve(skb,2); /* Align to 16 bytes */ ! 1010: p = skb_put(skb,pkt_len); ! 1011: ! 1012: if (lp->shmem_length == IO_ONLY) { ! 1013: *p = inb(EWRK3_DATA); /* dummy read */ ! 1014: for (i=0; i<pkt_len; i++) { ! 1015: *p++ = inb(EWRK3_DATA); ! 1016: } ! 1017: } else { ! 1018: memcpy_fromio(p, buf, pkt_len); ! 1019: } ! 1020: ! 1021: /* ! 1022: ** Notify the upper protocol layers that there is another ! 1023: ** packet to handle ! 1024: */ ! 1025: skb->protocol=eth_type_trans(skb,dev); ! 1026: netif_rx(skb); ! 1027: ! 1028: /* ! 1029: ** Update stats ! 1030: */ ! 1031: lp->stats.rx_packets++; ! 1032: for (i=1; i<EWRK3_PKT_STAT_SZ-1; i++) { ! 1033: if (pkt_len < i*EWRK3_PKT_BIN_SZ) { ! 1034: lp->pktStats.bins[i]++; ! 1035: i = EWRK3_PKT_STAT_SZ; ! 1036: } ! 1037: } ! 1038: p = skb->data; /* Look at the dest addr */ ! 1039: if (p[0] & 0x01) { /* Multicast/Broadcast */ ! 1040: if ((*(s32 *)&p[0] == -1) && (*(s16 *)&p[4] == -1)) { ! 1041: lp->pktStats.broadcast++; ! 1042: } else { ! 1043: lp->pktStats.multicast++; ! 1044: } ! 1045: } else if ((*(s32 *)&p[0] == *(s32 *)&dev->dev_addr[0]) && ! 1046: (*(s16 *)&p[4] == *(s16 *)&dev->dev_addr[4])) { ! 1047: lp->pktStats.unicast++; ! 1048: } ! 1049: ! 1050: lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */ ! 1051: if (lp->pktStats.bins[0] == 0) { /* Reset counters */ ! 1052: memset(&lp->pktStats, 0, sizeof(lp->pktStats)); ! 1053: } ! 1054: } else { ! 1055: printk("%s: Insufficient memory; nuking packet.\n", dev->name); ! 1056: lp->stats.rx_dropped++; /* Really, deferred. */ ! 1057: break; ! 1058: } ! 1059: } ! 1060: } ! 1061: /* ! 1062: ** Return the received buffer to the free memory queue ! 1063: */ ! 1064: outb(page, EWRK3_FMQ); ! 1065: ! 1066: if (tmpLock) { /* If a lock was preempted */ ! 1067: if (lp->shmem_length == IO_ONLY) { /* Replace old page */ ! 1068: outb(tmpPage, EWRK3_IOPR); ! 1069: } else { ! 1070: outb(tmpPage, EWRK3_MPR); ! 1071: } ! 1072: } ! 1073: lp->lock = 0; /* Unlock the page register */ ! 1074: } else { ! 1075: printk("ewrk3_rx(): Illegal page number, page %d\n",page); ! 1076: printk("ewrk3_rx(): CSR: %02x ICR: %02x FMQC: %02x\n",inb(EWRK3_CSR),inb(EWRK3_ICR),inb(EWRK3_FMQC)); ! 1077: } ! 1078: } ! 1079: return status; ! 1080: } ! 1081: ! 1082: /* ! 1083: ** Buffer sent - check for TX buffer errors. ! 1084: */ ! 1085: static int ! 1086: ewrk3_tx(struct device *dev) ! 1087: { ! 1088: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1089: u_long iobase = dev->base_addr; ! 1090: u_char tx_status; ! 1091: ! 1092: while ((tx_status = inb(EWRK3_TDQ)) > 0) { /* Whilst there's old buffers */ ! 1093: if (tx_status & T_VSTS) { /* The status is valid */ ! 1094: if (tx_status & T_TXE) { ! 1095: lp->stats.tx_errors++; ! 1096: if (tx_status & T_NCL) lp->stats.tx_carrier_errors++; ! 1097: if (tx_status & T_LCL) lp->stats.tx_window_errors++; ! 1098: if (tx_status & T_CTU) { ! 1099: if ((tx_status & T_COLL) ^ T_XUR) { ! 1100: lp->pktStats.tx_underruns++; ! 1101: } else { ! 1102: lp->pktStats.excessive_underruns++; ! 1103: } ! 1104: } else if (tx_status & T_COLL) { ! 1105: if ((tx_status & T_COLL) ^ T_XCOLL) { ! 1106: lp->stats.collisions++; ! 1107: } else { ! 1108: lp->pktStats.excessive_collisions++; ! 1109: } ! 1110: } ! 1111: } else { ! 1112: lp->stats.tx_packets++; ! 1113: } ! 1114: } ! 1115: } ! 1116: ! 1117: return 0; ! 1118: } ! 1119: ! 1120: static int ! 1121: ewrk3_close(struct device *dev) ! 1122: { ! 1123: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1124: u_long iobase = dev->base_addr; ! 1125: u_char icr, csr; ! 1126: ! 1127: dev->start = 0; ! 1128: dev->tbusy = 1; ! 1129: ! 1130: if (ewrk3_debug > 1) { ! 1131: printk("%s: Shutting down ethercard, status was %2.2x.\n", ! 1132: dev->name, inb(EWRK3_CSR)); ! 1133: } ! 1134: ! 1135: /* ! 1136: ** We stop the EWRK3 here... mask interrupts and stop TX & RX ! 1137: */ ! 1138: DISABLE_IRQs; ! 1139: ! 1140: STOP_EWRK3; ! 1141: ! 1142: /* ! 1143: ** Clean out the TX and RX queues here (note that one entry ! 1144: ** may get added to either the TXD or RX queues if the TX or RX ! 1145: ** just starts processing a packet before the STOP_EWRK3 command ! 1146: ** is received. This will be flushed in the ewrk3_open() call). ! 1147: */ ! 1148: while (inb(EWRK3_TQ)); ! 1149: while (inb(EWRK3_TDQ)); ! 1150: while (inb(EWRK3_RQ)); ! 1151: ! 1152: if (!lp->hard_strapped) { ! 1153: free_irq(dev->irq, NULL); ! 1154: ! 1155: irq2dev_map[dev->irq] = 0; ! 1156: } ! 1157: ! 1158: MOD_DEC_USE_COUNT; ! 1159: ! 1160: return 0; ! 1161: } ! 1162: ! 1163: static struct enet_statistics * ! 1164: ewrk3_get_stats(struct device *dev) ! 1165: { ! 1166: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1167: ! 1168: /* Null body since there is no framing error counter */ ! 1169: ! 1170: return &lp->stats; ! 1171: } ! 1172: ! 1173: /* ! 1174: ** Set or clear the multicast filter for this adapter. ! 1175: */ ! 1176: static void ! 1177: set_multicast_list(struct device *dev) ! 1178: { ! 1179: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1180: u_long iobase = dev->base_addr; ! 1181: u_char csr; ! 1182: ! 1183: if (irq2dev_map[dev->irq] != NULL) { ! 1184: csr = inb(EWRK3_CSR); ! 1185: ! 1186: if (lp->shmem_length == IO_ONLY) { ! 1187: lp->mctbl = (char *) PAGE0_HTE; ! 1188: } else { ! 1189: lp->mctbl = (char *)(lp->shmem_base + PAGE0_HTE); ! 1190: } ! 1191: ! 1192: csr &= ~(CSR_PME | CSR_MCE); ! 1193: if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */ ! 1194: csr |= CSR_PME; ! 1195: outb(csr, EWRK3_CSR); ! 1196: } else { ! 1197: SetMulticastFilter(dev); ! 1198: csr |= CSR_MCE; ! 1199: outb(csr, EWRK3_CSR); ! 1200: } ! 1201: } ! 1202: } ! 1203: ! 1204: /* ! 1205: ** Calculate the hash code and update the logical address filter ! 1206: ** from a list of ethernet multicast addresses. ! 1207: ** Little endian crc one liner from Matt Thomas, DEC. ! 1208: ** ! 1209: ** Note that when clearing the table, the broadcast bit must remain asserted ! 1210: ** to receive broadcast messages. ! 1211: */ ! 1212: static void SetMulticastFilter(struct device *dev) ! 1213: { ! 1214: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1215: struct dev_mc_list *dmi=dev->mc_list; ! 1216: u_long iobase = dev->base_addr; ! 1217: int i; ! 1218: char *addrs, j, bit, byte; ! 1219: short *p = (short *) lp->mctbl; ! 1220: u16 hashcode; ! 1221: s32 crc, poly = CRC_POLYNOMIAL_LE; ! 1222: ! 1223: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */ ! 1224: ! 1225: if (lp->shmem_length == IO_ONLY) { ! 1226: outb(0, EWRK3_IOPR); ! 1227: outw(EEPROM_OFFSET(lp->mctbl), EWRK3_PIR1); ! 1228: } else { ! 1229: outb(0, EWRK3_MPR); ! 1230: } ! 1231: ! 1232: if (dev->flags & IFF_ALLMULTI) { ! 1233: for (i=0; i<(HASH_TABLE_LEN >> 3); i++) { ! 1234: if (lp->shmem_length == IO_ONLY) { ! 1235: outb(0xff, EWRK3_DATA); ! 1236: } else { /* memset didn't work here */ ! 1237: writew(0xffff, p); ! 1238: p++; i++; ! 1239: } ! 1240: } ! 1241: } else { ! 1242: /* Clear table except for broadcast bit */ ! 1243: if (lp->shmem_length == IO_ONLY) { ! 1244: for (i=0; i<(HASH_TABLE_LEN >> 4) - 1; i++) { ! 1245: outb(0x00, EWRK3_DATA); ! 1246: } ! 1247: outb(0x80, EWRK3_DATA); i++; /* insert the broadcast bit */ ! 1248: for (; i<(HASH_TABLE_LEN >> 3); i++) { ! 1249: outb(0x00, EWRK3_DATA); ! 1250: } ! 1251: } else { ! 1252: memset_io(lp->mctbl, 0, (HASH_TABLE_LEN >> 3)); ! 1253: writeb(0x80, (char *)(lp->mctbl + (HASH_TABLE_LEN >> 4) - 1)); ! 1254: } ! 1255: ! 1256: /* Update table */ ! 1257: for (i=0;i<dev->mc_count;i++) { /* for each address in the list */ ! 1258: addrs=dmi->dmi_addr; ! 1259: dmi=dmi->next; ! 1260: if ((*addrs & 0x01) == 1) { /* multicast address? */ ! 1261: crc = 0xffffffff; /* init CRC for each address */ ! 1262: for (byte=0;byte<ETH_ALEN;byte++) { /* for each address byte */ ! 1263: /* process each address bit */ ! 1264: for (bit = *addrs++,j=0;j<8;j++, bit>>=1) { ! 1265: crc = (crc >> 1) ^ (((crc ^ bit) & 0x01) ? poly : 0); ! 1266: } ! 1267: } ! 1268: hashcode = crc & ((1 << 9) - 1); /* hashcode is 9 LSb of CRC */ ! 1269: ! 1270: byte = hashcode >> 3; /* bit[3-8] -> byte in filter */ ! 1271: bit = 1 << (hashcode & 0x07); /* bit[0-2] -> bit in byte */ ! 1272: ! 1273: if (lp->shmem_length == IO_ONLY) { ! 1274: u_char tmp; ! 1275: ! 1276: outw((short)((long)lp->mctbl) + byte, EWRK3_PIR1); ! 1277: tmp = inb(EWRK3_DATA); ! 1278: tmp |= bit; ! 1279: outw((short)((long)lp->mctbl) + byte, EWRK3_PIR1); ! 1280: outb(tmp, EWRK3_DATA); ! 1281: } else { ! 1282: writeb(readb(lp->mctbl + byte) | bit, lp->mctbl + byte); ! 1283: } ! 1284: } ! 1285: } ! 1286: } ! 1287: ! 1288: lp->lock = 0; /* Unlock the page register */ ! 1289: ! 1290: return; ! 1291: } ! 1292: ! 1293: /* ! 1294: ** ISA bus I/O device probe ! 1295: */ ! 1296: static void isa_probe(struct device *dev, u_long ioaddr) ! 1297: { ! 1298: int i = num_ewrk3s, maxSlots; ! 1299: u_long iobase; ! 1300: ! 1301: if (!ioaddr && autoprobed) return ; /* Been here before ! */ ! 1302: if (ioaddr >= 0x400) return; /* Not ISA */ ! 1303: ! 1304: if (ioaddr == 0) { /* Autoprobing */ ! 1305: iobase = EWRK3_IO_BASE; /* Get the first slot address */ ! 1306: maxSlots = 24; ! 1307: } else { /* Probe a specific location */ ! 1308: iobase = ioaddr; ! 1309: maxSlots = i + 1; ! 1310: } ! 1311: ! 1312: for (; (i<maxSlots) && (dev!=NULL);iobase+=EWRK3_IOP_INC, i++) { ! 1313: if (!check_region(iobase, EWRK3_TOTAL_SIZE)) { ! 1314: if (DevicePresent(iobase) == 0) { ! 1315: if ((dev = alloc_device(dev, iobase)) != NULL) { ! 1316: if (ewrk3_hw_init(dev, iobase) == 0) { ! 1317: num_ewrk3s++; ! 1318: } ! 1319: num_eth++; ! 1320: } ! 1321: } ! 1322: } else if (autoprobed) { ! 1323: printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase); ! 1324: } ! 1325: } ! 1326: ! 1327: return; ! 1328: } ! 1329: ! 1330: /* ! 1331: ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually ! 1332: ** the motherboard. ! 1333: */ ! 1334: static void eisa_probe(struct device *dev, u_long ioaddr) ! 1335: { ! 1336: int i, maxSlots; ! 1337: u_long iobase; ! 1338: char name[EWRK3_STRLEN]; ! 1339: ! 1340: if (!ioaddr && autoprobed) return ; /* Been here before ! */ ! 1341: if (ioaddr < 0x1000) return; /* Not EISA */ ! 1342: ! 1343: if (ioaddr == 0) { /* Autoprobing */ ! 1344: iobase = EISA_SLOT_INC; /* Get the first slot address */ ! 1345: i = 1; ! 1346: maxSlots = MAX_EISA_SLOTS; ! 1347: } else { /* Probe a specific location */ ! 1348: iobase = ioaddr; ! 1349: i = (ioaddr >> 12); ! 1350: maxSlots = i + 1; ! 1351: } ! 1352: ! 1353: for (i=1; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) { ! 1354: if (EISA_signature(name, EISA_ID) == 0) { ! 1355: if (!check_region(iobase, EWRK3_TOTAL_SIZE)) { ! 1356: if (DevicePresent(iobase) == 0) { ! 1357: if ((dev = alloc_device(dev, iobase)) != NULL) { ! 1358: if (ewrk3_hw_init(dev, iobase) == 0) { ! 1359: num_ewrk3s++; ! 1360: } ! 1361: num_eth++; ! 1362: } ! 1363: } ! 1364: } else if (autoprobed) { ! 1365: printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase); ! 1366: } ! 1367: } ! 1368: } ! 1369: ! 1370: return; ! 1371: } ! 1372: ! 1373: /* ! 1374: ** Search the entire 'eth' device list for a fixed probe. If a match isn't ! 1375: ** found then check for an autoprobe or unused device location. If they ! 1376: ** are not available then insert a new device structure at the end of ! 1377: ** the current list. ! 1378: */ ! 1379: static struct device * ! 1380: alloc_device(struct device *dev, u_long iobase) ! 1381: { ! 1382: struct device *adev = NULL; ! 1383: int fixed = 0, new_dev = 0; ! 1384: ! 1385: num_eth = ewrk3_dev_index(dev->name); ! 1386: if (loading_module) return dev; ! 1387: ! 1388: while (1) { ! 1389: if (((dev->base_addr == EWRK3_NDA) || (dev->base_addr==0)) && !adev) { ! 1390: adev=dev; ! 1391: } else if ((dev->priv == NULL) && (dev->base_addr==iobase)) { ! 1392: fixed = 1; ! 1393: } else { ! 1394: if (dev->next == NULL) { ! 1395: new_dev = 1; ! 1396: } else if (strncmp(dev->next->name, "eth", 3) != 0) { ! 1397: new_dev = 1; ! 1398: } ! 1399: } ! 1400: if ((dev->next == NULL) || new_dev || fixed) break; ! 1401: dev = dev->next; ! 1402: num_eth++; ! 1403: } ! 1404: if (adev && !fixed) { ! 1405: dev = adev; ! 1406: num_eth = ewrk3_dev_index(dev->name); ! 1407: new_dev = 0; ! 1408: } ! 1409: ! 1410: if (((dev->next == NULL) && ! 1411: ((dev->base_addr != EWRK3_NDA) && (dev->base_addr != 0)) && !fixed) || ! 1412: new_dev) { ! 1413: num_eth++; /* New device */ ! 1414: dev = insert_device(dev, iobase, ewrk3_probe); ! 1415: } ! 1416: ! 1417: return dev; ! 1418: } ! 1419: ! 1420: /* ! 1421: ** If at end of eth device list and can't use current entry, malloc ! 1422: ** one up. If memory could not be allocated, print an error message. ! 1423: */ ! 1424: static struct device * ! 1425: insert_device(struct device *dev, u_long iobase, int (*init)(struct device *)) ! 1426: { ! 1427: struct device *new; ! 1428: ! 1429: new = (struct device *)kmalloc(sizeof(struct device)+8, GFP_KERNEL); ! 1430: if (new == NULL) { ! 1431: printk("eth%d: Device not initialised, insufficient memory\n",num_eth); ! 1432: return NULL; ! 1433: } else { ! 1434: new->next = dev->next; ! 1435: dev->next = new; ! 1436: dev = dev->next; /* point to the new device */ ! 1437: dev->name = (char *)(dev + 1); ! 1438: if (num_eth > 9999) { ! 1439: sprintf(dev->name,"eth????");/* New device name */ ! 1440: } else { ! 1441: sprintf(dev->name,"eth%d", num_eth);/* New device name */ ! 1442: } ! 1443: dev->base_addr = iobase; /* assign the io address */ ! 1444: dev->init = init; /* initialisation routine */ ! 1445: } ! 1446: ! 1447: return dev; ! 1448: } ! 1449: ! 1450: static int ! 1451: ewrk3_dev_index(char *s) ! 1452: { ! 1453: int i=0, j=0; ! 1454: ! 1455: for (;*s; s++) { ! 1456: if (isdigit(*s)) { ! 1457: j=1; ! 1458: i = (i * 10) + (*s - '0'); ! 1459: } else if (j) break; ! 1460: } ! 1461: ! 1462: return i; ! 1463: } ! 1464: ! 1465: /* ! 1466: ** Read the EWRK3 EEPROM using this routine ! 1467: */ ! 1468: static int Read_EEPROM(u_long iobase, u_char eaddr) ! 1469: { ! 1470: int i; ! 1471: ! 1472: outb((eaddr & 0x3f), EWRK3_PIR1); /* set up 6 bits of address info */ ! 1473: outb(EEPROM_RD, EWRK3_IOPR); /* issue read command */ ! 1474: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */ ! 1475: ! 1476: return inw(EWRK3_EPROM1); /* 16 bits data return */ ! 1477: } ! 1478: ! 1479: /* ! 1480: ** Write the EWRK3 EEPROM using this routine ! 1481: */ ! 1482: static int Write_EEPROM(short data, u_long iobase, u_char eaddr) ! 1483: { ! 1484: int i; ! 1485: ! 1486: outb(EEPROM_WR_EN, EWRK3_IOPR); /* issue write enable command */ ! 1487: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */ ! 1488: outw(data, EWRK3_EPROM1); /* write data to register */ ! 1489: outb((eaddr & 0x3f), EWRK3_PIR1); /* set up 6 bits of address info */ ! 1490: outb(EEPROM_WR, EWRK3_IOPR); /* issue write command */ ! 1491: for (i=0;i<75000;i++) inb(EWRK3_CSR); /* wait 15msec */ ! 1492: outb(EEPROM_WR_DIS, EWRK3_IOPR); /* issue write disable command */ ! 1493: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */ ! 1494: ! 1495: return 0; ! 1496: } ! 1497: ! 1498: /* ! 1499: ** Look for a particular board name in the on-board EEPROM. ! 1500: */ ! 1501: static void EthwrkSignature(char *name, char *eeprom_image) ! 1502: { ! 1503: u_long i,j,k; ! 1504: char *signatures[] = EWRK3_SIGNATURE; ! 1505: ! 1506: strcpy(name, ""); ! 1507: for (i=0;*signatures[i] != '\0' && *name == '\0';i++) { ! 1508: for (j=EEPROM_PNAME7,k=0;j<=EEPROM_PNAME0 && k<strlen(signatures[i]);j++) { ! 1509: if (signatures[i][k] == eeprom_image[j]) { /* track signature */ ! 1510: k++; ! 1511: } else { /* lost signature; begin search again */ ! 1512: k=0; ! 1513: } ! 1514: } ! 1515: if (k == strlen(signatures[i])) { ! 1516: for (k=0; k<EWRK3_STRLEN; k++) { ! 1517: name[k] = eeprom_image[EEPROM_PNAME7 + k]; ! 1518: name[EWRK3_STRLEN] = '\0'; ! 1519: } ! 1520: } ! 1521: } ! 1522: ! 1523: return; /* return the device name string */ ! 1524: } ! 1525: ! 1526: /* ! 1527: ** Look for a special sequence in the Ethernet station address PROM that ! 1528: ** is common across all EWRK3 products. ! 1529: ** ! 1530: ** Search the Ethernet address ROM for the signature. Since the ROM address ! 1531: ** counter can start at an arbitrary point, the search must include the entire ! 1532: ** probe sequence length plus the (length_of_the_signature - 1). ! 1533: ** Stop the search IMMEDIATELY after the signature is found so that the ! 1534: ** PROM address counter is correctly positioned at the start of the ! 1535: ** ethernet address for later read out. ! 1536: */ ! 1537: ! 1538: static int DevicePresent(u_long iobase) ! 1539: { ! 1540: union { ! 1541: struct { ! 1542: u32 a; ! 1543: u32 b; ! 1544: } llsig; ! 1545: char Sig[sizeof(u32) << 1]; ! 1546: } dev; ! 1547: short sigLength; ! 1548: char data; ! 1549: int i, j, status = 0; ! 1550: ! 1551: dev.llsig.a = ETH_PROM_SIG; ! 1552: dev.llsig.b = ETH_PROM_SIG; ! 1553: sigLength = sizeof(u32) << 1; ! 1554: ! 1555: for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) { ! 1556: data = inb(EWRK3_APROM); ! 1557: if (dev.Sig[j] == data) { /* track signature */ ! 1558: j++; ! 1559: } else { /* lost signature; begin search again */ ! 1560: if (data == dev.Sig[0]) { ! 1561: j=1; ! 1562: } else { ! 1563: j=0; ! 1564: } ! 1565: } ! 1566: } ! 1567: ! 1568: if (j!=sigLength) { ! 1569: status = -ENODEV; /* search failed */ ! 1570: } ! 1571: ! 1572: return status; ! 1573: } ! 1574: ! 1575: static u_char get_hw_addr(struct device *dev, u_char *eeprom_image, char chipType) ! 1576: { ! 1577: int i, j, k; ! 1578: u_short chksum; ! 1579: u_char crc, lfsr, sd, status = 0; ! 1580: u_long iobase = dev->base_addr; ! 1581: u16 tmp; ! 1582: ! 1583: if (chipType == LeMAC2) { ! 1584: for (crc=0x6a, j=0; j<ETH_ALEN; j++) { ! 1585: sd = dev->dev_addr[j] = eeprom_image[EEPROM_PADDR0 + j]; ! 1586: outb(dev->dev_addr[j], EWRK3_PAR0 + j); ! 1587: for (k=0; k<8; k++, sd >>= 1) { ! 1588: lfsr = ((((crc & 0x02) >> 1) ^ (crc & 0x01)) ^ (sd & 0x01)) << 7; ! 1589: crc = (crc >> 1) + lfsr; ! 1590: } ! 1591: } ! 1592: if (crc != eeprom_image[EEPROM_PA_CRC]) status = -1; ! 1593: } else { ! 1594: for (i=0,k=0;i<ETH_ALEN;) { ! 1595: k <<= 1 ; ! 1596: if (k > 0xffff) k-=0xffff; ! 1597: ! 1598: k += (u_char) (tmp = inb(EWRK3_APROM)); ! 1599: dev->dev_addr[i] = (u_char) tmp; ! 1600: outb(dev->dev_addr[i], EWRK3_PAR0 + i); ! 1601: i++; ! 1602: k += (u_short) ((tmp = inb(EWRK3_APROM)) << 8); ! 1603: dev->dev_addr[i] = (u_char) tmp; ! 1604: outb(dev->dev_addr[i], EWRK3_PAR0 + i); ! 1605: i++; ! 1606: ! 1607: if (k > 0xffff) k-=0xffff; ! 1608: } ! 1609: if (k == 0xffff) k=0; ! 1610: chksum = inb(EWRK3_APROM); ! 1611: chksum |= (inb(EWRK3_APROM)<<8); ! 1612: if (k != chksum) status = -1; ! 1613: } ! 1614: ! 1615: return status; ! 1616: } ! 1617: ! 1618: /* ! 1619: ** Look for a particular board name in the EISA configuration space ! 1620: */ ! 1621: static int EISA_signature(char *name, s32 eisa_id) ! 1622: { ! 1623: u_long i; ! 1624: char *signatures[] = EWRK3_SIGNATURE; ! 1625: char ManCode[EWRK3_STRLEN]; ! 1626: union { ! 1627: s32 ID; ! 1628: char Id[4]; ! 1629: } Eisa; ! 1630: int status = 0; ! 1631: ! 1632: *name = '\0'; ! 1633: for (i=0; i<4; i++) { ! 1634: Eisa.Id[i] = inb(eisa_id + i); ! 1635: } ! 1636: ! 1637: ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40); ! 1638: ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40); ! 1639: ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30); ! 1640: ManCode[3]=((Eisa.Id[2]&0x0f)+0x30); ! 1641: ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30); ! 1642: ManCode[5]='\0'; ! 1643: ! 1644: for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) { ! 1645: if (strstr(ManCode, signatures[i]) != NULL) { ! 1646: strcpy(name,ManCode); ! 1647: status = 1; ! 1648: } ! 1649: } ! 1650: ! 1651: return status; /* return the device name string */ ! 1652: } ! 1653: ! 1654: /* ! 1655: ** Perform IOCTL call functions here. Some are privileged operations and the ! 1656: ** effective uid is checked in those cases. ! 1657: */ ! 1658: static int ewrk3_ioctl(struct device *dev, struct ifreq *rq, int cmd) ! 1659: { ! 1660: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv; ! 1661: struct ewrk3_ioctl *ioc = (struct ewrk3_ioctl *) &rq->ifr_data; ! 1662: u_long iobase = dev->base_addr; ! 1663: int i, j, status = 0; ! 1664: u_char csr; ! 1665: union { ! 1666: u_char addr[HASH_TABLE_LEN * ETH_ALEN]; ! 1667: u_short val[(HASH_TABLE_LEN * ETH_ALEN) >> 1]; ! 1668: } tmp; ! 1669: ! 1670: switch(ioc->cmd) { ! 1671: case EWRK3_GET_HWADDR: /* Get the hardware address */ ! 1672: for (i=0; i<ETH_ALEN; i++) { ! 1673: tmp.addr[i] = dev->dev_addr[i]; ! 1674: } ! 1675: ioc->len = ETH_ALEN; ! 1676: if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) { ! 1677: memcpy_tofs(ioc->data, tmp.addr, ioc->len); ! 1678: } ! 1679: ! 1680: break; ! 1681: case EWRK3_SET_HWADDR: /* Set the hardware address */ ! 1682: if (suser()) { ! 1683: if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN))) { ! 1684: csr = inb(EWRK3_CSR); ! 1685: csr |= (CSR_TXD|CSR_RXD); ! 1686: outb(csr, EWRK3_CSR); /* Disable the TX and RX */ ! 1687: ! 1688: memcpy_fromfs(tmp.addr,ioc->data,ETH_ALEN); ! 1689: for (i=0; i<ETH_ALEN; i++) { ! 1690: dev->dev_addr[i] = tmp.addr[i]; ! 1691: outb(tmp.addr[i], EWRK3_PAR0 + i); ! 1692: } ! 1693: ! 1694: csr &= ~(CSR_TXD|CSR_RXD); /* Enable the TX and RX */ ! 1695: outb(csr, EWRK3_CSR); ! 1696: } ! 1697: } else { ! 1698: status = -EPERM; ! 1699: } ! 1700: ! 1701: break; ! 1702: case EWRK3_SET_PROM: /* Set Promiscuous Mode */ ! 1703: if (suser()) { ! 1704: csr = inb(EWRK3_CSR); ! 1705: csr |= CSR_PME; ! 1706: csr &= ~CSR_MCE; ! 1707: outb(csr, EWRK3_CSR); ! 1708: } else { ! 1709: status = -EPERM; ! 1710: } ! 1711: ! 1712: break; ! 1713: case EWRK3_CLR_PROM: /* Clear Promiscuous Mode */ ! 1714: if (suser()) { ! 1715: csr = inb(EWRK3_CSR); ! 1716: csr &= ~CSR_PME; ! 1717: outb(csr, EWRK3_CSR); ! 1718: } else { ! 1719: status = -EPERM; ! 1720: } ! 1721: ! 1722: break; ! 1723: case EWRK3_SAY_BOO: /* Say "Boo!" to the kernel log file */ ! 1724: printk("%s: Boo!\n", dev->name); ! 1725: ! 1726: break; ! 1727: case EWRK3_GET_MCA: /* Get the multicast address table */ ! 1728: if (!(status = verify_area(VERIFY_WRITE, ioc->data, ioc->len))) { ! 1729: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */ ! 1730: if (lp->shmem_length == IO_ONLY) { ! 1731: outb(0, EWRK3_IOPR); ! 1732: outw(PAGE0_HTE, EWRK3_PIR1); ! 1733: for (i=0; i<(HASH_TABLE_LEN >> 3); i++) { ! 1734: tmp.addr[i] = inb(EWRK3_DATA); ! 1735: } ! 1736: } else { ! 1737: outb(0, EWRK3_MPR); ! 1738: memcpy_fromio(tmp.addr, (char *)(lp->shmem_base + PAGE0_HTE), (HASH_TABLE_LEN >> 3)); ! 1739: } ! 1740: ioc->len = (HASH_TABLE_LEN >> 3); ! 1741: memcpy_tofs(ioc->data, tmp.addr, ioc->len); ! 1742: } ! 1743: lp->lock = 0; /* Unlock the page register */ ! 1744: ! 1745: break; ! 1746: case EWRK3_SET_MCA: /* Set a multicast address */ ! 1747: if (suser()) { ! 1748: if (!(status=verify_area(VERIFY_READ, ioc->data, ETH_ALEN*ioc->len))) { ! 1749: memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN * ioc->len); ! 1750: set_multicast_list(dev); ! 1751: } ! 1752: } else { ! 1753: status = -EPERM; ! 1754: } ! 1755: ! 1756: break; ! 1757: case EWRK3_CLR_MCA: /* Clear all multicast addresses */ ! 1758: if (suser()) { ! 1759: set_multicast_list(dev); ! 1760: } else { ! 1761: status = -EPERM; ! 1762: } ! 1763: ! 1764: break; ! 1765: case EWRK3_MCA_EN: /* Enable multicast addressing */ ! 1766: if (suser()) { ! 1767: csr = inb(EWRK3_CSR); ! 1768: csr |= CSR_MCE; ! 1769: csr &= ~CSR_PME; ! 1770: outb(csr, EWRK3_CSR); ! 1771: } else { ! 1772: status = -EPERM; ! 1773: } ! 1774: ! 1775: break; ! 1776: case EWRK3_GET_STATS: /* Get the driver statistics */ ! 1777: cli(); ! 1778: ioc->len = sizeof(lp->pktStats); ! 1779: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) { ! 1780: memcpy_tofs(ioc->data, &lp->pktStats, ioc->len); ! 1781: } ! 1782: sti(); ! 1783: ! 1784: break; ! 1785: case EWRK3_CLR_STATS: /* Zero out the driver statistics */ ! 1786: if (suser()) { ! 1787: cli(); ! 1788: memset(&lp->pktStats, 0, sizeof(lp->pktStats)); ! 1789: sti(); ! 1790: } else { ! 1791: status = -EPERM; ! 1792: } ! 1793: ! 1794: break; ! 1795: case EWRK3_GET_CSR: /* Get the CSR Register contents */ ! 1796: tmp.addr[0] = inb(EWRK3_CSR); ! 1797: ioc->len = 1; ! 1798: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) { ! 1799: memcpy_tofs(ioc->data, tmp.addr, ioc->len); ! 1800: } ! 1801: ! 1802: break; ! 1803: case EWRK3_SET_CSR: /* Set the CSR Register contents */ ! 1804: if (suser()) { ! 1805: if (!(status=verify_area(VERIFY_READ, ioc->data, 1))) { ! 1806: memcpy_fromfs(tmp.addr, ioc->data, 1); ! 1807: outb(tmp.addr[0], EWRK3_CSR); ! 1808: } ! 1809: } else { ! 1810: status = -EPERM; ! 1811: } ! 1812: ! 1813: break; ! 1814: case EWRK3_GET_EEPROM: /* Get the EEPROM contents */ ! 1815: if (suser()) { ! 1816: for (i=0; i<(EEPROM_MAX>>1); i++) { ! 1817: tmp.val[i] = (short)Read_EEPROM(iobase, i); ! 1818: } ! 1819: i = EEPROM_MAX; ! 1820: tmp.addr[i++] = inb(EWRK3_CMR); /* Config/Management Reg. */ ! 1821: for (j=0;j<ETH_ALEN;j++) { ! 1822: tmp.addr[i++] = inb(EWRK3_PAR0 + j); ! 1823: } ! 1824: ioc->len = EEPROM_MAX + 1 + ETH_ALEN; ! 1825: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) { ! 1826: memcpy_tofs(ioc->data, tmp.addr, ioc->len); ! 1827: } ! 1828: } else { ! 1829: status = -EPERM; ! 1830: } ! 1831: ! 1832: break; ! 1833: case EWRK3_SET_EEPROM: /* Set the EEPROM contents */ ! 1834: if (suser()) { ! 1835: if (!(status=verify_area(VERIFY_READ, ioc->data, EEPROM_MAX))) { ! 1836: memcpy_fromfs(tmp.addr, ioc->data, EEPROM_MAX); ! 1837: for (i=0; i<(EEPROM_MAX>>1); i++) { ! 1838: Write_EEPROM(tmp.val[i], iobase, i); ! 1839: } ! 1840: } ! 1841: } else { ! 1842: status = -EPERM; ! 1843: } ! 1844: ! 1845: break; ! 1846: case EWRK3_GET_CMR: /* Get the CMR Register contents */ ! 1847: tmp.addr[0] = inb(EWRK3_CMR); ! 1848: ioc->len = 1; ! 1849: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) { ! 1850: memcpy_tofs(ioc->data, tmp.addr, ioc->len); ! 1851: } ! 1852: ! 1853: break; ! 1854: case EWRK3_SET_TX_CUT_THRU: /* Set TX cut through mode */ ! 1855: if (suser()) { ! 1856: lp->txc = 1; ! 1857: } else { ! 1858: status = -EPERM; ! 1859: } ! 1860: ! 1861: break; ! 1862: case EWRK3_CLR_TX_CUT_THRU: /* Clear TX cut through mode */ ! 1863: if (suser()) { ! 1864: lp->txc = 0; ! 1865: } else { ! 1866: status = -EPERM; ! 1867: } ! 1868: ! 1869: break; ! 1870: default: ! 1871: status = -EOPNOTSUPP; ! 1872: } ! 1873: ! 1874: return status; ! 1875: } ! 1876: ! 1877: #ifdef MODULE ! 1878: static char devicename[9] = { 0, }; ! 1879: static struct device thisEthwrk = { ! 1880: devicename, /* device name is inserted by /linux/drivers/net/net_init.c */ ! 1881: 0, 0, 0, 0, ! 1882: 0x300, 5, /* I/O address, IRQ */ ! 1883: 0, 0, 0, NULL, ewrk3_probe }; ! 1884: ! 1885: static int io=0x300; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ ! 1886: static int irq=5; /* or use the insmod io= irq= options */ ! 1887: ! 1888: int ! 1889: init_module(void) ! 1890: { ! 1891: thisEthwrk.base_addr=io; ! 1892: thisEthwrk.irq=irq; ! 1893: if (register_netdev(&thisEthwrk) != 0) ! 1894: return -EIO; ! 1895: return 0; ! 1896: } ! 1897: ! 1898: void ! 1899: cleanup_module(void) ! 1900: { ! 1901: if (thisEthwrk.priv) { ! 1902: kfree(thisEthwrk.priv); ! 1903: thisEthwrk.priv = NULL; ! 1904: } ! 1905: thisEthwrk.irq = 0; ! 1906: ! 1907: unregister_netdev(&thisEthwrk); ! 1908: release_region(thisEthwrk.base_addr, EWRK3_TOTAL_SIZE); ! 1909: } ! 1910: #endif /* MODULE */ ! 1911: ! 1912: ! 1913: /* ! 1914: * Local variables: ! 1915: * compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c ewrk3.c" ! 1916: * ! 1917: * compile-command: "gcc -D__KERNEL__ -DMODULE -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c ewrk3.c" ! 1918: * End: ! 1919: */ ! 1920:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.