|
|
1.1 ! root 1: /* 8390.c: A general NS8390 ethernet driver core for linux. */ ! 2: /* ! 3: Written 1992-94 by Donald Becker. ! 4: ! 5: Copyright 1993 United States Government as represented by the ! 6: Director, National Security Agency. ! 7: ! 8: This software may be used and distributed according to the terms ! 9: of the GNU Public License, incorporated herein by reference. ! 10: ! 11: The author may be reached as [email protected], or C/O ! 12: Center of Excellence in Space Data and Information Sciences ! 13: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 ! 14: ! 15: This is the chip-specific code for many 8390-based ethernet adaptors. ! 16: This is not a complete driver, it must be combined with board-specific ! 17: code such as ne.c, wd.c, 3c503.c, etc. ! 18: ! 19: Changelog: ! 20: ! 21: Paul Gortmaker : remove set_bit lock, other cleanups. ! 22: Paul Gortmaker : add ei_get_8390_hdr() so we can pass skb's to ! 23: ei_block_input() for eth_io_copy_and_sum(). ! 24: ! 25: */ ! 26: ! 27: static const char *version = ! 28: "8390.c:v1.10 9/23/94 Donald Becker ([email protected])\n"; ! 29: ! 30: /* ! 31: Braindamage remaining: ! 32: Much of this code should have been cleaned up, but every attempt ! 33: has broken some clone part. ! 34: ! 35: Sources: ! 36: The National Semiconductor LAN Databook, and the 3Com 3c503 databook. ! 37: */ ! 38: ! 39: #include <linux/module.h> ! 40: ! 41: #include <linux/kernel.h> ! 42: #include <linux/sched.h> ! 43: #include <linux/fs.h> ! 44: #include <linux/types.h> ! 45: #include <linux/ptrace.h> ! 46: #include <linux/string.h> ! 47: #include <asm/system.h> ! 48: #include <asm/segment.h> ! 49: #include <asm/bitops.h> ! 50: #include <asm/io.h> ! 51: #include <linux/errno.h> ! 52: #include <linux/fcntl.h> ! 53: #include <linux/in.h> ! 54: #include <linux/interrupt.h> ! 55: ! 56: #include <linux/netdevice.h> ! 57: #include <linux/etherdevice.h> ! 58: ! 59: #include "8390.h" ! 60: ! 61: /* These are the operational function interfaces to board-specific ! 62: routines. ! 63: void reset_8390(struct device *dev) ! 64: Resets the board associated with DEV, including a hardware reset of ! 65: the 8390. This is only called when there is a transmit timeout, and ! 66: it is always followed by 8390_init(). ! 67: void block_output(struct device *dev, int count, const unsigned char *buf, ! 68: int start_page) ! 69: Write the COUNT bytes of BUF to the packet buffer at START_PAGE. The ! 70: "page" value uses the 8390's 256-byte pages. ! 71: void get_8390_hdr(struct device *dev, struct e8390_hdr *hdr, int ring_page) ! 72: Read the 4 byte, page aligned 8390 header. *If* there is a ! 73: subsequent read, it will be of the rest of the packet. ! 74: void block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset) ! 75: Read COUNT bytes from the packet buffer into the skb data area. Start ! 76: reading from RING_OFFSET, the address as the 8390 sees it. This will always ! 77: follow the read of the 8390 header. ! 78: */ ! 79: #define ei_reset_8390 (ei_local->reset_8390) ! 80: #define ei_block_output (ei_local->block_output) ! 81: #define ei_block_input (ei_local->block_input) ! 82: #define ei_get_8390_hdr (ei_local->get_8390_hdr) ! 83: ! 84: /* use 0 for production, 1 for verification, >2 for debug */ ! 85: #ifdef EI_DEBUG ! 86: int ei_debug = EI_DEBUG; ! 87: #else ! 88: int ei_debug = 0; ! 89: #endif ! 90: #ifdef EI_PINGPONG ! 91: static int ei_pingpong = 1; ! 92: #else ! 93: static int ei_pingpong = 0; ! 94: #endif ! 95: ! 96: /* Max number of packets received at one Intr. ! 97: Currently this may only be examined by a kernel debugger. */ ! 98: static int high_water_mark = 0; ! 99: ! 100: /* Index to functions. */ ! 101: static void ei_tx_intr(struct device *dev); ! 102: static void ei_receive(struct device *dev); ! 103: static void ei_rx_overrun(struct device *dev); ! 104: ! 105: /* Routines generic to NS8390-based boards. */ ! 106: static void NS8390_trigger_send(struct device *dev, unsigned int length, ! 107: int start_page); ! 108: static void set_multicast_list(struct device *dev); ! 109: ! 110: ! 111: /* Open/initialize the board. This routine goes all-out, setting everything ! 112: up anew at each open, even though many of these registers should only ! 113: need to be set once at boot. ! 114: */ ! 115: int ei_open(struct device *dev) ! 116: { ! 117: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 118: ! 119: /* This can't happen unless somebody forgot to call ethdev_init(). */ ! 120: if (ei_local == NULL) { ! 121: printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name); ! 122: return -ENXIO; ! 123: } ! 124: ! 125: irq2dev_map[dev->irq] = dev; ! 126: NS8390_init(dev, 1); ! 127: dev->start = 1; ! 128: ei_local->irqlock = 0; ! 129: return 0; ! 130: } ! 131: ! 132: /* Opposite of above. Only used when "ifconfig <devname> down" is done. */ ! 133: int ei_close(struct device *dev) ! 134: { ! 135: NS8390_init(dev, 0); ! 136: dev->start = 0; ! 137: return 0; ! 138: } ! 139: ! 140: static int ei_start_xmit(struct sk_buff *skb, struct device *dev) ! 141: { ! 142: int e8390_base = dev->base_addr; ! 143: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 144: int length, send_length; ! 145: ! 146: /* ! 147: * We normally shouldn't be called if dev->tbusy is set, but the ! 148: * existing code does anyway. If it has been too long since the ! 149: * last Tx, we assume the board has died and kick it. ! 150: */ ! 151: ! 152: if (dev->tbusy) { /* Do timeouts, just like the 8003 driver. */ ! 153: int txsr = inb(e8390_base+EN0_TSR), isr; ! 154: int tickssofar = jiffies - dev->trans_start; ! 155: if (tickssofar < TX_TIMEOUT || (tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX))) { ! 156: return 1; ! 157: } ! 158: isr = inb(e8390_base+EN0_ISR); ! 159: if (dev->start == 0) { ! 160: printk("%s: xmit on stopped card\n", dev->name); ! 161: return 1; ! 162: } ! 163: ! 164: printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n", ! 165: dev->name, (txsr & ENTSR_ABT) ? "excess collisions." : ! 166: (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar); ! 167: ! 168: if (!isr && !ei_local->stat.tx_packets) { ! 169: /* The 8390 probably hasn't gotten on the cable yet. */ ! 170: ei_local->interface_num ^= 1; /* Try a different xcvr. */ ! 171: } ! 172: ! 173: /* Try to restart the card. Perhaps the user has fixed something. */ ! 174: ei_reset_8390(dev); ! 175: NS8390_init(dev, 1); ! 176: dev->trans_start = jiffies; ! 177: } ! 178: ! 179: /* Sending a NULL skb means some higher layer thinks we've missed an ! 180: tx-done interrupt. Caution: dev_tint() handles the cli()/sti() ! 181: itself. */ ! 182: if (skb == NULL) { ! 183: dev_tint(dev); ! 184: return 0; ! 185: } ! 186: ! 187: length = skb->len; ! 188: if (skb->len <= 0) ! 189: return 0; ! 190: ! 191: /* Mask interrupts from the ethercard. */ ! 192: outb_p(0x00, e8390_base + EN0_IMR); ! 193: if (dev->interrupt) { ! 194: printk("%s: Tx request while isr active.\n",dev->name); ! 195: outb_p(ENISR_ALL, e8390_base + EN0_IMR); ! 196: return 1; ! 197: } ! 198: ei_local->irqlock = 1; ! 199: ! 200: send_length = ETH_ZLEN < length ? length : ETH_ZLEN; ! 201: ! 202: if (ei_local->pingpong) { ! 203: int output_page; ! 204: if (ei_local->tx1 == 0) { ! 205: output_page = ei_local->tx_start_page; ! 206: ei_local->tx1 = send_length; ! 207: if (ei_debug && ei_local->tx2 > 0) ! 208: printk("%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n", ! 209: dev->name, ei_local->tx2, ei_local->lasttx, ! 210: ei_local->txing); ! 211: } else if (ei_local->tx2 == 0) { ! 212: output_page = ei_local->tx_start_page + 6; ! 213: ei_local->tx2 = send_length; ! 214: if (ei_debug && ei_local->tx1 > 0) ! 215: printk("%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n", ! 216: dev->name, ei_local->tx1, ei_local->lasttx, ! 217: ei_local->txing); ! 218: } else { /* We should never get here. */ ! 219: if (ei_debug) ! 220: printk("%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d\n", ! 221: dev->name, dev->interrupt, ei_local->tx1, ! 222: ei_local->tx2, ei_local->lasttx); ! 223: ei_local->irqlock = 0; ! 224: dev->tbusy = 1; ! 225: outb_p(ENISR_ALL, e8390_base + EN0_IMR); ! 226: return 1; ! 227: } ! 228: ei_block_output(dev, length, skb->data, output_page); ! 229: if (! ei_local->txing) { ! 230: ei_local->txing = 1; ! 231: NS8390_trigger_send(dev, send_length, output_page); ! 232: dev->trans_start = jiffies; ! 233: if (output_page == ei_local->tx_start_page) ! 234: ei_local->tx1 = -1, ei_local->lasttx = -1; ! 235: else ! 236: ei_local->tx2 = -1, ei_local->lasttx = -2; ! 237: } else ! 238: ei_local->txqueue++; ! 239: ! 240: dev->tbusy = (ei_local->tx1 && ei_local->tx2); ! 241: } else { /* No pingpong, just a single Tx buffer. */ ! 242: ei_block_output(dev, length, skb->data, ei_local->tx_start_page); ! 243: ei_local->txing = 1; ! 244: NS8390_trigger_send(dev, send_length, ei_local->tx_start_page); ! 245: dev->trans_start = jiffies; ! 246: dev->tbusy = 1; ! 247: } ! 248: ! 249: /* Turn 8390 interrupts back on. */ ! 250: ei_local->irqlock = 0; ! 251: outb_p(ENISR_ALL, e8390_base + EN0_IMR); ! 252: ! 253: dev_kfree_skb (skb, FREE_WRITE); ! 254: ! 255: return 0; ! 256: } ! 257: ! 258: /* The typical workload of the driver: ! 259: Handle the ether interface interrupts. */ ! 260: void ei_interrupt(int irq, struct pt_regs * regs) ! 261: { ! 262: struct device *dev = (struct device *)(irq2dev_map[irq]); ! 263: int e8390_base; ! 264: int interrupts, nr_serviced = 0; ! 265: struct ei_device *ei_local; ! 266: ! 267: if (dev == NULL) { ! 268: printk ("net_interrupt(): irq %d for unknown device.\n", irq); ! 269: return; ! 270: } ! 271: e8390_base = dev->base_addr; ! 272: ei_local = (struct ei_device *) dev->priv; ! 273: if (dev->interrupt || ei_local->irqlock) { ! 274: /* The "irqlock" check is only for testing. */ ! 275: printk(ei_local->irqlock ! 276: ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n" ! 277: : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n", ! 278: dev->name, inb_p(e8390_base + EN0_ISR), ! 279: inb_p(e8390_base + EN0_IMR)); ! 280: return; ! 281: } ! 282: ! 283: dev->interrupt = 1; ! 284: ! 285: /* Change to page 0 and read the intr status reg. */ ! 286: outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD); ! 287: if (ei_debug > 3) ! 288: printk("%s: interrupt(isr=%#2.2x).\n", dev->name, ! 289: inb_p(e8390_base + EN0_ISR)); ! 290: ! 291: /* !!Assumption!! -- we stay in page 0. Don't break this. */ ! 292: while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0 ! 293: && ++nr_serviced < MAX_SERVICE) { ! 294: if (dev->start == 0) { ! 295: printk("%s: interrupt from stopped card\n", dev->name); ! 296: interrupts = 0; ! 297: break; ! 298: } ! 299: if (interrupts & ENISR_OVER) { ! 300: ei_rx_overrun(dev); ! 301: } else if (interrupts & (ENISR_RX+ENISR_RX_ERR)) { ! 302: /* Got a good (?) packet. */ ! 303: ei_receive(dev); ! 304: } ! 305: /* Push the next to-transmit packet through. */ ! 306: if (interrupts & ENISR_TX) { ! 307: ei_tx_intr(dev); ! 308: } else if (interrupts & ENISR_COUNTERS) { ! 309: ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0); ! 310: ei_local->stat.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1); ! 311: ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2); ! 312: outb_p(ENISR_COUNTERS, e8390_base + EN0_ISR); /* Ack intr. */ ! 313: } ! 314: ! 315: /* Ignore the transmit errs and reset intr for now. */ ! 316: if (interrupts & ENISR_TX_ERR) { ! 317: outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR); /* Ack intr. */ ! 318: } ! 319: ! 320: /* Ignore any RDC interrupts that make it back to here. */ ! 321: if (interrupts & ENISR_RDC) { ! 322: outb_p(ENISR_RDC, e8390_base + EN0_ISR); ! 323: } ! 324: ! 325: outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD); ! 326: } ! 327: ! 328: if (interrupts && ei_debug) { ! 329: outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD); ! 330: if (nr_serviced >= MAX_SERVICE) { ! 331: printk("%s: Too much work at interrupt, status %#2.2x\n", ! 332: dev->name, interrupts); ! 333: outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */ ! 334: } else { ! 335: printk("%s: unknown interrupt %#2x\n", dev->name, interrupts); ! 336: outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */ ! 337: } ! 338: } ! 339: dev->interrupt = 0; ! 340: return; ! 341: } ! 342: ! 343: /* We have finished a transmit: check for errors and then trigger the next ! 344: packet to be sent. */ ! 345: static void ei_tx_intr(struct device *dev) ! 346: { ! 347: int e8390_base = dev->base_addr; ! 348: int status = inb(e8390_base + EN0_TSR); ! 349: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 350: ! 351: outb_p(ENISR_TX, e8390_base + EN0_ISR); /* Ack intr. */ ! 352: ! 353: if (ei_local->pingpong) { ! 354: ei_local->txqueue--; ! 355: if (ei_local->tx1 < 0) { ! 356: if (ei_local->lasttx != 1 && ei_local->lasttx != -1) ! 357: printk("%s: bogus last_tx_buffer %d, tx1=%d.\n", ! 358: ei_local->name, ei_local->lasttx, ei_local->tx1); ! 359: ei_local->tx1 = 0; ! 360: dev->tbusy = 0; ! 361: if (ei_local->tx2 > 0) { ! 362: ei_local->txing = 1; ! 363: NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6); ! 364: dev->trans_start = jiffies; ! 365: ei_local->tx2 = -1, ! 366: ei_local->lasttx = 2; ! 367: } else ! 368: ei_local->lasttx = 20, ei_local->txing = 0; ! 369: } else if (ei_local->tx2 < 0) { ! 370: if (ei_local->lasttx != 2 && ei_local->lasttx != -2) ! 371: printk("%s: bogus last_tx_buffer %d, tx2=%d.\n", ! 372: ei_local->name, ei_local->lasttx, ei_local->tx2); ! 373: ei_local->tx2 = 0; ! 374: dev->tbusy = 0; ! 375: if (ei_local->tx1 > 0) { ! 376: ei_local->txing = 1; ! 377: NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page); ! 378: dev->trans_start = jiffies; ! 379: ei_local->tx1 = -1; ! 380: ei_local->lasttx = 1; ! 381: } else ! 382: ei_local->lasttx = 10, ei_local->txing = 0; ! 383: } else ! 384: printk("%s: unexpected TX-done interrupt, lasttx=%d.\n", ! 385: dev->name, ei_local->lasttx); ! 386: } else { ! 387: ei_local->txing = 0; ! 388: dev->tbusy = 0; ! 389: } ! 390: ! 391: /* Minimize Tx latency: update the statistics after we restart TXing. */ ! 392: if (status & ENTSR_COL) ei_local->stat.collisions++; ! 393: if (status & ENTSR_PTX) ! 394: ei_local->stat.tx_packets++; ! 395: else { ! 396: ei_local->stat.tx_errors++; ! 397: if (status & ENTSR_ABT) ei_local->stat.tx_aborted_errors++; ! 398: if (status & ENTSR_CRS) ei_local->stat.tx_carrier_errors++; ! 399: if (status & ENTSR_FU) ei_local->stat.tx_fifo_errors++; ! 400: if (status & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++; ! 401: if (status & ENTSR_OWC) ei_local->stat.tx_window_errors++; ! 402: } ! 403: ! 404: mark_bh (NET_BH); ! 405: } ! 406: ! 407: /* We have a good packet(s), get it/them out of the buffers. */ ! 408: ! 409: static void ei_receive(struct device *dev) ! 410: { ! 411: int e8390_base = dev->base_addr; ! 412: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 413: int rxing_page, this_frame, next_frame, current_offset; ! 414: int rx_pkt_count = 0; ! 415: struct e8390_pkt_hdr rx_frame; ! 416: int num_rx_pages = ei_local->stop_page-ei_local->rx_start_page; ! 417: ! 418: while (++rx_pkt_count < 10) { ! 419: int pkt_len; ! 420: ! 421: /* Get the rx page (incoming packet pointer). */ ! 422: outb_p(E8390_NODMA+E8390_PAGE1, e8390_base + E8390_CMD); ! 423: rxing_page = inb_p(e8390_base + EN1_CURPAG); ! 424: outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD); ! 425: ! 426: /* Remove one frame from the ring. Boundary is always a page behind. */ ! 427: this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1; ! 428: if (this_frame >= ei_local->stop_page) ! 429: this_frame = ei_local->rx_start_page; ! 430: ! 431: /* Someday we'll omit the previous, iff we never get this message. ! 432: (There is at least one clone claimed to have a problem.) */ ! 433: if (ei_debug > 0 && this_frame != ei_local->current_page) ! 434: printk("%s: mismatched read page pointers %2x vs %2x.\n", ! 435: dev->name, this_frame, ei_local->current_page); ! 436: ! 437: if (this_frame == rxing_page) /* Read all the frames? */ ! 438: break; /* Done for now */ ! 439: ! 440: current_offset = this_frame << 8; ! 441: ei_get_8390_hdr(dev, &rx_frame, this_frame); ! 442: ! 443: pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr); ! 444: ! 445: next_frame = this_frame + 1 + ((pkt_len+4)>>8); ! 446: ! 447: /* Check for bogosity warned by 3c503 book: the status byte is never ! 448: written. This happened a lot during testing! This code should be ! 449: cleaned up someday. */ ! 450: if (rx_frame.next != next_frame ! 451: && rx_frame.next != next_frame + 1 ! 452: && rx_frame.next != next_frame - num_rx_pages ! 453: && rx_frame.next != next_frame + 1 - num_rx_pages) { ! 454: ei_local->current_page = rxing_page; ! 455: outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY); ! 456: ei_local->stat.rx_errors++; ! 457: continue; ! 458: } ! 459: ! 460: if (pkt_len < 60 || pkt_len > 1518) { ! 461: if (ei_debug) ! 462: printk("%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", ! 463: dev->name, rx_frame.count, rx_frame.status, ! 464: rx_frame.next); ! 465: ei_local->stat.rx_errors++; ! 466: } else if ((rx_frame.status & 0x0F) == ENRSR_RXOK) { ! 467: struct sk_buff *skb; ! 468: ! 469: skb = dev_alloc_skb(pkt_len+2); ! 470: if (skb == NULL) { ! 471: if (ei_debug > 1) ! 472: printk("%s: Couldn't allocate a sk_buff of size %d.\n", ! 473: dev->name, pkt_len); ! 474: ei_local->stat.rx_dropped++; ! 475: break; ! 476: } else { ! 477: skb_reserve(skb,2); /* IP headers on 16 byte boundaries */ ! 478: skb->dev = dev; ! 479: skb_put(skb, pkt_len); /* Make room */ ! 480: ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame)); ! 481: skb->protocol=eth_type_trans(skb,dev); ! 482: netif_rx(skb); ! 483: ei_local->stat.rx_packets++; ! 484: } ! 485: } else { ! 486: int errs = rx_frame.status; ! 487: if (ei_debug) ! 488: printk("%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", ! 489: dev->name, rx_frame.status, rx_frame.next, ! 490: rx_frame.count); ! 491: if (errs & ENRSR_FO) ! 492: ei_local->stat.rx_fifo_errors++; ! 493: } ! 494: next_frame = rx_frame.next; ! 495: ! 496: /* This _should_ never happen: it's here for avoiding bad clones. */ ! 497: if (next_frame >= ei_local->stop_page) { ! 498: printk("%s: next frame inconsistency, %#2x\n", dev->name, ! 499: next_frame); ! 500: next_frame = ei_local->rx_start_page; ! 501: } ! 502: ei_local->current_page = next_frame; ! 503: outb_p(next_frame-1, e8390_base+EN0_BOUNDARY); ! 504: } ! 505: /* If any worth-while packets have been received, netif_rx() ! 506: has done a mark_bh(NET_BH) for us and will work on them ! 507: when we get to the bottom-half routine. */ ! 508: ! 509: /* Record the maximum Rx packet queue. */ ! 510: if (rx_pkt_count > high_water_mark) ! 511: high_water_mark = rx_pkt_count; ! 512: ! 513: /* We used to also ack ENISR_OVER here, but that would sometimes mask ! 514: a real overrun, leaving the 8390 in a stopped state with rec'vr off. */ ! 515: outb_p(ENISR_RX+ENISR_RX_ERR, e8390_base+EN0_ISR); ! 516: return; ! 517: } ! 518: ! 519: /* We have a receiver overrun: we have to kick the 8390 to get it started ! 520: again.*/ ! 521: static void ei_rx_overrun(struct device *dev) ! 522: { ! 523: int e8390_base = dev->base_addr; ! 524: int reset_start_time = jiffies; ! 525: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 526: ! 527: /* We should already be stopped and in page0. Remove after testing. */ ! 528: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD); ! 529: ! 530: if (ei_debug > 1) ! 531: printk("%s: Receiver overrun.\n", dev->name); ! 532: ei_local->stat.rx_over_errors++; ! 533: ! 534: /* The old Biro driver does dummy = inb_p( RBCR[01] ); at this point. ! 535: It might mean something -- magic to speed up a reset? A 8390 bug?*/ ! 536: ! 537: /* Wait for the reset to complete. This should happen almost instantly, ! 538: but could take up to 1.5msec in certain rare instances. There is no ! 539: easy way of timing something in that range, so we use 'jiffies' as ! 540: a sanity check. */ ! 541: while ((inb_p(e8390_base+EN0_ISR) & ENISR_RESET) == 0) ! 542: if (jiffies - reset_start_time > 2*HZ/100) { ! 543: printk("%s: reset did not complete at ei_rx_overrun.\n", ! 544: dev->name); ! 545: NS8390_init(dev, 1); ! 546: return; ! 547: } ! 548: ! 549: /* Remove packets right away. */ ! 550: ei_receive(dev); ! 551: ! 552: outb_p(ENISR_OVER, e8390_base+EN0_ISR); ! 553: /* Generic 8390 insns to start up again, same as in open_8390(). */ ! 554: outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD); ! 555: outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR); /* xmit on. */ ! 556: } ! 557: ! 558: static struct enet_statistics *get_stats(struct device *dev) ! 559: { ! 560: short ioaddr = dev->base_addr; ! 561: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 562: ! 563: /* If the card is stopped, just return the present stats. */ ! 564: if (dev->start == 0) return &ei_local->stat; ! 565: ! 566: /* Read the counter registers, assuming we are in page 0. */ ! 567: ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0); ! 568: ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1); ! 569: ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2); ! 570: ! 571: return &ei_local->stat; ! 572: } ! 573: ! 574: /* ! 575: * Set or clear the multicast filter for this adaptor. ! 576: */ ! 577: ! 578: static void set_multicast_list(struct device *dev) ! 579: { ! 580: short ioaddr = dev->base_addr; ! 581: ! 582: if(dev->flags&IFF_PROMISC) ! 583: { ! 584: outb_p(E8390_RXCONFIG | 0x18, ioaddr + EN0_RXCR); ! 585: } ! 586: else if((dev->flags&IFF_ALLMULTI)||dev->mc_list) ! 587: { ! 588: /* The multicast-accept list is initialized to accept-all, and we ! 589: rely on higher-level filtering for now. */ ! 590: outb_p(E8390_RXCONFIG | 0x08, ioaddr + EN0_RXCR); ! 591: } ! 592: else ! 593: outb_p(E8390_RXCONFIG, ioaddr + EN0_RXCR); ! 594: } ! 595: ! 596: /* Initialize the rest of the 8390 device structure. */ ! 597: int ethdev_init(struct device *dev) ! 598: { ! 599: if (ei_debug > 1) ! 600: printk(version); ! 601: ! 602: if (dev->priv == NULL) { ! 603: struct ei_device *ei_local; ! 604: ! 605: dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL); ! 606: if (dev->priv == NULL) ! 607: return -ENOMEM; ! 608: memset(dev->priv, 0, sizeof(struct ei_device)); ! 609: ei_local = (struct ei_device *)dev->priv; ! 610: ei_local->pingpong = ei_pingpong; ! 611: } ! 612: ! 613: dev->hard_start_xmit = &ei_start_xmit; ! 614: dev->get_stats = get_stats; ! 615: dev->set_multicast_list = &set_multicast_list; ! 616: ! 617: ether_setup(dev); ! 618: ! 619: return 0; ! 620: } ! 621: ! 622: ! 623: /* This page of functions should be 8390 generic */ ! 624: /* Follow National Semi's recommendations for initializing the "NIC". */ ! 625: void NS8390_init(struct device *dev, int startp) ! 626: { ! 627: int e8390_base = dev->base_addr; ! 628: struct ei_device *ei_local = (struct ei_device *) dev->priv; ! 629: int i; ! 630: int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48; ! 631: unsigned long flags; ! 632: ! 633: /* Follow National Semi's recommendations for initing the DP83902. */ ! 634: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); /* 0x21 */ ! 635: outb_p(endcfg, e8390_base + EN0_DCFG); /* 0x48 or 0x49 */ ! 636: /* Clear the remote byte count registers. */ ! 637: outb_p(0x00, e8390_base + EN0_RCNTLO); ! 638: outb_p(0x00, e8390_base + EN0_RCNTHI); ! 639: /* Set to monitor and loopback mode -- this is vital!. */ ! 640: outb_p(E8390_RXOFF, e8390_base + EN0_RXCR); /* 0x20 */ ! 641: outb_p(E8390_TXOFF, e8390_base + EN0_TXCR); /* 0x02 */ ! 642: /* Set the transmit page and receive ring. */ ! 643: outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR); ! 644: ei_local->tx1 = ei_local->tx2 = 0; ! 645: outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG); ! 646: outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY); /* 3c503 says 0x3f,NS0x26*/ ! 647: ei_local->current_page = ei_local->rx_start_page; /* assert boundary+1 */ ! 648: outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG); ! 649: /* Clear the pending interrupts and mask. */ ! 650: outb_p(0xFF, e8390_base + EN0_ISR); ! 651: outb_p(0x00, e8390_base + EN0_IMR); ! 652: ! 653: /* Copy the station address into the DS8390 registers, ! 654: and set the multicast hash bitmap to receive all multicasts. */ ! 655: save_flags(flags); ! 656: cli(); ! 657: outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base); /* 0x61 */ ! 658: for(i = 0; i < 6; i++) { ! 659: outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS + i); ! 660: } ! 661: /* Initialize the multicast list to accept-all. If we enable multicast ! 662: the higher levels can do the filtering. */ ! 663: for(i = 0; i < 8; i++) ! 664: outb_p(0xff, e8390_base + EN1_MULT + i); ! 665: ! 666: outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG); ! 667: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); ! 668: restore_flags(flags); ! 669: dev->tbusy = 0; ! 670: dev->interrupt = 0; ! 671: ei_local->tx1 = ei_local->tx2 = 0; ! 672: ei_local->txing = 0; ! 673: if (startp) { ! 674: outb_p(0xff, e8390_base + EN0_ISR); ! 675: outb_p(ENISR_ALL, e8390_base + EN0_IMR); ! 676: outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base); ! 677: outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR); /* xmit on. */ ! 678: /* 3c503 TechMan says rxconfig only after the NIC is started. */ ! 679: outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR); /* rx on, */ ! 680: dev->set_multicast_list(dev); /* Get the multicast status right if this ! 681: was a reset. */ ! 682: } ! 683: return; ! 684: } ! 685: ! 686: /* Trigger a transmit start, assuming the length is valid. */ ! 687: static void NS8390_trigger_send(struct device *dev, unsigned int length, ! 688: int start_page) ! 689: { ! 690: int e8390_base = dev->base_addr; ! 691: ! 692: outb_p(E8390_NODMA+E8390_PAGE0, e8390_base); ! 693: ! 694: if (inb_p(e8390_base) & E8390_TRANS) { ! 695: printk("%s: trigger_send() called with the transmitter busy.\n", ! 696: dev->name); ! 697: return; ! 698: } ! 699: outb_p(length & 0xff, e8390_base + EN0_TCNTLO); ! 700: outb_p(length >> 8, e8390_base + EN0_TCNTHI); ! 701: outb_p(start_page, e8390_base + EN0_TPSR); ! 702: outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base); ! 703: return; ! 704: } ! 705: ! 706: #ifdef MODULE ! 707: ! 708: int init_module(void) ! 709: { ! 710: return 0; ! 711: } ! 712: ! 713: void ! 714: cleanup_module(void) ! 715: { ! 716: } ! 717: #endif /* MODULE */ ! 718: ! 719: /* ! 720: * Local variables: ! 721: * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c 8390.c" ! 722: * version-control: t ! 723: * kept-new-versions: 5 ! 724: * c-indent-level: 4 ! 725: * tab-width: 4 ! 726: * End: ! 727: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.