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

1.1       root        1: /* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux
                      2: 
                      3:    Written 1994-95 by Mika Kuoppala
                      4: 
                      5:    Copyright (C) 1994, 1995 by Mika Kuoppala
                      6:    Based on skeleton.c and at1700.c by Donald Becker
                      7: 
                      8:    This software may be used and distributed according to the terms
                      9:    of the GNU Public Licence, incorporated herein by reference.
                     10: 
                     11:    The author may be reached as [email protected]
                     12: 
                     13:    This driver supports following cards :
                     14:        - ICL EtherTeam 16i
                     15:        - ICL EtherTeam 32 EISA
                     16: 
                     17:    Sources:
                     18:      - skeleton.c  a sample network driver core for linux,
                     19:        written by Donald Becker <[email protected]>
                     20:      - at1700.c a driver for Allied Telesis AT1700, written 
                     21:        by Donald Becker.
                     22:      - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i
                     23:        written by Markku Viima
                     24:      - The Fujitsu MB86965 databook.
                     25:    
                     26:    Valuable assistance from:
                     27:        Markku Viima (ICL) 
                     28:        Ari Valve (ICL)
                     29:    
                     30:    Revision history:
                     31: 
                     32:    Version     Date            Description
                     33:    
                     34:    0.01                15.12-94        Initial version (card detection)
                     35:    0.02         23.01-95        Interrupt is now hooked correctly
                     36:    0.03         01.02-95        Rewrote initialization part
                     37:    0.04         07.02-95        Base skeleton done...
                     38:                                Made a few changes to signature checking
                     39:                                to make it a bit reliable.
                     40:                                - fixed bug in tx_buf mapping
                     41:                                - fixed bug in initialization (DLC_EN
                     42:                                  wasn't enabled when initialization
                     43:                                  was done.)
                     44:    0.05                08.02-95        If there were more than one packet to send,
                     45:                                transmit was jammed due to invalid
                     46:                                register write...now fixed
                     47:    0.06         19.02-95        Rewrote interrupt handling        
                     48:    0.07         13.04-95        Wrote EEPROM read routines
                     49:                                 Card configuration now set according to
                     50:                                data read from EEPROM
                     51:    0.08         23.06-95        Wrote part that tries to probe used interface
                     52:                                 port if AUTO is selected
                     53: 
                     54:    0.09         01.09-95       Added module support
                     55:    
                     56:    0.10         04.09-95       Fixed receive packet allocation to work         
                     57:                                with kernels > 1.3.x
                     58:    
                     59:    0.20                20.09-95        Added support for EtherTeam32 EISA      
                     60: 
                     61:    0.21         17.10-95        Removed the unnecessary extern 
                     62:                                init_etherdev() declaration. Some
                     63:                                other cleanups.
                     64:    Bugs:
                     65:        In some cases the interface autoprobing code doesn't find 
                     66:        the correct interface type. In this case you can 
                     67:        manually choose the interface type in DOS with E16IC.EXE which is 
                     68:        configuration software for EtherTeam16i and EtherTeam32 cards.
                     69:        
                     70:    To do:
                     71:        - Real multicast support
                     72: */
                     73: 
                     74: static char *version = 
                     75:        "eth16i.c: v0.21 17-10-95 Mika Kuoppala ([email protected])\n";
                     76: 
                     77: #include <linux/module.h>
                     78: 
                     79: #include <linux/kernel.h>
                     80: #include <linux/sched.h>
                     81: #include <linux/types.h>                 
                     82: #include <linux/fcntl.h>                 
                     83: #include <linux/interrupt.h>             
                     84: #include <linux/ptrace.h>                
                     85: #include <linux/ioport.h>                
                     86: #include <linux/in.h>            
                     87: #include <linux/malloc.h>                
                     88: #include <linux/string.h>                
                     89: #include <linux/errno.h>
                     90: 
                     91: #include <linux/netdevice.h>
                     92: #include <linux/etherdevice.h>
                     93: #include <linux/skbuff.h>
                     94: 
                     95: #include <asm/system.h>                  
                     96: #include <asm/bitops.h>                  
                     97: #include <asm/io.h>              
                     98: #include <asm/dma.h>
                     99: 
                    100: /* Few macros */
                    101: #define BIT(a)                 ( (1 << (a)) )  
                    102: #define BITSET(ioaddr, bnum)   ((outb(((inb(ioaddr)) | (bnum)), ioaddr))) 
                    103: #define BITCLR(ioaddr, bnum)   ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr)))
                    104: 
                    105: /* This is the I/O address space for Etherteam 16i adapter. */
                    106: #define ETH16I_IO_EXTENT 32
                    107: 
                    108: /* Ticks before deciding that transmit has timed out */
                    109: #define TIMEOUT_TICKS          30
                    110: 
                    111: /* Maximum loop count when receiving packets */
                    112: #define MAX_RX_LOOP            40
                    113: 
                    114: /* Some interrupt masks */
                    115: #define ETH16I_INTR_ON        0x8f82
                    116: #define ETH16I_INTR_OFF               0x0000
                    117:         
                    118: /* Buffers header status byte meanings */
                    119: #define PKT_GOOD               BIT(5)
                    120: #define PKT_GOOD_RMT           BIT(4)
                    121: #define PKT_SHORT              BIT(3)
                    122: #define PKT_ALIGN_ERR          BIT(2)
                    123: #define PKT_CRC_ERR            BIT(1)
                    124: #define PKT_RX_BUF_OVERFLOW    BIT(0)
                    125: 
                    126: /* Transmit status register (DLCR0) */
                    127: #define TX_STATUS_REG          0
                    128: #define TX_DONE                BIT(7)
                    129: #define NET_BUSY               BIT(6)
                    130: #define TX_PKT_RCD             BIT(5)
                    131: #define CR_LOST                BIT(4)
                    132: #define COLLISION              BIT(2)
                    133: #define COLLISIONS_16          BIT(1)
                    134: 
                    135: /* Receive status register (DLCR1) */
                    136: #define RX_STATUS_REG          1
                    137: #define RX_PKT                 BIT(7)  /* Packet received */
                    138: #define BUS_RD_ERR             BIT(6)
                    139: #define SHORT_PKT_ERR          BIT(3)
                    140: #define ALIGN_ERR              BIT(2)
                    141: #define CRC_ERR                BIT(1)
                    142: #define RX_BUF_OVERFLOW        BIT(0)
                    143:               
                    144: /* Transmit Interrupt Enable Register (DLCR2) */
                    145: #define TX_INTR_REG            2
                    146: #define TX_INTR_DONE           BIT(7)
                    147: #define TX_INTR_COL            BIT(2)
                    148: #define TX_INTR_16_COL         BIT(1)
                    149: 
                    150: /* Receive Interrupt Enable Register (DLCR3) */
                    151: #define RX_INTR_REG            3
                    152: #define RX_INTR_RECEIVE        BIT(7)
                    153: #define RX_INTR_SHORT_PKT      BIT(3)
                    154: #define RX_INTR_CRC_ERR        BIT(1)
                    155: #define RX_INTR_BUF_OVERFLOW   BIT(0)
                    156: 
                    157: /* Transmit Mode Register (DLCR4) */
                    158: #define TRANSMIT_MODE_REG      4
                    159: #define LOOPBACK_CONTROL       BIT(1)
                    160: #define CONTROL_OUTPUT         BIT(2)
                    161: 
                    162: /* Receive Mode Register (DLCR5) */
                    163: #define RECEIVE_MODE_REG       5
                    164: #define RX_BUFFER_EMPTY        BIT(6)
                    165: #define ACCEPT_BAD_PACKETS     BIT(5)
                    166: #define RECEIVE_SHORT_ADDR     BIT(4)
                    167: #define ACCEPT_SHORT_PACKETS   BIT(3)
                    168: #define REMOTE_RESET           BIT(2)
                    169: 
                    170: #define ADDRESS_FILTER_MODE    BIT(1) | BIT(0)
                    171: #define REJECT_ALL             0
                    172: #define ACCEPT_ALL             3
                    173: #define MODE_1                 1            /* NODE ID, BC, MC, 2-24th bit */
                    174: #define MODE_2                 2            /* NODE ID, BC, MC, Hash Table */
                    175: 
                    176: /* Configuration Register 0 (DLCR6) */
                    177: #define CONFIG_REG_0           6
                    178: #define DLC_EN                 BIT(7)
                    179: #define SRAM_CYCLE_TIME_100NS  BIT(6)
                    180: #define SYSTEM_BUS_WIDTH_8     BIT(5)       /* 1 = 8bit, 0 = 16bit */
                    181: #define BUFFER_WIDTH_8         BIT(4)       /* 1 = 8bit, 0 = 16bit */
                    182: #define TBS1                   BIT(3)       
                    183: #define TBS0                   BIT(2)
                    184: #define BS1                    BIT(1)       /* 00=8kb,  01=16kb  */
                    185: #define BS0                    BIT(0)       /* 10=32kb, 11=64kb  */
                    186: 
                    187: #ifndef ETH16I_TX_BUF_SIZE                   /* 0 = 2kb, 1 = 4kb  */ 
                    188: #define ETH16I_TX_BUF_SIZE     2             /* 2 = 8kb, 3 = 16kb */
                    189: #endif                                      
                    190: #define TX_BUF_1x2048            0
                    191: #define TX_BUF_2x2048            1
                    192: #define TX_BUF_2x4098            2
                    193: #define TX_BUF_2x8192            3
                    194: 
                    195: /* Configuration Register 1 (DLCR7) */
                    196: #define CONFIG_REG_1           7
                    197: #define POWERUP                BIT(5)
                    198: 
                    199: /* Transmit start register */
                    200: #define TRANSMIT_START_REG     10
                    201: #define TRANSMIT_START_RB      2
                    202: #define TX_START               BIT(7)       /* Rest of register bit indicate*/
                    203:                                             /* number of packets in tx buffer*/
                    204: /* Node ID registers (DLCR8-13) */
                    205: #define NODE_ID_0              8
                    206: #define NODE_ID_RB             0
                    207: 
                    208: /* Hash Table registers (HT8-15) */
                    209: #define HASH_TABLE_0           8
                    210: #define HASH_TABLE_RB          1
                    211: 
                    212: /* Buffer memory ports */
                    213: #define BUFFER_MEM_PORT_LB    8
                    214: #define DATAPORT              BUFFER_MEM_PORT_LB
                    215: #define BUFFER_MEM_PORT_HB    9
                    216: 
                    217: /* 16 Collision control register (BMPR11) */
                    218: #define COL_16_REG             11
                    219: #define HALT_ON_16             0x00
                    220: #define RETRANS_AND_HALT_ON_16 0x02
                    221: 
                    222: /* DMA Burst and Transceiver Mode Register (BMPR13) */
                    223: #define TRANSCEIVER_MODE_REG   13
                    224: #define TRANSCEIVER_MODE_RB    2         
                    225: #define IO_BASE_UNLOCK        BIT(7)
                    226: #define LOWER_SQUELCH_TRESH    BIT(6)
                    227: #define LINK_TEST_DISABLE      BIT(5)
                    228: #define AUI_SELECT             BIT(4)
                    229: #define DIS_AUTO_PORT_SEL      BIT(3)
                    230: 
                    231: /* Filter Self Receive Register (BMPR14)  */
                    232: #define FILTER_SELF_RX_REG     14
                    233: #define SKIP_RECEIVE_PACKET    BIT(2)
                    234: #define FILTER_SELF_RECEIVE    BIT(0)
                    235: #define RX_BUF_SKIP_PACKET     SKIP_RECEIVE_PACKET | FILTER_SELF_RECEIVE
                    236: 
                    237: /* EEPROM Control Register (BMPR 16) */
                    238: #define EEPROM_CTRL_REG        16
                    239: 
                    240: /* EEPROM Data Register (BMPR 17) */
                    241: #define EEPROM_DATA_REG        17
                    242: 
                    243: /* NMC93CSx6 EEPROM Control Bits */
                    244: #define CS_0                   0x00
                    245: #define CS_1                   0x20
                    246: #define SK_0                   0x00
                    247: #define SK_1                   0x40
                    248: #define DI_0                   0x00
                    249: #define DI_1                   0x80
                    250: 
                    251: /* NMC93CSx6 EEPROM Instructions */
                    252: #define EEPROM_READ            0x80
                    253: 
                    254: /* NMC93CSx6 EEPROM Addresses */
                    255: #define E_NODEID_0                     0x02
                    256: #define E_NODEID_1                     0x03
                    257: #define E_NODEID_2                     0x04
                    258: #define E_PORT_SELECT                  0x14
                    259:   #define E_PORT_BNC                   0
                    260:   #define E_PORT_DIX                   1
                    261:   #define E_PORT_TP                    2
                    262:   #define E_PORT_AUTO                  3
                    263: #define E_PRODUCT_CFG                  0x30
                    264:  
                    265: 
                    266: /* Macro to slow down io between EEPROM clock transitions */
                    267: #define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { __SLOW_DOWN_IO; }}while(0)
                    268: 
                    269: /* Jumperless Configuration Register (BMPR19) */
                    270: #define JUMPERLESS_CONFIG      19
                    271: 
                    272: /* ID ROM registers, writing to them also resets some parts of chip */
                    273: #define ID_ROM_0               24
                    274: #define ID_ROM_7               31
                    275: #define RESET                  ID_ROM_0
                    276: 
                    277: /* This is the I/O address list to be probed when seeking the card */
                    278: static unsigned int eth16i_portlist[] =
                    279:    { 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 };
                    280: 
                    281: static unsigned int eth32i_portlist[] =
                    282:    { 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000,
                    283:      0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0 };
                    284: 
                    285: /* This is the Interrupt lookup table for Eth16i card */
                    286: static unsigned int eth16i_irqmap[] = { 9, 10, 5, 15 };
                    287: 
                    288: /* This is the Interrupt lookup table for Eth32i card */
                    289: static unsigned int eth32i_irqmap[] = { 3, 5, 7, 9, 10, 11, 12, 15 };  
                    290: #define EISA_IRQ_REG   0xc89
                    291: 
                    292: static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
                    293: unsigned int boot = 1;
                    294: 
                    295: /* Use 0 for production, 1 for verification, >2 for debug */
                    296: #ifndef ETH16I_DEBUG
                    297: #define ETH16I_DEBUG 0
                    298: #endif
                    299: static unsigned int eth16i_debug = ETH16I_DEBUG;
                    300: 
                    301: /* Information for each board */
                    302: struct eth16i_local {
                    303:   struct enet_statistics stats;
                    304:   unsigned int tx_started:1;
                    305:   unsigned char tx_queue;         /* Number of packets in transmit buffer */
                    306:   unsigned short tx_queue_len;         
                    307:   unsigned int tx_buf_size;
                    308:   unsigned long open_time;
                    309: };
                    310: 
                    311: /* Function prototypes */
                    312: 
                    313: extern int eth16i_probe(struct device *dev);
                    314: 
                    315: static int eth16i_probe1(struct device *dev, short ioaddr);
                    316: static int eth16i_check_signature(short ioaddr);
                    317: static int eth16i_probe_port(short ioaddr);
                    318: static void eth16i_set_port(short ioaddr, int porttype);
                    319: static int eth16i_send_probe_packet(short ioaddr, unsigned char *b, int l);
                    320: static int eth16i_receive_probe_packet(short ioaddr);
                    321: static int eth16i_get_irq(short ioaddr);
                    322: static int eth16i_read_eeprom(int ioaddr, int offset);
                    323: static int eth16i_read_eeprom_word(int ioaddr);
                    324: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command);
                    325: static int eth16i_open(struct device *dev);
                    326: static int eth16i_close(struct device *dev);
                    327: static int eth16i_tx(struct sk_buff *skb, struct device *dev);
                    328: static void eth16i_rx(struct device *dev);
                    329: static void eth16i_interrupt(int irq, struct pt_regs *regs);
                    330: static void eth16i_multicast(struct device *dev, int num_addrs, void *addrs); 
                    331: static void eth16i_select_regbank(unsigned char regbank, short ioaddr);
                    332: static void eth16i_initialize(struct device *dev);
                    333: static struct enet_statistics *eth16i_get_stats(struct device *dev);
                    334: 
                    335: static char *cardname = "ICL EtherTeam 16i/32";
                    336: 
                    337: #ifdef HAVE_DEVLIST 
                    338: /* Support for alternate probe manager */
                    339: /struct netdev_entry eth16i_drv = 
                    340:    {"eth16i", eth16i_probe1, ETH16I_IO_EXTENT, eth16i_probe_list}; 
                    341: 
                    342: #else  /* Not HAVE_DEVLIST */
                    343: int eth16i_probe(struct device *dev)
                    344: {
                    345:   int i;
                    346:   int ioaddr;
                    347:   int base_addr = dev ? dev->base_addr : 0;
                    348: 
                    349:   if(eth16i_debug > 4) 
                    350:     printk("Probing started for %s\n", cardname);
                    351: 
                    352:   if(base_addr > 0x1ff)           /* Check only single location */
                    353:     return eth16i_probe1(dev, base_addr);
                    354:   else if(base_addr != 0)         /* Don't probe at all */
                    355:     return ENXIO;
                    356: 
                    357:   /* Seek card from the ISA io address space */
                    358:   for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++) {
                    359:     if(check_region(ioaddr, ETH16I_IO_EXTENT))
                    360:       continue;
                    361:     if(eth16i_probe1(dev, ioaddr) == 0)
                    362:       return 0;
                    363:   }
                    364: 
                    365:   /* Seek card from the EISA io address space */
                    366:   for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++) {
                    367:     if(check_region(ioaddr, ETH16I_IO_EXTENT))
                    368:        continue;
                    369:     if(eth16i_probe1(dev, ioaddr) == 0)
                    370:        return 0;
                    371:    }
                    372: 
                    373:   return ENODEV;
                    374: }
                    375: #endif  /* Not HAVE_DEVLIST */
                    376: 
                    377: static int eth16i_probe1(struct device *dev, short ioaddr)
                    378: {
                    379:   static unsigned version_printed = 0;
                    380:   unsigned int irq = 0;
                    381:   boot = 1;          /* To inform initilization that we are in boot probe */
                    382: 
                    383:   /*
                    384:      The MB86985 chip has on register which holds information in which 
                    385:      io address the chip lies. First read this register and compare
                    386:      it to our current io address and if match then this could
                    387:      be our chip.
                    388:   */
                    389:   
                    390:   if(ioaddr < 0x1000) {
                    391:     if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)] != ioaddr)
                    392:       return -ENODEV;
                    393:   }
                    394: 
                    395:   /* Now we will go a bit deeper and try to find the chip's signature */
                    396: 
                    397:   if(eth16i_check_signature(ioaddr) != 0) /* Can we find the signature here */
                    398:     return -ENODEV;
                    399:   
                    400:   /* 
                    401:      Now it seems that we have found a ethernet chip in this particular
                    402:      ioaddr. The MB86985 chip has this feature, that when you read a 
                    403:      certain register it will increase it's io base address to next
                    404:      configurable slot. Now when we have found the chip, first thing is
                    405:      to make sure that the chip's ioaddr will hold still here.
                    406:   */
                    407:   
                    408:   eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
                    409:   outb(0x00, ioaddr + TRANSCEIVER_MODE_REG);
                    410:   
                    411:   outb(0x00, ioaddr + RESET);             /* Will reset some parts of chip */
                    412:   BITSET(ioaddr + CONFIG_REG_0, BIT(7));  /* This will disable the data link */
                    413:   
                    414:   if(dev == NULL)
                    415:     dev = init_etherdev(0, sizeof(struct eth16i_local));
                    416: 
                    417:   if( (eth16i_debug & version_printed++) == 0)
                    418:     printk(version);
                    419: 
                    420:   dev->base_addr = ioaddr;
                    421:  
                    422:   irq = eth16i_get_irq(ioaddr);
                    423:   dev->irq = irq;
                    424: 
                    425:   /* Try to obtain interrupt vector */
                    426:   if(request_irq(dev->irq, &eth16i_interrupt, 0, "eth16i")) {
                    427:     printk("%s: %s at %#3x, but is unusable due 
                    428:            conflict on IRQ %d.\n", dev->name, cardname, ioaddr, irq);
                    429:     return EAGAIN;
                    430:   }
                    431: 
                    432:   printk("%s: %s at %#3x, IRQ %d, ", 
                    433:         dev->name, cardname, ioaddr, dev->irq);
                    434: 
                    435:   /* Let's grab the region */
                    436:   request_region(ioaddr, ETH16I_IO_EXTENT, "eth16i");
                    437: 
                    438:   /* Now we will have to lock the chip's io address */
                    439:   eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
                    440:   outb(0x38, ioaddr + TRANSCEIVER_MODE_REG); 
                    441: 
                    442:   eth16i_initialize(dev);   /* Initialize rest of the chip's registers */
                    443:   
                    444:   /* Now let's same some energy by shutting down the chip ;) */
                    445:   BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
                    446:    
                    447:   /* Initialize the device structure */
                    448:   if(dev->priv == NULL)
                    449:     dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL);
                    450:   memset(dev->priv, 0, sizeof(struct eth16i_local));
                    451: 
                    452:   dev->open               = eth16i_open;
                    453:   dev->stop               = eth16i_close;
                    454:   dev->hard_start_xmit    = eth16i_tx;
                    455:   dev->get_stats          = eth16i_get_stats;
                    456:   dev->set_multicast_list = &eth16i_multicast;
                    457: 
                    458:   /* Fill in the fields of the device structure with ethernet values. */
                    459:   ether_setup(dev);
                    460: 
                    461:   boot = 0;
                    462: 
                    463:   return 0;
                    464: }
                    465: 
                    466: 
                    467: static void eth16i_initialize(struct device *dev)
                    468: {
                    469:   short ioaddr = dev->base_addr;
                    470:   int i, node_w = 0;
                    471:   unsigned char node_byte = 0;
                    472: 
                    473:   /* Setup station address */
                    474:   eth16i_select_regbank(NODE_ID_RB, ioaddr);
                    475:   for(i = 0 ; i < 3 ; i++) {
                    476:     unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i);
                    477:     ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val);
                    478:   }
                    479: 
                    480:   for(i = 0; i < 6; i++) { 
                    481:     outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i);
                    482:     if(boot) {
                    483:       printk("%02x", inb(ioaddr + NODE_ID_0 + i));
                    484:       if(i != 5)
                    485:        printk(":");
                    486:     }
                    487:   }
                    488: 
                    489:   /* Now we will set multicast addresses to accept none */
                    490:   eth16i_select_regbank(HASH_TABLE_RB, ioaddr);
                    491:   for(i = 0; i < 8; i++) 
                    492:     outb(0x00, ioaddr + HASH_TABLE_0 + i);
                    493: 
                    494:   /*
                    495:      Now let's disable the transmitter and receiver, set the buffer ram 
                    496:      cycle time, bus width and buffer data path width. Also we shall
                    497:      set transmit buffer size and total buffer size.
                    498:   */
                    499: 
                    500:   eth16i_select_regbank(2, ioaddr);
                    501: 
                    502:   node_byte = 0;
                    503:   node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG);
                    504: 
                    505:   if( (node_w & 0xFF00) == 0x0800)
                    506:     node_byte |= BUFFER_WIDTH_8;
                    507: 
                    508:   node_byte |= BS1;
                    509: 
                    510:   if( (node_w & 0x00FF) == 64)
                    511:     node_byte |= BS0;
                    512:   
                    513:   node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2);
                    514: 
                    515:   outb(node_byte, ioaddr + CONFIG_REG_0);
                    516: 
                    517:   /* We shall halt the transmitting, if 16 collisions are detected */
                    518:   outb(RETRANS_AND_HALT_ON_16, ioaddr + COL_16_REG);
                    519: 
                    520:   if(boot) /* Now set port type */
                    521:   {
                    522:     char *porttype[] = {"BNC", "DIX", "TP", "AUTO"};
                    523:     
                    524:     ushort ptype = eth16i_read_eeprom(ioaddr, E_PORT_SELECT);
                    525:     dev->if_port = (ptype & 0x00FF);
                    526:     
                    527:     printk(" %s interface.\n", porttype[dev->if_port]);
                    528: 
                    529:     if(ptype == E_PORT_AUTO)
                    530:       ptype = eth16i_probe_port(ioaddr);
                    531:     
                    532:     eth16i_set_port(ioaddr, ptype);
                    533:   }
                    534: 
                    535:   /* Set Receive Mode to normal operation */
                    536:   outb(MODE_2, ioaddr + RECEIVE_MODE_REG);
                    537: }
                    538: 
                    539: static int eth16i_probe_port(short ioaddr)
                    540: {
                    541:   int i;
                    542:   int retcode;
                    543:   unsigned char dummy_packet[64] = { 0 };
                    544: 
                    545:   /* Powerup the chip */
                    546:   outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
                    547: 
                    548:   BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
                    549: 
                    550:   eth16i_select_regbank(NODE_ID_RB, ioaddr);
                    551: 
                    552:   for(i = 0; i < 6; i++) {
                    553:     dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i);
                    554:     dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i);
                    555:   }
                    556: 
                    557:   dummy_packet[12] = 0x00;
                    558:   dummy_packet[13] = 0x04;
                    559: 
                    560:   eth16i_select_regbank(2, ioaddr);
                    561: 
                    562:   for(i = 0; i < 3; i++) {
                    563:     BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
                    564:     BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
                    565:     eth16i_set_port(ioaddr, i);
                    566:    
                    567:     if(eth16i_debug > 1)
                    568:        printk("Set port number %d\n", i);
                    569: 
                    570:     retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64);
                    571:     if(retcode == 0) {
                    572:       retcode = eth16i_receive_probe_packet(ioaddr);
                    573:       if(retcode != -1) {
                    574:        if(eth16i_debug > 1)
                    575:                printk("Eth16i interface port found at %d\n", i);
                    576:        return i;
                    577:       }
                    578:     }
                    579:     else {
                    580:       if(eth16i_debug > 1)
                    581:        printk("TRANSMIT_DONE timeout\n");
                    582:     }
                    583:   }
                    584:   
                    585:   if( eth16i_debug > 1)
                    586:        printk("Using default port\n");
                    587:  
                    588:  return E_PORT_BNC;
                    589: }
                    590: 
                    591: static void eth16i_set_port(short ioaddr, int porttype)
                    592: { 
                    593:     unsigned short temp = 0;
                    594: 
                    595:     eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
                    596:     outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG);
                    597: 
                    598:     temp |= DIS_AUTO_PORT_SEL;
                    599: 
                    600:     switch(porttype) {
                    601: 
                    602:     case E_PORT_BNC :
                    603:       temp |= AUI_SELECT;
                    604:       break;
                    605: 
                    606:     case E_PORT_TP :
                    607:       break;
                    608:       
                    609:     case E_PORT_DIX :
                    610:       temp |= AUI_SELECT;
                    611:       BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT);
                    612:       break;
                    613:     }  
                    614:     outb(temp, ioaddr + TRANSCEIVER_MODE_REG);
                    615: 
                    616:     if(eth16i_debug > 1) {
                    617:        printk("TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG));
                    618:        printk("TRANSCEIVER_MODE_REG = %x\n", inb(ioaddr+TRANSCEIVER_MODE_REG));
                    619:     }
                    620: }
                    621: 
                    622: static int eth16i_send_probe_packet(short ioaddr, unsigned char *b, int l)
                    623: {
                    624:   int starttime;
                    625: 
                    626:   outb(0xff, ioaddr + TX_STATUS_REG);
                    627: 
                    628:   outw(l, ioaddr + DATAPORT);
                    629:   outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1);  
                    630:   
                    631:   starttime = jiffies;
                    632:   outb(TX_START | 1, ioaddr + TRANSMIT_START_REG); 
                    633: 
                    634:   while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
                    635:     if( (jiffies - starttime) > TIMEOUT_TICKS) {
                    636:       break;
                    637:     }
                    638:   }
                    639:   
                    640:   return(0);
                    641: }
                    642: 
                    643: static int eth16i_receive_probe_packet(short ioaddr)
                    644: {
                    645:   int starttime;
                    646:   
                    647:   starttime = jiffies;
                    648:   
                    649:   while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
                    650:     if( (jiffies - starttime) > TIMEOUT_TICKS) {
                    651:       
                    652:       if(eth16i_debug > 1)
                    653:        printk("Timeout occured waiting transmit packet received\n");
                    654:       starttime = jiffies;
                    655:       while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
                    656:        if( (jiffies - starttime) > TIMEOUT_TICKS) {
                    657:        if(eth16i_debug > 1)
                    658:          printk("Timeout occured waiting receive packet\n");
                    659:         return -1;
                    660:         }
                    661:       }
                    662:       
                    663:       if(eth16i_debug > 1)
                    664:        printk("RECEIVE_PACKET\n");
                    665:       return(0); /* Found receive packet */
                    666:     }
                    667:   }
                    668: 
                    669:   if(eth16i_debug > 1) {
                    670:        printk("TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG));
                    671:        printk("RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG));
                    672:   }
                    673: 
                    674:   return(0); /* Return success */
                    675: }
                    676: 
                    677: static int eth16i_get_irq(short ioaddr)
                    678: {
                    679:   unsigned char cbyte;
                    680:   
                    681:   if( ioaddr < 0x1000) {
                    682:        cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
                    683:        return( eth16i_irqmap[ ((cbyte & 0xC0) >> 6) ] );
                    684:   } else {  /* Oh..the card is EISA so method getting IRQ different */
                    685:        unsigned short index = 0;
                    686:        cbyte = inb(ioaddr + EISA_IRQ_REG);
                    687:        while( (cbyte & 0x01) == 0) {
                    688:                cbyte = cbyte >> 1;
                    689:                index++;
                    690:         }
                    691:        return( eth32i_irqmap[ index ] );
                    692:   }
                    693: }
                    694: 
                    695: static int eth16i_check_signature(short ioaddr)
                    696: {
                    697:   int i;
                    698:   unsigned char creg[4] = { 0 };
                    699:   
                    700:   for(i = 0; i < 4 ; i++) {
                    701: 
                    702:     creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i);
                    703:   
                    704:     if(eth16i_debug > 1)
                    705:        printk("eth16i: read signature byte %x at %x\n", creg[i],
                    706:               ioaddr + TRANSMIT_MODE_REG + i);
                    707:   }
                    708: 
                    709:   creg[0] &= 0x0F;      /* Mask collision cnr */
                    710:   creg[2] &= 0x7F;      /* Mask DCLEN bit */
                    711: 
                    712: #ifdef 0
                    713: /* 
                    714:        This was removed because the card was sometimes left to state
                    715:        from which it couldn't be find anymore. If there is need
                    716:        to more strict chech still this have to be fixed.
                    717: */
                    718:   if( !( (creg[0] == 0x06) && (creg[1] == 0x41)) ) {
                    719:     if(creg[1] != 0x42)
                    720:       return -1;
                    721:   }
                    722: #endif
                    723: 
                    724:   if( !( (creg[2] == 0x36) && (creg[3] == 0xE0)) ) {
                    725:       creg[2] &= 0x42;
                    726:       creg[3] &= 0x03;
                    727: 
                    728:       if( !( (creg[2] == 0x42) && (creg[3] == 0x00)) )
                    729:        return -1;
                    730:   }
                    731: 
                    732:   if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0)
                    733:     return -1;
                    734:   if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00)
                    735:     return -1;
                    736: 
                    737:   return 0;
                    738: }
                    739: 
                    740: static int eth16i_read_eeprom(int ioaddr, int offset)
                    741: {
                    742:   int data = 0;
                    743: 
                    744:   eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset);
                    745:   outb(CS_1, ioaddr + EEPROM_CTRL_REG);
                    746:   data = eth16i_read_eeprom_word(ioaddr);
                    747:   outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
                    748: 
                    749:   return(data);  
                    750: }
                    751: 
                    752: static int eth16i_read_eeprom_word(int ioaddr)
                    753: {
                    754:   int i;
                    755:   int data = 0;
                    756: 
                    757:   for(i = 16; i > 0; i--) {
                    758:     outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
                    759:     eeprom_slow_io();
                    760:     outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
                    761:     eeprom_slow_io();
                    762:     data = (data << 1) | ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0);
                    763:     eeprom_slow_io();
                    764:   }
                    765: 
                    766:   return(data);
                    767: }
                    768: 
                    769: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command)
                    770: {
                    771:   int i;
                    772:   
                    773:   outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
                    774:   outb(DI_0, ioaddr + EEPROM_DATA_REG);
                    775:   outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
                    776:   outb(DI_1, ioaddr + EEPROM_DATA_REG);
                    777:   outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
                    778: 
                    779:   for(i = 7; i >= 0; i--) {
                    780:     short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 );
                    781:     outb(cmd, ioaddr + EEPROM_DATA_REG);
                    782:     outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
                    783:     eeprom_slow_io();
                    784:     outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
                    785:     eeprom_slow_io();
                    786:   } 
                    787: }
                    788: 
                    789: static int eth16i_open(struct device *dev)
                    790: {
                    791:   struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
                    792:   int ioaddr = dev->base_addr;
                    793:   
                    794:   irq2dev_map[dev->irq] = dev;
                    795: 
                    796:   /* Powerup the chip */
                    797:   outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
                    798:   
                    799:   /* Initialize the chip */
                    800:   eth16i_initialize(dev);  
                    801:   
                    802:   /* Set the transmit buffer size */
                    803:   lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
                    804:   
                    805:   if(eth16i_debug > 3)
                    806:     printk("%s: transmit buffer size %d\n", dev->name, lp->tx_buf_size);
                    807: 
                    808:   /* Now enable Transmitter and Receiver sections */
                    809:   BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
                    810:  
                    811:   /* Now switch to register bank 2, for run time operation */
                    812:   eth16i_select_regbank(2, ioaddr);
                    813: 
                    814:   lp->open_time = jiffies;
                    815:   lp->tx_started = 0;
                    816:   lp->tx_queue = 0;
                    817:   lp->tx_queue_len = 0;
                    818: 
                    819:   /* Turn on interrupts*/
                    820:   outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);  
                    821: 
                    822:   dev->tbusy = 0;
                    823:   dev->interrupt = 0;
                    824:   dev->start = 1;
                    825: 
                    826: #ifdef MODULE
                    827:   MOD_INC_USE_COUNT;
                    828: #endif
                    829: 
                    830:   return 0;
                    831: }
                    832: 
                    833: static int eth16i_close(struct device *dev)
                    834: {
                    835:   struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
                    836:   int ioaddr = dev->base_addr;
                    837: 
                    838:   lp->open_time = 0;
                    839: 
                    840:   dev->tbusy = 1;
                    841:   dev->start = 0;
                    842: 
                    843:   /* Disable transmit and receive */
                    844:   BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
                    845: 
                    846:   /* Reset the chip */
                    847:   outb(0xff, ioaddr + RESET);
                    848: 
                    849:   /* Save some energy by switching off power */
                    850:   BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
                    851: 
                    852: #ifdef MODULE
                    853:   MOD_DEC_USE_COUNT;
                    854: #endif
                    855: 
                    856:   return 0;
                    857: }
                    858: 
                    859: static int eth16i_tx(struct sk_buff *skb, struct device *dev)
                    860: {
                    861:   struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
                    862:   int ioaddr = dev->base_addr;
                    863: 
                    864:   if(dev->tbusy) {
                    865:     /* 
                    866:        If we get here, some higher level has decided that we are broken. 
                    867:        There should really be a "kick me" function call instead. 
                    868:     */
                    869:     
                    870:     int tickssofar = jiffies - dev->trans_start;
                    871:     if(tickssofar < TIMEOUT_TICKS)  /* Let's not rush with our timeout, */  
                    872:       return 1;                     /* wait a couple of ticks first     */
                    873: 
                    874:     printk("%s: transmit timed out with status %04x, %s ?\n", dev->name,
                    875:           inw(ioaddr + TX_STATUS_REG), 
                    876:           (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ? 
                    877:           "IRQ conflict" : "network cable problem");
                    878: 
                    879:     /* Let's dump all registers */
                    880:     if(eth16i_debug > 0) { 
                    881:       printk("%s: timeout regs: %02x %02x %02x %02x %02x %02x %02x %02x.\n",
                    882:             dev->name, inb(ioaddr + 0), inb(ioaddr + 1), inb(ioaddr + 2), 
                    883:             inb(ioaddr + 3), inb(ioaddr + 4), inb(ioaddr + 5),
                    884:             inb(ioaddr + 6), inb(ioaddr + 7));
                    885: 
                    886: 
                    887:       printk("lp->tx_queue = %d\n", lp->tx_queue);
                    888:       printk("lp->tx_queue_len = %d\n", lp->tx_queue_len);
                    889:       printk("lp->tx_started = %d\n", lp->tx_started);
                    890: 
                    891:     }
                    892: 
                    893:     lp->stats.tx_errors++;
                    894: 
                    895:     /* Now let's try to restart the adaptor */
                    896:     
                    897:     BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
                    898:     outw(0xffff, ioaddr + RESET);
                    899:     eth16i_initialize(dev);
                    900:     outw(0xffff, ioaddr + TX_STATUS_REG);
                    901:     BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
                    902:             
                    903:     lp->tx_started = 0;
                    904:     lp->tx_queue = 0;
                    905:     lp->tx_queue_len = 0;
                    906:     
                    907:     outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
                    908:     
                    909:     dev->tbusy = 0;
                    910:     dev->trans_start = jiffies;
                    911:   }
                    912: 
                    913:   /* 
                    914:      If some higher layer thinks we've missed an tx-done interrupt
                    915:      we are passed NULL. Caution: dev_tint() handles the cli()/sti()
                    916:      itself 
                    917:   */
                    918:   if(skb == NULL) {
                    919:     dev_tint(dev);
                    920:     return 0;
                    921:   }
                    922: 
                    923:   /* Block a timer based transmitter from overlapping. This could better be
                    924:      done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
                    925: 
                    926:   /* Turn off TX interrupts */
                    927:   outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
                    928: 
                    929:   if(set_bit(0, (void *)&dev->tbusy) != 0)
                    930:     printk("%s: Transmitter access conflict.\n", dev->name);
                    931:   else {
                    932:     short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
                    933:     unsigned char *buf = skb->data;
                    934:   
                    935:     outw(length, ioaddr + DATAPORT);
                    936:     
                    937:     if( ioaddr < 0x1000 ) 
                    938:        outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
                    939:     else {
                    940:        unsigned char frag = length % 4;
                    941: 
                    942:        outsl(ioaddr + DATAPORT, buf, length >> 2);
                    943:        
                    944:        if( frag != 0 ) {
                    945:          outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1);
                    946:          if( frag == 3 ) 
                    947:            outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC) + 2), 1);
                    948:        }
                    949:     }
                    950: 
                    951:     lp->tx_queue++;
                    952:     lp->tx_queue_len += length + 2;
                    953: 
                    954:     if(lp->tx_started == 0) {
                    955:       /* If the transmitter is idle..always trigger a transmit */
                    956:       outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
                    957:       lp->tx_queue = 0;
                    958:       lp->tx_queue_len = 0;
                    959:       dev->trans_start = jiffies;
                    960:       lp->tx_started = 1;
                    961:       dev->tbusy = 0;
                    962:     }
                    963:     else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
                    964:       /* There is still more room for one more packet in tx buffer */
                    965:       dev->tbusy = 0;
                    966:     }
                    967:         
                    968:     outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
                    969: 
                    970:     /* Turn TX interrupts back on */
                    971:     /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */
                    972:   } 
                    973:   dev_kfree_skb(skb, FREE_WRITE);
                    974: 
                    975:   return 0;
                    976: }
                    977: 
                    978: static void eth16i_rx(struct device *dev)
                    979: {
                    980:   struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
                    981:   int ioaddr = dev->base_addr;
                    982:   int boguscount = MAX_RX_LOOP;
                    983: 
                    984:   /* Loop until all packets have been read */
                    985:   while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) {
                    986:     
                    987:     /* Read status byte from receive buffer */ 
                    988:     ushort status = inw(ioaddr + DATAPORT);
                    989: 
                    990:     if(eth16i_debug > 4)
                    991:       printk("%s: Receiving packet mode %02x status %04x.\n", 
                    992:             dev->name, inb(ioaddr + RECEIVE_MODE_REG), status);
                    993:   
                    994:       if( !(status & PKT_GOOD) ) {
                    995:        /* Hmm..something went wrong. Let's check what error occured */
                    996:        lp->stats.rx_errors++;
                    997:        if( status & PKT_SHORT     ) lp->stats.rx_length_errors++;
                    998:        if( status & PKT_ALIGN_ERR ) lp->stats.rx_frame_errors++;
                    999:        if( status & PKT_CRC_ERR   ) lp->stats.rx_crc_errors++;
                   1000:        if( status & PKT_RX_BUF_OVERFLOW) lp->stats.rx_over_errors++;
                   1001:       }
                   1002:       else {   /* Ok so now we should have a good packet */
                   1003:        struct sk_buff *skb;
                   1004: 
                   1005:        /* Get the size of the packet from receive buffer */
                   1006:        ushort pkt_len = inw(ioaddr + DATAPORT);
                   1007: 
                   1008:        if(pkt_len > ETH_FRAME_LEN) {
                   1009:          printk("%s: %s claimed a very large packet, size of %d bytes.\n", 
                   1010:                 dev->name, cardname, pkt_len);
                   1011:          outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
                   1012:          lp->stats.rx_dropped++;
                   1013:          break;
                   1014:        }
                   1015: 
                   1016:        skb = dev_alloc_skb(pkt_len + 3);
                   1017:        if( skb == NULL ) {
                   1018:          printk("%s: Could'n allocate memory for packet (len %d)\n", 
                   1019:                 dev->name, pkt_len);
                   1020:          outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
                   1021:          lp->stats.rx_dropped++;
                   1022:          break;
                   1023:        }
                   1024:        
                   1025:        skb->dev = dev;
                   1026:        skb_reserve(skb,2);
                   1027:        /* 
                   1028:           Now let's get the packet out of buffer.
                   1029:           size is (pkt_len + 1) >> 1, cause we are now reading words
                   1030:           and it have to be even aligned.
                   1031:        */ 
                   1032: 
                   1033:        if( ioaddr < 0x1000) 
                   1034:          insw(ioaddr + DATAPORT, skb_put(skb, pkt_len), (pkt_len + 1) >> 1);
                   1035:        else {  
                   1036:          unsigned char *buf = skb_put(skb, pkt_len);
                   1037:          unsigned char frag = pkt_len % 4;
                   1038: 
                   1039:          insl(ioaddr + DATAPORT, buf, pkt_len >> 2);
                   1040:        
                   1041:          if(frag != 0) {
                   1042:                unsigned short rest[2];
                   1043:                rest[0] = inw( ioaddr + DATAPORT );
                   1044:                if(frag == 3)
                   1045:                        rest[1] = inw( ioaddr + DATAPORT );
                   1046: 
                   1047:                memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag);
                   1048:          }
                   1049:        }
                   1050:        
                   1051:         skb->protocol=eth_type_trans(skb, dev);
                   1052:        netif_rx(skb);
                   1053:        lp->stats.rx_packets++;
                   1054:          
                   1055:        if( eth16i_debug > 5 ) {
                   1056:          int i;
                   1057:          printk("%s: Received packet of length %d.\n", dev->name, pkt_len);
                   1058:          for(i = 0; i < 14; i++) 
                   1059:            printk(" %02x", skb->data[i]);
                   1060:          printk(".\n");
                   1061:        }
                   1062:        
                   1063:       } /* else */
                   1064: 
                   1065:     if(--boguscount <= 0)
                   1066:       break;
                   1067: 
                   1068:   } /* while */
                   1069: 
                   1070: #if 0
                   1071:   {
                   1072:     int i;
                   1073: 
                   1074:     for(i = 0; i < 20; i++) {
                   1075:       if( (inb(ioaddr+RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == RX_BUFFER_EMPTY)
                   1076:        break;
                   1077:       inw(ioaddr + DATAPORT);
                   1078:       outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
                   1079:     }
                   1080: 
                   1081:     if(eth16i_debug > 1)
                   1082:       printk("%s: Flushed receive buffer.\n", dev->name);
                   1083:   }
                   1084: #endif
                   1085: 
                   1086:   return;
                   1087: }
                   1088: 
                   1089: static void eth16i_interrupt(int irq, struct pt_regs *regs)
                   1090: {
                   1091:   struct device *dev = (struct device *)(irq2dev_map[irq]);
                   1092:   struct eth16i_local *lp;
                   1093:   int ioaddr = 0,
                   1094:       status;
                   1095: 
                   1096:   if(dev == NULL) {
                   1097:     printk("eth16i_interrupt(): irq %d for unknown device. \n", irq);
                   1098:     return;
                   1099:   }
                   1100: 
                   1101:   /* Turn off all interrupts from adapter */
                   1102:   outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); 
                   1103: 
                   1104:   dev->interrupt = 1;
                   1105: 
                   1106:   ioaddr = dev->base_addr;
                   1107:   lp = (struct eth16i_local *)dev->priv;
                   1108:   status = inw(ioaddr + TX_STATUS_REG);      /* Get the status */
                   1109:   outw(status, ioaddr + TX_STATUS_REG);      /* Clear status bits */
                   1110:   
                   1111:   if(eth16i_debug > 3)
                   1112:     printk("%s: Interrupt with status %04x.\n", dev->name, status);
                   1113: 
                   1114:   if( status & 0x00ff ) {          /* Let's check the transmit status reg */
                   1115:     
                   1116:     if(status & TX_DONE) {         /* The transmit has been done */
                   1117:       lp->stats.tx_packets++;
                   1118: 
                   1119:       if(lp->tx_queue) {           /* Is there still packets ? */
                   1120:          /* There was packet(s) so start transmitting and write also
                   1121:           how many packets there is to be sended */
                   1122:        outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
                   1123:        lp->tx_queue = 0;
                   1124:        lp->tx_queue_len = 0;
                   1125:        dev->trans_start = jiffies;
                   1126:        dev->tbusy = 0;
                   1127:        mark_bh(NET_BH);
                   1128:       }
                   1129:       else {
                   1130:        lp->tx_started = 0;
                   1131:        dev->tbusy = 0;
                   1132:        mark_bh(NET_BH);
                   1133:       }
                   1134:     }
                   1135:   }
                   1136:     
                   1137:   if( ( status & 0xff00 ) || 
                   1138:      ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) {
                   1139:     eth16i_rx(dev);  /* We have packet in receive buffer */
                   1140:   }
                   1141: 
                   1142:   dev->interrupt = 0;
                   1143:   
                   1144:   /* Turn interrupts back on */
                   1145:   outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
                   1146: 
                   1147:   return;
                   1148: }
                   1149: 
                   1150: static void eth16i_multicast(struct device *dev, int num_addrs, void *addrs)
                   1151: {
                   1152:   short ioaddr = dev->base_addr;
                   1153:   
                   1154:   if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) 
                   1155:   {
                   1156:     dev->flags|=IFF_PROMISC;   /* Must do this */
                   1157:     outb(3, ioaddr + RECEIVE_MODE_REG);    
                   1158:   } else {
                   1159:     outb(2, ioaddr + RECEIVE_MODE_REG);
                   1160:   }
                   1161: }
                   1162: 
                   1163: static struct enet_statistics *eth16i_get_stats(struct device *dev)
                   1164: {
                   1165:   struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
                   1166: 
                   1167:   return &lp->stats;
                   1168: }
                   1169: 
                   1170: static void eth16i_select_regbank(unsigned char banknbr, short ioaddr)
                   1171: {
                   1172:   unsigned char data;
                   1173: 
                   1174:   data = inb(ioaddr + CONFIG_REG_1);
                   1175:   outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1); 
                   1176: }
                   1177: 
                   1178: #ifdef MODULE
                   1179: static char devicename[9] = { 0, };
                   1180: static struct device dev_eth16i = {
                   1181:        devicename,
                   1182:        0, 0, 0, 0,
                   1183:        0, 0,
                   1184:        0, 0, 0, NULL, eth16i_probe };
                   1185: 
                   1186: int io = 0x2a0;
                   1187: int irq = 0;
                   1188: 
                   1189: int init_module(void)
                   1190: {
                   1191:        if(io == 0)
                   1192:                printk("eth16i: You should not use auto-probing with insmod!\n");
                   1193:        
                   1194:        dev_eth16i.base_addr = io;
                   1195:        dev_eth16i.irq = irq;
                   1196:        if( register_netdev( &dev_eth16i ) != 0 ) {
                   1197:                printk("eth16i: register_netdev() returned non-zero.\n");
                   1198:                return -EIO;
                   1199:        }
                   1200: 
                   1201:        return 0;
                   1202: }
                   1203: 
                   1204: void cleanup_module(void)
                   1205: {
                   1206:        unregister_netdev( &dev_eth16i );
                   1207:        free_irq( dev_eth16i.irq );
                   1208:        irq2dev_map[ dev_eth16i.irq ] = NULL;
                   1209:        release_region( dev_eth16i.base_addr, ETH16I_IO_EXTENT );
                   1210: }
                   1211: 
                   1212: #endif /* MODULE */
                   1213: 
                   1214: 

unix.superglobalmegacorp.com

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