linux/drivers/net/ethernet/fujitsu/at1700.c
<<
>>
Prefs
   1/* at1700.c: A network device driver for  the Allied Telesis AT1700.
   2
   3        Written 1993-98 by Donald Becker.
   4
   5        Copyright 1993 United States Government as represented by the
   6        Director, National Security Agency.
   7
   8        This software may be used and distributed according to the terms
   9        of the GNU General Public License, incorporated herein by reference.
  10
  11        The author may be reached as becker@scyld.com, or C/O
  12        Scyld Computing Corporation
  13        410 Severn Ave., Suite 210
  14        Annapolis MD 21403
  15
  16        This is a device driver for the Allied Telesis AT1700, and
  17        Fujitsu FMV-181/182/181A/182A/183/184/183A/184A, which are
  18        straight-forward Fujitsu MB86965 implementations.
  19
  20        Modification for Fujitsu FMV-18X cards is done by Yutaka Tamiya
  21        (tamy@flab.fujitsu.co.jp).
  22
  23  Sources:
  24    The Fujitsu MB86965 datasheet.
  25
  26        After the initial version of this driver was written Gerry Sawkins of
  27        ATI provided their EEPROM configuration code header file.
  28    Thanks to NIIBE Yutaka <gniibe@mri.co.jp> for bug fixes.
  29
  30    MCA bus (AT1720) support (now deleted) by Rene Schmit <rene@bss.lu>
  31
  32  Bugs:
  33        The MB86965 has a design flaw that makes all probes unreliable.  Not
  34        only is it difficult to detect, it also moves around in I/O space in
  35        response to inb()s from other device probes!
  36*/
  37
  38#include <linux/errno.h>
  39#include <linux/netdevice.h>
  40#include <linux/etherdevice.h>
  41#include <linux/module.h>
  42#include <linux/kernel.h>
  43#include <linux/types.h>
  44#include <linux/fcntl.h>
  45#include <linux/interrupt.h>
  46#include <linux/ioport.h>
  47#include <linux/in.h>
  48#include <linux/skbuff.h>
  49#include <linux/string.h>
  50#include <linux/init.h>
  51#include <linux/crc32.h>
  52#include <linux/bitops.h>
  53
  54#include <asm/io.h>
  55#include <asm/dma.h>
  56
  57static char version[] __initdata =
  58        "at1700.c:v1.16 9/11/06  Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
  59
  60#define DRV_NAME "at1700"
  61
  62/* Tunable parameters. */
  63
  64/* When to switch from the 64-entry multicast filter to Rx-all-multicast. */
  65#define MC_FILTERBREAK 64
  66
  67/* These unusual address orders are used to verify the CONFIG register. */
  68
  69static int fmv18x_probe_list[] __initdata = {
  70        0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
  71};
  72
  73/*
  74 *      ISA
  75 */
  76
  77static unsigned at1700_probe_list[] __initdata = {
  78        0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
  79};
  80
  81/* use 0 for production, 1 for verification, >2 for debug */
  82#ifndef NET_DEBUG
  83#define NET_DEBUG 1
  84#endif
  85static unsigned int net_debug = NET_DEBUG;
  86
  87typedef unsigned char uchar;
  88
  89/* Information that need to be kept for each board. */
  90struct net_local {
  91        spinlock_t lock;
  92        unsigned char mc_filter[8];
  93        uint jumpered:1;                        /* Set iff the board has jumper config. */
  94        uint tx_started:1;                      /* Packets are on the Tx queue. */
  95        uint tx_queue_ready:1;                  /* Tx queue is ready to be sent. */
  96        uint rx_started:1;                      /* Packets are Rxing. */
  97        uchar tx_queue;                         /* Number of packet on the Tx queue. */
  98        ushort tx_queue_len;                    /* Current length of the Tx queue. */
  99};
 100
 101
 102/* Offsets from the base address. */
 103#define STATUS                  0
 104#define TX_STATUS               0
 105#define RX_STATUS               1
 106#define TX_INTR                 2               /* Bit-mapped interrupt enable registers. */
 107#define RX_INTR                 3
 108#define TX_MODE                 4
 109#define RX_MODE                 5
 110#define CONFIG_0                6               /* Misc. configuration settings. */
 111#define CONFIG_1                7
 112/* Run-time register bank 2 definitions. */
 113#define DATAPORT                8               /* Word-wide DMA or programmed-I/O dataport. */
 114#define TX_START                10
 115#define COL16CNTL               11              /* Control Reg for 16 collisions */
 116#define MODE13                  13
 117#define RX_CTRL                 14
 118/* Configuration registers only on the '865A/B chips. */
 119#define EEPROM_Ctrl     16
 120#define EEPROM_Data     17
 121#define CARDSTATUS      16                      /* FMV-18x Card Status */
 122#define CARDSTATUS1     17                      /* FMV-18x Card Status */
 123#define IOCONFIG                18              /* Either read the jumper, or move the I/O. */
 124#define IOCONFIG1               19
 125#define SAPROM                  20              /* The station address PROM, if no EEPROM. */
 126#define MODE24                  24
 127#define RESET                   31              /* Write to reset some parts of the chip. */
 128#define AT1700_IO_EXTENT        32
 129#define PORT_OFFSET(o) (o)
 130
 131
 132#define TX_TIMEOUT              (HZ/10)
 133
 134
 135/* Index to functions, as function prototypes. */
 136
 137static int at1700_probe1(struct net_device *dev, int ioaddr);
 138static int read_eeprom(long ioaddr, int location);
 139static int net_open(struct net_device *dev);
 140static netdev_tx_t net_send_packet(struct sk_buff *skb,
 141                                   struct net_device *dev);
 142static irqreturn_t net_interrupt(int irq, void *dev_id);
 143static void net_rx(struct net_device *dev);
 144static int net_close(struct net_device *dev);
 145static void set_rx_mode(struct net_device *dev);
 146static void net_tx_timeout (struct net_device *dev);
 147
 148
 149/* Check for a network adaptor of this type, and return '0' iff one exists.
 150   If dev->base_addr == 0, probe all likely locations.
 151   If dev->base_addr == 1, always return failure.
 152   If dev->base_addr == 2, allocate space for the device and return success
 153   (detachable devices only).
 154   */
 155
 156static int io = 0x260;
 157
 158static int irq;
 159
 160static void cleanup_card(struct net_device *dev)
 161{
 162        free_irq(dev->irq, NULL);
 163        release_region(dev->base_addr, AT1700_IO_EXTENT);
 164}
 165
 166struct net_device * __init at1700_probe(int unit)
 167{
 168        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
 169        unsigned *port;
 170        int err = 0;
 171
 172        if (!dev)
 173                return ERR_PTR(-ENODEV);
 174
 175        if (unit >= 0) {
 176                sprintf(dev->name, "eth%d", unit);
 177                netdev_boot_setup_check(dev);
 178                io = dev->base_addr;
 179                irq = dev->irq;
 180        } else {
 181                dev->base_addr = io;
 182                dev->irq = irq;
 183        }
 184
 185        if (io > 0x1ff) {       /* Check a single specified location. */
 186                err = at1700_probe1(dev, io);
 187        } else if (io != 0) {   /* Don't probe at all. */
 188                err = -ENXIO;
 189        } else {
 190                for (port = at1700_probe_list; *port; port++) {
 191                        if (at1700_probe1(dev, *port) == 0)
 192                                break;
 193                        dev->irq = irq;
 194                }
 195                if (!*port)
 196                        err = -ENODEV;
 197        }
 198        if (err)
 199                goto out;
 200        err = register_netdev(dev);
 201        if (err)
 202                goto out1;
 203        return dev;
 204out1:
 205        cleanup_card(dev);
 206out:
 207        free_netdev(dev);
 208        return ERR_PTR(err);
 209}
 210
 211static const struct net_device_ops at1700_netdev_ops = {
 212        .ndo_open               = net_open,
 213        .ndo_stop               = net_close,
 214        .ndo_start_xmit         = net_send_packet,
 215        .ndo_set_rx_mode        = set_rx_mode,
 216        .ndo_tx_timeout         = net_tx_timeout,
 217        .ndo_change_mtu         = eth_change_mtu,
 218        .ndo_set_mac_address    = eth_mac_addr,
 219        .ndo_validate_addr      = eth_validate_addr,
 220};
 221
 222/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
 223   "signature", the default bit pattern after a reset.  This *doesn't* work --
 224   there is no way to reset the bus interface without a complete power-cycle!
 225
 226   It turns out that ATI came to the same conclusion I did: the only thing
 227   that can be done is checking a few bits and then diving right into an
 228   EEPROM read. */
 229
 230static int __init at1700_probe1(struct net_device *dev, int ioaddr)
 231{
 232        static const char fmv_irqmap[4] = {3, 7, 10, 15};
 233        static const char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
 234        static const char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
 235        unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
 236        int ret = -ENODEV;
 237        struct net_local *lp = netdev_priv(dev);
 238
 239        if (!request_region(ioaddr, AT1700_IO_EXTENT, DRV_NAME))
 240                return -EBUSY;
 241
 242        /* Resetting the chip doesn't reset the ISA interface, so don't bother.
 243           That means we have to be careful with the register values we probe
 244           for.
 245         */
 246#ifdef notdef
 247        printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
 248                   ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
 249                   read_eeprom(ioaddr, 6), inw(ioaddr + EEPROM_Ctrl));
 250#endif
 251        /* We must check for the EEPROM-config boards first, else accessing
 252           IOCONFIG0 will move the board! */
 253        if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr &&
 254            read_eeprom(ioaddr, 4) == 0x0000 &&
 255            (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
 256                is_at1700 = 1;
 257        else if (inb(ioaddr + SAPROM    ) == 0x00 &&
 258                 inb(ioaddr + SAPROM + 1) == 0x00 &&
 259                 inb(ioaddr + SAPROM + 2) == 0x0e)
 260                is_fmv18x = 1;
 261        else {
 262                goto err_out;
 263        }
 264
 265        /* Reset the internal state machines. */
 266        outb(0, ioaddr + RESET);
 267
 268        if (is_at1700) {
 269                irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
 270                                                   | (read_eeprom(ioaddr, 0)>>14)];
 271        } else {
 272                /* Check PnP mode for FMV-183/184/183A/184A. */
 273                /* This PnP routine is very poor. IO and IRQ should be known. */
 274                if (inb(ioaddr + CARDSTATUS1) & 0x20) {
 275                        irq = dev->irq;
 276                        for (i = 0; i < 8; i++) {
 277                                if (irq == fmv_irqmap_pnp[i])
 278                                        break;
 279                        }
 280                        if (i == 8) {
 281                                goto err_out;
 282                        }
 283                } else {
 284                        if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
 285                                goto err_out;
 286                        irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
 287                }
 288        }
 289
 290        printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
 291                   is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
 292
 293        dev->base_addr = ioaddr;
 294        dev->irq = irq;
 295
 296        if (is_at1700) {
 297                for(i = 0; i < 3; i++) {
 298                        unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
 299                        ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
 300                }
 301        } else {
 302                for(i = 0; i < 6; i++) {
 303                        unsigned char val = inb(ioaddr + SAPROM + i);
 304                        dev->dev_addr[i] = val;
 305                }
 306        }
 307        printk("%pM", dev->dev_addr);
 308
 309        /* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
 310           rather than 150 ohm shielded twisted pair compensation.
 311           0x0000 == auto-sense the interface
 312           0x0800 == use TP interface
 313           0x1800 == use coax interface
 314           */
 315        {
 316                const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
 317                if (is_at1700) {
 318                        ushort setup_value = read_eeprom(ioaddr, 12);
 319                        dev->if_port = setup_value >> 8;
 320                } else {
 321                        ushort setup_value = inb(ioaddr + CARDSTATUS);
 322                        switch (setup_value & 0x07) {
 323                        case 0x01: /* 10base5 */
 324                        case 0x02: /* 10base2 */
 325                                dev->if_port = 0x18; break;
 326                        case 0x04: /* 10baseT */
 327                                dev->if_port = 0x08; break;
 328                        default:   /* auto-sense */
 329                                dev->if_port = 0x00; break;
 330                        }
 331                }
 332                printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
 333        }
 334
 335        /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
 336           bus access, two 4K Tx queues, and disabled Tx and Rx. */
 337        outb(0xda, ioaddr + CONFIG_0);
 338
 339        /* Set the station address in bank zero. */
 340        outb(0x00, ioaddr + CONFIG_1);
 341        for (i = 0; i < 6; i++)
 342                outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
 343
 344        /* Switch to bank 1 and set the multicast table to accept none. */
 345        outb(0x04, ioaddr + CONFIG_1);
 346        for (i = 0; i < 8; i++)
 347                outb(0x00, ioaddr + PORT_OFFSET(8 + i));
 348
 349
 350        /* Switch to bank 2 */
 351        /* Lock our I/O address, and set manual processing mode for 16 collisions. */
 352        outb(0x08, ioaddr + CONFIG_1);
 353        outb(dev->if_port, ioaddr + MODE13);
 354        outb(0x00, ioaddr + COL16CNTL);
 355
 356        if (net_debug)
 357                printk(version);
 358
 359        dev->netdev_ops = &at1700_netdev_ops;
 360        dev->watchdog_timeo = TX_TIMEOUT;
 361
 362        spin_lock_init(&lp->lock);
 363
 364        lp->jumpered = is_fmv18x;
 365        /* Snarf the interrupt vector now. */
 366        ret = request_irq(irq, net_interrupt, 0, DRV_NAME, dev);
 367        if (ret) {
 368                printk(KERN_ERR "AT1700 at %#3x is unusable due to a "
 369                       "conflict on IRQ %d.\n",
 370                       ioaddr, irq);
 371                goto err_out;
 372        }
 373
 374        return 0;
 375
 376err_out:
 377        release_region(ioaddr, AT1700_IO_EXTENT);
 378        return ret;
 379}
 380
 381
 382/*  EEPROM_Ctrl bits. */
 383#define EE_SHIFT_CLK    0x40    /* EEPROM shift clock, in reg. 16. */
 384#define EE_CS                   0x20    /* EEPROM chip select, in reg. 16. */
 385#define EE_DATA_WRITE   0x80    /* EEPROM chip data in, in reg. 17. */
 386#define EE_DATA_READ    0x80    /* EEPROM chip data out, in reg. 17. */
 387
 388/* The EEPROM commands include the alway-set leading bit. */
 389#define EE_WRITE_CMD    (5 << 6)
 390#define EE_READ_CMD             (6 << 6)
 391#define EE_ERASE_CMD    (7 << 6)
 392
 393static int __init read_eeprom(long ioaddr, int location)
 394{
 395        int i;
 396        unsigned short retval = 0;
 397        long ee_addr = ioaddr + EEPROM_Ctrl;
 398        long ee_daddr = ioaddr + EEPROM_Data;
 399        int read_cmd = location | EE_READ_CMD;
 400
 401        /* Shift the read command bits out. */
 402        for (i = 9; i >= 0; i--) {
 403                short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
 404                outb(EE_CS, ee_addr);
 405                outb(dataval, ee_daddr);
 406                outb(EE_CS | EE_SHIFT_CLK, ee_addr);    /* EEPROM clock tick. */
 407        }
 408        outb(EE_DATA_WRITE, ee_daddr);
 409        for (i = 16; i > 0; i--) {
 410                outb(EE_CS, ee_addr);
 411                outb(EE_CS | EE_SHIFT_CLK, ee_addr);
 412                retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
 413        }
 414
 415        /* Terminate the EEPROM access. */
 416        outb(EE_CS, ee_addr);
 417        outb(EE_SHIFT_CLK, ee_addr);
 418        outb(0, ee_addr);
 419        return retval;
 420}
 421
 422
 423
 424static int net_open(struct net_device *dev)
 425{
 426        struct net_local *lp = netdev_priv(dev);
 427        int ioaddr = dev->base_addr;
 428
 429        /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
 430           bus access, and two 4K Tx queues. */
 431        outb(0x5a, ioaddr + CONFIG_0);
 432
 433        /* Powerup, switch to register bank 2, and enable the Rx and Tx. */
 434        outb(0xe8, ioaddr + CONFIG_1);
 435
 436        lp->tx_started = 0;
 437        lp->tx_queue_ready = 1;
 438        lp->rx_started = 0;
 439        lp->tx_queue = 0;
 440        lp->tx_queue_len = 0;
 441
 442        /* Turn on hardware Tx and Rx interrupts. */
 443        outb(0x82, ioaddr + TX_INTR);
 444        outb(0x81, ioaddr + RX_INTR);
 445
 446        /* Enable the IRQ on boards of fmv18x it is feasible. */
 447        if (lp->jumpered) {
 448                outb(0x80, ioaddr + IOCONFIG1);
 449        }
 450
 451        netif_start_queue(dev);
 452        return 0;
 453}
 454
 455static void net_tx_timeout (struct net_device *dev)
 456{
 457        struct net_local *lp = netdev_priv(dev);
 458        int ioaddr = dev->base_addr;
 459
 460        printk ("%s: transmit timed out with status %04x, %s?\n", dev->name,
 461                inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
 462                ? "IRQ conflict" : "network cable problem");
 463        printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
 464         dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
 465                inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
 466                inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
 467        dev->stats.tx_errors++;
 468        /* ToDo: We should try to restart the adaptor... */
 469        outw(0xffff, ioaddr + MODE24);
 470        outw (0xffff, ioaddr + TX_STATUS);
 471        outb (0x5a, ioaddr + CONFIG_0);
 472        outb (0xe8, ioaddr + CONFIG_1);
 473        outw (0x8182, ioaddr + TX_INTR);
 474        outb (0x00, ioaddr + TX_START);
 475        outb (0x03, ioaddr + COL16CNTL);
 476
 477        dev->trans_start = jiffies; /* prevent tx timeout */
 478
 479        lp->tx_started = 0;
 480        lp->tx_queue_ready = 1;
 481        lp->rx_started = 0;
 482        lp->tx_queue = 0;
 483        lp->tx_queue_len = 0;
 484
 485        netif_wake_queue(dev);
 486}
 487
 488
 489static netdev_tx_t net_send_packet (struct sk_buff *skb,
 490                                    struct net_device *dev)
 491{
 492        struct net_local *lp = netdev_priv(dev);
 493        int ioaddr = dev->base_addr;
 494        short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
 495        short len = skb->len;
 496        unsigned char *buf = skb->data;
 497        static u8 pad[ETH_ZLEN];
 498
 499        netif_stop_queue (dev);
 500
 501        /* We may not start transmitting unless we finish transferring
 502           a packet into the Tx queue. During executing the following
 503           codes we possibly catch a Tx interrupt. Thus we flag off
 504           tx_queue_ready, so that we prevent the interrupt routine
 505           (net_interrupt) to start transmitting. */
 506        lp->tx_queue_ready = 0;
 507        {
 508                outw (length, ioaddr + DATAPORT);
 509                /* Packet data */
 510                outsw (ioaddr + DATAPORT, buf, len >> 1);
 511                /* Check for dribble byte */
 512                if (len & 1) {
 513                        outw(skb->data[skb->len-1], ioaddr + DATAPORT);
 514                        len++;
 515                }
 516                /* Check for packet padding */
 517                if (length != skb->len)
 518                        outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
 519
 520                lp->tx_queue++;
 521                lp->tx_queue_len += length + 2;
 522        }
 523        lp->tx_queue_ready = 1;
 524
 525        if (lp->tx_started == 0) {
 526                /* If the Tx is idle, always trigger a transmit. */
 527                outb (0x80 | lp->tx_queue, ioaddr + TX_START);
 528                lp->tx_queue = 0;
 529                lp->tx_queue_len = 0;
 530                lp->tx_started = 1;
 531                netif_start_queue (dev);
 532        } else if (lp->tx_queue_len < 4096 - 1502)
 533                /* Yes, there is room for one more packet. */
 534                netif_start_queue (dev);
 535        dev_kfree_skb (skb);
 536
 537        return NETDEV_TX_OK;
 538}
 539
 540/* The typical workload of the driver:
 541   Handle the network interface interrupts. */
 542static irqreturn_t net_interrupt(int irq, void *dev_id)
 543{
 544        struct net_device *dev = dev_id;
 545        struct net_local *lp;
 546        int ioaddr, status;
 547        int handled = 0;
 548
 549        if (dev == NULL) {
 550                printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
 551                return IRQ_NONE;
 552        }
 553
 554        ioaddr = dev->base_addr;
 555        lp = netdev_priv(dev);
 556
 557        spin_lock (&lp->lock);
 558
 559        status = inw(ioaddr + TX_STATUS);
 560        outw(status, ioaddr + TX_STATUS);
 561
 562        if (net_debug > 4)
 563                printk("%s: Interrupt with status %04x.\n", dev->name, status);
 564        if (lp->rx_started == 0 &&
 565            (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
 566                /* Got a packet(s).
 567                   We cannot execute net_rx more than once at the same time for
 568                   the same device. During executing net_rx, we possibly catch a
 569                   Tx interrupt. Thus we flag on rx_started, so that we prevent
 570                   the interrupt routine (net_interrupt) to dive into net_rx
 571                   again. */
 572                handled = 1;
 573                lp->rx_started = 1;
 574                outb(0x00, ioaddr + RX_INTR);   /* Disable RX intr. */
 575                net_rx(dev);
 576                outb(0x81, ioaddr + RX_INTR);   /* Enable  RX intr. */
 577                lp->rx_started = 0;
 578        }
 579        if (status & 0x00ff) {
 580                handled = 1;
 581                if (status & 0x02) {
 582                        /* More than 16 collisions occurred */
 583                        if (net_debug > 4)
 584                                printk("%s: 16 Collision occur during Txing.\n", dev->name);
 585                        /* Cancel sending a packet. */
 586                        outb(0x03, ioaddr + COL16CNTL);
 587                        dev->stats.collisions++;
 588                }
 589                if (status & 0x82) {
 590                        dev->stats.tx_packets++;
 591                        /* The Tx queue has any packets and is not being
 592                           transferred a packet from the host, start
 593                           transmitting. */
 594                        if (lp->tx_queue && lp->tx_queue_ready) {
 595                                outb(0x80 | lp->tx_queue, ioaddr + TX_START);
 596                                lp->tx_queue = 0;
 597                                lp->tx_queue_len = 0;
 598                                dev->trans_start = jiffies;
 599                                netif_wake_queue (dev);
 600                        } else {
 601                                lp->tx_started = 0;
 602                                netif_wake_queue (dev);
 603                        }
 604                }
 605        }
 606
 607        spin_unlock (&lp->lock);
 608        return IRQ_RETVAL(handled);
 609}
 610
 611/* We have a good packet(s), get it/them out of the buffers. */
 612static void
 613net_rx(struct net_device *dev)
 614{
 615        int ioaddr = dev->base_addr;
 616        int boguscount = 5;
 617
 618        while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
 619                ushort status = inw(ioaddr + DATAPORT);
 620                ushort pkt_len = inw(ioaddr + DATAPORT);
 621
 622                if (net_debug > 4)
 623                        printk("%s: Rxing packet mode %02x status %04x.\n",
 624                                   dev->name, inb(ioaddr + RX_MODE), status);
 625#ifndef final_version
 626                if (status == 0) {
 627                        outb(0x05, ioaddr + RX_CTRL);
 628                        break;
 629                }
 630#endif
 631
 632                if ((status & 0xF0) != 0x20) {  /* There was an error. */
 633                        dev->stats.rx_errors++;
 634                        if (status & 0x08) dev->stats.rx_length_errors++;
 635                        if (status & 0x04) dev->stats.rx_frame_errors++;
 636                        if (status & 0x02) dev->stats.rx_crc_errors++;
 637                        if (status & 0x01) dev->stats.rx_over_errors++;
 638                } else {
 639                        /* Malloc up new buffer. */
 640                        struct sk_buff *skb;
 641
 642                        if (pkt_len > 1550) {
 643                                printk("%s: The AT1700 claimed a very large packet, size %d.\n",
 644                                           dev->name, pkt_len);
 645                                /* Prime the FIFO and then flush the packet. */
 646                                inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
 647                                outb(0x05, ioaddr + RX_CTRL);
 648                                dev->stats.rx_errors++;
 649                                break;
 650                        }
 651                        skb = netdev_alloc_skb(dev, pkt_len + 3);
 652                        if (skb == NULL) {
 653                                printk("%s: Memory squeeze, dropping packet (len %d).\n",
 654                                           dev->name, pkt_len);
 655                                /* Prime the FIFO and then flush the packet. */
 656                                inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
 657                                outb(0x05, ioaddr + RX_CTRL);
 658                                dev->stats.rx_dropped++;
 659                                break;
 660                        }
 661                        skb_reserve(skb,2);
 662
 663                        insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
 664                        skb->protocol=eth_type_trans(skb, dev);
 665                        netif_rx(skb);
 666                        dev->stats.rx_packets++;
 667                        dev->stats.rx_bytes += pkt_len;
 668                }
 669                if (--boguscount <= 0)
 670                        break;
 671        }
 672
 673        /* If any worth-while packets have been received, dev_rint()
 674           has done a mark_bh(NET_BH) for us and will work on them
 675           when we get to the bottom-half routine. */
 676        {
 677                int i;
 678                for (i = 0; i < 20; i++) {
 679                        if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
 680                                break;
 681                        inw(ioaddr + DATAPORT);                         /* dummy status read */
 682                        outb(0x05, ioaddr + RX_CTRL);
 683                }
 684
 685                if (net_debug > 5)
 686                        printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
 687                                   dev->name, inb(ioaddr + RX_MODE), i);
 688        }
 689}
 690
 691/* The inverse routine to net_open(). */
 692static int net_close(struct net_device *dev)
 693{
 694        struct net_local *lp = netdev_priv(dev);
 695        int ioaddr = dev->base_addr;
 696
 697        netif_stop_queue(dev);
 698
 699        /* Set configuration register 0 to disable Tx and Rx. */
 700        outb(0xda, ioaddr + CONFIG_0);
 701
 702        /* No statistic counters on the chip to update. */
 703
 704        /* Disable the IRQ on boards of fmv18x where it is feasible. */
 705        if (lp->jumpered)
 706                outb(0x00, ioaddr + IOCONFIG1);
 707
 708        /* Power-down the chip.  Green, green, green! */
 709        outb(0x00, ioaddr + CONFIG_1);
 710        return 0;
 711}
 712
 713/*
 714  Set the multicast/promiscuous mode for this adaptor.
 715*/
 716
 717static void
 718set_rx_mode(struct net_device *dev)
 719{
 720        int ioaddr = dev->base_addr;
 721        struct net_local *lp = netdev_priv(dev);
 722        unsigned char mc_filter[8];              /* Multicast hash filter */
 723        unsigned long flags;
 724
 725        if (dev->flags & IFF_PROMISC) {
 726                memset(mc_filter, 0xff, sizeof(mc_filter));
 727                outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
 728        } else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
 729                           (dev->flags & IFF_ALLMULTI)) {
 730                /* Too many to filter perfectly -- accept all multicasts. */
 731                memset(mc_filter, 0xff, sizeof(mc_filter));
 732                outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
 733        } else if (netdev_mc_empty(dev)) {
 734                memset(mc_filter, 0x00, sizeof(mc_filter));
 735                outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
 736        } else {
 737                struct netdev_hw_addr *ha;
 738
 739                memset(mc_filter, 0, sizeof(mc_filter));
 740                netdev_for_each_mc_addr(ha, dev) {
 741                        unsigned int bit =
 742                                ether_crc_le(ETH_ALEN, ha->addr) >> 26;
 743                        mc_filter[bit >> 3] |= (1 << bit);
 744                }
 745                outb(0x02, ioaddr + RX_MODE);   /* Use normal mode. */
 746        }
 747
 748        spin_lock_irqsave (&lp->lock, flags);
 749        if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
 750                int i;
 751                int saved_bank = inw(ioaddr + CONFIG_0);
 752                /* Switch to bank 1 and set the multicast table. */
 753                outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
 754                for (i = 0; i < 8; i++)
 755                        outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
 756                memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
 757                outw(saved_bank, ioaddr + CONFIG_0);
 758        }
 759        spin_unlock_irqrestore (&lp->lock, flags);
 760}
 761
 762#ifdef MODULE
 763static struct net_device *dev_at1700;
 764
 765module_param(io, int, 0);
 766module_param(irq, int, 0);
 767module_param(net_debug, int, 0);
 768MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
 769MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
 770MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
 771
 772static int __init at1700_module_init(void)
 773{
 774        if (io == 0)
 775                printk("at1700: You should not use auto-probing with insmod!\n");
 776        dev_at1700 = at1700_probe(-1);
 777        if (IS_ERR(dev_at1700))
 778                return PTR_ERR(dev_at1700);
 779        return 0;
 780}
 781
 782static void __exit at1700_module_exit(void)
 783{
 784        unregister_netdev(dev_at1700);
 785        cleanup_card(dev_at1700);
 786        free_netdev(dev_at1700);
 787}
 788module_init(at1700_module_init);
 789module_exit(at1700_module_exit);
 790#endif /* MODULE */
 791MODULE_LICENSE("GPL");
 792