linux/drivers/net/eth16i.c
<<
>>
Prefs
   1/* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux
   2
   3   Written 1994-1999 by Mika Kuoppala
   4
   5   Copyright (C) 1994-1999 by Mika Kuoppala
   6   Based on skeleton.c and heavily on at1700.c by Donald Becker
   7
   8   This software may be used and distributed according to the terms
   9   of the GNU General Public License, incorporated herein by reference.
  10
  11   The author may be reached as miku@iki.fi
  12
  13   This driver supports following cards :
  14        - ICL EtherTeam 16i
  15        - ICL EtherTeam 32 EISA
  16          (Uses true 32 bit transfers rather than 16i compability mode)
  17
  18   Example Module usage:
  19        insmod eth16i.o io=0x2a0 mediatype=bnc
  20
  21        mediatype can be one of the following: bnc,tp,dix,auto,eprom
  22
  23        'auto' will try to autoprobe mediatype.
  24        'eprom' will use whatever type defined in eprom.
  25
  26   I have benchmarked driver with PII/300Mhz as a ftp client
  27   and 486/33Mhz as a ftp server. Top speed was 1128.37 kilobytes/sec.
  28
  29   Sources:
  30     - skeleton.c  a sample network driver core for linux,
  31       written by Donald Becker <becker@scyld.com>
  32     - at1700.c a driver for Allied Telesis AT1700, written
  33       by Donald Becker.
  34     - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i
  35       written by Markku Viima
  36     - The Fujitsu MB86965 databook.
  37
  38   Author thanks following persons due to their valueble assistance:
  39        Markku Viima (ICL)
  40        Ari Valve (ICL)
  41        Donald Becker
  42        Kurt Huwig <kurt@huwig.de>
  43
  44   Revision history:
  45
  46   Version      Date            Description
  47
  48   0.01         15.12-94        Initial version (card detection)
  49   0.02         23.01-95        Interrupt is now hooked correctly
  50   0.03         01.02-95        Rewrote initialization part
  51   0.04         07.02-95        Base skeleton done...
  52                                Made a few changes to signature checking
  53                                to make it a bit reliable.
  54                                - fixed bug in tx_buf mapping
  55                                - fixed bug in initialization (DLC_EN
  56                                  wasn't enabled when initialization
  57                                  was done.)
  58   0.05         08.02-95        If there were more than one packet to send,
  59                                transmit was jammed due to invalid
  60                                register write...now fixed
  61   0.06         19.02-95        Rewrote interrupt handling
  62   0.07         13.04-95        Wrote EEPROM read routines
  63                                Card configuration now set according to
  64                                data read from EEPROM
  65   0.08         23.06-95        Wrote part that tries to probe used interface
  66                                port if AUTO is selected
  67
  68   0.09         01.09-95        Added module support
  69
  70   0.10         04.09-95        Fixed receive packet allocation to work
  71                                with kernels > 1.3.x
  72
  73   0.20         20.09-95        Added support for EtherTeam32 EISA
  74
  75   0.21         17.10-95        Removed the unnecessary extern
  76                                init_etherdev() declaration. Some
  77                                other cleanups.
  78
  79   0.22         22.02-96        Receive buffer was not flushed
  80                                correctly when faulty packet was
  81                                received. Now fixed.
  82
  83   0.23         26.02-96        Made resetting the adapter
  84                                more reliable.
  85
  86   0.24         27.02-96        Rewrote faulty packet handling in eth16i_rx
  87
  88   0.25         22.05-96        kfree() was missing from cleanup_module.
  89
  90   0.26         11.06-96        Sometimes card was not found by
  91                                check_signature(). Now made more reliable.
  92
  93   0.27         23.06-96        Oops. 16 consecutive collisions halted
  94                                adapter. Now will try to retransmit
  95                                MAX_COL_16 times before finally giving up.
  96
  97   0.28         28.10-97        Added dev_id parameter (NULL) for free_irq
  98
  99   0.29         29.10-97        Multiple card support for module users
 100
 101   0.30         30.10-97        Fixed irq allocation bug.
 102                                (request_irq moved from probe to open)
 103
 104   0.30a        21.08-98        Card detection made more relaxed. Driver
 105                                had problems with some TCP/IP-PROM boots
 106                                to find the card. Suggested by
 107                                Kurt Huwig <kurt@huwig.de>
 108
 109   0.31         28.08-98        Media interface port can now be selected
 110                                with module parameters or kernel
 111                                boot parameters.
 112
 113   0.32         31.08-98        IRQ was never freed if open/close
 114                                pair wasn't called. Now fixed.
 115
 116   0.33         10.09-98        When eth16i_open() was called after
 117                                eth16i_close() chip never recovered.
 118                                Now more shallow reset is made on
 119                                close.
 120
 121   0.34         29.06-99        Fixed one bad #ifdef.
 122                                Changed ioaddr -> io for consistency
 123
 124   0.35         01.07-99        transmit,-receive bytes were never
 125                                updated in stats.
 126
 127   Bugs:
 128        In some cases the media interface autoprobing code doesn't find
 129        the correct interface type. In this case you can
 130        manually choose the interface type in DOS with E16IC.EXE which is
 131        configuration software for EtherTeam16i and EtherTeam32 cards.
 132        This is also true for IRQ setting. You cannot use module
 133        parameter to configure IRQ of the card (yet).
 134
 135   To do:
 136        - Real multicast support
 137        - Rewrite the media interface autoprobing code. Its _horrible_ !
 138        - Possibly merge all the MB86965 specific code to external
 139          module for use by eth16.c and Donald's at1700.c
 140        - IRQ configuration with module parameter. I will do
 141          this when i will get enough info about setting
 142          irq without configuration utility.
 143*/
 144
 145static char *version =
 146    "eth16i.c: v0.35 01-Jul-1999 Mika Kuoppala (miku@iki.fi)\n";
 147
 148#include <linux/module.h>
 149#include <linux/kernel.h>
 150#include <linux/types.h>
 151#include <linux/fcntl.h>
 152#include <linux/interrupt.h>
 153#include <linux/ioport.h>
 154#include <linux/in.h>
 155#include <linux/slab.h>
 156#include <linux/string.h>
 157#include <linux/errno.h>
 158#include <linux/init.h>
 159#include <linux/spinlock.h>
 160#include <linux/netdevice.h>
 161#include <linux/etherdevice.h>
 162#include <linux/skbuff.h>
 163#include <linux/bitops.h>
 164#include <linux/jiffies.h>
 165#include <linux/io.h>
 166
 167#include <asm/system.h>
 168#include <asm/dma.h>
 169
 170
 171
 172/* Few macros */
 173#define BITSET(ioaddr, bnum)   ((outb(((inb(ioaddr)) | (bnum)), ioaddr)))
 174#define BITCLR(ioaddr, bnum)   ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr)))
 175
 176/* This is the I/O address space for Etherteam 16i adapter. */
 177#define ETH16I_IO_EXTENT       32
 178
 179/* Ticks before deciding that transmit has timed out */
 180#define TX_TIMEOUT             (400*HZ/1000)
 181
 182/* Maximum loop count when receiving packets */
 183#define MAX_RX_LOOP            20
 184
 185/* Some interrupt masks */
 186#define ETH16I_INTR_ON         0xef8a       /* Higher is receive mask */
 187#define ETH16I_INTR_OFF        0x0000
 188
 189/* Buffers header status byte meanings */
 190#define PKT_GOOD               BIT(5)
 191#define PKT_GOOD_RMT           BIT(4)
 192#define PKT_SHORT              BIT(3)
 193#define PKT_ALIGN_ERR          BIT(2)
 194#define PKT_CRC_ERR            BIT(1)
 195#define PKT_RX_BUF_OVERFLOW    BIT(0)
 196
 197/* Transmit status register (DLCR0) */
 198#define TX_STATUS_REG          0
 199#define TX_DONE                BIT(7)
 200#define NET_BUSY               BIT(6)
 201#define TX_PKT_RCD             BIT(5)
 202#define CR_LOST                BIT(4)
 203#define TX_JABBER_ERR          BIT(3)
 204#define COLLISION              BIT(2)
 205#define COLLISIONS_16          BIT(1)
 206
 207/* Receive status register (DLCR1) */
 208#define RX_STATUS_REG          1
 209#define RX_PKT                 BIT(7)  /* Packet received */
 210#define BUS_RD_ERR             BIT(6)
 211#define SHORT_PKT_ERR          BIT(3)
 212#define ALIGN_ERR              BIT(2)
 213#define CRC_ERR                BIT(1)
 214#define RX_BUF_OVERFLOW        BIT(0)
 215
 216/* Transmit Interrupt Enable Register (DLCR2) */
 217#define TX_INTR_REG            2
 218#define TX_INTR_DONE           BIT(7)
 219#define TX_INTR_COL            BIT(2)
 220#define TX_INTR_16_COL         BIT(1)
 221
 222/* Receive Interrupt Enable Register (DLCR3) */
 223#define RX_INTR_REG            3
 224#define RX_INTR_RECEIVE        BIT(7)
 225#define RX_INTR_SHORT_PKT      BIT(3)
 226#define RX_INTR_CRC_ERR        BIT(1)
 227#define RX_INTR_BUF_OVERFLOW   BIT(0)
 228
 229/* Transmit Mode Register (DLCR4) */
 230#define TRANSMIT_MODE_REG      4
 231#define LOOPBACK_CONTROL       BIT(1)
 232#define CONTROL_OUTPUT         BIT(2)
 233
 234/* Receive Mode Register (DLCR5) */
 235#define RECEIVE_MODE_REG       5
 236#define RX_BUFFER_EMPTY        BIT(6)
 237#define ACCEPT_BAD_PACKETS     BIT(5)
 238#define RECEIVE_SHORT_ADDR     BIT(4)
 239#define ACCEPT_SHORT_PACKETS   BIT(3)
 240#define REMOTE_RESET           BIT(2)
 241
 242#define ADDRESS_FILTER_MODE    BIT(1) | BIT(0)
 243#define REJECT_ALL             0
 244#define ACCEPT_ALL             3
 245#define MODE_1                 1            /* NODE ID, BC, MC, 2-24th bit */
 246#define MODE_2                 2            /* NODE ID, BC, MC, Hash Table */
 247
 248/* Configuration Register 0 (DLCR6) */
 249#define CONFIG_REG_0           6
 250#define DLC_EN                 BIT(7)
 251#define SRAM_CYCLE_TIME_100NS  BIT(6)
 252#define SYSTEM_BUS_WIDTH_8     BIT(5)       /* 1 = 8bit, 0 = 16bit */
 253#define BUFFER_WIDTH_8         BIT(4)       /* 1 = 8bit, 0 = 16bit */
 254#define TBS1                   BIT(3)
 255#define TBS0                   BIT(2)
 256#define SRAM_BS1               BIT(1)       /* 00=8kb,  01=16kb  */
 257#define SRAM_BS0               BIT(0)       /* 10=32kb, 11=64kb  */
 258
 259#ifndef ETH16I_TX_BUF_SIZE                   /* 0 = 2kb, 1 = 4kb  */
 260#define ETH16I_TX_BUF_SIZE     3             /* 2 = 8kb, 3 = 16kb */
 261#endif
 262#define TX_BUF_1x2048          0
 263#define TX_BUF_2x2048          1
 264#define TX_BUF_2x4098          2
 265#define TX_BUF_2x8192          3
 266
 267/* Configuration Register 1 (DLCR7) */
 268#define CONFIG_REG_1           7
 269#define POWERUP                BIT(5)
 270
 271/* Transmit start register */
 272#define TRANSMIT_START_REG     10
 273#define TRANSMIT_START_RB      2
 274#define TX_START               BIT(7)       /* Rest of register bit indicate*/
 275                                            /* number of packets in tx buffer*/
 276/* Node ID registers (DLCR8-13) */
 277#define NODE_ID_0              8
 278#define NODE_ID_RB             0
 279
 280/* Hash Table registers (HT8-15) */
 281#define HASH_TABLE_0           8
 282#define HASH_TABLE_RB          1
 283
 284/* Buffer memory ports */
 285#define BUFFER_MEM_PORT_LB     8
 286#define DATAPORT               BUFFER_MEM_PORT_LB
 287#define BUFFER_MEM_PORT_HB     9
 288
 289/* 16 Collision control register (BMPR11) */
 290#define COL_16_REG             11
 291#define HALT_ON_16             0x00
 292#define RETRANS_AND_HALT_ON_16 0x02
 293
 294/* Maximum number of attempts to send after 16 concecutive collisions */
 295#define MAX_COL_16             10
 296
 297/* DMA Burst and Transceiver Mode Register (BMPR13) */
 298#define TRANSCEIVER_MODE_REG   13
 299#define TRANSCEIVER_MODE_RB    2
 300#define IO_BASE_UNLOCK         BIT(7)
 301#define LOWER_SQUELCH_TRESH    BIT(6)
 302#define LINK_TEST_DISABLE      BIT(5)
 303#define AUI_SELECT             BIT(4)
 304#define DIS_AUTO_PORT_SEL      BIT(3)
 305
 306/* Filter Self Receive Register (BMPR14)  */
 307#define FILTER_SELF_RX_REG     14
 308#define SKIP_RX_PACKET         BIT(2)
 309#define FILTER_SELF_RECEIVE    BIT(0)
 310
 311/* EEPROM Control Register (BMPR 16) */
 312#define EEPROM_CTRL_REG        16
 313
 314/* EEPROM Data Register (BMPR 17) */
 315#define EEPROM_DATA_REG        17
 316
 317/* NMC93CSx6 EEPROM Control Bits */
 318#define CS_0                   0x00
 319#define CS_1                   0x20
 320#define SK_0                   0x00
 321#define SK_1                   0x40
 322#define DI_0                   0x00
 323#define DI_1                   0x80
 324
 325/* NMC93CSx6 EEPROM Instructions */
 326#define EEPROM_READ            0x80
 327
 328/* NMC93CSx6 EEPROM Addresses */
 329#define E_NODEID_0             0x02
 330#define E_NODEID_1             0x03
 331#define E_NODEID_2             0x04
 332#define E_PORT_SELECT          0x14
 333  #define E_PORT_BNC           0x00
 334  #define E_PORT_DIX           0x01
 335  #define E_PORT_TP            0x02
 336  #define E_PORT_AUTO          0x03
 337  #define E_PORT_FROM_EPROM    0x04
 338#define E_PRODUCT_CFG          0x30
 339
 340
 341/* Macro to slow down io between EEPROM clock transitions */
 342#define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { inb(0x80); }}while(0)
 343
 344/* Jumperless Configuration Register (BMPR19) */
 345#define JUMPERLESS_CONFIG      19
 346
 347/* ID ROM registers, writing to them also resets some parts of chip */
 348#define ID_ROM_0               24
 349#define ID_ROM_7               31
 350#define RESET                  ID_ROM_0
 351
 352/* This is the I/O address list to be probed when seeking the card */
 353static unsigned int eth16i_portlist[] __initdata = {
 354        0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
 355};
 356
 357static unsigned int eth32i_portlist[] __initdata = {
 358        0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000,
 359        0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0
 360};
 361
 362/* This is the Interrupt lookup table for Eth16i card */
 363static unsigned int eth16i_irqmap[] __initdata = { 9, 10, 5, 15, 0 };
 364#define NUM_OF_ISA_IRQS    4
 365
 366/* This is the Interrupt lookup table for Eth32i card */
 367static unsigned int eth32i_irqmap[] __initdata = { 3, 5, 7, 9, 10, 11, 12, 15, 0 };
 368#define EISA_IRQ_REG    0xc89
 369#define NUM_OF_EISA_IRQS   8
 370
 371static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
 372
 373/* Use 0 for production, 1 for verification, >2 for debug */
 374#ifndef ETH16I_DEBUG
 375#define ETH16I_DEBUG 0
 376#endif
 377static unsigned int eth16i_debug = ETH16I_DEBUG;
 378
 379/* Information for each board */
 380
 381struct eth16i_local {
 382        unsigned char     tx_started;
 383        unsigned char     tx_buf_busy;
 384        unsigned short    tx_queue;  /* Number of packets in transmit buffer */
 385        unsigned short    tx_queue_len;
 386        unsigned int      tx_buf_size;
 387        unsigned long     open_time;
 388        unsigned long     tx_buffered_packets;
 389        unsigned long     tx_buffered_bytes;
 390        unsigned long     col_16;
 391        spinlock_t        lock;
 392};
 393
 394/* Function prototypes */
 395
 396static int     eth16i_probe1(struct net_device *dev, int ioaddr);
 397static int     eth16i_check_signature(int ioaddr);
 398static int     eth16i_probe_port(int ioaddr);
 399static void    eth16i_set_port(int ioaddr, int porttype);
 400static int     eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l);
 401static int     eth16i_receive_probe_packet(int ioaddr);
 402static int     eth16i_get_irq(int ioaddr);
 403static int     eth16i_read_eeprom(int ioaddr, int offset);
 404static int     eth16i_read_eeprom_word(int ioaddr);
 405static void    eth16i_eeprom_cmd(int ioaddr, unsigned char command);
 406static int     eth16i_open(struct net_device *dev);
 407static int     eth16i_close(struct net_device *dev);
 408static netdev_tx_t eth16i_tx(struct sk_buff *skb, struct net_device *dev);
 409static void    eth16i_rx(struct net_device *dev);
 410static void    eth16i_timeout(struct net_device *dev);
 411static irqreturn_t eth16i_interrupt(int irq, void *dev_id);
 412static void    eth16i_reset(struct net_device *dev);
 413static void    eth16i_timeout(struct net_device *dev);
 414static void    eth16i_skip_packet(struct net_device *dev);
 415static void    eth16i_multicast(struct net_device *dev);
 416static void    eth16i_select_regbank(unsigned char regbank, int ioaddr);
 417static void    eth16i_initialize(struct net_device *dev, int boot);
 418
 419#if 0
 420static int     eth16i_set_irq(struct net_device *dev);
 421#endif
 422
 423#ifdef MODULE
 424static ushort  eth16i_parse_mediatype(const char* s);
 425#endif
 426
 427static char cardname[] __initdata = "ICL EtherTeam 16i/32";
 428
 429static int __init do_eth16i_probe(struct net_device *dev)
 430{
 431        int i;
 432        int ioaddr;
 433        int base_addr = dev->base_addr;
 434
 435        if(eth16i_debug > 4)
 436                printk(KERN_DEBUG "Probing started for %s\n", cardname);
 437
 438        if(base_addr > 0x1ff)           /* Check only single location */
 439                return eth16i_probe1(dev, base_addr);
 440        else if(base_addr != 0)         /* Don't probe at all */
 441                return -ENXIO;
 442
 443        /* Seek card from the ISA io address space */
 444        for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++)
 445                if(eth16i_probe1(dev, ioaddr) == 0)
 446                        return 0;
 447
 448        /* Seek card from the EISA io address space */
 449        for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++)
 450                if(eth16i_probe1(dev, ioaddr) == 0)
 451                        return 0;
 452
 453        return -ENODEV;
 454}
 455
 456#ifndef MODULE
 457struct net_device * __init eth16i_probe(int unit)
 458{
 459        struct net_device *dev = alloc_etherdev(sizeof(struct eth16i_local));
 460        int err;
 461
 462        if (!dev)
 463                return ERR_PTR(-ENOMEM);
 464
 465        sprintf(dev->name, "eth%d", unit);
 466        netdev_boot_setup_check(dev);
 467
 468        err = do_eth16i_probe(dev);
 469        if (err)
 470                goto out;
 471        return dev;
 472out:
 473        free_netdev(dev);
 474        return ERR_PTR(err);
 475}
 476#endif
 477
 478static const struct net_device_ops eth16i_netdev_ops = {
 479        .ndo_open               = eth16i_open,
 480        .ndo_stop               = eth16i_close,
 481        .ndo_start_xmit         = eth16i_tx,
 482        .ndo_set_multicast_list = eth16i_multicast,
 483        .ndo_tx_timeout         = eth16i_timeout,
 484        .ndo_change_mtu         = eth_change_mtu,
 485        .ndo_set_mac_address    = eth_mac_addr,
 486        .ndo_validate_addr      = eth_validate_addr,
 487};
 488
 489static int __init eth16i_probe1(struct net_device *dev, int ioaddr)
 490{
 491        struct eth16i_local *lp = netdev_priv(dev);
 492        static unsigned version_printed;
 493        int retval;
 494
 495        /* Let's grab the region */
 496        if (!request_region(ioaddr, ETH16I_IO_EXTENT, cardname))
 497                return -EBUSY;
 498
 499        /*
 500          The MB86985 chip has on register which holds information in which
 501          io address the chip lies. First read this register and compare
 502          it to our current io address and if match then this could
 503          be our chip.
 504          */
 505
 506        if(ioaddr < 0x1000) {
 507                if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)]
 508                   != ioaddr) {
 509                        retval = -ENODEV;
 510                        goto out;
 511                }
 512        }
 513
 514        /* Now we will go a bit deeper and try to find the chip's signature */
 515
 516        if(eth16i_check_signature(ioaddr) != 0) {
 517                retval = -ENODEV;
 518                goto out;
 519        }
 520
 521        /*
 522           Now it seems that we have found a ethernet chip in this particular
 523           ioaddr. The MB86985 chip has this feature, that when you read a
 524           certain register it will increase it's io base address to next
 525           configurable slot. Now when we have found the chip, first thing is
 526           to make sure that the chip's ioaddr will hold still here.
 527           */
 528
 529        eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
 530        outb(0x00, ioaddr + TRANSCEIVER_MODE_REG);
 531
 532        outb(0x00, ioaddr + RESET);             /* Reset some parts of chip */
 533        BITSET(ioaddr + CONFIG_REG_0, BIT(7));  /* Disable the data link */
 534
 535        if( (eth16i_debug & version_printed++) == 0)
 536                printk(KERN_INFO "%s", version);
 537
 538        dev->base_addr = ioaddr;
 539        dev->irq = eth16i_get_irq(ioaddr);
 540
 541        /* Try to obtain interrupt vector */
 542
 543        if ((retval = request_irq(dev->irq, (void *)&eth16i_interrupt, 0, cardname, dev))) {
 544                printk(KERN_WARNING "%s at %#3x, but is unusable due to conflicting IRQ %d.\n",
 545                       cardname, ioaddr, dev->irq);
 546                goto out;
 547        }
 548
 549        printk(KERN_INFO "%s: %s at %#3x, IRQ %d, ",
 550               dev->name, cardname, ioaddr, dev->irq);
 551
 552
 553        /* Now we will have to lock the chip's io address */
 554        eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
 555        outb(0x38, ioaddr + TRANSCEIVER_MODE_REG);
 556
 557        eth16i_initialize(dev, 1); /* Initialize rest of the chip's registers */
 558
 559        /* Now let's same some energy by shutting down the chip ;) */
 560        BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
 561
 562        /* Initialize the device structure */
 563        dev->netdev_ops         = &eth16i_netdev_ops;
 564        dev->watchdog_timeo     = TX_TIMEOUT;
 565        spin_lock_init(&lp->lock);
 566
 567        retval = register_netdev(dev);
 568        if (retval)
 569                goto out1;
 570        return 0;
 571out1:
 572        free_irq(dev->irq, dev);
 573out:
 574        release_region(ioaddr, ETH16I_IO_EXTENT);
 575        return retval;
 576}
 577
 578
 579static void eth16i_initialize(struct net_device *dev, int boot)
 580{
 581        int ioaddr = dev->base_addr;
 582        int i, node_w = 0;
 583        unsigned char node_byte = 0;
 584
 585        /* Setup station address */
 586        eth16i_select_regbank(NODE_ID_RB, ioaddr);
 587        for(i = 0 ; i < 3 ; i++) {
 588                unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i);
 589                ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val);
 590        }
 591
 592        for(i = 0; i < 6; i++) {
 593                outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i);
 594                if(boot) {
 595                        printk("%02x", inb(ioaddr + NODE_ID_0 + i));
 596                        if(i != 5)
 597                                printk(":");
 598                }
 599        }
 600
 601        /* Now we will set multicast addresses to accept none */
 602        eth16i_select_regbank(HASH_TABLE_RB, ioaddr);
 603        for(i = 0; i < 8; i++)
 604                outb(0x00, ioaddr + HASH_TABLE_0 + i);
 605
 606        /*
 607          Now let's disable the transmitter and receiver, set the buffer ram
 608          cycle time, bus width and buffer data path width. Also we shall
 609          set transmit buffer size and total buffer size.
 610          */
 611
 612        eth16i_select_regbank(2, ioaddr);
 613
 614        node_byte = 0;
 615        node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG);
 616
 617        if( (node_w & 0xFF00) == 0x0800)
 618                node_byte |= BUFFER_WIDTH_8;
 619
 620        node_byte |= SRAM_BS1;
 621
 622        if( (node_w & 0x00FF) == 64)
 623                node_byte |= SRAM_BS0;
 624
 625        node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2);
 626
 627        outb(node_byte, ioaddr + CONFIG_REG_0);
 628
 629        /* We shall halt the transmitting, if 16 collisions are detected */
 630        outb(HALT_ON_16, ioaddr + COL_16_REG);
 631
 632#ifdef MODULE
 633        /* if_port already set by init_module() */
 634#else
 635        dev->if_port = (dev->mem_start < E_PORT_FROM_EPROM) ?
 636                dev->mem_start : E_PORT_FROM_EPROM;
 637#endif
 638
 639        /* Set interface port type */
 640        if(boot) {
 641                char *porttype[] = {"BNC", "DIX", "TP", "AUTO", "FROM_EPROM" };
 642
 643                switch(dev->if_port)
 644                {
 645
 646                case E_PORT_FROM_EPROM:
 647                        dev->if_port = eth16i_read_eeprom(ioaddr, E_PORT_SELECT);
 648                        break;
 649
 650                case E_PORT_AUTO:
 651                        dev->if_port = eth16i_probe_port(ioaddr);
 652                        break;
 653
 654                case E_PORT_BNC:
 655                case E_PORT_TP:
 656                case E_PORT_DIX:
 657                        break;
 658                }
 659
 660                printk(" %s interface.\n", porttype[dev->if_port]);
 661
 662                eth16i_set_port(ioaddr, dev->if_port);
 663        }
 664
 665        /* Set Receive Mode to normal operation */
 666        outb(MODE_2, ioaddr + RECEIVE_MODE_REG);
 667}
 668
 669static int eth16i_probe_port(int ioaddr)
 670{
 671        int i;
 672        int retcode;
 673        unsigned char dummy_packet[64];
 674
 675        /* Powerup the chip */
 676        outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
 677
 678        BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
 679
 680        eth16i_select_regbank(NODE_ID_RB, ioaddr);
 681
 682        for(i = 0; i < 6; i++) {
 683                dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i);
 684                dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i);
 685        }
 686
 687        dummy_packet[12] = 0x00;
 688        dummy_packet[13] = 0x04;
 689        memset(dummy_packet + 14, 0, sizeof(dummy_packet) - 14);
 690
 691        eth16i_select_regbank(2, ioaddr);
 692
 693        for(i = 0; i < 3; i++) {
 694                BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
 695                BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
 696                eth16i_set_port(ioaddr, i);
 697
 698                if(eth16i_debug > 1)
 699                        printk(KERN_DEBUG "Set port number %d\n", i);
 700
 701                retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64);
 702                if(retcode == 0) {
 703                        retcode = eth16i_receive_probe_packet(ioaddr);
 704                        if(retcode != -1) {
 705                                if(eth16i_debug > 1)
 706                                        printk(KERN_DEBUG "Eth16i interface port found at %d\n", i);
 707                                return i;
 708                        }
 709                }
 710                else {
 711                        if(eth16i_debug > 1)
 712                                printk(KERN_DEBUG "TRANSMIT_DONE timeout when probing interface port\n");
 713                }
 714        }
 715
 716        if( eth16i_debug > 1)
 717                printk(KERN_DEBUG "Using default port\n");
 718
 719        return E_PORT_BNC;
 720}
 721
 722static void eth16i_set_port(int ioaddr, int porttype)
 723{
 724        unsigned short temp = 0;
 725
 726        eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
 727        outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG);
 728
 729        temp |= DIS_AUTO_PORT_SEL;
 730
 731        switch(porttype) {
 732
 733        case E_PORT_BNC :
 734                temp |= AUI_SELECT;
 735                break;
 736
 737        case E_PORT_TP :
 738                break;
 739
 740        case E_PORT_DIX :
 741                temp |= AUI_SELECT;
 742                BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT);
 743                break;
 744        }
 745
 746        outb(temp, ioaddr + TRANSCEIVER_MODE_REG);
 747
 748        if(eth16i_debug > 1) {
 749                printk(KERN_DEBUG "TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG));
 750                printk(KERN_DEBUG "TRANSCEIVER_MODE_REG = %x\n",
 751                       inb(ioaddr+TRANSCEIVER_MODE_REG));
 752        }
 753}
 754
 755static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
 756{
 757        unsigned long starttime;
 758
 759        outb(0xff, ioaddr + TX_STATUS_REG);
 760
 761        outw(l, ioaddr + DATAPORT);
 762        outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1);
 763
 764        starttime = jiffies;
 765        outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
 766
 767        while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
 768                if( time_after(jiffies, starttime + TX_TIMEOUT)) {
 769                        return -1;
 770                }
 771        }
 772
 773        return 0;
 774}
 775
 776static int eth16i_receive_probe_packet(int ioaddr)
 777{
 778        unsigned long starttime;
 779
 780        starttime = jiffies;
 781
 782        while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
 783                if( time_after(jiffies, starttime + TX_TIMEOUT)) {
 784
 785                        if(eth16i_debug > 1)
 786                                printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
 787                        starttime = jiffies;
 788                        while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
 789                                if( time_after(jiffies, starttime + TX_TIMEOUT)) {
 790                                        if(eth16i_debug > 1)
 791                                                printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
 792                                        return -1;
 793                                }
 794                        }
 795
 796                        if(eth16i_debug > 1)
 797                                printk(KERN_DEBUG "RECEIVE_PACKET\n");
 798                        return(0); /* Found receive packet */
 799                }
 800        }
 801
 802        if(eth16i_debug > 1) {
 803                printk(KERN_DEBUG "TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG));
 804                printk(KERN_DEBUG "RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG));
 805        }
 806
 807        return(0); /* Return success */
 808}
 809
 810#if 0
 811static int eth16i_set_irq(struct net_device* dev)
 812{
 813        const int ioaddr = dev->base_addr;
 814        const int irq = dev->irq;
 815        int i = 0;
 816
 817        if(ioaddr < 0x1000) {
 818                while(eth16i_irqmap[i] && eth16i_irqmap[i] != irq)
 819                        i++;
 820
 821                if(i < NUM_OF_ISA_IRQS) {
 822                        u8 cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
 823                        cbyte = (cbyte & 0x3F) | (i << 6);
 824                        outb(cbyte, ioaddr + JUMPERLESS_CONFIG);
 825                        return 0;
 826                }
 827        }
 828        else {
 829                printk(KERN_NOTICE "%s: EISA Interrupt cannot be set. Use EISA Configuration utility.\n", dev->name);
 830        }
 831
 832        return -1;
 833
 834}
 835#endif
 836
 837static int __init eth16i_get_irq(int ioaddr)
 838{
 839        unsigned char cbyte;
 840
 841        if( ioaddr < 0x1000) {
 842                cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
 843                return( eth16i_irqmap[ ((cbyte & 0xC0) >> 6) ] );
 844        } else {  /* Oh..the card is EISA so method getting IRQ different */
 845                unsigned short index = 0;
 846                cbyte = inb(ioaddr + EISA_IRQ_REG);
 847                while( (cbyte & 0x01) == 0) {
 848                        cbyte = cbyte >> 1;
 849                        index++;
 850                }
 851                return( eth32i_irqmap[ index ] );
 852        }
 853}
 854
 855static int __init eth16i_check_signature(int ioaddr)
 856{
 857        int i;
 858        unsigned char creg[4] = { 0 };
 859
 860        for(i = 0; i < 4 ; i++) {
 861
 862                creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i);
 863
 864                if(eth16i_debug > 1)
 865                        printk("eth16i: read signature byte %x at %x\n",
 866                               creg[i],
 867                               ioaddr + TRANSMIT_MODE_REG + i);
 868        }
 869
 870        creg[0] &= 0x0F;      /* Mask collision cnr */
 871        creg[2] &= 0x7F;      /* Mask DCLEN bit */
 872
 873#if 0
 874        /*
 875           This was removed because the card was sometimes left to state
 876           from which it couldn't be find anymore. If there is need
 877           to more strict check still this have to be fixed.
 878           */
 879        if( ! ((creg[0] == 0x06) && (creg[1] == 0x41)) ) {
 880                if(creg[1] != 0x42)
 881                        return -1;
 882        }
 883#endif
 884
 885        if( !((creg[2] == 0x36) && (creg[3] == 0xE0)) ) {
 886                creg[2] &= 0x40;
 887                creg[3] &= 0x03;
 888
 889                if( !((creg[2] == 0x40) && (creg[3] == 0x00)) )
 890                        return -1;
 891        }
 892
 893        if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0)
 894                return -1;
 895
 896        if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00)
 897                return -1;
 898
 899        return 0;
 900}
 901
 902static int eth16i_read_eeprom(int ioaddr, int offset)
 903{
 904        int data = 0;
 905
 906        eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset);
 907        outb(CS_1, ioaddr + EEPROM_CTRL_REG);
 908        data = eth16i_read_eeprom_word(ioaddr);
 909        outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
 910
 911        return(data);
 912}
 913
 914static int eth16i_read_eeprom_word(int ioaddr)
 915{
 916        int i;
 917        int data = 0;
 918
 919        for(i = 16; i > 0; i--) {
 920                outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
 921                eeprom_slow_io();
 922                outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
 923                eeprom_slow_io();
 924                data = (data << 1) |
 925                        ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0);
 926
 927                eeprom_slow_io();
 928        }
 929
 930        return(data);
 931}
 932
 933static void eth16i_eeprom_cmd(int ioaddr, unsigned char command)
 934{
 935        int i;
 936
 937        outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
 938        outb(DI_0, ioaddr + EEPROM_DATA_REG);
 939        outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
 940        outb(DI_1, ioaddr + EEPROM_DATA_REG);
 941        outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
 942
 943        for(i = 7; i >= 0; i--) {
 944                short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 );
 945                outb(cmd, ioaddr + EEPROM_DATA_REG);
 946                outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
 947                eeprom_slow_io();
 948                outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
 949                eeprom_slow_io();
 950        }
 951}
 952
 953static int eth16i_open(struct net_device *dev)
 954{
 955        struct eth16i_local *lp = netdev_priv(dev);
 956        int ioaddr = dev->base_addr;
 957
 958        /* Powerup the chip */
 959        outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
 960
 961        /* Initialize the chip */
 962        eth16i_initialize(dev, 0);
 963
 964        /* Set the transmit buffer size */
 965        lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
 966
 967        if(eth16i_debug > 0)
 968                printk(KERN_DEBUG "%s: transmit buffer size %d\n",
 969                       dev->name, lp->tx_buf_size);
 970
 971        /* Now enable Transmitter and Receiver sections */
 972        BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
 973
 974        /* Now switch to register bank 2, for run time operation */
 975        eth16i_select_regbank(2, ioaddr);
 976
 977        lp->open_time = jiffies;
 978        lp->tx_started = 0;
 979        lp->tx_queue = 0;
 980        lp->tx_queue_len = 0;
 981
 982        /* Turn on interrupts*/
 983        outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
 984
 985        netif_start_queue(dev);
 986        return 0;
 987}
 988
 989static int eth16i_close(struct net_device *dev)
 990{
 991        struct eth16i_local *lp = netdev_priv(dev);
 992        int ioaddr = dev->base_addr;
 993
 994        eth16i_reset(dev);
 995
 996        /* Turn off interrupts*/
 997        outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
 998
 999        netif_stop_queue(dev);
1000
1001        lp->open_time = 0;
1002
1003        /* Disable transmit and receive */
1004        BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
1005
1006        /* Reset the chip */
1007        /* outb(0xff, ioaddr + RESET); */
1008        /* outw(0xffff, ioaddr + TX_STATUS_REG);    */
1009
1010        outb(0x00, ioaddr + CONFIG_REG_1);
1011
1012        return 0;
1013}
1014
1015static void eth16i_timeout(struct net_device *dev)
1016{
1017        struct eth16i_local *lp = netdev_priv(dev);
1018        int ioaddr = dev->base_addr;
1019        /*
1020           If we get here, some higher level has decided that
1021           we are broken. There should really be a "kick me"
1022           function call instead.
1023           */
1024
1025        outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1026        printk(KERN_WARNING "%s: transmit timed out with status %04x, %s ?\n",
1027               dev->name,
1028        inw(ioaddr + TX_STATUS_REG),  (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ?
1029                       "IRQ conflict" : "network cable problem");
1030
1031        dev->trans_start = jiffies;
1032
1033        /* Let's dump all registers */
1034        if(eth16i_debug > 0) {
1035                printk(KERN_DEBUG "%s: timeout: %02x %02x %02x %02x %02x %02x %02x %02x.\n",
1036                       dev->name, inb(ioaddr + 0),
1037                       inb(ioaddr + 1), inb(ioaddr + 2),
1038                       inb(ioaddr + 3), inb(ioaddr + 4),
1039                       inb(ioaddr + 5),
1040                       inb(ioaddr + 6), inb(ioaddr + 7));
1041
1042                printk(KERN_DEBUG "%s: transmit start reg: %02x. collision reg %02x\n",
1043                       dev->name, inb(ioaddr + TRANSMIT_START_REG),
1044                       inb(ioaddr + COL_16_REG));
1045                        printk(KERN_DEBUG "lp->tx_queue = %d\n", lp->tx_queue);
1046                printk(KERN_DEBUG "lp->tx_queue_len = %d\n", lp->tx_queue_len);
1047                printk(KERN_DEBUG "lp->tx_started = %d\n", lp->tx_started);
1048        }
1049        dev->stats.tx_errors++;
1050        eth16i_reset(dev);
1051        dev->trans_start = jiffies;
1052        outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1053        netif_wake_queue(dev);
1054}
1055
1056static netdev_tx_t eth16i_tx(struct sk_buff *skb, struct net_device *dev)
1057{
1058        struct eth16i_local *lp = netdev_priv(dev);
1059        int ioaddr = dev->base_addr;
1060        int status = 0;
1061        ushort length = skb->len;
1062        unsigned char *buf;
1063        unsigned long flags;
1064
1065        if (length < ETH_ZLEN) {
1066                if (skb_padto(skb, ETH_ZLEN))
1067                        return NETDEV_TX_OK;
1068                length = ETH_ZLEN;
1069        }
1070        buf = skb->data;
1071
1072        netif_stop_queue(dev);
1073
1074        /* Turn off TX interrupts */
1075        outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1076
1077        /* We would be better doing the disable_irq tricks the 3c509 does,
1078           that would make this suck a lot less */
1079
1080        spin_lock_irqsave(&lp->lock, flags);
1081
1082        if( (length + 2) > (lp->tx_buf_size - lp->tx_queue_len)) {
1083                if(eth16i_debug > 0)
1084                        printk(KERN_WARNING "%s: Transmit buffer full.\n", dev->name);
1085        }
1086        else {
1087                outw(length, ioaddr + DATAPORT);
1088
1089                if( ioaddr < 0x1000 )
1090                        outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
1091                else {
1092                        unsigned char frag = length % 4;
1093                        outsl(ioaddr + DATAPORT, buf, length >> 2);
1094                        if( frag != 0 ) {
1095                                outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1);
1096                                if( frag == 3 )
1097                                        outsw(ioaddr + DATAPORT,
1098                                              (buf + (length & 0xFFFC) + 2), 1);
1099                        }
1100                }
1101                lp->tx_buffered_packets++;
1102                lp->tx_buffered_bytes = length;
1103                lp->tx_queue++;
1104                lp->tx_queue_len += length + 2;
1105        }
1106        lp->tx_buf_busy = 0;
1107
1108        if(lp->tx_started == 0) {
1109                /* If the transmitter is idle..always trigger a transmit */
1110                outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
1111                lp->tx_queue = 0;
1112                lp->tx_queue_len = 0;
1113                dev->trans_start = jiffies;
1114                lp->tx_started = 1;
1115                netif_wake_queue(dev);
1116        }
1117        else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
1118                /* There is still more room for one more packet in tx buffer */
1119                netif_wake_queue(dev);
1120        }
1121
1122        spin_unlock_irqrestore(&lp->lock, flags);
1123
1124        outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1125        /* Turn TX interrupts back on */
1126        /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */
1127        status = 0;
1128        dev_kfree_skb(skb);
1129        return NETDEV_TX_OK;
1130}
1131
1132static void eth16i_rx(struct net_device *dev)
1133{
1134        int ioaddr = dev->base_addr;
1135        int boguscount = MAX_RX_LOOP;
1136
1137        /* Loop until all packets have been read */
1138        while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) {
1139
1140                /* Read status byte from receive buffer */
1141                ushort status = inw(ioaddr + DATAPORT);
1142
1143                /* Get the size of the packet from receive buffer */
1144                ushort pkt_len = inw(ioaddr + DATAPORT);
1145
1146                if(eth16i_debug > 4)
1147                        printk(KERN_DEBUG "%s: Receiving packet mode %02x status %04x.\n",
1148                               dev->name,
1149                               inb(ioaddr + RECEIVE_MODE_REG), status);
1150
1151                if( !(status & PKT_GOOD) ) {
1152                        dev->stats.rx_errors++;
1153
1154                        if( (pkt_len < ETH_ZLEN) || (pkt_len > ETH_FRAME_LEN) ) {
1155                                dev->stats.rx_length_errors++;
1156                                eth16i_reset(dev);
1157                                return;
1158                        }
1159                        else {
1160                                eth16i_skip_packet(dev);
1161                                dev->stats.rx_dropped++;
1162                        }
1163                }
1164                else {   /* Ok so now we should have a good packet */
1165                        struct sk_buff *skb;
1166
1167                        skb = dev_alloc_skb(pkt_len + 3);
1168                        if( skb == NULL ) {
1169                                printk(KERN_WARNING "%s: Could'n allocate memory for packet (len %d)\n",
1170                                       dev->name, pkt_len);
1171                                eth16i_skip_packet(dev);
1172                                dev->stats.rx_dropped++;
1173                                break;
1174                        }
1175
1176                        skb_reserve(skb,2);
1177
1178                        /*
1179                           Now let's get the packet out of buffer.
1180                           size is (pkt_len + 1) >> 1, cause we are now reading words
1181                           and it have to be even aligned.
1182                           */
1183
1184                        if(ioaddr < 0x1000)
1185                                insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1186                                     (pkt_len + 1) >> 1);
1187                        else {
1188                                unsigned char *buf = skb_put(skb, pkt_len);
1189                                unsigned char frag = pkt_len % 4;
1190
1191                                insl(ioaddr + DATAPORT, buf, pkt_len >> 2);
1192
1193                                if(frag != 0) {
1194                                        unsigned short rest[2];
1195                                        rest[0] = inw( ioaddr + DATAPORT );
1196                                        if(frag == 3)
1197                                                rest[1] = inw( ioaddr + DATAPORT );
1198
1199                                        memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag);
1200                                }
1201                        }
1202
1203                        skb->protocol=eth_type_trans(skb, dev);
1204
1205                        if( eth16i_debug > 5 ) {
1206                                int i;
1207                                printk(KERN_DEBUG "%s: Received packet of length %d.\n",
1208                                       dev->name, pkt_len);
1209                                for(i = 0; i < 14; i++)
1210                                        printk(KERN_DEBUG " %02x", skb->data[i]);
1211                                printk(KERN_DEBUG ".\n");
1212                        }
1213                        netif_rx(skb);
1214                        dev->stats.rx_packets++;
1215                        dev->stats.rx_bytes += pkt_len;
1216
1217                } /* else */
1218
1219                if(--boguscount <= 0)
1220                        break;
1221
1222        } /* while */
1223}
1224
1225static irqreturn_t eth16i_interrupt(int irq, void *dev_id)
1226{
1227        struct net_device *dev = dev_id;
1228        struct eth16i_local *lp;
1229        int ioaddr = 0, status;
1230        int handled = 0;
1231
1232        ioaddr = dev->base_addr;
1233        lp = netdev_priv(dev);
1234
1235        /* Turn off all interrupts from adapter */
1236        outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1237
1238        /* eth16i_tx won't be called */
1239        spin_lock(&lp->lock);
1240
1241        status = inw(ioaddr + TX_STATUS_REG);      /* Get the status */
1242        outw(status, ioaddr + TX_STATUS_REG);      /* Clear status bits */
1243
1244        if (status)
1245                handled = 1;
1246
1247        if(eth16i_debug > 3)
1248                printk(KERN_DEBUG "%s: Interrupt with status %04x.\n", dev->name, status);
1249
1250        if( status & 0x7f00 ) {
1251
1252                dev->stats.rx_errors++;
1253
1254                if(status & (BUS_RD_ERR << 8) )
1255                        printk(KERN_WARNING "%s: Bus read error.\n",dev->name);
1256                if(status & (SHORT_PKT_ERR << 8) )   dev->stats.rx_length_errors++;
1257                if(status & (ALIGN_ERR << 8) )       dev->stats.rx_frame_errors++;
1258                if(status & (CRC_ERR << 8) )        dev->stats.rx_crc_errors++;
1259                if(status & (RX_BUF_OVERFLOW << 8) ) dev->stats.rx_over_errors++;
1260        }
1261        if( status & 0x001a) {
1262
1263                dev->stats.tx_errors++;
1264
1265                if(status & CR_LOST) dev->stats.tx_carrier_errors++;
1266                if(status & TX_JABBER_ERR) dev->stats.tx_window_errors++;
1267
1268#if 0
1269                if(status & COLLISION) {
1270                        dev->stats.collisions +=
1271                                ((inb(ioaddr+TRANSMIT_MODE_REG) & 0xF0) >> 4);
1272                }
1273#endif
1274                if(status & COLLISIONS_16) {
1275                        if(lp->col_16 < MAX_COL_16) {
1276                                lp->col_16++;
1277                                dev->stats.collisions++;
1278                                /* Resume transmitting, skip failed packet */
1279                                outb(0x02, ioaddr + COL_16_REG);
1280                        }
1281                        else {
1282                                printk(KERN_WARNING "%s: bailing out due to many consecutive 16-in-a-row collisions. Network cable problem?\n", dev->name);
1283                        }
1284                }
1285        }
1286
1287        if( status & 0x00ff ) {          /* Let's check the transmit status reg */
1288
1289                if(status & TX_DONE) {         /* The transmit has been done */
1290                        dev->stats.tx_packets = lp->tx_buffered_packets;
1291                        dev->stats.tx_bytes += lp->tx_buffered_bytes;
1292                        lp->col_16 = 0;
1293
1294                        if(lp->tx_queue) {           /* Is there still packets ? */
1295                                /* There was packet(s) so start transmitting and write also
1296                                   how many packets there is to be sended */
1297                                outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
1298                                lp->tx_queue = 0;
1299                                lp->tx_queue_len = 0;
1300                                lp->tx_started = 1;
1301                        }
1302                        else {
1303                                lp->tx_started = 0;
1304                        }
1305                        netif_wake_queue(dev);
1306                }
1307        }
1308
1309        if( ( status & 0x8000 ) ||
1310            ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) {
1311                eth16i_rx(dev);  /* We have packet in receive buffer */
1312        }
1313
1314        /* Turn interrupts back on */
1315        outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1316
1317        if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
1318                /* There is still more room for one more packet in tx buffer */
1319                netif_wake_queue(dev);
1320        }
1321
1322        spin_unlock(&lp->lock);
1323
1324        return IRQ_RETVAL(handled);
1325}
1326
1327static void eth16i_skip_packet(struct net_device *dev)
1328{
1329        int ioaddr = dev->base_addr;
1330
1331        inw(ioaddr + DATAPORT);
1332        inw(ioaddr + DATAPORT);
1333        inw(ioaddr + DATAPORT);
1334
1335        outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG);
1336        while( inb( ioaddr + FILTER_SELF_RX_REG ) != 0);
1337}
1338
1339static void eth16i_reset(struct net_device *dev)
1340{
1341        struct eth16i_local *lp = netdev_priv(dev);
1342        int ioaddr = dev->base_addr;
1343
1344        if(eth16i_debug > 1)
1345                printk(KERN_DEBUG "%s: Resetting device.\n", dev->name);
1346
1347        BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
1348        outw(0xffff, ioaddr + TX_STATUS_REG);
1349        eth16i_select_regbank(2, ioaddr);
1350
1351        lp->tx_started = 0;
1352        lp->tx_buf_busy = 0;
1353        lp->tx_queue = 0;
1354        lp->tx_queue_len = 0;
1355        BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
1356}
1357
1358static void eth16i_multicast(struct net_device *dev)
1359{
1360        int ioaddr = dev->base_addr;
1361
1362        if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
1363        {
1364                outb(3, ioaddr + RECEIVE_MODE_REG);
1365        } else {
1366                outb(2, ioaddr + RECEIVE_MODE_REG);
1367        }
1368}
1369
1370static void eth16i_select_regbank(unsigned char banknbr, int ioaddr)
1371{
1372        unsigned char data;
1373
1374        data = inb(ioaddr + CONFIG_REG_1);
1375        outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1);
1376}
1377
1378#ifdef MODULE
1379
1380static ushort eth16i_parse_mediatype(const char* s)
1381{
1382        if(!s)
1383                return E_PORT_FROM_EPROM;
1384
1385        if (!strncmp(s, "bnc", 3))
1386                return E_PORT_BNC;
1387        else if (!strncmp(s, "tp", 2))
1388                return E_PORT_TP;
1389        else if (!strncmp(s, "dix", 3))
1390                return E_PORT_DIX;
1391        else if (!strncmp(s, "auto", 4))
1392                return E_PORT_AUTO;
1393        else
1394                return E_PORT_FROM_EPROM;
1395}
1396
1397#define MAX_ETH16I_CARDS 4  /* Max number of Eth16i cards per module */
1398
1399static struct net_device *dev_eth16i[MAX_ETH16I_CARDS];
1400static int io[MAX_ETH16I_CARDS];
1401#if 0
1402static int irq[MAX_ETH16I_CARDS];
1403#endif
1404static char* mediatype[MAX_ETH16I_CARDS];
1405static int debug = -1;
1406
1407MODULE_AUTHOR("Mika Kuoppala <miku@iki.fi>");
1408MODULE_DESCRIPTION("ICL EtherTeam 16i/32 driver");
1409MODULE_LICENSE("GPL");
1410
1411
1412module_param_array(io, int, NULL, 0);
1413MODULE_PARM_DESC(io, "eth16i I/O base address(es)");
1414
1415#if 0
1416module_param_array(irq, int, NULL, 0);
1417MODULE_PARM_DESC(irq, "eth16i interrupt request number");
1418#endif
1419
1420module_param_array(mediatype, charp, NULL, 0);
1421MODULE_PARM_DESC(mediatype, "eth16i media type of interface(s) (bnc,tp,dix,auto,eprom)");
1422
1423module_param(debug, int, 0);
1424MODULE_PARM_DESC(debug, "eth16i debug level (0-6)");
1425
1426int __init init_module(void)
1427{
1428        int this_dev, found = 0;
1429        struct net_device *dev;
1430
1431        for (this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
1432                dev = alloc_etherdev(sizeof(struct eth16i_local));
1433                if (!dev)
1434                        break;
1435
1436                dev->base_addr = io[this_dev];
1437
1438                if(debug != -1)
1439                        eth16i_debug = debug;
1440
1441                if(eth16i_debug > 1)
1442                        printk(KERN_NOTICE "eth16i(%d): interface type %s\n", this_dev, mediatype[this_dev] ? mediatype[this_dev] : "none" );
1443
1444                dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]);
1445
1446                if(io[this_dev] == 0) {
1447                        if(this_dev != 0) /* Only autoprobe 1st one */
1448                                break;
1449
1450                        printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n");
1451                }
1452
1453                if (do_eth16i_probe(dev) == 0) {
1454                        dev_eth16i[found++] = dev;
1455                        continue;
1456                }
1457                printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
1458                       io[this_dev]);
1459                free_netdev(dev);
1460                break;
1461        }
1462        if (found)
1463                return 0;
1464        return -ENXIO;
1465}
1466
1467void __exit cleanup_module(void)
1468{
1469        int this_dev;
1470
1471        for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
1472                struct net_device *dev = dev_eth16i[this_dev];
1473
1474                if (netdev_priv(dev)) {
1475                        unregister_netdev(dev);
1476                        free_irq(dev->irq, dev);
1477                        release_region(dev->base_addr, ETH16I_IO_EXTENT);
1478                        free_netdev(dev);
1479                }
1480        }
1481}
1482#endif /* MODULE */
1483