Annotation of Gnu-Mach/i386/i386at/gpl/linux/net/8390.c, revision 1.1.1.1

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:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.