|
|
1.1 ! root 1: /* ! 2: * Linux ethernet device driver for the 3Com Etherlink Plus (3C505) ! 3: * By Craig Southeren, Juha Laiho and Philip Blundell ! 4: * ! 5: * 3c505.c This module implements an interface to the 3Com ! 6: * Etherlink Plus (3c505) ethernet card. Linux device ! 7: * driver interface reverse engineered from the Linux 3C509 ! 8: * device drivers. Some 3C505 information gleaned from ! 9: * the Crynwr packet driver. Still this driver would not ! 10: * be here without 3C505 technical reference provided by ! 11: * 3Com. ! 12: * ! 13: * $Id: 3c505.c,v 1.1 1999/04/26 05:51:48 tb Exp $ ! 14: * ! 15: * Authors: Linux 3c505 device driver by ! 16: * Craig Southeren, <[email protected]> ! 17: * Final debugging by ! 18: * Andrew Tridgell, <[email protected]> ! 19: * Auto irq/address, tuning, cleanup and v1.1.4+ kernel mods by ! 20: * Juha Laiho, <[email protected]> ! 21: * Linux 3C509 driver by ! 22: * Donald Becker, <[email protected]> ! 23: * Crynwr packet driver by ! 24: * Krishnan Gopalan and Gregg Stefancik, ! 25: * Clemson University Engineering Computer Operations. ! 26: * Portions of the code have been adapted from the 3c505 ! 27: * driver for NCSA Telnet by Bruce Orchard and later ! 28: * modified by Warren Van Houten and [email protected]. ! 29: * 3C505 technical information provided by ! 30: * Terry Murphy, of 3Com Network Adapter Division ! 31: * Linux 1.3.0 changes by ! 32: * Alan Cox <[email protected]> ! 33: * More debugging and DMA version by Philip Blundell ! 34: */ ! 35: ! 36: /* Theory of operation: ! 37: ! 38: * The 3c505 is quite an intelligent board. All communication with it is done ! 39: * by means of Primary Command Blocks (PCBs); these are transferred using PIO ! 40: * through the command register. The card has 256k of on-board RAM, which is ! 41: * used to buffer received packets. It might seem at first that more buffers ! 42: * are better, but in fact this isn't true. From my tests, it seems that ! 43: * more than about 10 buffers are unnecessary, and there is a noticeable ! 44: * performance hit in having more active on the card. So the majority of the ! 45: * card's memory isn't, in fact, used. ! 46: * ! 47: * We keep up to 4 "receive packet" commands active on the board at a time. ! 48: * When a packet comes in, so long as there is a receive command active, the ! 49: * board will send us a "packet received" PCB and then add the data for that ! 50: * packet to the DMA queue. If a DMA transfer is not already in progress, we ! 51: * set one up to start uploading the data. We have to maintain a list of ! 52: * backlogged receive packets, because the card may decide to tell us about ! 53: * a newly-arrived packet at any time, and we may not be able to start a DMA ! 54: * transfer immediately (ie one may already be going on). We can't NAK the ! 55: * PCB, because then it would throw the packet away. ! 56: * ! 57: * Trying to send a PCB to the card at the wrong moment seems to have bad ! 58: * effects. If we send it a transmit PCB while a receive DMA is happening, ! 59: * it will just NAK the PCB and so we will have wasted our time. Worse, it ! 60: * sometimes seems to interrupt the transfer. The majority of the low-level ! 61: * code is protected by one huge semaphore -- "busy" -- which is set whenever ! 62: * it probably isn't safe to do anything to the card. The receive routine ! 63: * must gain a lock on "busy" before it can start a DMA transfer, and the ! 64: * transmit routine must gain a lock before it sends the first PCB to the card. ! 65: * The send_pcb() routine also has an internal semaphore to protect it against ! 66: * being re-entered (which would be disastrous) -- this is needed because ! 67: * several things can happen asynchronously (re-priming the receiver and ! 68: * asking the card for statistics, for example). send_pcb() will also refuse ! 69: * to talk to the card at all if a DMA upload is happening. The higher-level ! 70: * networking code will reschedule a later retry if some part of the driver ! 71: * is blocked. In practice, this doesn't seem to happen very often. ! 72: */ ! 73: ! 74: /* This driver will not work with revision 2 hardware, because the host ! 75: * control register is write-only. It should be fairly easy to arrange to ! 76: * keep our own soft-copy of the intended contents of this register, if ! 77: * somebody has the time. There may be firmware differences that cause ! 78: * other problems, though, and I don't have an old card to test. ! 79: */ ! 80: ! 81: /* The driver is a mess. I took Craig's and Juha's code, and hacked it firstly ! 82: * to make it more reliable, and secondly to add DMA mode. Many things could ! 83: * probably be done better; the concurrency protection is particularly awful. ! 84: */ ! 85: ! 86: #include <linux/module.h> ! 87: ! 88: #include <linux/kernel.h> ! 89: #include <linux/sched.h> ! 90: #include <linux/string.h> ! 91: #include <linux/interrupt.h> ! 92: #include <linux/ptrace.h> ! 93: #include <linux/errno.h> ! 94: #include <linux/in.h> ! 95: #include <linux/malloc.h> ! 96: #include <linux/ioport.h> ! 97: #include <asm/bitops.h> ! 98: #include <asm/io.h> ! 99: #include <asm/dma.h> ! 100: ! 101: #include <linux/netdevice.h> ! 102: #include <linux/etherdevice.h> ! 103: #include <linux/skbuff.h> ! 104: ! 105: #include "3c505.h" ! 106: ! 107: #define ELP_DMA 6 /* DMA channel to use */ ! 108: #define ELP_RX_PCBS 4 ! 109: ! 110: /********************************************************* ! 111: * ! 112: * define debug messages here as common strings to reduce space ! 113: * ! 114: *********************************************************/ ! 115: ! 116: static const char *filename = __FILE__; ! 117: ! 118: static const char *timeout_msg = "*** timeout at %s:%s (line %d) ***\n"; ! 119: #define TIMEOUT_MSG(lineno) \ ! 120: printk(timeout_msg, filename,__FUNCTION__,(lineno)) ! 121: ! 122: static const char *invalid_pcb_msg = ! 123: "*** invalid pcb length %d at %s:%s (line %d) ***\n"; ! 124: #define INVALID_PCB_MSG(len) \ ! 125: printk(invalid_pcb_msg, (len),filename,__FUNCTION__,__LINE__) ! 126: ! 127: static const char *search_msg = "%s: Looking for 3c505 adapter at address %#x..."; ! 128: ! 129: static const char *stilllooking_msg = "still looking..."; ! 130: ! 131: static const char *found_msg = "found.\n"; ! 132: ! 133: static const char *notfound_msg = "not found (reason = %d)\n"; ! 134: ! 135: static const char *couldnot_msg = "%s: 3c505 not found\n"; ! 136: ! 137: /********************************************************* ! 138: * ! 139: * various other debug stuff ! 140: * ! 141: *********************************************************/ ! 142: ! 143: #ifdef ELP_DEBUG ! 144: static const int elp_debug = ELP_DEBUG; ! 145: #else ! 146: static const int elp_debug = 0; ! 147: #endif ! 148: ! 149: /* ! 150: * 0 = no messages (well, some) ! 151: * 1 = messages when high level commands performed ! 152: * 2 = messages when low level commands performed ! 153: * 3 = messages when interrupts received ! 154: */ ! 155: ! 156: /***************************************************************** ! 157: * ! 158: * useful macros ! 159: * ! 160: *****************************************************************/ ! 161: ! 162: #ifndef TRUE ! 163: #define TRUE 1 ! 164: #endif ! 165: ! 166: #ifndef FALSE ! 167: #define FALSE 0 ! 168: #endif ! 169: ! 170: ! 171: /***************************************************************** ! 172: * ! 173: * List of I/O-addresses we try to auto-sense ! 174: * Last element MUST BE 0! ! 175: *****************************************************************/ ! 176: ! 177: const int addr_list[] = {0x300, 0x280, 0x310, 0}; ! 178: ! 179: /* Dma Memory related stuff */ ! 180: ! 181: /* Pure 2^n version of get_order */ ! 182: static inline int __get_order(unsigned long size) ! 183: { ! 184: int order; ! 185: ! 186: size = (size - 1) >> (PAGE_SHIFT - 1); ! 187: order = -1; ! 188: do { ! 189: size >>= 1; ! 190: order++; ! 191: } while (size); ! 192: return order; ! 193: } ! 194: ! 195: static unsigned long dma_mem_alloc(int size) ! 196: { ! 197: int order = __get_order(size); ! 198: ! 199: return __get_dma_pages(GFP_KERNEL, order); ! 200: } ! 201: ! 202: ! 203: /***************************************************************** ! 204: * ! 205: * Functions for I/O (note the inline !) ! 206: * ! 207: *****************************************************************/ ! 208: ! 209: static inline unsigned char inb_status(unsigned int base_addr) ! 210: { ! 211: return inb(base_addr + PORT_STATUS); ! 212: } ! 213: ! 214: static inline unsigned char inb_control(unsigned int base_addr) ! 215: { ! 216: return inb(base_addr + PORT_CONTROL); ! 217: } ! 218: ! 219: static inline int inb_command(unsigned int base_addr) ! 220: { ! 221: return inb(base_addr + PORT_COMMAND); ! 222: } ! 223: ! 224: static inline void outb_control(unsigned char val, unsigned int base_addr) ! 225: { ! 226: outb(val, base_addr + PORT_CONTROL); ! 227: } ! 228: ! 229: static inline void outb_command(unsigned char val, unsigned int base_addr) ! 230: { ! 231: outb(val, base_addr + PORT_COMMAND); ! 232: } ! 233: ! 234: static inline unsigned int inw_data(unsigned int base_addr) ! 235: { ! 236: return inw(base_addr + PORT_DATA); ! 237: } ! 238: ! 239: static inline void outw_data(unsigned int val, unsigned int base_addr) ! 240: { ! 241: outw(val, base_addr + PORT_DATA); ! 242: } ! 243: ! 244: ! 245: /***************************************************************** ! 246: * ! 247: * structure to hold context information for adapter ! 248: * ! 249: *****************************************************************/ ! 250: ! 251: #define DMA_BUFFER_SIZE 1600 ! 252: #define BACKLOG_SIZE 4 ! 253: ! 254: typedef struct { ! 255: volatile short got[NUM_TRANSMIT_CMDS]; /* flags for command completion */ ! 256: pcb_struct tx_pcb; /* PCB for foreground sending */ ! 257: pcb_struct rx_pcb; /* PCB for foreground receiving */ ! 258: pcb_struct itx_pcb; /* PCB for background sending */ ! 259: pcb_struct irx_pcb; /* PCB for background receiving */ ! 260: struct enet_statistics stats; ! 261: ! 262: void *dma_buffer; ! 263: ! 264: struct { ! 265: unsigned int length[BACKLOG_SIZE]; ! 266: unsigned int in; ! 267: unsigned int out; ! 268: } rx_backlog; ! 269: ! 270: struct { ! 271: unsigned int direction; ! 272: unsigned int length; ! 273: unsigned int copy_flag; ! 274: struct sk_buff *skb; ! 275: long int start_time; ! 276: } current_dma; ! 277: ! 278: /* flags */ ! 279: unsigned long send_pcb_semaphore; ! 280: unsigned int dmaing; ! 281: unsigned long busy; ! 282: ! 283: unsigned int rx_active; /* number of receive PCBs */ ! 284: } elp_device; ! 285: ! 286: static inline unsigned int backlog_next(unsigned int n) ! 287: { ! 288: return (n + 1) % BACKLOG_SIZE; ! 289: } ! 290: ! 291: /***************************************************************** ! 292: * ! 293: * useful functions for accessing the adapter ! 294: * ! 295: *****************************************************************/ ! 296: ! 297: /* ! 298: * use this routine when accessing the ASF bits as they are ! 299: * changed asynchronously by the adapter ! 300: */ ! 301: ! 302: /* get adapter PCB status */ ! 303: #define GET_ASF(addr) \ ! 304: (get_status(addr)&ASF_PCB_MASK) ! 305: ! 306: static inline int get_status(unsigned int base_addr) ! 307: { ! 308: int timeout = jiffies + 10; ! 309: register int stat1; ! 310: do { ! 311: stat1 = inb_status(base_addr); ! 312: } while (stat1 != inb_status(base_addr) && jiffies < timeout); ! 313: if (jiffies >= timeout) ! 314: TIMEOUT_MSG(__LINE__); ! 315: return stat1; ! 316: } ! 317: ! 318: static inline void set_hsf(unsigned int base_addr, int hsf) ! 319: { ! 320: cli(); ! 321: outb_control((inb_control(base_addr) & ~HSF_PCB_MASK) | hsf, base_addr); ! 322: sti(); ! 323: } ! 324: ! 325: static int start_receive(struct device *, pcb_struct *); ! 326: ! 327: inline static void adapter_reset(struct device *dev) ! 328: { ! 329: int timeout; ! 330: unsigned char orig_hcr = inb_control(dev->base_addr); ! 331: ! 332: elp_device *adapter = dev->priv; ! 333: ! 334: outb_control(0, dev->base_addr); ! 335: ! 336: if (inb_status(dev->base_addr) & ACRF) { ! 337: do { ! 338: inb_command(dev->base_addr); ! 339: timeout = jiffies + 2; ! 340: while ((jiffies <= timeout) && !(inb_status(dev->base_addr) & ACRF)); ! 341: } while (inb_status(dev->base_addr) & ACRF); ! 342: set_hsf(dev->base_addr, HSF_PCB_NAK); ! 343: } ! 344: outb_control(inb_control(dev->base_addr) | ATTN | DIR, dev->base_addr); ! 345: timeout = jiffies + 1; ! 346: while (jiffies <= timeout); ! 347: outb_control(inb_control(dev->base_addr) & ~ATTN, dev->base_addr); ! 348: timeout = jiffies + 1; ! 349: while (jiffies <= timeout); ! 350: outb_control(inb_control(dev->base_addr) | FLSH, dev->base_addr); ! 351: timeout = jiffies + 1; ! 352: while (jiffies <= timeout); ! 353: outb_control(inb_control(dev->base_addr) & ~FLSH, dev->base_addr); ! 354: timeout = jiffies + 1; ! 355: while (jiffies <= timeout); ! 356: ! 357: outb_control(orig_hcr, dev->base_addr); ! 358: if (!start_receive(dev, &adapter->tx_pcb)) ! 359: printk("%s: start receive command failed \n", dev->name); ! 360: } ! 361: ! 362: /* Check to make sure that a DMA transfer hasn't timed out. This should never happen ! 363: * in theory, but seems to occur occasionally if the card gets prodded at the wrong ! 364: * time. ! 365: */ ! 366: static inline void check_dma(struct device *dev) ! 367: { ! 368: elp_device *adapter = dev->priv; ! 369: if (adapter->dmaing && (jiffies > (adapter->current_dma.start_time + 10))) { ! 370: unsigned long flags; ! 371: printk("%s: DMA %s timed out, %d bytes left\n", dev->name, adapter->current_dma.direction ? "download" : "upload", get_dma_residue(dev->dma)); ! 372: save_flags(flags); ! 373: cli(); ! 374: adapter->dmaing = 0; ! 375: adapter->busy = 0; ! 376: disable_dma(dev->dma); ! 377: if (adapter->rx_active) ! 378: adapter->rx_active--; ! 379: outb_control(inb_control(dev->base_addr) & ~(DMAE | TCEN | DIR), dev->base_addr); ! 380: restore_flags(flags); ! 381: } ! 382: } ! 383: ! 384: /* Primitive functions used by send_pcb() */ ! 385: static inline unsigned int send_pcb_slow(unsigned int base_addr, unsigned char byte) ! 386: { ! 387: unsigned int timeout; ! 388: outb_command(byte, base_addr); ! 389: for (timeout = jiffies + 5; jiffies < timeout;) { ! 390: if (inb_status(base_addr) & HCRE) ! 391: return FALSE; ! 392: } ! 393: printk("3c505: send_pcb_slow timed out\n"); ! 394: return TRUE; ! 395: } ! 396: ! 397: static inline unsigned int send_pcb_fast(unsigned int base_addr, unsigned char byte) ! 398: { ! 399: unsigned int timeout; ! 400: outb_command(byte, base_addr); ! 401: for (timeout = 0; timeout < 40000; timeout++) { ! 402: if (inb_status(base_addr) & HCRE) ! 403: return FALSE; ! 404: } ! 405: printk("3c505: send_pcb_fast timed out\n"); ! 406: return TRUE; ! 407: } ! 408: ! 409: /* Check to see if the receiver needs restarting, and kick it if so */ ! 410: static inline void prime_rx(struct device *dev) ! 411: { ! 412: elp_device *adapter = dev->priv; ! 413: while (adapter->rx_active < ELP_RX_PCBS && dev->start) { ! 414: if (!start_receive(dev, &adapter->itx_pcb)) ! 415: break; ! 416: } ! 417: } ! 418: ! 419: /***************************************************************** ! 420: * ! 421: * send_pcb ! 422: * Send a PCB to the adapter. ! 423: * ! 424: * output byte to command reg --<--+ ! 425: * wait until HCRE is non zero | ! 426: * loop until all bytes sent -->--+ ! 427: * set HSF1 and HSF2 to 1 ! 428: * output pcb length ! 429: * wait until ASF give ACK or NAK ! 430: * set HSF1 and HSF2 to 0 ! 431: * ! 432: *****************************************************************/ ! 433: ! 434: /* This can be quite slow -- the adapter is allowed to take up to 40ms ! 435: * to respond to the initial interrupt. ! 436: * ! 437: * We run initially with interrupts turned on, but with a semaphore set ! 438: * so that nobody tries to re-enter this code. Once the first byte has ! 439: * gone through, we turn interrupts off and then send the others (the ! 440: * timeout is reduced to 500us). ! 441: */ ! 442: ! 443: static int send_pcb(struct device *dev, pcb_struct * pcb) ! 444: { ! 445: int i; ! 446: int timeout; ! 447: elp_device *adapter = dev->priv; ! 448: ! 449: check_dma(dev); ! 450: ! 451: if (adapter->dmaing && adapter->current_dma.direction == 0) ! 452: return FALSE; ! 453: ! 454: /* Avoid contention */ ! 455: if (set_bit(1, &adapter->send_pcb_semaphore)) { ! 456: if (elp_debug >= 3) { ! 457: printk("%s: send_pcb entered while threaded\n", dev->name); ! 458: } ! 459: return FALSE; ! 460: } ! 461: /* ! 462: * load each byte into the command register and ! 463: * wait for the HCRE bit to indicate the adapter ! 464: * had read the byte ! 465: */ ! 466: set_hsf(dev->base_addr, 0); ! 467: ! 468: if (send_pcb_slow(dev->base_addr, pcb->command)) ! 469: goto abort; ! 470: ! 471: cli(); ! 472: ! 473: if (send_pcb_fast(dev->base_addr, pcb->length)) ! 474: goto sti_abort; ! 475: ! 476: for (i = 0; i < pcb->length; i++) { ! 477: if (send_pcb_fast(dev->base_addr, pcb->data.raw[i])) ! 478: goto sti_abort; ! 479: } ! 480: ! 481: outb_control(inb_control(dev->base_addr) | 3, dev->base_addr); /* signal end of PCB */ ! 482: outb_command(2 + pcb->length, dev->base_addr); ! 483: ! 484: /* now wait for the acknowledgement */ ! 485: sti(); ! 486: ! 487: for (timeout = jiffies + 5; jiffies < timeout;) { ! 488: switch (GET_ASF(dev->base_addr)) { ! 489: case ASF_PCB_ACK: ! 490: adapter->send_pcb_semaphore = 0; ! 491: return TRUE; ! 492: break; ! 493: case ASF_PCB_NAK: ! 494: printk("%s: send_pcb got NAK\n", dev->name); ! 495: goto abort; ! 496: break; ! 497: } ! 498: } ! 499: ! 500: if (elp_debug >= 1) ! 501: printk("%s: timeout waiting for PCB acknowledge (status %02x)\n", dev->name, inb_status(dev->base_addr)); ! 502: ! 503: sti_abort: ! 504: sti(); ! 505: abort: ! 506: adapter->send_pcb_semaphore = 0; ! 507: return FALSE; ! 508: } ! 509: ! 510: ! 511: /***************************************************************** ! 512: * ! 513: * receive_pcb ! 514: * Read a PCB from the adapter ! 515: * ! 516: * wait for ACRF to be non-zero ---<---+ ! 517: * input a byte | ! 518: * if ASF1 and ASF2 were not both one | ! 519: * before byte was read, loop --->---+ ! 520: * set HSF1 and HSF2 for ack ! 521: * ! 522: *****************************************************************/ ! 523: ! 524: static int receive_pcb(struct device *dev, pcb_struct * pcb) ! 525: { ! 526: int i, j; ! 527: int total_length; ! 528: int stat; ! 529: int timeout; ! 530: ! 531: elp_device *adapter = dev->priv; ! 532: ! 533: set_hsf(dev->base_addr, 0); ! 534: ! 535: /* get the command code */ ! 536: timeout = jiffies + 2; ! 537: while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout); ! 538: if (jiffies >= timeout) { ! 539: TIMEOUT_MSG(__LINE__); ! 540: return FALSE; ! 541: } ! 542: pcb->command = inb_command(dev->base_addr); ! 543: ! 544: /* read the data length */ ! 545: timeout = jiffies + 3; ! 546: while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout); ! 547: if (jiffies >= timeout) { ! 548: TIMEOUT_MSG(__LINE__); ! 549: printk("%s: status %02x\n", dev->name, stat); ! 550: return FALSE; ! 551: } ! 552: pcb->length = inb_command(dev->base_addr); ! 553: ! 554: if (pcb->length > MAX_PCB_DATA) { ! 555: INVALID_PCB_MSG(pcb->length); ! 556: adapter_reset(dev); ! 557: return FALSE; ! 558: } ! 559: /* read the data */ ! 560: cli(); ! 561: i = 0; ! 562: do { ! 563: j = 0; ! 564: while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000); ! 565: pcb->data.raw[i++] = inb_command(dev->base_addr); ! 566: if (i > MAX_PCB_DATA) ! 567: INVALID_PCB_MSG(i); ! 568: } while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000); ! 569: sti(); ! 570: if (j >= 20000) { ! 571: TIMEOUT_MSG(__LINE__); ! 572: return FALSE; ! 573: } ! 574: /* woops, the last "data" byte was really the length! */ ! 575: total_length = pcb->data.raw[--i]; ! 576: ! 577: /* safety check total length vs data length */ ! 578: if (total_length != (pcb->length + 2)) { ! 579: if (elp_debug >= 2) ! 580: printk("%s: mangled PCB received\n", dev->name); ! 581: set_hsf(dev->base_addr, HSF_PCB_NAK); ! 582: return FALSE; ! 583: } ! 584: ! 585: if (pcb->command == CMD_RECEIVE_PACKET_COMPLETE) { ! 586: if (set_bit(0, (void *) &adapter->busy)) { ! 587: if (backlog_next(adapter->rx_backlog.in) == adapter->rx_backlog.out) { ! 588: set_hsf(dev->base_addr, HSF_PCB_NAK); ! 589: printk("%s: PCB rejected, transfer in progress and backlog full\n", dev->name); ! 590: pcb->command = 0; ! 591: return TRUE; ! 592: } else { ! 593: pcb->command = 0xff; ! 594: } ! 595: } ! 596: } ! 597: set_hsf(dev->base_addr, HSF_PCB_ACK); ! 598: return TRUE; ! 599: } ! 600: ! 601: /****************************************************** ! 602: * ! 603: * queue a receive command on the adapter so we will get an ! 604: * interrupt when a packet is received. ! 605: * ! 606: ******************************************************/ ! 607: ! 608: static int start_receive(struct device *dev, pcb_struct * tx_pcb) ! 609: { ! 610: int status; ! 611: elp_device *adapter = dev->priv; ! 612: ! 613: if (elp_debug >= 3) ! 614: printk("%s: restarting receiver\n", dev->name); ! 615: tx_pcb->command = CMD_RECEIVE_PACKET; ! 616: tx_pcb->length = sizeof(struct Rcv_pkt); ! 617: tx_pcb->data.rcv_pkt.buf_seg ! 618: = tx_pcb->data.rcv_pkt.buf_ofs = 0; /* Unused */ ! 619: tx_pcb->data.rcv_pkt.buf_len = 1600; ! 620: tx_pcb->data.rcv_pkt.timeout = 0; /* set timeout to zero */ ! 621: status = send_pcb(dev, tx_pcb); ! 622: if (status) ! 623: adapter->rx_active++; ! 624: return status; ! 625: } ! 626: ! 627: /****************************************************** ! 628: * ! 629: * extract a packet from the adapter ! 630: * this routine is only called from within the interrupt ! 631: * service routine, so no cli/sti calls are needed ! 632: * note that the length is always assumed to be even ! 633: * ! 634: ******************************************************/ ! 635: ! 636: static void receive_packet(struct device *dev, int len) ! 637: { ! 638: int rlen; ! 639: elp_device *adapter = dev->priv; ! 640: unsigned long target; ! 641: struct sk_buff *skb; ! 642: ! 643: rlen = (len + 1) & ~1; ! 644: skb = dev_alloc_skb(rlen + 2); ! 645: ! 646: adapter->current_dma.copy_flag = 0; ! 647: ! 648: if (!skb) { ! 649: printk("%s: memory squeeze, dropping packet\n", dev->name); ! 650: target = virt_to_bus(adapter->dma_buffer); ! 651: } else { ! 652: skb_reserve(skb, 2); ! 653: target = virt_to_bus(skb_put(skb, rlen)); ! 654: if ((target + rlen) >= MAX_DMA_ADDRESS) { ! 655: target = virt_to_bus(adapter->dma_buffer); ! 656: adapter->current_dma.copy_flag = 1; ! 657: } ! 658: } ! 659: /* if this happens, we die */ ! 660: if (set_bit(0, (void *) &adapter->dmaing)) ! 661: printk("%s: rx blocked, DMA in progress, dir %d\n", dev->name, adapter->current_dma.direction); ! 662: ! 663: adapter->current_dma.direction = 0; ! 664: adapter->current_dma.length = rlen; ! 665: adapter->current_dma.skb = skb; ! 666: adapter->current_dma.start_time = jiffies; ! 667: ! 668: outb_control(inb_control(dev->base_addr) | DIR | TCEN | DMAE, dev->base_addr); ! 669: ! 670: disable_dma(dev->dma); ! 671: clear_dma_ff(dev->dma); ! 672: set_dma_mode(dev->dma, 0x04); /* dma read */ ! 673: set_dma_addr(dev->dma, target); ! 674: set_dma_count(dev->dma, rlen); ! 675: enable_dma(dev->dma); ! 676: ! 677: if (elp_debug >= 3) { ! 678: printk("%s: rx DMA transfer started\n", dev->name); ! 679: } ! 680: if (adapter->rx_active) ! 681: adapter->rx_active--; ! 682: ! 683: if (!adapter->busy) ! 684: printk("%s: receive_packet called, busy not set.\n", dev->name); ! 685: } ! 686: ! 687: /****************************************************** ! 688: * ! 689: * interrupt handler ! 690: * ! 691: ******************************************************/ ! 692: ! 693: static void elp_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr) ! 694: { ! 695: int len; ! 696: int dlen; ! 697: int icount = 0; ! 698: struct device *dev; ! 699: elp_device *adapter; ! 700: int timeout; ! 701: ! 702: if (irq < 0 || irq > 15) { ! 703: printk("elp_interrupt(): illegal IRQ number found in interrupt routine (%i)\n", irq); ! 704: return; ! 705: } ! 706: dev = irq2dev_map[irq]; ! 707: ! 708: if (dev == NULL) { ! 709: printk("elp_interrupt(): irq %d for unknown device.\n", irq); ! 710: return; ! 711: } ! 712: adapter = (elp_device *) dev->priv; ! 713: ! 714: if (dev->interrupt) { ! 715: printk("%s: re-entering the interrupt handler!\n", dev->name); ! 716: return; ! 717: } ! 718: dev->interrupt = 1; ! 719: ! 720: do { ! 721: /* ! 722: * has a DMA transfer finished? ! 723: */ ! 724: if (inb_status(dev->base_addr) & DONE) { ! 725: if (!adapter->dmaing) { ! 726: printk("%s: phantom DMA completed\n", dev->name); ! 727: } ! 728: if (elp_debug >= 3) { ! 729: printk("%s: %s DMA complete, status %02x\n", dev->name, adapter->current_dma.direction ? "tx" : "rx", inb_status(dev->base_addr)); ! 730: } ! 731: ! 732: outb_control(inb_control(dev->base_addr) & ~(DMAE | TCEN | DIR), dev->base_addr); ! 733: if (adapter->current_dma.direction) { ! 734: dev_kfree_skb(adapter->current_dma.skb, FREE_WRITE); ! 735: } else { ! 736: struct sk_buff *skb = adapter->current_dma.skb; ! 737: if (skb) { ! 738: skb->dev = dev; ! 739: if (adapter->current_dma.copy_flag) { ! 740: memcpy(skb_put(skb, adapter->current_dma.length), adapter->dma_buffer, adapter->current_dma.length); ! 741: } ! 742: skb->protocol = eth_type_trans(skb,dev); ! 743: netif_rx(skb); ! 744: } ! 745: } ! 746: adapter->dmaing = 0; ! 747: if (adapter->rx_backlog.in != adapter->rx_backlog.out) { ! 748: int t = adapter->rx_backlog.length[adapter->rx_backlog.out]; ! 749: adapter->rx_backlog.out = backlog_next(adapter->rx_backlog.out); ! 750: if (elp_debug >= 2) ! 751: printk("%s: receiving backlogged packet (%d)\n", dev->name, t); ! 752: receive_packet(dev, t); ! 753: } else { ! 754: adapter->busy = 0; ! 755: } ! 756: } else { ! 757: /* has one timed out? */ ! 758: check_dma(dev); ! 759: } ! 760: ! 761: sti(); ! 762: ! 763: /* ! 764: * receive a PCB from the adapter ! 765: */ ! 766: timeout = jiffies + 3; ! 767: while ((inb_status(dev->base_addr) & ACRF) != 0 && jiffies < timeout) { ! 768: if (receive_pcb(dev, &adapter->irx_pcb)) { ! 769: switch (adapter->irx_pcb.command) { ! 770: case 0: ! 771: break; ! 772: /* ! 773: * received a packet - this must be handled fast ! 774: */ ! 775: case 0xff: ! 776: case CMD_RECEIVE_PACKET_COMPLETE: ! 777: /* if the device isn't open, don't pass packets up the stack */ ! 778: if (dev->start == 0) ! 779: break; ! 780: cli(); ! 781: len = adapter->irx_pcb.data.rcv_resp.pkt_len; ! 782: dlen = adapter->irx_pcb.data.rcv_resp.buf_len; ! 783: if (adapter->irx_pcb.data.rcv_resp.timeout != 0) { ! 784: printk("%s: interrupt - packet not received correctly\n", dev->name); ! 785: sti(); ! 786: } else { ! 787: if (elp_debug >= 3) { ! 788: sti(); ! 789: printk("%s: interrupt - packet received of length %i (%i)\n", dev->name, len, dlen); ! 790: cli(); ! 791: } ! 792: if (adapter->irx_pcb.command == 0xff) { ! 793: if (elp_debug >= 2) ! 794: printk("%s: adding packet to backlog (len = %d)\n", dev->name, dlen); ! 795: adapter->rx_backlog.length[adapter->rx_backlog.in] = dlen; ! 796: adapter->rx_backlog.in = backlog_next(adapter->rx_backlog.in); ! 797: } else { ! 798: receive_packet(dev, dlen); ! 799: } ! 800: sti(); ! 801: if (elp_debug >= 3) ! 802: printk("%s: packet received\n", dev->name); ! 803: } ! 804: break; ! 805: ! 806: /* ! 807: * 82586 configured correctly ! 808: */ ! 809: case CMD_CONFIGURE_82586_RESPONSE: ! 810: adapter->got[CMD_CONFIGURE_82586] = 1; ! 811: if (elp_debug >= 3) ! 812: printk("%s: interrupt - configure response received\n", dev->name); ! 813: break; ! 814: ! 815: /* ! 816: * Adapter memory configuration ! 817: */ ! 818: case CMD_CONFIGURE_ADAPTER_RESPONSE: ! 819: adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 1; ! 820: if (elp_debug >= 3) ! 821: printk("%s: Adapter memory configuration %s.\n", dev->name, ! 822: adapter->irx_pcb.data.failed ? "failed" : "succeeded"); ! 823: break; ! 824: ! 825: /* ! 826: * Multicast list loading ! 827: */ ! 828: case CMD_LOAD_MULTICAST_RESPONSE: ! 829: adapter->got[CMD_LOAD_MULTICAST_LIST] = 1; ! 830: if (elp_debug >= 3) ! 831: printk("%s: Multicast address list loading %s.\n", dev->name, ! 832: adapter->irx_pcb.data.failed ? "failed" : "succeeded"); ! 833: break; ! 834: ! 835: /* ! 836: * Station address setting ! 837: */ ! 838: case CMD_SET_ADDRESS_RESPONSE: ! 839: adapter->got[CMD_SET_STATION_ADDRESS] = 1; ! 840: if (elp_debug >= 3) ! 841: printk("%s: Ethernet address setting %s.\n", dev->name, ! 842: adapter->irx_pcb.data.failed ? "failed" : "succeeded"); ! 843: break; ! 844: ! 845: ! 846: /* ! 847: * received board statistics ! 848: */ ! 849: case CMD_NETWORK_STATISTICS_RESPONSE: ! 850: adapter->stats.rx_packets += adapter->irx_pcb.data.netstat.tot_recv; ! 851: adapter->stats.tx_packets += adapter->irx_pcb.data.netstat.tot_xmit; ! 852: adapter->stats.rx_crc_errors += adapter->irx_pcb.data.netstat.err_CRC; ! 853: adapter->stats.rx_frame_errors += adapter->irx_pcb.data.netstat.err_align; ! 854: adapter->stats.rx_fifo_errors += adapter->irx_pcb.data.netstat.err_ovrrun; ! 855: adapter->stats.rx_over_errors += adapter->irx_pcb.data.netstat.err_res; ! 856: adapter->got[CMD_NETWORK_STATISTICS] = 1; ! 857: if (elp_debug >= 3) ! 858: printk("%s: interrupt - statistics response received\n", dev->name); ! 859: break; ! 860: ! 861: /* ! 862: * sent a packet ! 863: */ ! 864: case CMD_TRANSMIT_PACKET_COMPLETE: ! 865: if (elp_debug >= 3) ! 866: printk("%s: interrupt - packet sent\n", dev->name); ! 867: if (dev->start == 0) ! 868: break; ! 869: switch (adapter->irx_pcb.data.xmit_resp.c_stat) { ! 870: case 0xffff: ! 871: adapter->stats.tx_aborted_errors++; ! 872: printk(KERN_INFO "%s: transmit timed out, network cable problem?\n", dev->name); ! 873: break; ! 874: case 0xfffe: ! 875: adapter->stats.tx_fifo_errors++; ! 876: printk(KERN_INFO "%s: transmit timed out, FIFO underrun\n", dev->name); ! 877: break; ! 878: } ! 879: dev->tbusy = 0; ! 880: mark_bh(NET_BH); ! 881: break; ! 882: ! 883: /* ! 884: * some unknown PCB ! 885: */ ! 886: default: ! 887: printk(KERN_DEBUG "%s: unknown PCB received - %2.2x\n", dev->name, adapter->irx_pcb.command); ! 888: break; ! 889: } ! 890: } else { ! 891: printk("%s: failed to read PCB on interrupt\n", dev->name); ! 892: adapter_reset(dev); ! 893: } ! 894: } ! 895: ! 896: } while (icount++ < 5 && (inb_status(dev->base_addr) & (ACRF | DONE))); ! 897: ! 898: prime_rx(dev); ! 899: ! 900: /* ! 901: * indicate no longer in interrupt routine ! 902: */ ! 903: dev->interrupt = 0; ! 904: } ! 905: ! 906: ! 907: /****************************************************** ! 908: * ! 909: * open the board ! 910: * ! 911: ******************************************************/ ! 912: ! 913: static int elp_open(struct device *dev) ! 914: { ! 915: elp_device *adapter; ! 916: ! 917: adapter = dev->priv; ! 918: ! 919: if (elp_debug >= 3) ! 920: printk("%s: request to open device\n", dev->name); ! 921: ! 922: /* ! 923: * make sure we actually found the device ! 924: */ ! 925: if (adapter == NULL) { ! 926: printk("%s: Opening a non-existent physical device\n", dev->name); ! 927: return -EAGAIN; ! 928: } ! 929: /* ! 930: * disable interrupts on the board ! 931: */ ! 932: outb_control(0x00, dev->base_addr); ! 933: ! 934: /* ! 935: * clear any pending interrupts ! 936: */ ! 937: inb_command(dev->base_addr); ! 938: adapter_reset(dev); ! 939: ! 940: /* ! 941: * interrupt routine not entered ! 942: */ ! 943: dev->interrupt = 0; ! 944: ! 945: /* ! 946: * transmitter not busy ! 947: */ ! 948: dev->tbusy = 0; ! 949: ! 950: /* ! 951: * no receive PCBs active ! 952: */ ! 953: adapter->rx_active = 0; ! 954: ! 955: adapter->busy = 0; ! 956: adapter->send_pcb_semaphore = 0; ! 957: adapter->rx_backlog.in = 0; ! 958: adapter->rx_backlog.out = 0; ! 959: ! 960: /* ! 961: * make sure we can find the device header given the interrupt number ! 962: */ ! 963: irq2dev_map[dev->irq] = dev; ! 964: ! 965: /* ! 966: * install our interrupt service routine ! 967: */ ! 968: if (request_irq(dev->irq, &elp_interrupt, 0, "3c505", NULL)) { ! 969: irq2dev_map[dev->irq] = NULL; ! 970: return -EAGAIN; ! 971: } ! 972: if (request_dma(dev->dma, "3c505")) { ! 973: printk("%s: could not allocate DMA channel\n", dev->name); ! 974: return -EAGAIN; ! 975: } ! 976: adapter->dma_buffer = (void *) dma_mem_alloc(DMA_BUFFER_SIZE); ! 977: if (!adapter->dma_buffer) { ! 978: printk("Could not allocate DMA buffer\n"); ! 979: } ! 980: adapter->dmaing = 0; ! 981: ! 982: /* ! 983: * enable interrupts on the board ! 984: */ ! 985: outb_control(CMDE, dev->base_addr); ! 986: ! 987: /* ! 988: * device is now officially open! ! 989: */ ! 990: dev->start = 1; ! 991: ! 992: /* ! 993: * configure adapter memory: we need 10 multicast addresses, default==0 ! 994: */ ! 995: if (elp_debug >= 3) ! 996: printk("%s: sending 3c505 memory configuration command\n", dev->name); ! 997: adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY; ! 998: adapter->tx_pcb.data.memconf.cmd_q = 10; ! 999: adapter->tx_pcb.data.memconf.rcv_q = 20; ! 1000: adapter->tx_pcb.data.memconf.mcast = 10; ! 1001: adapter->tx_pcb.data.memconf.frame = 20; ! 1002: adapter->tx_pcb.data.memconf.rcv_b = 20; ! 1003: adapter->tx_pcb.data.memconf.progs = 0; ! 1004: adapter->tx_pcb.length = sizeof(struct Memconf); ! 1005: adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 0; ! 1006: if (!send_pcb(dev, &adapter->tx_pcb)) ! 1007: printk("%s: couldn't send memory configuration command\n", dev->name); ! 1008: else { ! 1009: int timeout = jiffies + TIMEOUT; ! 1010: while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && jiffies < timeout); ! 1011: if (jiffies >= timeout) ! 1012: TIMEOUT_MSG(__LINE__); ! 1013: } ! 1014: ! 1015: ! 1016: /* ! 1017: * configure adapter to receive broadcast messages and wait for response ! 1018: */ ! 1019: if (elp_debug >= 3) ! 1020: printk("%s: sending 82586 configure command\n", dev->name); ! 1021: adapter->tx_pcb.command = CMD_CONFIGURE_82586; ! 1022: adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD; ! 1023: adapter->tx_pcb.length = 2; ! 1024: adapter->got[CMD_CONFIGURE_82586] = 0; ! 1025: if (!send_pcb(dev, &adapter->tx_pcb)) ! 1026: printk("%s: couldn't send 82586 configure command\n", dev->name); ! 1027: else { ! 1028: int timeout = jiffies + TIMEOUT; ! 1029: while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout); ! 1030: if (jiffies >= timeout) ! 1031: TIMEOUT_MSG(__LINE__); ! 1032: } ! 1033: ! 1034: /* enable burst-mode DMA */ ! 1035: outb(0x1, dev->base_addr + PORT_AUXDMA); ! 1036: ! 1037: /* ! 1038: * queue receive commands to provide buffering ! 1039: */ ! 1040: prime_rx(dev); ! 1041: if (elp_debug >= 3) ! 1042: printk("%s: %d receive PCBs active\n", dev->name, adapter->rx_active); ! 1043: ! 1044: MOD_INC_USE_COUNT; ! 1045: ! 1046: return 0; /* Always succeed */ ! 1047: } ! 1048: ! 1049: ! 1050: /****************************************************** ! 1051: * ! 1052: * send a packet to the adapter ! 1053: * ! 1054: ******************************************************/ ! 1055: ! 1056: static int send_packet(struct device *dev, struct sk_buff *skb) ! 1057: { ! 1058: elp_device *adapter = dev->priv; ! 1059: unsigned long target; ! 1060: ! 1061: /* ! 1062: * make sure the length is even and no shorter than 60 bytes ! 1063: */ ! 1064: unsigned int nlen = (((skb->len < 60) ? 60 : skb->len) + 1) & (~1); ! 1065: ! 1066: if (set_bit(0, (void *) &adapter->busy)) { ! 1067: if (elp_debug >= 2) ! 1068: printk("%s: transmit blocked\n", dev->name); ! 1069: return FALSE; ! 1070: } ! 1071: adapter = dev->priv; ! 1072: ! 1073: /* ! 1074: * send the adapter a transmit packet command. Ignore segment and offset ! 1075: * and make sure the length is even ! 1076: */ ! 1077: adapter->tx_pcb.command = CMD_TRANSMIT_PACKET; ! 1078: adapter->tx_pcb.length = sizeof(struct Xmit_pkt); ! 1079: adapter->tx_pcb.data.xmit_pkt.buf_ofs ! 1080: = adapter->tx_pcb.data.xmit_pkt.buf_seg = 0; /* Unused */ ! 1081: adapter->tx_pcb.data.xmit_pkt.pkt_len = nlen; ! 1082: ! 1083: if (!send_pcb(dev, &adapter->tx_pcb)) { ! 1084: adapter->busy = 0; ! 1085: return FALSE; ! 1086: } ! 1087: /* if this happens, we die */ ! 1088: if (set_bit(0, (void *) &adapter->dmaing)) ! 1089: printk("%s: tx: DMA %d in progress\n", dev->name, adapter->current_dma.direction); ! 1090: ! 1091: adapter->current_dma.direction = 1; ! 1092: adapter->current_dma.start_time = jiffies; ! 1093: ! 1094: target = virt_to_bus(skb->data); ! 1095: if ((target + nlen) >= MAX_DMA_ADDRESS) { ! 1096: memcpy(adapter->dma_buffer, skb->data, nlen); ! 1097: target = virt_to_bus(adapter->dma_buffer); ! 1098: } ! 1099: adapter->current_dma.skb = skb; ! 1100: cli(); ! 1101: disable_dma(dev->dma); ! 1102: clear_dma_ff(dev->dma); ! 1103: set_dma_mode(dev->dma, 0x08); /* dma memory -> io */ ! 1104: set_dma_addr(dev->dma, target); ! 1105: set_dma_count(dev->dma, nlen); ! 1106: enable_dma(dev->dma); ! 1107: outb_control(inb_control(dev->base_addr) | DMAE | TCEN, dev->base_addr); ! 1108: if (elp_debug >= 3) ! 1109: printk("%s: DMA transfer started\n", dev->name); ! 1110: ! 1111: return TRUE; ! 1112: } ! 1113: ! 1114: /****************************************************** ! 1115: * ! 1116: * start the transmitter ! 1117: * return 0 if sent OK, else return 1 ! 1118: * ! 1119: ******************************************************/ ! 1120: ! 1121: static int elp_start_xmit(struct sk_buff *skb, struct device *dev) ! 1122: { ! 1123: if (dev->interrupt) { ! 1124: printk("%s: start_xmit aborted (in irq)\n", dev->name); ! 1125: return 1; ! 1126: } ! 1127: ! 1128: check_dma(dev); ! 1129: ! 1130: /* ! 1131: * if the transmitter is still busy, we have a transmit timeout... ! 1132: */ ! 1133: if (dev->tbusy) { ! 1134: elp_device *adapter = dev->priv; ! 1135: int tickssofar = jiffies - dev->trans_start; ! 1136: int stat; ! 1137: ! 1138: if (tickssofar < 1000) ! 1139: return 1; ! 1140: ! 1141: stat = inb_status(dev->base_addr); ! 1142: printk("%s: transmit timed out, lost %s?\n", dev->name, (stat & ACRF) ? "interrupt" : "command"); ! 1143: if (elp_debug >= 1) ! 1144: printk("%s: status %#02x\n", dev->name, stat); ! 1145: dev->trans_start = jiffies; ! 1146: dev->tbusy = 0; ! 1147: adapter->stats.tx_dropped++; ! 1148: } ! 1149: ! 1150: /* Some upper layer thinks we've missed a tx-done interrupt */ ! 1151: if (skb == NULL) { ! 1152: dev_tint(dev); ! 1153: return 0; ! 1154: } ! 1155: ! 1156: if (skb->len <= 0) ! 1157: return 0; ! 1158: ! 1159: if (elp_debug >= 3) ! 1160: printk("%s: request to send packet of length %d\n", dev->name, (int) skb->len); ! 1161: ! 1162: if (set_bit(0, (void *) &dev->tbusy)) { ! 1163: printk("%s: transmitter access conflict\n", dev->name); ! 1164: return 1; ! 1165: } ! 1166: /* ! 1167: * send the packet at skb->data for skb->len ! 1168: */ ! 1169: if (!send_packet(dev, skb)) { ! 1170: if (elp_debug >= 2) { ! 1171: printk("%s: failed to transmit packet\n", dev->name); ! 1172: } ! 1173: dev->tbusy = 0; ! 1174: return 1; ! 1175: } ! 1176: if (elp_debug >= 3) ! 1177: printk("%s: packet of length %d sent\n", dev->name, (int) skb->len); ! 1178: ! 1179: /* ! 1180: * start the transmit timeout ! 1181: */ ! 1182: dev->trans_start = jiffies; ! 1183: ! 1184: prime_rx(dev); ! 1185: ! 1186: return 0; ! 1187: } ! 1188: ! 1189: /****************************************************** ! 1190: * ! 1191: * return statistics on the board ! 1192: * ! 1193: ******************************************************/ ! 1194: ! 1195: static struct enet_statistics *elp_get_stats(struct device *dev) ! 1196: { ! 1197: elp_device *adapter = (elp_device *) dev->priv; ! 1198: ! 1199: if (elp_debug >= 3) ! 1200: printk("%s: request for stats\n", dev->name); ! 1201: ! 1202: /* If the device is closed, just return the latest stats we have, ! 1203: - we cannot ask from the adapter without interrupts */ ! 1204: if (!dev->start) ! 1205: return &adapter->stats; ! 1206: ! 1207: /* send a get statistics command to the board */ ! 1208: adapter->tx_pcb.command = CMD_NETWORK_STATISTICS; ! 1209: adapter->tx_pcb.length = 0; ! 1210: adapter->got[CMD_NETWORK_STATISTICS] = 0; ! 1211: if (!send_pcb(dev, &adapter->tx_pcb)) ! 1212: printk("%s: couldn't send get statistics command\n", dev->name); ! 1213: else { ! 1214: int timeout = jiffies + TIMEOUT; ! 1215: while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && jiffies < timeout); ! 1216: if (jiffies >= timeout) { ! 1217: TIMEOUT_MSG(__LINE__); ! 1218: return &adapter->stats; ! 1219: } ! 1220: } ! 1221: ! 1222: /* statistics are now up to date */ ! 1223: return &adapter->stats; ! 1224: } ! 1225: ! 1226: /****************************************************** ! 1227: * ! 1228: * close the board ! 1229: * ! 1230: ******************************************************/ ! 1231: ! 1232: static int elp_close(struct device *dev) ! 1233: { ! 1234: elp_device *adapter; ! 1235: ! 1236: adapter = dev->priv; ! 1237: ! 1238: if (elp_debug >= 3) ! 1239: printk("%s: request to close device\n", dev->name); ! 1240: ! 1241: /* Someone may request the device statistic information even when ! 1242: * the interface is closed. The following will update the statistics ! 1243: * structure in the driver, so we'll be able to give current statistics. ! 1244: */ ! 1245: (void) elp_get_stats(dev); ! 1246: ! 1247: /* ! 1248: * disable interrupts on the board ! 1249: */ ! 1250: outb_control(0x00, dev->base_addr); ! 1251: ! 1252: /* ! 1253: * flag transmitter as busy (i.e. not available) ! 1254: */ ! 1255: dev->tbusy = 1; ! 1256: ! 1257: /* ! 1258: * indicate device is closed ! 1259: */ ! 1260: dev->start = 0; ! 1261: ! 1262: /* ! 1263: * release the IRQ ! 1264: */ ! 1265: free_irq(dev->irq, NULL); ! 1266: ! 1267: /* ! 1268: * and we no longer have to map irq to dev either ! 1269: */ ! 1270: irq2dev_map[dev->irq] = 0; ! 1271: ! 1272: free_dma(dev->dma); ! 1273: free_pages((unsigned long) adapter->dma_buffer, __get_order(DMA_BUFFER_SIZE)); ! 1274: ! 1275: MOD_DEC_USE_COUNT; ! 1276: ! 1277: return 0; ! 1278: } ! 1279: ! 1280: ! 1281: /************************************************************ ! 1282: * ! 1283: * Set multicast list ! 1284: * num_addrs==0: clear mc_list ! 1285: * num_addrs==-1: set promiscuous mode ! 1286: * num_addrs>0: set mc_list ! 1287: * ! 1288: ************************************************************/ ! 1289: ! 1290: static void elp_set_mc_list(struct device *dev) ! 1291: { ! 1292: elp_device *adapter = (elp_device *) dev->priv; ! 1293: struct dev_mc_list *dmi = dev->mc_list; ! 1294: int i; ! 1295: ! 1296: if (elp_debug >= 3) ! 1297: printk("%s: request to set multicast list\n", dev->name); ! 1298: ! 1299: if (!(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) { ! 1300: /* send a "load multicast list" command to the board, max 10 addrs/cmd */ ! 1301: /* if num_addrs==0 the list will be cleared */ ! 1302: adapter->tx_pcb.command = CMD_LOAD_MULTICAST_LIST; ! 1303: adapter->tx_pcb.length = 6 * dev->mc_count; ! 1304: for (i = 0; i < dev->mc_count; i++) { ! 1305: memcpy(adapter->tx_pcb.data.multicast[i], dmi->dmi_addr, 6); ! 1306: dmi = dmi->next; ! 1307: } ! 1308: adapter->got[CMD_LOAD_MULTICAST_LIST] = 0; ! 1309: if (!send_pcb(dev, &adapter->tx_pcb)) ! 1310: printk("%s: couldn't send set_multicast command\n", dev->name); ! 1311: else { ! 1312: int timeout = jiffies + TIMEOUT; ! 1313: while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && jiffies < timeout); ! 1314: if (jiffies >= timeout) { ! 1315: TIMEOUT_MSG(__LINE__); ! 1316: } ! 1317: } ! 1318: if (dev->mc_count) ! 1319: adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD | RECV_MULTI; ! 1320: else /* num_addrs == 0 */ ! 1321: adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD; ! 1322: } else ! 1323: adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_PROMISC; ! 1324: /* ! 1325: * configure adapter to receive messages (as specified above) ! 1326: * and wait for response ! 1327: */ ! 1328: if (elp_debug >= 3) ! 1329: printk("%s: sending 82586 configure command\n", dev->name); ! 1330: adapter->tx_pcb.command = CMD_CONFIGURE_82586; ! 1331: adapter->tx_pcb.length = 2; ! 1332: adapter->got[CMD_CONFIGURE_82586] = 0; ! 1333: if (!send_pcb(dev, &adapter->tx_pcb)) ! 1334: printk("%s: couldn't send 82586 configure command\n", dev->name); ! 1335: else { ! 1336: int timeout = jiffies + TIMEOUT; ! 1337: while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout); ! 1338: if (jiffies >= timeout) ! 1339: TIMEOUT_MSG(__LINE__); ! 1340: } ! 1341: } ! 1342: ! 1343: /****************************************************** ! 1344: * ! 1345: * initialise Etherlink Plus board ! 1346: * ! 1347: ******************************************************/ ! 1348: ! 1349: static void elp_init(struct device *dev) ! 1350: { ! 1351: elp_device *adapter = dev->priv; ! 1352: ! 1353: /* ! 1354: * set ptrs to various functions ! 1355: */ ! 1356: dev->open = elp_open; /* local */ ! 1357: dev->stop = elp_close; /* local */ ! 1358: dev->get_stats = elp_get_stats; /* local */ ! 1359: dev->hard_start_xmit = elp_start_xmit; /* local */ ! 1360: dev->set_multicast_list = elp_set_mc_list; /* local */ ! 1361: ! 1362: /* Setup the generic properties */ ! 1363: ether_setup(dev); ! 1364: ! 1365: /* ! 1366: * setup ptr to adapter specific information ! 1367: */ ! 1368: memset(&(adapter->stats), 0, sizeof(struct enet_statistics)); ! 1369: ! 1370: /* ! 1371: * memory information ! 1372: */ ! 1373: dev->mem_start = dev->mem_end = dev->rmem_end = dev->rmem_start = 0; ! 1374: } ! 1375: ! 1376: /************************************************************ ! 1377: * ! 1378: * A couple of tests to see if there's 3C505 or not ! 1379: * Called only by elp_autodetect ! 1380: ************************************************************/ ! 1381: ! 1382: static int elp_sense(struct device *dev) ! 1383: { ! 1384: int timeout; ! 1385: int addr = dev->base_addr; ! 1386: const char *name = dev->name; ! 1387: long flags; ! 1388: byte orig_HCR, orig_HSR; ! 1389: ! 1390: if (check_region(addr, 0xf)) ! 1391: return -1; ! 1392: ! 1393: orig_HCR = inb_control(addr); ! 1394: orig_HSR = inb_status(addr); ! 1395: ! 1396: if (elp_debug > 0) ! 1397: printk(search_msg, name, addr); ! 1398: ! 1399: if (((orig_HCR == 0xff) && (orig_HSR == 0xff)) || ! 1400: ((orig_HCR & DIR) != (orig_HSR & DIR))) { ! 1401: if (elp_debug > 0) ! 1402: printk(notfound_msg, 1); ! 1403: return -1; /* It can't be 3c505 if HCR.DIR != HSR.DIR */ ! 1404: } ! 1405: /* Enable interrupts - we need timers! */ ! 1406: save_flags(flags); ! 1407: sti(); ! 1408: ! 1409: /* Wait for a while; the adapter may still be booting up */ ! 1410: if (elp_debug > 0) ! 1411: printk(stilllooking_msg); ! 1412: if (orig_HCR & DIR) { ! 1413: /* If HCR.DIR is up, we pull it down. HSR.DIR should follow. */ ! 1414: outb_control(orig_HCR & ~DIR, addr); ! 1415: timeout = jiffies + 30; ! 1416: while (jiffies < timeout); ! 1417: restore_flags(flags); ! 1418: if (inb_status(addr) & DIR) { ! 1419: outb_control(orig_HCR, addr); ! 1420: if (elp_debug > 0) ! 1421: printk(notfound_msg, 2); ! 1422: return -1; ! 1423: } ! 1424: } else { ! 1425: /* If HCR.DIR is down, we pull it up. HSR.DIR should follow. */ ! 1426: outb_control(orig_HCR | DIR, addr); ! 1427: timeout = jiffies + 30; ! 1428: while (jiffies < timeout); ! 1429: restore_flags(flags); ! 1430: if (!(inb_status(addr) & DIR)) { ! 1431: outb_control(orig_HCR, addr); ! 1432: if (elp_debug > 0) ! 1433: printk(notfound_msg, 3); ! 1434: return -1; ! 1435: } ! 1436: } ! 1437: /* ! 1438: * It certainly looks like a 3c505. If it has DMA enabled, it needs ! 1439: * a hard reset. Also, do a hard reset if selected at the compile time. ! 1440: */ ! 1441: if (elp_debug > 0) ! 1442: printk(found_msg); ! 1443: ! 1444: return 0; ! 1445: } ! 1446: ! 1447: /************************************************************* ! 1448: * ! 1449: * Search through addr_list[] and try to find a 3C505 ! 1450: * Called only by eplus_probe ! 1451: *************************************************************/ ! 1452: ! 1453: static int elp_autodetect(struct device *dev) ! 1454: { ! 1455: int idx = 0; ! 1456: ! 1457: /* if base address set, then only check that address ! 1458: otherwise, run through the table */ ! 1459: if (dev->base_addr != 0) { /* dev->base_addr == 0 ==> plain autodetect */ ! 1460: if (elp_sense(dev) == 0) ! 1461: return dev->base_addr; ! 1462: } else ! 1463: while ((dev->base_addr = addr_list[idx++])) { ! 1464: if (elp_sense(dev) == 0) ! 1465: return dev->base_addr; ! 1466: } ! 1467: ! 1468: /* could not find an adapter */ ! 1469: if (elp_debug > 0) ! 1470: printk(couldnot_msg, dev->name); ! 1471: ! 1472: return 0; /* Because of this, the layer above will return -ENODEV */ ! 1473: } ! 1474: ! 1475: ! 1476: /****************************************************** ! 1477: * ! 1478: * probe for an Etherlink Plus board at the specified address ! 1479: * ! 1480: ******************************************************/ ! 1481: ! 1482: /* There are three situations we need to be able to detect here: ! 1483: ! 1484: * a) the card is idle ! 1485: * b) the card is still booting up ! 1486: * c) the card is stuck in a strange state (some DOS drivers do this) ! 1487: * ! 1488: * In case (a), all is well. In case (b), we wait 10 seconds to see if the ! 1489: * card finishes booting, and carry on if so. In case (c), we do a hard reset, ! 1490: * loop round, and hope for the best. ! 1491: * ! 1492: * This is all very unpleasant, but hopefully avoids the problems with the old ! 1493: * probe code (which had a 15-second delay if the card was idle, and didn't ! 1494: * work at all if it was in a weird state). ! 1495: */ ! 1496: ! 1497: int elplus_probe(struct device *dev) ! 1498: { ! 1499: elp_device *adapter; ! 1500: int i, tries, tries1, timeout, okay; ! 1501: ! 1502: /* ! 1503: * setup adapter structure ! 1504: */ ! 1505: ! 1506: dev->base_addr = elp_autodetect(dev); ! 1507: if (!(dev->base_addr)) ! 1508: return -ENODEV; ! 1509: ! 1510: /* ! 1511: * setup ptr to adapter specific information ! 1512: */ ! 1513: adapter = (elp_device *) (dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL)); ! 1514: if (adapter == NULL) { ! 1515: printk("%s: out of memory\n", dev->name); ! 1516: return -ENODEV; ! 1517: } ! 1518: ! 1519: for (tries1 = 0; tries1 < 3; tries1++) { ! 1520: outb_control((inb_control(dev->base_addr) | CMDE) & ~DIR, dev->base_addr); ! 1521: /* First try to write just one byte, to see if the card is ! 1522: * responding at all normally. ! 1523: */ ! 1524: timeout = jiffies + 5; ! 1525: okay = 0; ! 1526: while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE)); ! 1527: if ((inb_status(dev->base_addr) & HCRE)) { ! 1528: outb_command(0, dev->base_addr); /* send a spurious byte */ ! 1529: timeout = jiffies + 5; ! 1530: while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE)); ! 1531: if (inb_status(dev->base_addr) & HCRE) ! 1532: okay = 1; ! 1533: } ! 1534: if (!okay) { ! 1535: /* Nope, it's ignoring the command register. This means that ! 1536: * either it's still booting up, or it's died. ! 1537: */ ! 1538: printk("%s: command register wouldn't drain, ", dev->name); ! 1539: if ((inb_status(dev->base_addr) & 7) == 3) { ! 1540: /* If the adapter status is 3, it *could* still be booting. ! 1541: * Give it the benefit of the doubt for 10 seconds. ! 1542: */ ! 1543: printk("assuming 3c505 still starting\n"); ! 1544: timeout = jiffies + 10 * HZ; ! 1545: while (jiffies < timeout && (inb_status(dev->base_addr) & 7)); ! 1546: if (inb_status(dev->base_addr) & 7) { ! 1547: printk("%s: 3c505 failed to start\n", dev->name); ! 1548: } else { ! 1549: okay = 1; /* It started */ ! 1550: } ! 1551: } else { ! 1552: /* Otherwise, it must just be in a strange state. We probably ! 1553: * need to kick it. ! 1554: */ ! 1555: printk("3c505 is sulking\n"); ! 1556: } ! 1557: } ! 1558: for (tries = 0; tries < 5 && okay; tries++) { ! 1559: ! 1560: /* ! 1561: * Try to set the Ethernet address, to make sure that the board ! 1562: * is working. ! 1563: */ ! 1564: adapter->tx_pcb.command = CMD_STATION_ADDRESS; ! 1565: adapter->tx_pcb.length = 0; ! 1566: autoirq_setup(0); ! 1567: if (!send_pcb(dev, &adapter->tx_pcb)) { ! 1568: printk("%s: could not send first PCB\n", dev->name); ! 1569: autoirq_report(0); ! 1570: continue; ! 1571: } ! 1572: if (!receive_pcb(dev, &adapter->rx_pcb)) { ! 1573: printk("%s: could not read first PCB\n", dev->name); ! 1574: autoirq_report(0); ! 1575: continue; ! 1576: } ! 1577: if ((adapter->rx_pcb.command != CMD_ADDRESS_RESPONSE) || ! 1578: (adapter->rx_pcb.length != 6)) { ! 1579: printk("%s: first PCB wrong (%d, %d)\n", dev->name, adapter->rx_pcb.command, adapter->rx_pcb.length); ! 1580: autoirq_report(0); ! 1581: continue; ! 1582: } ! 1583: goto okay; ! 1584: } ! 1585: /* It's broken. Do a hard reset to re-initialise the board, ! 1586: * and try again. ! 1587: */ ! 1588: printk(KERN_INFO "%s: resetting adapter\n", dev->name); ! 1589: outb_control(inb_control(dev->base_addr) | FLSH | ATTN, dev->base_addr); ! 1590: outb_control(inb_control(dev->base_addr) & ~(FLSH | ATTN), dev->base_addr); ! 1591: } ! 1592: printk("%s: failed to initialise 3c505\n", dev->name); ! 1593: return -ENODEV; ! 1594: ! 1595: okay: ! 1596: if (dev->irq) { /* Is there a preset IRQ? */ ! 1597: int rpt = autoirq_report(0); ! 1598: if (dev->irq != rpt) { ! 1599: printk("%s: warning, irq %d configured but %d detected\n", dev->name, dev->irq, rpt); ! 1600: return -ENODEV; ! 1601: } ! 1602: /* if dev->irq == autoirq_report(0), all is well */ ! 1603: } else /* No preset IRQ; just use what we can detect */ ! 1604: dev->irq = autoirq_report(0); ! 1605: switch (dev->irq) { /* Legal, sane? */ ! 1606: case 0: ! 1607: printk("%s: No IRQ reported by autoirq_report().\n", dev->name); ! 1608: printk("%s: Check the jumpers of your 3c505 board.\n", dev->name); ! 1609: return -ENODEV; ! 1610: case 1: ! 1611: case 6: ! 1612: case 8: ! 1613: case 13: ! 1614: printk("%s: Impossible IRQ %d reported by autoirq_report().\n", ! 1615: dev->name, dev->irq); ! 1616: return -ENODEV; ! 1617: } ! 1618: /* ! 1619: * Now we have the IRQ number so we can disable the interrupts from ! 1620: * the board until the board is opened. ! 1621: */ ! 1622: outb_control(inb_control(dev->base_addr) & ~CMDE, dev->base_addr); ! 1623: ! 1624: /* ! 1625: * copy ethernet address into structure ! 1626: */ ! 1627: for (i = 0; i < 6; i++) ! 1628: dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i]; ! 1629: ! 1630: /* set up the DMA channel */ ! 1631: dev->dma = ELP_DMA; ! 1632: ! 1633: /* ! 1634: * print remainder of startup message ! 1635: */ ! 1636: printk("%s: 3c505 at %#lx, irq %d, dma %d, ", ! 1637: dev->name, dev->base_addr, dev->irq, dev->dma); ! 1638: printk("addr %02x:%02x:%02x:%02x:%02x:%02x, ", ! 1639: dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], ! 1640: dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); ! 1641: ! 1642: /* ! 1643: * read more information from the adapter ! 1644: */ ! 1645: ! 1646: adapter->tx_pcb.command = CMD_ADAPTER_INFO; ! 1647: adapter->tx_pcb.length = 0; ! 1648: if (!send_pcb(dev, &adapter->tx_pcb) || ! 1649: !receive_pcb(dev, &adapter->rx_pcb) || ! 1650: (adapter->rx_pcb.command != CMD_ADAPTER_INFO_RESPONSE) || ! 1651: (adapter->rx_pcb.length != 10)) { ! 1652: printk("%s: not responding to second PCB\n", dev->name); ! 1653: } ! 1654: printk("rev %d.%d, %dk\n", adapter->rx_pcb.data.info.major_vers, adapter->rx_pcb.data.info.minor_vers, adapter->rx_pcb.data.info.RAM_sz); ! 1655: ! 1656: /* ! 1657: * reconfigure the adapter memory to better suit our purposes ! 1658: */ ! 1659: adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY; ! 1660: adapter->tx_pcb.length = 12; ! 1661: adapter->tx_pcb.data.memconf.cmd_q = 8; ! 1662: adapter->tx_pcb.data.memconf.rcv_q = 8; ! 1663: adapter->tx_pcb.data.memconf.mcast = 10; ! 1664: adapter->tx_pcb.data.memconf.frame = 10; ! 1665: adapter->tx_pcb.data.memconf.rcv_b = 10; ! 1666: adapter->tx_pcb.data.memconf.progs = 0; ! 1667: if (!send_pcb(dev, &adapter->tx_pcb) || ! 1668: !receive_pcb(dev, &adapter->rx_pcb) || ! 1669: (adapter->rx_pcb.command != CMD_CONFIGURE_ADAPTER_RESPONSE) || ! 1670: (adapter->rx_pcb.length != 2)) { ! 1671: printk("%s: could not configure adapter memory\n", dev->name); ! 1672: } ! 1673: if (adapter->rx_pcb.data.configure) { ! 1674: printk("%s: adapter configuration failed\n", dev->name); ! 1675: } ! 1676: /* ! 1677: * and reserve the address region ! 1678: */ ! 1679: request_region(dev->base_addr, ELP_IO_EXTENT, "3c505"); ! 1680: ! 1681: /* ! 1682: * initialise the device ! 1683: */ ! 1684: elp_init(dev); ! 1685: ! 1686: return 0; ! 1687: } ! 1688: ! 1689: #ifdef MODULE ! 1690: static char devicename[9] = {0,}; ! 1691: static struct device dev_3c505 = ! 1692: { ! 1693: devicename, /* device name is inserted by linux/drivers/net/net_init.c */ ! 1694: 0, 0, 0, 0, ! 1695: 0, 0, ! 1696: 0, 0, 0, NULL, elplus_probe}; ! 1697: ! 1698: int io = 0x300; ! 1699: int irq = 0; ! 1700: ! 1701: int init_module(void) ! 1702: { ! 1703: if (io == 0) ! 1704: printk("3c505: You should not use auto-probing with insmod!\n"); ! 1705: dev_3c505.base_addr = io; ! 1706: dev_3c505.irq = irq; ! 1707: if (register_netdev(&dev_3c505) != 0) { ! 1708: return -EIO; ! 1709: } ! 1710: return 0; ! 1711: } ! 1712: ! 1713: void cleanup_module(void) ! 1714: { ! 1715: unregister_netdev(&dev_3c505); ! 1716: kfree(dev_3c505.priv); ! 1717: dev_3c505.priv = NULL; ! 1718: ! 1719: /* If we don't do this, we can't re-insmod it later. */ ! 1720: release_region(dev_3c505.base_addr, ELP_IO_EXTENT); ! 1721: } ! 1722: ! 1723: #endif /* MODULE */ ! 1724: ! 1725: ! 1726: /* ! 1727: * Local Variables: ! 1728: * c-file-style: "linux" ! 1729: * tab-width: 8 ! 1730: * compile-command: "gcc -D__KERNEL__ -I/discs/bibble/src/linux-1.3.69/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce -pipe -m486 -DCPU=486 -DMODULE -c 3c505.c" ! 1731: * End: ! 1732: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.