|
|
1.1 ! root 1: /* eepro.c: Intel EtherExpress Pro/10 device driver for Linux. */ ! 2: /* ! 3: Written 1994-1998 by Bao C. Ha. ! 4: ! 5: Copyright (C) 1994-1998 by Bao C. Ha. ! 6: ! 7: This software may be used and distributed ! 8: according to the terms of the GNU Public License, ! 9: incorporated herein by reference. ! 10: ! 11: The author may be reached at [email protected] ! 12: or Hacom, 2477 Wrightsboro Rd., Augusta, GA 30904. ! 13: ! 14: Things remaining to do: ! 15: Better record keeping of errors. ! 16: Eliminate transmit interrupt to reduce overhead. ! 17: Implement "concurrent processing". I won't be doing it! ! 18: ! 19: Bugs: ! 20: ! 21: If you have a problem of not detecting the 82595 during a ! 22: reboot (warm reset), disable the FLASH memory should fix it. ! 23: This is a compatibility hardware problem. ! 24: ! 25: Versions: ! 26: ! 27: 0.10c Some cosmetic changes. (9/28/98, BCH) ! 28: ! 29: 0.10b Should work now with (some) Pro/10+. At least for ! 30: me (and my two cards) it does. _No_ guarantee for ! 31: function with non-Pro/10+ cards! (don't have any) ! 32: (RMC, 9/11/96) ! 33: ! 34: 0.10 Added support for the Etherexpress Pro/10+. The ! 35: IRQ map was changed significantly from the old ! 36: pro/10. The new interrupt map was provided by ! 37: Rainer M. Canavan ([email protected]). ! 38: (BCH, 9/3/96) ! 39: ! 40: 0.09 Fixed a race condition in the transmit algorithm, ! 41: which causes crashes under heavy load with fast ! 42: pentium computers. The performance should also ! 43: improve a bit. The size of RX buffer, and hence ! 44: TX buffer, can also be changed via lilo or insmod. ! 45: (BCH, 7/31/96) ! 46: ! 47: 0.08 Implement 32-bit I/O for the 82595TX and 82595FX ! 48: based lan cards. Disable full-duplex mode if TPE ! 49: is not used. (BCH, 4/8/96) ! 50: ! 51: 0.07a Fix a stat report which counts every packet as a ! 52: heart-beat failure. (BCH, 6/3/95) ! 53: ! 54: 0.07 Modified to support all other 82595-based lan cards. ! 55: The IRQ vector of the EtherExpress Pro will be set ! 56: according to the value saved in the EEPROM. For other ! 57: cards, I will do autoirq_request() to grab the next ! 58: available interrupt vector. (BCH, 3/17/95) ! 59: ! 60: 0.06a,b Interim released. Minor changes in the comments and ! 61: print out format. (BCH, 3/9/95 and 3/14/95) ! 62: ! 63: 0.06 First stable release that I am comfortable with. (BCH, ! 64: 3/2/95) ! 65: ! 66: 0.05 Complete testing of multicast. (BCH, 2/23/95) ! 67: ! 68: 0.04 Adding multicast support. (BCH, 2/14/95) ! 69: ! 70: 0.03 First widely alpha release for public testing. ! 71: (BCH, 2/14/95) ! 72: ! 73: */ ! 74: ! 75: static const char *version = ! 76: "eepro.c: v0.10c 9/28/98 Bao C. Ha ([email protected])\n"; ! 77: ! 78: #include <linux/module.h> ! 79: ! 80: /* ! 81: Sources: ! 82: ! 83: This driver wouldn't have been written without the availability ! 84: of the Crynwr's Lan595 driver source code. It helps me to ! 85: familiarize with the 82595 chipset while waiting for the Intel ! 86: documentation. I also learned how to detect the 82595 using ! 87: the packet driver's technique. ! 88: ! 89: This driver is written by cutting and pasting the skeleton.c driver ! 90: provided by Donald Becker. I also borrowed the EEPROM routine from ! 91: Donald Becker's 82586 driver. ! 92: ! 93: Datasheet for the Intel 82595 (including the TX and FX version). It ! 94: provides just enough info that the casual reader might think that it ! 95: documents the i82595. ! 96: ! 97: The User Manual for the 82595. It provides a lot of the missing ! 98: information. ! 99: ! 100: */ ! 101: ! 102: #include <linux/kernel.h> ! 103: #include <linux/sched.h> ! 104: #include <linux/types.h> ! 105: #include <linux/fcntl.h> ! 106: #include <linux/interrupt.h> ! 107: #include <linux/ptrace.h> ! 108: #include <linux/ioport.h> ! 109: #include <linux/in.h> ! 110: #include <linux/malloc.h> ! 111: #include <linux/string.h> ! 112: #include <asm/system.h> ! 113: #include <asm/bitops.h> ! 114: #include <asm/io.h> ! 115: #include <asm/dma.h> ! 116: #include <linux/errno.h> ! 117: ! 118: #include <linux/netdevice.h> ! 119: #include <linux/etherdevice.h> ! 120: #include <linux/skbuff.h> ! 121: ! 122: /* First, a few definitions that the brave might change. */ ! 123: ! 124: /* A zero-terminated list of I/O addresses to be probed. */ ! 125: static unsigned int eepro_portlist[] = ! 126: { 0x300, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0}; ! 127: ! 128: /* use 0 for production, 1 for verification, >2 for debug */ ! 129: ! 130: #ifndef NET_DEBUG ! 131: #define NET_DEBUG 1 ! 132: #endif ! 133: ! 134: static unsigned int net_debug = NET_DEBUG; ! 135: ! 136: /* The number of low I/O ports used by the ethercard. */ ! 137: ! 138: #define EEPRO_IO_EXTENT 16 ! 139: ! 140: /* Different 82595 chips */ ! 141: ! 142: #define LAN595 0 ! 143: #define LAN595TX 1 ! 144: #define LAN595FX 2 ! 145: ! 146: /* Information that need to be kept for each board. */ ! 147: struct eepro_local { ! 148: struct enet_statistics stats; ! 149: unsigned rx_start; ! 150: unsigned tx_start; /* start of the transmit chain */ ! 151: int tx_last; /* pointer to last packet in the transmit chain */ ! 152: unsigned tx_end; /* end of the transmit chain (plus 1) */ ! 153: int eepro; /* 1 for the EtherExpress Pro/10, ! 154: 2 for the EtherExpress Pro/10+, ! 155: 0 for other 82595-based lan cards. */ ! 156: int version; /* a flag to indicate if this is a TX or FX ! 157: version of the 82595 chip. */ ! 158: int stepping; ! 159: }; ! 160: ! 161: /* The station (ethernet) address prefix, used for IDing the board. */ ! 162: ! 163: #define SA_ADDR0 0x00 /* Etherexpress Pro/10 */ ! 164: #define SA_ADDR1 0xaa ! 165: #define SA_ADDR2 0x00 ! 166: ! 167: #define SA2_ADDR0 0x00 /* Etherexpress Pro/10+ */ ! 168: #define SA2_ADDR1 0xa0 ! 169: #define SA2_ADDR2 0xc9 ! 170: ! 171: #define SA3_ADDR0 0x00 /* more Etherexpress Pro/10+ */ ! 172: #define SA3_ADDR1 0xaa ! 173: #define SA3_ADDR2 0x00 ! 174: #define SA3_ADDR3 0xc9 ! 175: ! 176: /* Index to functions, as function prototypes. */ ! 177: ! 178: extern int eepro_probe(struct device *dev); ! 179: ! 180: static int eepro_probe1(struct device *dev, short ioaddr); ! 181: static int eepro_open(struct device *dev); ! 182: static int eepro_send_packet(struct sk_buff *skb, struct device *dev); ! 183: static void eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs); ! 184: static void eepro_rx(struct device *dev); ! 185: static void eepro_transmit_interrupt(struct device *dev); ! 186: static int eepro_close(struct device *dev); ! 187: static struct enet_statistics *eepro_get_stats(struct device *dev); ! 188: static void set_multicast_list(struct device *dev); ! 189: ! 190: static int read_eeprom(int ioaddr, int location); ! 191: static void hardware_send_packet(struct device *dev, void *buf, short length); ! 192: static int eepro_grab_irq(struct device *dev); ! 193: ! 194: /* ! 195: Details of the i82595. ! 196: ! 197: You will need either the datasheet or the user manual to understand what ! 198: is going on here. The 82595 is very different from the 82586, 82593. ! 199: ! 200: The receive algorithm in eepro_rx() is just an implementation of the ! 201: RCV ring structure that the Intel 82595 imposes at the hardware level. ! 202: The receive buffer is set at 24K, and the transmit buffer is 8K. I ! 203: am assuming that the total buffer memory is 32K, which is true for the ! 204: Intel EtherExpress Pro/10. If it is less than that on a generic card, ! 205: the driver will be broken. ! 206: ! 207: The transmit algorithm in the hardware_send_packet() is similar to the ! 208: one in the eepro_rx(). The transmit buffer is a ring linked list. ! 209: I just queue the next available packet to the end of the list. In my ! 210: system, the 82595 is so fast that the list seems to always contain a ! 211: single packet. In other systems with faster computers and more congested ! 212: network traffics, the ring linked list should improve performance by ! 213: allowing up to 8K worth of packets to be queued. ! 214: ! 215: The sizes of the receive and transmit buffers can now be changed via lilo ! 216: or insmod. Lilo uses the appended line "ether=io,irq,debug,rx-buffer,eth0" ! 217: where rx-buffer is in KB unit. Modules uses the parameter mem which is ! 218: also in KB unit, for example "insmod io=io-address irq=0 mem=rx-buffer." ! 219: The receive buffer has to be more than 3K or less than 29K. Otherwise, ! 220: it is reset to the default of 24K, and, hence, 8K for the trasnmit ! 221: buffer (transmit-buffer = 32K - receive-buffer). ! 222: ! 223: */ ! 224: ! 225: #define RAM_SIZE 0x8000 ! 226: #define RCV_HEADER 8 ! 227: #define RCV_RAM 0x6000 /* 24KB default for RCV buffer */ ! 228: #define RCV_LOWER_LIMIT 0x00 /* 0x0000 */ ! 229: ! 230: /* #define RCV_UPPER_LIMIT ((RCV_RAM - 2) >> 8) */ /* 0x5ffe */ ! 231: #define RCV_UPPER_LIMIT (((rcv_ram) - 2) >> 8) ! 232: ! 233: /* #define XMT_RAM (RAM_SIZE - RCV_RAM) */ /* 8KB for XMT buffer */ ! 234: #define XMT_RAM (RAM_SIZE - (rcv_ram)) /* 8KB for XMT buffer */ ! 235: ! 236: /* #define XMT_LOWER_LIMIT (RCV_RAM >> 8) */ /* 0x6000 */ ! 237: #define XMT_LOWER_LIMIT ((rcv_ram) >> 8) ! 238: #define XMT_UPPER_LIMIT ((RAM_SIZE - 2) >> 8) /* 0x7ffe */ ! 239: #define XMT_HEADER 8 ! 240: ! 241: #define RCV_DONE 0x0008 ! 242: #define RX_OK 0x2000 ! 243: #define RX_ERROR 0x0d81 ! 244: ! 245: #define TX_DONE_BIT 0x0080 ! 246: #define CHAIN_BIT 0x8000 ! 247: #define XMT_STATUS 0x02 ! 248: #define XMT_CHAIN 0x04 ! 249: #define XMT_COUNT 0x06 ! 250: ! 251: #define BANK0_SELECT 0x00 ! 252: #define BANK1_SELECT 0x40 ! 253: #define BANK2_SELECT 0x80 ! 254: ! 255: /* Bank 0 registers */ ! 256: ! 257: #define COMMAND_REG 0x00 /* Register 0 */ ! 258: #define MC_SETUP 0x03 ! 259: #define XMT_CMD 0x04 ! 260: #define DIAGNOSE_CMD 0x07 ! 261: #define RCV_ENABLE_CMD 0x08 ! 262: #define RCV_DISABLE_CMD 0x0a ! 263: #define STOP_RCV_CMD 0x0b ! 264: #define RESET_CMD 0x0e ! 265: #define POWER_DOWN_CMD 0x18 ! 266: #define RESUME_XMT_CMD 0x1c ! 267: #define SEL_RESET_CMD 0x1e ! 268: #define STATUS_REG 0x01 /* Register 1 */ ! 269: #define RX_INT 0x02 ! 270: #define TX_INT 0x04 ! 271: #define EXEC_STATUS 0x30 ! 272: #define ID_REG 0x02 /* Register 2 */ ! 273: #define R_ROBIN_BITS 0xc0 /* round robin counter */ ! 274: #define ID_REG_MASK 0x2c ! 275: #define ID_REG_SIG 0x24 ! 276: #define AUTO_ENABLE 0x10 ! 277: #define INT_MASK_REG 0x03 /* Register 3 */ ! 278: #define RX_STOP_MASK 0x01 ! 279: #define RX_MASK 0x02 ! 280: #define TX_MASK 0x04 ! 281: #define EXEC_MASK 0x08 ! 282: #define ALL_MASK 0x0f ! 283: #define IO_32_BIT 0x10 ! 284: #define RCV_BAR 0x04 /* The following are word (16-bit) registers */ ! 285: #define RCV_STOP 0x06 ! 286: #define XMT_BAR 0x0a ! 287: #define HOST_ADDRESS_REG 0x0c ! 288: #define IO_PORT 0x0e ! 289: #define IO_PORT_32_BIT 0x0c ! 290: ! 291: /* Bank 1 registers */ ! 292: ! 293: #define REG1 0x01 ! 294: #define WORD_WIDTH 0x02 ! 295: #define INT_ENABLE 0x80 ! 296: #define INT_NO_REG 0x02 ! 297: #define RCV_LOWER_LIMIT_REG 0x08 ! 298: #define RCV_UPPER_LIMIT_REG 0x09 ! 299: #define XMT_LOWER_LIMIT_REG 0x0a ! 300: #define XMT_UPPER_LIMIT_REG 0x0b ! 301: ! 302: /* Bank 2 registers */ ! 303: ! 304: #define XMT_Chain_Int 0x20 /* Interrupt at the end of the transmit chain */ ! 305: #define XMT_Chain_ErrStop 0x40 /* Interrupt at the end of the chain even if there are errors */ ! 306: #define RCV_Discard_BadFrame 0x80 /* Throw bad frames away, and continue to receive others */ ! 307: #define REG2 0x02 ! 308: #define PRMSC_Mode 0x01 ! 309: #define Multi_IA 0x20 ! 310: #define REG3 0x03 ! 311: #define TPE_BIT 0x04 ! 312: #define BNC_BIT 0x20 ! 313: #define REG13 0x0d ! 314: #define FDX 0x00 ! 315: #define A_N_ENABLE 0x02 ! 316: ! 317: #define I_ADD_REG0 0x04 ! 318: #define I_ADD_REG1 0x05 ! 319: #define I_ADD_REG2 0x06 ! 320: #define I_ADD_REG3 0x07 ! 321: #define I_ADD_REG4 0x08 ! 322: #define I_ADD_REG5 0x09 ! 323: ! 324: #define EEPROM_REG 0x0a ! 325: #define EESK 0x01 ! 326: #define EECS 0x02 ! 327: #define EEDI 0x04 ! 328: #define EEDO 0x08 ! 329: ! 330: /* Check for a network adaptor of this type, and return '0' if one exists. ! 331: ! 332: If dev->base_addr == 0, probe all likely locations. ! 333: If dev->base_addr == 1, always return failure. ! 334: If dev->base_addr == 2, allocate space for the device and return success ! 335: (detachable devices only). ! 336: ! 337: */ ! 338: ! 339: #ifdef HAVE_DEVLIST ! 340: ! 341: /* Support for a alternate probe manager, which will eliminate the ! 342: boilerplate below. */ ! 343: ! 344: struct netdev_entry netcard_drv = ! 345: {"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist}; ! 346: ! 347: #else ! 348: ! 349: int ! 350: eepro_probe(struct device *dev) ! 351: { ! 352: int i; ! 353: int base_addr = dev ? dev->base_addr : 0; ! 354: ! 355: if (base_addr > 0x1ff) /* Check a single specified location. */ ! 356: return eepro_probe1(dev, base_addr); ! 357: else if (base_addr != 0) /* Don't probe at all. */ ! 358: return ENXIO; ! 359: ! 360: for (i = 0; eepro_portlist[i]; i++) { ! 361: int ioaddr = eepro_portlist[i]; ! 362: if (check_region(ioaddr, EEPRO_IO_EXTENT)) ! 363: continue; ! 364: ! 365: if (eepro_probe1(dev, ioaddr) == 0) ! 366: return 0; ! 367: } ! 368: ! 369: return ENODEV; ! 370: } ! 371: #endif ! 372: ! 373: /* This is the real probe routine. Linux has a history of friendly device ! 374: probes on the ISA bus. A good device probes avoids doing writes, and ! 375: verifies that the correct device exists and functions. */ ! 376: ! 377: int ! 378: eepro_probe1(struct device *dev, short ioaddr) ! 379: { ! 380: unsigned short station_addr[6], id, counter; ! 381: int i; ! 382: int eepro; ! 383: const char *ifmap[] = {"AUI", "10Base2", "10BaseT"}; ! 384: enum iftype { AUI=0, BNC=1, TPE=2 }; ! 385: ! 386: /* Now, we are going to check for the signature of the ! 387: ID_REG (register 2 of bank 0) */ ! 388: if (((id=inb(ioaddr + ID_REG)) & ID_REG_MASK) == ID_REG_SIG) { ! 389: ! 390: /* We seem to have the 82595 signature, let's ! 391: play with its counter (last 2 bits of ! 392: register 2 of bank 0) to be sure. */ ! 393: ! 394: counter = (id & R_ROBIN_BITS); ! 395: if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS) == ! 396: (counter + 0x40)) { ! 397: ! 398: /* Yes, the 82595 has been found */ ! 399: ! 400: /* Now, get the ethernet hardware address from ! 401: the EEPROM */ ! 402: ! 403: station_addr[0] = read_eeprom(ioaddr, 2); ! 404: station_addr[1] = read_eeprom(ioaddr, 3); ! 405: station_addr[2] = read_eeprom(ioaddr, 4); ! 406: ! 407: /* Check the station address for the manufacturer's code */ ! 408: ! 409: if ((station_addr[2] == 0x00aa) && (station_addr[1]!= 0x00c9)) { ! 410: eepro = 1; ! 411: printk("%s: Intel EtherExpress Pro/10 ISA at %#x,", ! 412: dev->name, ioaddr); ! 413: } else ! 414: if ( (station_addr[2] == 0x00a0) ! 415: || ((station_addr[2] == 0x00aa) && (station_addr[1] == 0x00c9) )) { ! 416: eepro = 2; ! 417: printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,", ! 418: dev->name, ioaddr); ! 419: } ! 420: else { ! 421: eepro = 0; ! 422: printk("%s: Intel 82595-based lan card at %#x,", ! 423: dev->name, ioaddr); ! 424: } ! 425: ! 426: /* Fill in the 'dev' fields. */ ! 427: dev->base_addr = ioaddr; ! 428: ! 429: for (i=0; i < 6; i++) { ! 430: dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i]; ! 431: printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]); ! 432: } ! 433: ! 434: if ((dev->mem_end & 0x3f) < 3 || /* RX buffer must be more than 3K */ ! 435: (dev->mem_end & 0x3f) > 29) /* and less than 29K */ ! 436: dev->mem_end = RCV_RAM; /* or it will be set to 24K */ ! 437: else dev->mem_end = 1024*dev->mem_end; /* Maybe I should shift << 10 */ ! 438: ! 439: /* From now on, dev->mem_end contains the actual size of rx buffer */ ! 440: ! 441: if (net_debug > 3) ! 442: printk(", %dK RCV buffer", (int)(dev->mem_end)/1024); ! 443: ! 444: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 445: id = inb(ioaddr + REG3); ! 446: if (id & TPE_BIT) ! 447: dev->if_port = TPE; ! 448: else dev->if_port = BNC; ! 449: ! 450: if (net_debug>3) ! 451: printk("id: %x\n", id); ! 452: ! 453: if (dev->irq < 2 && eepro) { ! 454: i = read_eeprom(ioaddr, 1); ! 455: if (eepro == 1) ! 456: switch (i & 0x07) { ! 457: case 0: dev->irq = 9; break; ! 458: case 1: dev->irq = 3; break; ! 459: case 2: dev->irq = 5; break; ! 460: case 3: dev->irq = 10; break; ! 461: case 4: dev->irq = 11; break; ! 462: default: /* should never get here !!!!! */ ! 463: printk(" illegal interrupt vector stored in EEPROM.\n"); ! 464: return ENODEV; ! 465: } ! 466: else switch (i & 0x07) { ! 467: case 0: dev->irq = 3; break; ! 468: case 1: dev->irq = 4; break; ! 469: case 2: dev->irq = 5; break; ! 470: case 3: dev->irq = 7; break; ! 471: case 4: dev->irq = 9; break; ! 472: case 5: dev->irq = 10; break; ! 473: case 6: dev->irq = 11; break; ! 474: case 7: dev->irq = 12; break; ! 475: } ! 476: } ! 477: else if (dev->irq == 2) ! 478: dev->irq = 9; ! 479: ! 480: if (dev->irq > 2) { ! 481: printk(", IRQ %d, %s.\n", dev->irq, ! 482: ifmap[dev->if_port]); ! 483: if (request_irq(dev->irq, &eepro_interrupt, 0, "eepro", NULL)) { ! 484: printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq); ! 485: return -EAGAIN; ! 486: } ! 487: } ! 488: else printk(", %s.\n", ifmap[dev->if_port]); ! 489: ! 490: if ((dev->mem_start & 0xf) > 0) /* I don't know if this is */ ! 491: net_debug = dev->mem_start & 7; /* still useful or not */ ! 492: ! 493: if (net_debug > 3) { ! 494: i = read_eeprom(ioaddr, 5); ! 495: if (i & 0x2000) /* bit 13 of EEPROM word 5 */ ! 496: printk("%s: Concurrent Processing is enabled but not used!\n", ! 497: dev->name); ! 498: } ! 499: ! 500: if (net_debug) ! 501: printk(version); ! 502: ! 503: /* Grab the region so we can find another board if autoIRQ fails. */ ! 504: request_region(ioaddr, EEPRO_IO_EXTENT, "eepro"); ! 505: ! 506: /* Initialize the device structure */ ! 507: dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL); ! 508: if (dev->priv == NULL) ! 509: return -ENOMEM; ! 510: memset(dev->priv, 0, sizeof(struct eepro_local)); ! 511: ! 512: dev->open = eepro_open; ! 513: dev->stop = eepro_close; ! 514: dev->hard_start_xmit = eepro_send_packet; ! 515: dev->get_stats = eepro_get_stats; ! 516: dev->set_multicast_list = &set_multicast_list; ! 517: ! 518: /* Fill in the fields of the device structure with ! 519: ethernet generic values */ ! 520: ! 521: ether_setup(dev); ! 522: ! 523: outb(RESET_CMD, ioaddr); /* RESET the 82595 */ ! 524: ! 525: return 0; ! 526: } ! 527: else return ENODEV; ! 528: } ! 529: else if (net_debug > 3) ! 530: printk ("EtherExpress Pro probed failed!\n"); ! 531: return ENODEV; ! 532: } ! 533: ! 534: /* Open/initialize the board. This is called (in the current kernel) ! 535: sometime after booting when the 'ifconfig' program is run. ! 536: ! 537: This routine should set everything up anew at each open, even ! 538: registers that "should" only need to be set once at boot, so that ! 539: there is non-reboot way to recover if something goes wrong. ! 540: */ ! 541: ! 542: static char irqrmap[] = {-1,-1,0,1,-1,2,-1,-1,-1,0,3,4,-1,-1,-1,-1}; ! 543: static char irqrmap2[] = {-1,-1,4,0,1,2,-1,3,-1,4,5,6,7,-1,-1,-1}; ! 544: ! 545: static int ! 546: eepro_grab_irq(struct device *dev) ! 547: { ! 548: int irqlist[] = { 3, 4, 5, 7, 9, 10, 11, 12 }; ! 549: int *irqp = irqlist, temp_reg, ioaddr = dev->base_addr; ! 550: ! 551: outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ ! 552: ! 553: /* Enable the interrupt line. */ ! 554: temp_reg = inb(ioaddr + REG1); ! 555: outb(temp_reg | INT_ENABLE, ioaddr + REG1); ! 556: ! 557: outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */ ! 558: ! 559: /* clear all interrupts */ ! 560: outb(ALL_MASK, ioaddr + STATUS_REG); ! 561: ! 562: /* Let EXEC event to interrupt */ ! 563: outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG); ! 564: ! 565: do { ! 566: outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ ! 567: temp_reg = inb(ioaddr + INT_NO_REG); ! 568: outb((temp_reg & 0xf8) | irqrmap[*irqp], ioaddr + INT_NO_REG); ! 569: outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ ! 570: if (request_irq (*irqp, NULL, 0, "bogus", NULL) != EBUSY) { ! 571: /* Twinkle the interrupt, and check if it's seen */ ! 572: autoirq_setup(0); ! 573: outb(DIAGNOSE_CMD, ioaddr); /* RESET the 82595 */ ! 574: ! 575: if (*irqp == autoirq_report(2) && /* It's a good IRQ line */ ! 576: (request_irq(dev->irq = *irqp, &eepro_interrupt, 0, "eepro", NULL) == 0)) ! 577: break; ! 578: /* clear all interrupts */ ! 579: outb(ALL_MASK, ioaddr + STATUS_REG); ! 580: } ! 581: } while (*++irqp); ! 582: ! 583: outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */ ! 584: ! 585: /* Disable the physical interrupt line. */ ! 586: temp_reg = inb(ioaddr + REG1); ! 587: outb(temp_reg & 0x7f, ioaddr + REG1); ! 588: outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ ! 589: ! 590: /* Mask all the interrupts. */ ! 591: outb(ALL_MASK, ioaddr + INT_MASK_REG); ! 592: ! 593: /* clear all interrupts */ ! 594: outb(ALL_MASK, ioaddr + STATUS_REG); ! 595: ! 596: return dev->irq; ! 597: } ! 598: ! 599: static int ! 600: eepro_open(struct device *dev) ! 601: { ! 602: unsigned short temp_reg, old8, old9; ! 603: int i, ioaddr = dev->base_addr, rcv_ram = dev->mem_end; ! 604: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 605: ! 606: if (net_debug > 3) ! 607: printk("eepro: entering eepro_open routine.\n"); ! 608: ! 609: if ((dev->dev_addr[0] == SA_ADDR0 && ! 610: dev->dev_addr[1] == SA_ADDR1 && ! 611: dev->dev_addr[2] == SA_ADDR2)&& ! 612: (dev->dev_addr[3] != SA3_ADDR3)) ! 613: { ! 614: lp->eepro = 1; ! 615: if (net_debug > 3) printk("p->eepro = 1;\n"); ! 616: } /* Yes, an Intel EtherExpress Pro/10 */ ! 617: ! 618: else if ((dev->dev_addr[0] == SA2_ADDR0 && ! 619: dev->dev_addr[1] == SA2_ADDR1 && ! 620: dev->dev_addr[2] == SA2_ADDR2)|| ! 621: (dev->dev_addr[0] == SA3_ADDR0 && ! 622: dev->dev_addr[1] == SA3_ADDR1 && ! 623: dev->dev_addr[2] == SA3_ADDR2 && ! 624: dev->dev_addr[3] == SA3_ADDR3)) ! 625: { ! 626: lp->eepro = 2; /* Yes, an Intel EtherExpress Pro/10+ */ ! 627: if (net_debug > 3) printk("p->eepro = 2;\n"); ! 628: } ! 629: ! 630: else lp->eepro = 0; /* No, it is a generic 82585 lan card */ ! 631: ! 632: /* Get the interrupt vector for the 82595 */ ! 633: if (dev->irq < 2 && eepro_grab_irq(dev) == 0) { ! 634: printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq); ! 635: return -EAGAIN; ! 636: } ! 637: ! 638: if (irq2dev_map[dev->irq] != 0 ! 639: || (irq2dev_map[dev->irq] = dev) == 0) ! 640: return -EAGAIN; ! 641: ! 642: /* Initialize the 82595. */ ! 643: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 644: temp_reg = inb(ioaddr + EEPROM_REG); ! 645: lp->stepping = temp_reg >> 5; /* Get the stepping number of the 595 */ ! 646: ! 647: if (net_debug > 3) ! 648: printk("The stepping of the 82595 is %d\n", lp->stepping); ! 649: if (temp_reg & 0x10) /* Check the TurnOff Enable bit */ ! 650: outb(temp_reg & 0xef, ioaddr + EEPROM_REG); ! 651: for (i=0; i < 6; i++) ! 652: outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i); ! 653: ! 654: temp_reg = inb(ioaddr + REG1); /* Setup Transmit Chaining */ ! 655: outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop /* and discard bad RCV frames */ ! 656: | RCV_Discard_BadFrame, ioaddr + REG1); ! 657: temp_reg = inb(ioaddr + REG2); /* Match broadcast */ ! 658: outb(temp_reg | 0x14, ioaddr + REG2); ! 659: temp_reg = inb(ioaddr + REG3); ! 660: outb(temp_reg & 0x3f, ioaddr + REG3); /* clear test mode */ ! 661: ! 662: /* Set the receiving mode */ ! 663: outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ ! 664: ! 665: /* Set the interrupt vector */ ! 666: temp_reg = inb(ioaddr + INT_NO_REG); ! 667: ! 668: if (lp->eepro == 2) ! 669: outb((temp_reg & 0xf8) | irqrmap2[dev->irq], ioaddr + INT_NO_REG); ! 670: else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG); ! 671: ! 672: temp_reg = inb(ioaddr + INT_NO_REG); ! 673: ! 674: if (lp->eepro == 2) ! 675: outb((temp_reg & 0xf0) | irqrmap2[dev->irq] | 0x08,ioaddr+INT_NO_REG); ! 676: else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG); ! 677: ! 678: if (net_debug > 3) ! 679: printk("eepro_open: content of INT Reg is %x\n", temp_reg); ! 680: ! 681: ! 682: /* Initialize the RCV and XMT upper and lower limits */ ! 683: outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG); ! 684: outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG); ! 685: outb(XMT_LOWER_LIMIT, ioaddr + XMT_LOWER_LIMIT_REG); ! 686: outb(XMT_UPPER_LIMIT, ioaddr + XMT_UPPER_LIMIT_REG); ! 687: ! 688: /* Enable the interrupt line. */ ! 689: temp_reg = inb(ioaddr + REG1); ! 690: outb(temp_reg | INT_ENABLE, ioaddr + REG1); ! 691: outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ ! 692: ! 693: /* Let RX and TX events to interrupt */ ! 694: outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); ! 695: ! 696: /* clear all interrupts */ ! 697: outb(ALL_MASK, ioaddr + STATUS_REG); ! 698: ! 699: /* Initialize RCV */ ! 700: outw(RCV_LOWER_LIMIT << 8, ioaddr + RCV_BAR); ! 701: lp->rx_start = (RCV_LOWER_LIMIT << 8) ; ! 702: outw((RCV_UPPER_LIMIT << 8) | 0xfe, ioaddr + RCV_STOP); ! 703: ! 704: /* Initialize XMT */ ! 705: outw(XMT_LOWER_LIMIT << 8, ioaddr + XMT_BAR); ! 706: ! 707: /* Check for the i82595TX and i82595FX */ ! 708: old8 = inb(ioaddr + 8); ! 709: outb(~old8, ioaddr + 8); ! 710: ! 711: if ((temp_reg = inb(ioaddr + 8)) == old8) { ! 712: if (net_debug > 3) ! 713: printk("i82595 detected!\n"); ! 714: lp->version = LAN595; ! 715: } ! 716: else { ! 717: lp->version = LAN595TX; ! 718: outb(old8, ioaddr + 8); ! 719: old9 = inb(ioaddr + 9); ! 720: outb(~old9, ioaddr + 9); ! 721: ! 722: if (((temp_reg = inb(ioaddr + 9)) == ( (~old9)&0xff) )) { ! 723: enum iftype { AUI=0, BNC=1, TPE=2 }; ! 724: ! 725: if (net_debug > 3) { ! 726: printk("temp_reg: %#x ~old9: %#x\n",temp_reg, ~old9); ! 727: printk("i82595FX detected!\n"); ! 728: } ! 729: ! 730: lp->version = LAN595FX; ! 731: outb(old9, ioaddr + 9); ! 732: ! 733: if (dev->if_port != TPE) { /* Hopefully, this will fix the ! 734: problem of using Pentiums and ! 735: pro/10 w/ BNC. */ ! 736: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 737: temp_reg = inb(ioaddr + REG13); ! 738: ! 739: /* disable the full duplex mode since it is not ! 740: applicable with the 10Base2 cable. */ ! 741: outb(temp_reg & ~(FDX | A_N_ENABLE), REG13); ! 742: outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */ ! 743: } ! 744: } ! 745: else if (net_debug > 3) { ! 746: printk("temp_reg: %#x ~old9: %#x\n",temp_reg,((~old9)&0xff)); ! 747: printk("i82595TX detected!\n"); ! 748: } ! 749: } ! 750: ! 751: outb(SEL_RESET_CMD, ioaddr); ! 752: ! 753: /* We are supposed to wait for 2 us after a SEL_RESET */ ! 754: SLOW_DOWN_IO; ! 755: SLOW_DOWN_IO; ! 756: ! 757: lp->tx_start = lp->tx_end = XMT_LOWER_LIMIT << 8; /* or = RCV_RAM */ ! 758: lp->tx_last = 0; ! 759: ! 760: dev->tbusy = 0; ! 761: dev->interrupt = 0; ! 762: dev->start = 1; ! 763: ! 764: if (net_debug > 3) ! 765: printk("eepro: exiting eepro_open routine.\n"); ! 766: ! 767: outb(RCV_ENABLE_CMD, ioaddr); ! 768: MOD_INC_USE_COUNT; ! 769: ! 770: return 0; ! 771: } ! 772: ! 773: static int ! 774: eepro_send_packet(struct sk_buff *skb, struct device *dev) ! 775: { ! 776: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 777: int ioaddr = dev->base_addr; ! 778: int rcv_ram = dev->mem_end; ! 779: ! 780: if (net_debug > 5) ! 781: printk("eepro: entering eepro_send_packet routine.\n"); ! 782: ! 783: if (dev->tbusy) { ! 784: /* If we get here, some higher level has decided we are broken. ! 785: There should really be a "kick me" function call instead. */ ! 786: ! 787: int tickssofar = jiffies - dev->trans_start; ! 788: ! 789: if (tickssofar < 40) ! 790: return 1; ! 791: ! 792: if (net_debug > 1) ! 793: printk("%s: transmit timed out, %s?\n", dev->name, ! 794: "network cable problem"); ! 795: ! 796: lp->stats.tx_errors++; ! 797: ! 798: /* Try to restart the adaptor. */ ! 799: outb(SEL_RESET_CMD, ioaddr); ! 800: ! 801: /* We are supposed to wait for 2 us after a SEL_RESET */ ! 802: SLOW_DOWN_IO; ! 803: SLOW_DOWN_IO; ! 804: ! 805: /* Do I also need to flush the transmit buffers here? YES? */ ! 806: lp->tx_start = lp->tx_end = rcv_ram; ! 807: lp->tx_last = 0; ! 808: ! 809: dev->tbusy=0; ! 810: dev->trans_start = jiffies; ! 811: outb(RCV_ENABLE_CMD, ioaddr); ! 812: } ! 813: ! 814: /* If some higher layer thinks we've missed an tx-done interrupt ! 815: we are passed NULL. Caution: dev_tint() handles the cli()/sti() ! 816: itself. */ ! 817: ! 818: if (skb == NULL) { ! 819: dev_tint(dev); ! 820: return 0; ! 821: } ! 822: ! 823: /* Block a timer-based transmit from overlapping. */ ! 824: ! 825: if (set_bit(0, (void*)&dev->tbusy) != 0) ! 826: printk("%s: Transmitter access conflict.\n", dev->name); ! 827: else { ! 828: short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ! 829: unsigned char *buf = skb->data; ! 830: hardware_send_packet(dev, buf, length); ! 831: dev->trans_start = jiffies; ! 832: } ! 833: ! 834: dev_kfree_skb (skb, FREE_WRITE); ! 835: ! 836: /* You might need to clean up and record Tx statistics here. */ ! 837: /* lp->stats.tx_aborted_errors++; */ ! 838: ! 839: if (net_debug > 5) ! 840: printk("eepro: exiting eepro_send_packet routine.\n"); ! 841: ! 842: return 0; ! 843: } ! 844: ! 845: /* The typical workload of the driver: ! 846: Handle the network interface interrupts. */ ! 847: ! 848: static void ! 849: eepro_interrupt(int irq, void *dev_id, struct pt_regs * regs) ! 850: { ! 851: struct device *dev = (struct device *)(irq2dev_map[irq]); ! 852: int ioaddr, status, boguscount = 20; ! 853: ! 854: if (net_debug > 5) ! 855: printk("eepro: entering eepro_interrupt routine.\n"); ! 856: ! 857: if (dev == NULL) { ! 858: printk ("eepro_interrupt(): irq %d for unknown device.\n", irq); ! 859: return; ! 860: } ! 861: ! 862: dev->interrupt = 1; ! 863: ! 864: ioaddr = dev->base_addr; ! 865: ! 866: do { ! 867: status = inb(ioaddr + STATUS_REG); ! 868: ! 869: if (status & RX_INT) { ! 870: if (net_debug > 4) ! 871: printk("eepro: packet received interrupt.\n"); ! 872: /* Acknowledge the RX_INT */ ! 873: outb(RX_INT, ioaddr + STATUS_REG); ! 874: /* Get the received packets */ ! 875: eepro_rx(dev); ! 876: } ! 877: else if (status & TX_INT) { ! 878: if (net_debug > 4) ! 879: printk("eepro: packet transmit interrupt.\n"); ! 880: /* Acknowledge the TX_INT */ ! 881: outb(TX_INT, ioaddr + STATUS_REG); ! 882: /* Process the status of transmitted packets */ ! 883: eepro_transmit_interrupt(dev); ! 884: } ! 885: ! 886: } while ((boguscount-- > 0) && (status & 0x06)); ! 887: ! 888: dev->interrupt = 0; ! 889: ! 890: if (net_debug > 5) ! 891: printk("eepro: exiting eepro_interrupt routine.\n"); ! 892: ! 893: return; ! 894: } ! 895: ! 896: static int ! 897: eepro_close(struct device *dev) ! 898: { ! 899: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 900: int ioaddr = dev->base_addr; ! 901: int rcv_ram = dev->mem_end; ! 902: short temp_reg; ! 903: ! 904: dev->tbusy = 1; ! 905: dev->start = 0; ! 906: ! 907: outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */ ! 908: ! 909: /* Disable the physical interrupt line. */ ! 910: temp_reg = inb(ioaddr + REG1); ! 911: outb(temp_reg & 0x7f, ioaddr + REG1); ! 912: outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ ! 913: ! 914: /* Flush the Tx and disable Rx. */ ! 915: outb(STOP_RCV_CMD, ioaddr); ! 916: ! 917: lp->tx_start = lp->tx_end = rcv_ram ; ! 918: lp->tx_last = 0; ! 919: ! 920: /* Mask all the interrupts. */ ! 921: outb(ALL_MASK, ioaddr + INT_MASK_REG); ! 922: ! 923: /* clear all interrupts */ ! 924: outb(ALL_MASK, ioaddr + STATUS_REG); ! 925: ! 926: /* Reset the 82595 */ ! 927: outb(RESET_CMD, ioaddr); ! 928: ! 929: /* release the interrupt */ ! 930: free_irq(dev->irq, NULL); ! 931: irq2dev_map[dev->irq] = 0; ! 932: ! 933: /* Update the statistics here. What statistics? */ ! 934: /* We are supposed to wait for 200 us after a RESET */ ! 935: SLOW_DOWN_IO; ! 936: SLOW_DOWN_IO; /* May not be enough? */ ! 937: MOD_DEC_USE_COUNT; ! 938: ! 939: return 0; ! 940: } ! 941: ! 942: /* Get the current statistics. This may be called with the card open or ! 943: closed. */ ! 944: static struct enet_statistics * ! 945: eepro_get_stats(struct device *dev) ! 946: { ! 947: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 948: return &lp->stats; ! 949: } ! 950: ! 951: /* Set or clear the multicast filter for this adaptor. ! 952: */ ! 953: ! 954: static void ! 955: set_multicast_list(struct device *dev) ! 956: { ! 957: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 958: short ioaddr = dev->base_addr; ! 959: unsigned short mode; ! 960: struct dev_mc_list *dmi=dev->mc_list; ! 961: ! 962: if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63) ! 963: { ! 964: /* ! 965: * We must make the kernel realise we had to move ! 966: * into promisc mode or we start all out war on ! 967: * the cable. If it was a promisc request the ! 968: * flag is already set. If not we assert it. ! 969: */ ! 970: dev->flags|=IFF_PROMISC; ! 971: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 972: mode = inb(ioaddr + REG2); ! 973: outb(mode | PRMSC_Mode, ioaddr + REG2); ! 974: mode = inb(ioaddr + REG3); ! 975: outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ ! 976: outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ ! 977: printk("%s: promiscuous mode enabled.\n", dev->name); ! 978: } ! 979: ! 980: else if (dev->mc_count==0 ) ! 981: { ! 982: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 983: mode = inb(ioaddr + REG2); ! 984: outb(mode & 0xd6, ioaddr + REG2); /* Turn off Multi-IA and PRMSC_Mode bits */ ! 985: mode = inb(ioaddr + REG3); ! 986: outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ ! 987: outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ ! 988: } ! 989: ! 990: else ! 991: { ! 992: unsigned short status, *eaddrs; ! 993: int i, boguscount = 0; ! 994: ! 995: /* Disable RX and TX interrupts. Necessary to avoid ! 996: corruption of the HOST_ADDRESS_REG by interrupt ! 997: service routines. */ ! 998: outb(ALL_MASK, ioaddr + INT_MASK_REG); ! 999: outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ ! 1000: mode = inb(ioaddr + REG2); ! 1001: outb(mode | Multi_IA, ioaddr + REG2); ! 1002: mode = inb(ioaddr + REG3); ! 1003: outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ ! 1004: outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ ! 1005: outw(lp->tx_end, ioaddr + HOST_ADDRESS_REG); ! 1006: outw(MC_SETUP, ioaddr + IO_PORT); ! 1007: outw(0, ioaddr + IO_PORT); ! 1008: outw(0, ioaddr + IO_PORT); ! 1009: outw(6*(dev->mc_count + 1), ioaddr + IO_PORT); ! 1010: ! 1011: for (i = 0; i < dev->mc_count; i++) ! 1012: { ! 1013: eaddrs=(unsigned short *)dmi->dmi_addr; ! 1014: dmi=dmi->next; ! 1015: outw(*eaddrs++, ioaddr + IO_PORT); ! 1016: outw(*eaddrs++, ioaddr + IO_PORT); ! 1017: outw(*eaddrs++, ioaddr + IO_PORT); ! 1018: } ! 1019: ! 1020: eaddrs = (unsigned short *) dev->dev_addr; ! 1021: outw(eaddrs[0], ioaddr + IO_PORT); ! 1022: outw(eaddrs[1], ioaddr + IO_PORT); ! 1023: outw(eaddrs[2], ioaddr + IO_PORT); ! 1024: outw(lp->tx_end, ioaddr + XMT_BAR); ! 1025: outb(MC_SETUP, ioaddr); ! 1026: ! 1027: /* Update the transmit queue */ ! 1028: i = lp->tx_end + XMT_HEADER + 6*(dev->mc_count + 1); ! 1029: ! 1030: if (lp->tx_start != lp->tx_end) ! 1031: { ! 1032: /* update the next address and the chain bit in the ! 1033: last packet */ ! 1034: outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG); ! 1035: outw(i, ioaddr + IO_PORT); ! 1036: outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG); ! 1037: status = inw(ioaddr + IO_PORT); ! 1038: outw(status | CHAIN_BIT, ioaddr + IO_PORT); ! 1039: lp->tx_end = i ; ! 1040: } ! 1041: else { ! 1042: lp->tx_start = lp->tx_end = i ; ! 1043: } ! 1044: ! 1045: /* Acknowledge that the MC setup is done */ ! 1046: do { /* We should be doing this in the eepro_interrupt()! */ ! 1047: SLOW_DOWN_IO; ! 1048: SLOW_DOWN_IO; ! 1049: ! 1050: if (inb(ioaddr + STATUS_REG) & 0x08) ! 1051: { ! 1052: i = inb(ioaddr); ! 1053: outb(0x08, ioaddr + STATUS_REG); ! 1054: ! 1055: if (i & 0x20) { /* command ABORTed */ ! 1056: printk("%s: multicast setup failed.\n", ! 1057: dev->name); ! 1058: break; ! 1059: } else if ((i & 0x0f) == 0x03) { /* MC-Done */ ! 1060: printk("%s: set Rx mode to %d addresses.\n", ! 1061: dev->name, dev->mc_count); ! 1062: break; ! 1063: } ! 1064: } ! 1065: } while (++boguscount < 100); ! 1066: ! 1067: /* Re-enable RX and TX interrupts */ ! 1068: outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); ! 1069: ! 1070: } ! 1071: outb(RCV_ENABLE_CMD, ioaddr); ! 1072: } ! 1073: ! 1074: /* The horrible routine to read a word from the serial EEPROM. */ ! 1075: /* IMPORTANT - the 82595 will be set to Bank 0 after the eeprom is read */ ! 1076: /* The delay between EEPROM clock transitions. */ ! 1077: ! 1078: #define eeprom_delay() { int _i = 40; while (--_i > 0) { __SLOW_DOWN_IO; }} ! 1079: #define EE_READ_CMD (6 << 6) ! 1080: ! 1081: int ! 1082: read_eeprom(int ioaddr, int location) ! 1083: { ! 1084: int i; ! 1085: unsigned short retval = 0; ! 1086: short ee_addr = ioaddr + EEPROM_REG; ! 1087: int read_cmd = location | EE_READ_CMD; ! 1088: short ctrl_val = EECS ; ! 1089: ! 1090: outb(BANK2_SELECT, ioaddr); ! 1091: outb(ctrl_val, ee_addr); ! 1092: ! 1093: /* Shift the read command bits out. */ ! 1094: for (i = 8; i >= 0; i--) { ! 1095: short outval = (read_cmd & (1 << i)) ? ctrl_val | EEDI ! 1096: : ctrl_val; ! 1097: outb(outval, ee_addr); ! 1098: outb(outval | EESK, ee_addr); /* EEPROM clock tick. */ ! 1099: eeprom_delay(); ! 1100: outb(outval, ee_addr); /* Finish EEPROM a clock tick. */ ! 1101: eeprom_delay(); ! 1102: } ! 1103: outb(ctrl_val, ee_addr); ! 1104: ! 1105: for (i = 16; i > 0; i--) { ! 1106: outb(ctrl_val | EESK, ee_addr); eeprom_delay(); ! 1107: retval = (retval << 1) | ((inb(ee_addr) & EEDO) ? 1 : 0); ! 1108: outb(ctrl_val, ee_addr); eeprom_delay(); ! 1109: } ! 1110: /* Terminate the EEPROM access. */ ! 1111: ctrl_val &= ~EECS; ! 1112: outb(ctrl_val | EESK, ee_addr); ! 1113: eeprom_delay(); ! 1114: outb(ctrl_val, ee_addr); ! 1115: eeprom_delay(); ! 1116: outb(BANK0_SELECT, ioaddr); ! 1117: return retval; ! 1118: } ! 1119: ! 1120: static void ! 1121: hardware_send_packet(struct device *dev, void *buf, short length) ! 1122: { ! 1123: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 1124: short ioaddr = dev->base_addr; ! 1125: int rcv_ram = dev->mem_end; ! 1126: unsigned status, tx_available, last, end, boguscount = 100; ! 1127: ! 1128: if (net_debug > 5) ! 1129: printk("eepro: entering hardware_send_packet routine.\n"); ! 1130: ! 1131: while (boguscount-- > 0) { ! 1132: ! 1133: /* Disable RX and TX interrupts. Necessary to avoid ! 1134: corruption of the HOST_ADDRESS_REG by interrupt ! 1135: service routines. */ ! 1136: outb(ALL_MASK, ioaddr + INT_MASK_REG); ! 1137: ! 1138: if (dev->interrupt == 1) { ! 1139: /* Enable RX and TX interrupts */ ! 1140: outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); ! 1141: continue; ! 1142: } ! 1143: ! 1144: /* determine how much of the transmit buffer space is available */ ! 1145: if (lp->tx_end > lp->tx_start) ! 1146: tx_available = XMT_RAM - (lp->tx_end - lp->tx_start); ! 1147: else if (lp->tx_end < lp->tx_start) ! 1148: tx_available = lp->tx_start - lp->tx_end; ! 1149: else tx_available = XMT_RAM; ! 1150: ! 1151: if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER) ! 1152: >= tx_available) /* No space available ??? */ ! 1153: { ! 1154: eepro_transmit_interrupt(dev); /* Clean up the transmiting queue */ ! 1155: /* Enable RX and TX interrupts */ ! 1156: outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); ! 1157: continue; ! 1158: } ! 1159: ! 1160: last = lp->tx_end; ! 1161: end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; ! 1162: if (end >= RAM_SIZE) { /* the transmit buffer is wrapped around */ ! 1163: ! 1164: if ((RAM_SIZE - last) <= XMT_HEADER) { ! 1165: /* Arrrr!!!, must keep the xmt header together, ! 1166: several days were lost to chase this one down. */ ! 1167: last = rcv_ram; ! 1168: end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; ! 1169: } ! 1170: ! 1171: else end = rcv_ram + (end - RAM_SIZE); ! 1172: } ! 1173: ! 1174: outw(last, ioaddr + HOST_ADDRESS_REG); ! 1175: outw(XMT_CMD, ioaddr + IO_PORT); ! 1176: outw(0, ioaddr + IO_PORT); ! 1177: outw(end, ioaddr + IO_PORT); ! 1178: outw(length, ioaddr + IO_PORT); ! 1179: ! 1180: if (lp->version == LAN595) ! 1181: outsw(ioaddr + IO_PORT, buf, (length + 3) >> 1); ! 1182: ! 1183: else { /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */ ! 1184: unsigned short temp = inb(ioaddr + INT_MASK_REG); ! 1185: outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG); ! 1186: outsl(ioaddr + IO_PORT_32_BIT, buf, (length + 3) >> 2); ! 1187: outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG); ! 1188: } ! 1189: ! 1190: /* A dummy read to flush the DRAM write pipeline */ ! 1191: status = inw(ioaddr + IO_PORT); ! 1192: ! 1193: if (lp->tx_start == lp->tx_end) { ! 1194: outw(last, ioaddr + XMT_BAR); ! 1195: outb(XMT_CMD, ioaddr); ! 1196: lp->tx_start = last; /* I don't like to change tx_start here */ ! 1197: } ! 1198: else { ! 1199: /* update the next address and the chain bit in the ! 1200: last packet */ ! 1201: ! 1202: if (lp->tx_end != last) { ! 1203: outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG); ! 1204: outw(last, ioaddr + IO_PORT); ! 1205: } ! 1206: ! 1207: outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG); ! 1208: status = inw(ioaddr + IO_PORT); ! 1209: outw(status | CHAIN_BIT, ioaddr + IO_PORT); ! 1210: ! 1211: /* Continue the transmit command */ ! 1212: outb(RESUME_XMT_CMD, ioaddr); ! 1213: } ! 1214: lp->tx_last = last; ! 1215: lp->tx_end = end; ! 1216: ! 1217: /* Enable RX and TX interrupts */ ! 1218: outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); ! 1219: ! 1220: if (dev->tbusy) { ! 1221: dev->tbusy = 0; ! 1222: } ! 1223: ! 1224: if (net_debug > 5) ! 1225: printk("eepro: exiting hardware_send_packet routine.\n"); ! 1226: ! 1227: return; ! 1228: } ! 1229: dev->tbusy = 1; ! 1230: ! 1231: if (net_debug > 5) ! 1232: printk("eepro: exiting hardware_send_packet routine.\n"); ! 1233: } ! 1234: ! 1235: static void ! 1236: eepro_rx(struct device *dev) ! 1237: { ! 1238: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 1239: short ioaddr = dev->base_addr, rcv_ram = dev->mem_end; ! 1240: short boguscount = 20; ! 1241: short rcv_car = lp->rx_start; ! 1242: unsigned rcv_event, rcv_status, rcv_next_frame, rcv_size; ! 1243: ! 1244: if (net_debug > 5) ! 1245: printk("eepro: entering eepro_rx routine.\n"); ! 1246: ! 1247: /* Set the read pointer to the start of the RCV */ ! 1248: outw(rcv_car, ioaddr + HOST_ADDRESS_REG); ! 1249: ! 1250: rcv_event = inw(ioaddr + IO_PORT); ! 1251: while (rcv_event == RCV_DONE) { ! 1252: ! 1253: rcv_status = inw(ioaddr + IO_PORT); ! 1254: rcv_next_frame = inw(ioaddr + IO_PORT); ! 1255: rcv_size = inw(ioaddr + IO_PORT); ! 1256: ! 1257: if ((rcv_status & (RX_OK | RX_ERROR)) == RX_OK) { ! 1258: ! 1259: /* Malloc up new buffer. */ ! 1260: struct sk_buff *skb; ! 1261: rcv_size &= 0x3fff; ! 1262: skb = dev_alloc_skb(rcv_size+5); ! 1263: ! 1264: if (skb == NULL) { ! 1265: printk("%s: Memory squeeze, dropping packet.\n", dev->name); ! 1266: lp->stats.rx_dropped++; ! 1267: break; ! 1268: } ! 1269: ! 1270: skb->dev = dev; ! 1271: skb_reserve(skb,2); ! 1272: ! 1273: if (lp->version == LAN595) ! 1274: insw(ioaddr+IO_PORT, skb_put(skb,rcv_size), (rcv_size + 3) >> 1); ! 1275: ! 1276: else { /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */ ! 1277: unsigned short temp = inb(ioaddr + INT_MASK_REG); ! 1278: outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG); ! 1279: insl(ioaddr+IO_PORT_32_BIT, skb_put(skb,rcv_size), (rcv_size + 3) >> 2); ! 1280: outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG); ! 1281: } ! 1282: ! 1283: skb->protocol = eth_type_trans(skb,dev); ! 1284: netif_rx(skb); ! 1285: lp->stats.rx_packets++; ! 1286: } ! 1287: ! 1288: else { /* Not sure will ever reach here, ! 1289: I set the 595 to discard bad received frames */ ! 1290: lp->stats.rx_errors++; ! 1291: ! 1292: if (rcv_status & 0x0100) ! 1293: lp->stats.rx_over_errors++; ! 1294: ! 1295: else if (rcv_status & 0x0400) ! 1296: lp->stats.rx_frame_errors++; ! 1297: ! 1298: else if (rcv_status & 0x0800) ! 1299: lp->stats.rx_crc_errors++; ! 1300: ! 1301: printk("%s: event = %#x, status = %#x, next = %#x, size = %#x\n", ! 1302: dev->name, rcv_event, rcv_status, rcv_next_frame, rcv_size); ! 1303: } ! 1304: ! 1305: if (rcv_status & 0x1000) ! 1306: lp->stats.rx_length_errors++; ! 1307: ! 1308: if (--boguscount == 0) ! 1309: break; ! 1310: ! 1311: rcv_car = lp->rx_start + RCV_HEADER + rcv_size; ! 1312: lp->rx_start = rcv_next_frame; ! 1313: outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG); ! 1314: rcv_event = inw(ioaddr + IO_PORT); ! 1315: } ! 1316: if (rcv_car == 0) ! 1317: rcv_car = (RCV_UPPER_LIMIT << 8) | 0xff; ! 1318: ! 1319: outw(rcv_car - 1, ioaddr + RCV_STOP); ! 1320: ! 1321: if (net_debug > 5) ! 1322: printk("eepro: exiting eepro_rx routine.\n"); ! 1323: } ! 1324: ! 1325: static void ! 1326: eepro_transmit_interrupt(struct device *dev) ! 1327: { ! 1328: struct eepro_local *lp = (struct eepro_local *)dev->priv; ! 1329: short ioaddr = dev->base_addr; ! 1330: short boguscount = 20; ! 1331: short xmt_status; ! 1332: ! 1333: while (lp->tx_start != lp->tx_end) { ! 1334: ! 1335: outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG); ! 1336: xmt_status = inw(ioaddr+IO_PORT); ! 1337: ! 1338: if ((xmt_status & TX_DONE_BIT) == 0) break; ! 1339: ! 1340: xmt_status = inw(ioaddr+IO_PORT); ! 1341: lp->tx_start = inw(ioaddr+IO_PORT); ! 1342: dev->tbusy = 0; ! 1343: mark_bh(NET_BH); ! 1344: ! 1345: if (xmt_status & 0x2000) ! 1346: lp->stats.tx_packets++; ! 1347: else { ! 1348: lp->stats.tx_errors++; ! 1349: if (xmt_status & 0x0400) ! 1350: lp->stats.tx_carrier_errors++; ! 1351: printk("%s: XMT status = %#x\n", ! 1352: dev->name, xmt_status); ! 1353: } ! 1354: ! 1355: if (xmt_status & 0x000f) { ! 1356: lp->stats.collisions += (xmt_status & 0x000f); ! 1357: } ! 1358: ! 1359: if ((xmt_status & 0x0040) == 0x0) { ! 1360: lp->stats.tx_heartbeat_errors++; ! 1361: } ! 1362: ! 1363: if (--boguscount == 0) ! 1364: break; ! 1365: } ! 1366: } ! 1367: ! 1368: #ifdef MODULE ! 1369: ! 1370: static char devicename[9] = { 0, }; ! 1371: static struct device dev_eepro = { ! 1372: devicename, /* device name is inserted by linux/drivers/net/net_init.c */ ! 1373: 0, 0, 0, 0, ! 1374: 0, 0, ! 1375: 0, 0, 0, NULL, eepro_probe }; ! 1376: static int io = 0x200; ! 1377: static int irq = 0; ! 1378: static int mem = (RCV_RAM/1024); /* Size of the rx buffer in KB */ ! 1379: ! 1380: int ! 1381: init_module(void) ! 1382: { ! 1383: if (io == 0) ! 1384: printk("eepro: You should not use auto-probing with insmod!\n"); ! 1385: ! 1386: dev_eepro.base_addr = io; ! 1387: dev_eepro.irq = irq; ! 1388: dev_eepro.mem_end = mem; ! 1389: ! 1390: if (register_netdev(&dev_eepro) != 0) ! 1391: return -EIO; ! 1392: ! 1393: return 0; ! 1394: } ! 1395: ! 1396: void ! 1397: cleanup_module(void) ! 1398: { ! 1399: unregister_netdev(&dev_eepro); ! 1400: ! 1401: kfree_s(dev_eepro.priv,sizeof(struct eepro_local)); ! 1402: dev_eepro.priv=NULL; ! 1403: ! 1404: /* If we don't do this, we can't re-insmod it later. */ ! 1405: release_region(dev_eepro.base_addr, EEPRO_IO_EXTENT); ! 1406: } ! 1407: #endif /* MODULE */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.