linux-bk/drivers/net/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 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        99/03/03  Allied Telesis RE1000 Plus support by T.Hagawa
  39        99/12/30        port to 2.3.35 by K.Takai
  40*/
  41
  42#include <linux/config.h>
  43#include <linux/errno.h>
  44#include <linux/netdevice.h>
  45#include <linux/etherdevice.h>
  46#include <linux/mca-legacy.h>
  47#include <linux/module.h>
  48#include <linux/kernel.h>
  49#include <linux/types.h>
  50#include <linux/fcntl.h>
  51#include <linux/interrupt.h>
  52#include <linux/ioport.h>
  53#include <linux/in.h>
  54#include <linux/skbuff.h>
  55#include <linux/slab.h>
  56#include <linux/string.h>
  57#include <linux/init.h>
  58#include <linux/crc32.h>
  59
  60#include <asm/system.h>
  61#include <asm/bitops.h>
  62#include <asm/io.h>
  63#include <asm/dma.h>
  64
  65static char version[] __initdata =
  66        "at1700.c:v1.15 4/7/98  Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
  67
  68/* Tunable parameters. */
  69
  70/* When to switch from the 64-entry multicast filter to Rx-all-multicast. */
  71#define MC_FILTERBREAK 64
  72
  73/* These unusual address orders are used to verify the CONFIG register. */
  74
  75static int fmv18x_probe_list[] __initdata = {
  76        0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
  77};
  78
  79/*
  80 *      ISA
  81 */
  82
  83#ifndef CONFIG_X86_PC9800
  84static int at1700_probe_list[] __initdata = {
  85        0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
  86};
  87
  88#else /* CONFIG_X86_PC9800 */
  89static int at1700_probe_list[] __initdata = {
  90        0x1d6, 0x1d8, 0x1da, 0x1d4, 0xd4, 0xd2, 0xd8, 0xd0, 0
  91};
  92
  93#endif /* CONFIG_X86_PC9800 */
  94/*
  95 *      MCA
  96 */
  97#ifdef CONFIG_MCA       
  98static int at1700_ioaddr_pattern[] __initdata = {
  99        0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07
 100};
 101
 102static int at1700_mca_probe_list[] __initdata = {
 103        0x400, 0x1400, 0x2400, 0x3400, 0x4400, 0x5400, 0x6400, 0x7400, 0
 104};
 105
 106static int at1700_irq_pattern[] __initdata = {
 107        0x00, 0x00, 0x00, 0x30, 0x70, 0xb0, 0x00, 0x00,
 108        0x00, 0xf0, 0x34, 0x74, 0xb4, 0x00, 0x00, 0xf4, 0x00
 109};
 110#endif
 111
 112/* use 0 for production, 1 for verification, >2 for debug */
 113#ifndef NET_DEBUG
 114#define NET_DEBUG 1
 115#endif
 116static unsigned int net_debug = NET_DEBUG;
 117
 118typedef unsigned char uchar;
 119
 120/* Information that need to be kept for each board. */
 121struct net_local {
 122        struct net_device_stats stats;
 123        spinlock_t lock;
 124        unsigned char mc_filter[8];
 125        uint jumpered:1;                        /* Set iff the board has jumper config. */
 126        uint tx_started:1;                      /* Packets are on the Tx queue. */
 127        uint tx_queue_ready:1;                  /* Tx queue is ready to be sent. */
 128        uint rx_started:1;                      /* Packets are Rxing. */
 129        uchar tx_queue;                         /* Number of packet on the Tx queue. */
 130        char mca_slot;                          /* -1 means ISA */
 131        ushort tx_queue_len;                    /* Current length of the Tx queue. */
 132};
 133
 134
 135/* Offsets from the base address. */
 136#ifndef CONFIG_X86_PC9800
 137#define STATUS                  0
 138#define TX_STATUS               0
 139#define RX_STATUS               1
 140#define TX_INTR                 2               /* Bit-mapped interrupt enable registers. */
 141#define RX_INTR                 3
 142#define TX_MODE                 4
 143#define RX_MODE                 5
 144#define CONFIG_0                6               /* Misc. configuration settings. */
 145#define CONFIG_1                7
 146/* Run-time register bank 2 definitions. */
 147#define DATAPORT                8               /* Word-wide DMA or programmed-I/O dataport. */
 148#define TX_START                10
 149#define COL16CNTL               11              /* Controll Reg for 16 collisions */
 150#define MODE13                  13
 151#define RX_CTRL                 14
 152/* Configuration registers only on the '865A/B chips. */
 153#define EEPROM_Ctrl     16
 154#define EEPROM_Data     17
 155#define CARDSTATUS      16                      /* FMV-18x Card Status */
 156#define CARDSTATUS1     17                      /* FMV-18x Card Status */
 157#define IOCONFIG                18              /* Either read the jumper, or move the I/O. */
 158#define IOCONFIG1               19
 159#define SAPROM                  20              /* The station address PROM, if no EEPROM. */
 160#define MODE24                  24
 161#define RESET                   31              /* Write to reset some parts of the chip. */
 162#define AT1700_IO_EXTENT        32
 163#define PORT_OFFSET(o) (o)
 164#else /* CONFIG_X86_PC9800 */
 165#define STATUS                  (0x0000)
 166#define TX_STATUS               (0x0000)
 167#define RX_STATUS               (0x0001)
 168#define TX_INTR                 (0x0200)/* Bit-mapped interrupt enable registers. */
 169#define RX_INTR                 (0x0201)
 170#define TX_MODE                 (0x0400)
 171#define RX_MODE                 (0x0401)
 172#define CONFIG_0                (0x0600)/* Misc. configuration settings. */
 173#define CONFIG_1                (0x0601)
 174/* Run-time register bank 2 definitions. */
 175#define DATAPORT                (0x0800)/* Word-wide DMA or programmed-I/O dataport. */
 176#define TX_START                (0x0a00)
 177#define COL16CNTL               (0x0a01)/* Controll Reg for 16 collisions */
 178#define MODE13                  (0x0c01)
 179#define RX_CTRL                 (0x0e00)
 180/* Configuration registers only on the '865A/B chips. */
 181#define EEPROM_Ctrl     (0x1000)
 182#define EEPROM_Data     (0x1200)
 183#define CARDSTATUS      16                      /* FMV-18x Card Status */
 184#define CARDSTATUS1     17                      /* FMV-18x Card Status */
 185#define IOCONFIG                (0x1400)/* Either read the jumper, or move the I/O. */
 186#define IOCONFIG1               (0x1600)
 187#define SAPROM                  20              /* The station address PROM, if no EEPROM. */
 188#define MODE24                  (0x1800)/* The station address PROM, if no EEPROM. */
 189#define RESET                   (0x1e01)/* Write to reset some parts of the chip. */
 190#define PORT_OFFSET(o) ({ int _o_ = (o); (_o_ & ~1) * 0x100 + (_o_ & 1); })
 191#endif /* CONFIG_X86_PC9800 */
 192
 193
 194#define TX_TIMEOUT              10
 195
 196
 197/* Index to functions, as function prototypes. */
 198
 199extern int at1700_probe(struct net_device *dev);
 200
 201static int at1700_probe1(struct net_device *dev, int ioaddr);
 202static int read_eeprom(long ioaddr, int location);
 203static int net_open(struct net_device *dev);
 204static int      net_send_packet(struct sk_buff *skb, struct net_device *dev);
 205static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 206static void net_rx(struct net_device *dev);
 207static int net_close(struct net_device *dev);
 208static struct net_device_stats *net_get_stats(struct net_device *dev);
 209static void set_rx_mode(struct net_device *dev);
 210static void net_tx_timeout (struct net_device *dev);
 211
 212
 213#ifdef CONFIG_MCA
 214struct at1720_mca_adapters_struct {
 215        char* name;
 216        int id;
 217};
 218/* rEnE : maybe there are others I don't know off... */
 219
 220static struct at1720_mca_adapters_struct at1720_mca_adapters[] __initdata = {
 221        { "Allied Telesys AT1720AT",    0x6410 },
 222        { "Allied Telesys AT1720BT",    0x6413 },
 223        { "Allied Telesys AT1720T",     0x6416 },
 224        { NULL, 0 },
 225};
 226#endif
 227
 228/* Check for a network adaptor of this type, and return '0' iff one exists.
 229   If dev->base_addr == 0, probe all likely locations.
 230   If dev->base_addr == 1, always return failure.
 231   If dev->base_addr == 2, allocate space for the device and return success
 232   (detachable devices only).
 233   */
 234
 235int __init at1700_probe(struct net_device *dev)
 236{
 237        int i;
 238        int base_addr = dev->base_addr;
 239
 240        SET_MODULE_OWNER(dev);
 241
 242        if (base_addr > 0x1ff)          /* Check a single specified location. */
 243                return at1700_probe1(dev, base_addr);
 244        else if (base_addr != 0)        /* Don't probe at all. */
 245                return -ENXIO;
 246
 247        for (i = 0; at1700_probe_list[i]; i++) {
 248                int ioaddr = at1700_probe_list[i];
 249                if (at1700_probe1(dev, ioaddr) == 0)
 250                        return 0;
 251        }
 252        return -ENODEV;
 253}
 254
 255/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
 256   "signature", the default bit pattern after a reset.  This *doesn't* work --
 257   there is no way to reset the bus interface without a complete power-cycle!
 258
 259   It turns out that ATI came to the same conclusion I did: the only thing
 260   that can be done is checking a few bits and then diving right into an
 261   EEPROM read. */
 262
 263static int __init at1700_probe1(struct net_device *dev, int ioaddr)
 264{
 265        char fmv_irqmap[4] = {3, 7, 10, 15};
 266        char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
 267        char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
 268        unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
 269        int slot, ret = -ENODEV;
 270        struct net_local *lp;
 271        
 272#ifndef CONFIG_X86_PC9800
 273        if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name))
 274                return -EBUSY;
 275#else
 276        for (i = 0; i < 0x2000; i += 0x0200) {
 277                if (!request_region(ioaddr + i, 2, dev->name)) {
 278                        while (i > 0) {
 279                                i -= 0x0200;
 280                                release_region(ioaddr + i, 2);
 281                        }
 282                        return -EBUSY;
 283                }
 284        }
 285#endif
 286
 287                /* Resetting the chip doesn't reset the ISA interface, so don't bother.
 288           That means we have to be careful with the register values we probe for.
 289           */
 290#ifdef notdef
 291        printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
 292                   ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
 293                   read_eeprom(ioaddr, 6), inw(ioaddr + EEPROM_Ctrl));
 294#endif
 295
 296#ifdef CONFIG_MCA
 297        /* rEnE (rene@bss.lu): got this from 3c509 driver source , adapted for AT1720 */
 298
 299    /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, heavily
 300        modified by Chris Beauregard (cpbeaure@csclub.uwaterloo.ca)
 301        to support standard MCA probing. */
 302
 303        /* redone for multi-card detection by ZP Gu (zpg@castle.net) */
 304        /* now works as a module */
 305
 306        if (MCA_bus) {
 307                int j;
 308                int l_i;
 309                u_char pos3, pos4;
 310
 311                for (j = 0; at1720_mca_adapters[j].name != NULL; j ++) {
 312                        slot = 0;
 313                        while (slot != MCA_NOTFOUND) {
 314                                
 315                                slot = mca_find_unused_adapter( at1720_mca_adapters[j].id, slot );
 316                                if (slot == MCA_NOTFOUND) break;
 317
 318                                /* if we get this far, an adapter has been detected and is
 319                                enabled */
 320
 321                                pos3 = mca_read_stored_pos( slot, 3 );
 322                                pos4 = mca_read_stored_pos( slot, 4 );
 323
 324                                for (l_i = 0; l_i < 0x09; l_i++)
 325                                        if (( pos3 & 0x07) == at1700_ioaddr_pattern[l_i])
 326                                                break;
 327                                ioaddr = at1700_mca_probe_list[l_i];
 328                                
 329                                for (irq = 0; irq < 0x10; irq++)
 330                                        if (((((pos4>>4) & 0x0f) | (pos3 & 0xf0)) & 0xff) == at1700_irq_pattern[irq])
 331                                                break;
 332
 333                                        /* probing for a card at a particular IO/IRQ */
 334                                if (dev &&
 335                                        ((dev->irq && dev->irq != irq) ||
 336                                         (dev->base_addr && dev->base_addr != ioaddr))) {
 337                                        slot++;         /* probing next slot */
 338                                        continue;
 339                                }
 340
 341                                if (dev)
 342                                        dev->irq = irq;
 343                                
 344                                /* claim the slot */
 345                                mca_set_adapter_name( slot, at1720_mca_adapters[j].name );
 346                                mca_mark_as_used(slot);
 347
 348                                goto found;
 349                        }
 350                }
 351                /* if we get here, we didn't find an MCA adapter - try ISA */
 352        }
 353#endif
 354        slot = -1;
 355        /* We must check for the EEPROM-config boards first, else accessing
 356           IOCONFIG0 will move the board! */
 357        if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr
 358                && read_eeprom(ioaddr, 4) == 0x0000
 359                && (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
 360                is_at1700 = 1;
 361        else if (inb(ioaddr   + SAPROM    ) == 0x00
 362                && inb(ioaddr + SAPROM + 1) == 0x00
 363                && inb(ioaddr + SAPROM + 2) == 0x0e)
 364                is_fmv18x = 1;
 365        else {
 366                goto err_out;
 367        }
 368                        
 369#ifdef CONFIG_MCA
 370found:
 371#endif
 372
 373                /* Reset the internal state machines. */
 374        outb(0, ioaddr + RESET);
 375
 376        if (is_at1700) {
 377#ifndef CONFIG_X86_PC9800
 378                irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
 379                                                   | (read_eeprom(ioaddr, 0)>>14)];
 380#else
 381                {
 382                        char re1000plus_irqmap[4] = {3, 5, 6, 12};
 383                        irq = re1000plus_irqmap[inb(ioaddr + IOCONFIG1) >> 6];
 384                }
 385#endif
 386        } else {
 387                /* Check PnP mode for FMV-183/184/183A/184A. */
 388                /* This PnP routine is very poor. IO and IRQ should be known. */
 389                if (inb(ioaddr + CARDSTATUS1) & 0x20) {
 390                        irq = dev->irq;
 391                        for (i = 0; i < 8; i++) {
 392                                if (irq == fmv_irqmap_pnp[i])
 393                                        break;
 394                        }
 395                        if (i == 8) {
 396                                goto err_out;
 397                        }
 398                } else {
 399                        if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
 400                                goto err_out;
 401                        irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
 402                }
 403        }
 404
 405        printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
 406                   is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
 407
 408        dev->base_addr = ioaddr;
 409        dev->irq = irq;
 410
 411        if (is_at1700) {
 412                for(i = 0; i < 3; i++) {
 413                        unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
 414                        printk("%04x", eeprom_val);
 415                        ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
 416                }
 417        } else {
 418                for(i = 0; i < 6; i++) {
 419                        unsigned char val = inb(ioaddr + SAPROM + i);
 420                        printk("%02x", val);
 421                        dev->dev_addr[i] = val;
 422                }
 423        }
 424
 425        /* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
 426           rather than 150 ohm shielded twisted pair compensation.
 427           0x0000 == auto-sense the interface
 428           0x0800 == use TP interface
 429           0x1800 == use coax interface
 430           */
 431        {
 432                const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
 433                if (is_at1700) {
 434                        ushort setup_value = read_eeprom(ioaddr, 12);
 435                        dev->if_port = setup_value >> 8;
 436                } else {
 437                        ushort setup_value = inb(ioaddr + CARDSTATUS);
 438                        switch (setup_value & 0x07) {
 439                        case 0x01: /* 10base5 */
 440                        case 0x02: /* 10base2 */
 441                                dev->if_port = 0x18; break;
 442                        case 0x04: /* 10baseT */
 443                                dev->if_port = 0x08; break;
 444                        default:   /* auto-sense */
 445                                dev->if_port = 0x00; break;
 446                        }
 447                }
 448                printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
 449        }
 450
 451        /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
 452           bus access, two 4K Tx queues, and disabled Tx and Rx. */
 453        outb(0xda, ioaddr + CONFIG_0);
 454
 455        /* Set the station address in bank zero. */
 456        outb(0x00, ioaddr + CONFIG_1);
 457        for (i = 0; i < 6; i++)
 458                outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
 459
 460        /* Switch to bank 1 and set the multicast table to accept none. */
 461        outb(0x04, ioaddr + CONFIG_1);
 462        for (i = 0; i < 8; i++)
 463                outb(0x00, ioaddr + PORT_OFFSET(8 + i));
 464
 465
 466        /* Switch to bank 2 */
 467        /* Lock our I/O address, and set manual processing mode for 16 collisions. */
 468        outb(0x08, ioaddr + CONFIG_1);
 469#ifndef CONFIG_X86_PC9800
 470        outb(dev->if_port, ioaddr + MODE13);
 471#else
 472        outb(0, ioaddr + MODE13);
 473#endif
 474        outb(0x00, ioaddr + COL16CNTL);
 475
 476        if (net_debug)
 477                printk(version);
 478
 479        /* Initialize the device structure. */
 480        dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 481        if (dev->priv == NULL) {
 482                ret = -ENOMEM;
 483                goto err_out;
 484        }
 485        memset(dev->priv, 0, sizeof(struct net_local));
 486
 487        dev->open               = net_open;
 488        dev->stop               = net_close;
 489        dev->hard_start_xmit = net_send_packet;
 490        dev->get_stats  = net_get_stats;
 491        dev->set_multicast_list = &set_rx_mode;
 492        dev->tx_timeout = net_tx_timeout;
 493        dev->watchdog_timeo = TX_TIMEOUT;
 494
 495        lp = (struct net_local *)dev->priv;
 496        lp->lock = SPIN_LOCK_UNLOCKED;
 497
 498        /* Fill in the fields of 'dev' with ethernet-generic values. */
 499        ether_setup(dev);
 500
 501        lp->jumpered = is_fmv18x;
 502        lp->mca_slot = slot;
 503        /* Snarf the interrupt vector now. */
 504        ret = request_irq(irq, &net_interrupt, 0, dev->name, dev);
 505        if (ret) {
 506                printk ("  AT1700 at %#3x is unusable due to a conflict on"
 507                                "IRQ %d.\n", ioaddr, irq);
 508                goto err_out_priv;
 509        }
 510
 511        return 0;
 512
 513err_out_priv:
 514        kfree(dev->priv);
 515        dev->priv = NULL;
 516err_out:
 517#ifndef CONFIG_X86_PC9800
 518        release_region(ioaddr, AT1700_IO_EXTENT);
 519#else
 520        for (i = 0; i < 0x2000; i += 0x0200)
 521                release_region(ioaddr + i, 2);
 522#endif
 523        return ret;
 524}
 525
 526
 527/*  EEPROM_Ctrl bits. */
 528#define EE_SHIFT_CLK    0x40    /* EEPROM shift clock, in reg. 16. */
 529#define EE_CS                   0x20    /* EEPROM chip select, in reg. 16. */
 530#define EE_DATA_WRITE   0x80    /* EEPROM chip data in, in reg. 17. */
 531#define EE_DATA_READ    0x80    /* EEPROM chip data out, in reg. 17. */
 532
 533/* Delay between EEPROM clock transitions. */
 534#ifndef CONFIG_X86_PC9800
 535#define eeprom_delay()  do { } while (0)
 536#else
 537#define eeprom_delay()  __asm__ ("out%B0 %%al,%0" :: "N"(0x5f))
 538#endif
 539
 540/* The EEPROM commands include the alway-set leading bit. */
 541#define EE_WRITE_CMD    (5 << 6)
 542#define EE_READ_CMD             (6 << 6)
 543#define EE_ERASE_CMD    (7 << 6)
 544
 545static int __init read_eeprom(long ioaddr, int location)
 546{
 547        int i;
 548        unsigned short retval = 0;
 549        long ee_addr = ioaddr + EEPROM_Ctrl;
 550        long ee_daddr = ioaddr + EEPROM_Data;
 551        int read_cmd = location | EE_READ_CMD;
 552
 553        /* Shift the read command bits out. */
 554        for (i = 9; i >= 0; i--) {
 555                short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
 556                outb(EE_CS, ee_addr);
 557                outb(dataval, ee_daddr);
 558                eeprom_delay();
 559                outb(EE_CS | EE_SHIFT_CLK, ee_addr);    /* EEPROM clock tick. */
 560                eeprom_delay();
 561        }
 562        outb(EE_DATA_WRITE, ee_daddr);
 563        for (i = 16; i > 0; i--) {
 564                outb(EE_CS, ee_addr);
 565                eeprom_delay();
 566                outb(EE_CS | EE_SHIFT_CLK, ee_addr);
 567                eeprom_delay();
 568                retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
 569        }
 570
 571        /* Terminate the EEPROM access. */
 572        outb(EE_CS, ee_addr);
 573        eeprom_delay();
 574        outb(EE_SHIFT_CLK, ee_addr);
 575        outb(0, ee_addr);
 576        return retval;
 577}
 578
 579
 580
 581static int net_open(struct net_device *dev)
 582{
 583        struct net_local *lp = (struct net_local *)dev->priv;
 584        int ioaddr = dev->base_addr;
 585
 586        /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
 587           bus access, and two 4K Tx queues. */
 588        outb(0x5a, ioaddr + CONFIG_0);
 589
 590        /* Powerup, switch to register bank 2, and enable the Rx and Tx. */
 591        outb(0xe8, ioaddr + CONFIG_1);
 592
 593        lp->tx_started = 0;
 594        lp->tx_queue_ready = 1;
 595        lp->rx_started = 0;
 596        lp->tx_queue = 0;
 597        lp->tx_queue_len = 0;
 598
 599        /* Turn on hardware Tx and Rx interrupts. */
 600        outb(0x82, ioaddr + TX_INTR);
 601        outb(0x81, ioaddr + RX_INTR);
 602
 603        /* Enable the IRQ on boards of fmv18x it is feasible. */
 604        if (lp->jumpered) {
 605                outb(0x80, ioaddr + IOCONFIG1);
 606        }
 607
 608        netif_start_queue(dev);
 609        return 0;
 610}
 611
 612static void net_tx_timeout (struct net_device *dev)
 613{
 614        struct net_local *lp = (struct net_local *)dev->priv;
 615        int ioaddr = dev->base_addr;
 616
 617        printk ("%s: transmit timed out with status %04x, %s?\n", dev->name,
 618                inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
 619                ? "IRQ conflict" : "network cable problem");
 620        printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
 621         dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
 622                inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
 623                inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
 624        lp->stats.tx_errors++;
 625        /* ToDo: We should try to restart the adaptor... */
 626        outw(0xffff, ioaddr + MODE24);
 627        outw (0xffff, ioaddr + TX_STATUS);
 628        outb (0x5a, ioaddr + CONFIG_0);
 629        outb (0xe8, ioaddr + CONFIG_1);
 630        outw (0x8182, ioaddr + TX_INTR);
 631        outb (0x00, ioaddr + TX_START);
 632        outb (0x03, ioaddr + COL16CNTL);
 633
 634        dev->trans_start = jiffies;
 635
 636        lp->tx_started = 0;
 637        lp->tx_queue_ready = 1;
 638        lp->rx_started = 0;
 639        lp->tx_queue = 0;
 640        lp->tx_queue_len = 0;
 641
 642        netif_wake_queue(dev);
 643}
 644
 645
 646static int net_send_packet (struct sk_buff *skb, struct net_device *dev)
 647{
 648        struct net_local *lp = (struct net_local *) dev->priv;
 649        int ioaddr = dev->base_addr;
 650        short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
 651        short len = skb->len;
 652        unsigned char *buf = skb->data;
 653        static u8 pad[ETH_ZLEN];
 654
 655        netif_stop_queue (dev);
 656
 657        /* We may not start transmitting unless we finish transferring
 658           a packet into the Tx queue. During executing the following
 659           codes we possibly catch a Tx interrupt. Thus we flag off
 660           tx_queue_ready, so that we prevent the interrupt routine
 661           (net_interrupt) to start transmitting. */
 662        lp->tx_queue_ready = 0;
 663        {
 664                outw (length, ioaddr + DATAPORT);
 665                /* Packet data */
 666                outsw (ioaddr + DATAPORT, buf, len >> 1);
 667                /* Check for dribble byte */
 668                if (len & 1) {
 669                        outw(skb->data[skb->len-1], ioaddr + DATAPORT);
 670                        len++;
 671                }
 672                /* Check for packet padding */
 673                if (length != skb->len)
 674                        outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
 675
 676                lp->tx_queue++;
 677                lp->tx_queue_len += length + 2;
 678        }
 679        lp->tx_queue_ready = 1;
 680
 681        if (lp->tx_started == 0) {
 682                /* If the Tx is idle, always trigger a transmit. */
 683                outb (0x80 | lp->tx_queue, ioaddr + TX_START);
 684                lp->tx_queue = 0;
 685                lp->tx_queue_len = 0;
 686                dev->trans_start = jiffies;
 687                lp->tx_started = 1;
 688                netif_start_queue (dev);
 689        } else if (lp->tx_queue_len < 4096 - 1502)
 690                /* Yes, there is room for one more packet. */
 691                netif_start_queue (dev);
 692        dev_kfree_skb (skb);
 693
 694        return 0;
 695}
 696
 697/* The typical workload of the driver:
 698   Handle the network interface interrupts. */
 699static irqreturn_t
 700net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 701{
 702        struct net_device *dev = dev_id;
 703        struct net_local *lp;
 704        int ioaddr, status;
 705        int handled = 0;
 706
 707        if (dev == NULL) {
 708                printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
 709                return IRQ_NONE;
 710        }
 711
 712        ioaddr = dev->base_addr;
 713        lp = (struct net_local *)dev->priv;
 714        
 715        spin_lock (&lp->lock);
 716        
 717        status = inw(ioaddr + TX_STATUS);
 718        outw(status, ioaddr + TX_STATUS);
 719
 720        if (net_debug > 4)
 721                printk("%s: Interrupt with status %04x.\n", dev->name, status);
 722        if (lp->rx_started == 0 &&
 723            (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
 724                /* Got a packet(s).
 725                   We cannot execute net_rx more than once at the same time for
 726                   the same device. During executing net_rx, we possibly catch a
 727                   Tx interrupt. Thus we flag on rx_started, so that we prevent
 728                   the interrupt routine (net_interrupt) to dive into net_rx
 729                   again. */
 730                handled = 1;
 731                lp->rx_started = 1;
 732                outb(0x00, ioaddr + RX_INTR);   /* Disable RX intr. */
 733                net_rx(dev);
 734                outb(0x81, ioaddr + RX_INTR);   /* Enable  RX intr. */
 735                lp->rx_started = 0;
 736        }
 737        if (status & 0x00ff) {
 738                handled = 1;
 739                if (status & 0x02) {
 740                        /* More than 16 collisions occurred */
 741                        if (net_debug > 4)
 742                                printk("%s: 16 Collision occur during Txing.\n", dev->name);
 743                        /* Cancel sending a packet. */
 744                        outb(0x03, ioaddr + COL16CNTL);
 745                        lp->stats.collisions++;
 746                }
 747                if (status & 0x82) {
 748                        lp->stats.tx_packets++;
 749                        /* The Tx queue has any packets and is not being
 750                           transferred a packet from the host, start
 751                           transmitting. */
 752                        if (lp->tx_queue && lp->tx_queue_ready) {
 753                                outb(0x80 | lp->tx_queue, ioaddr + TX_START);
 754                                lp->tx_queue = 0;
 755                                lp->tx_queue_len = 0;
 756                                dev->trans_start = jiffies;
 757                                netif_wake_queue (dev);
 758                        } else {
 759                                lp->tx_started = 0;
 760                                netif_wake_queue (dev);
 761                        }
 762                }
 763        }
 764
 765        spin_unlock (&lp->lock);
 766        return IRQ_RETVAL(handled);
 767}
 768
 769/* We have a good packet(s), get it/them out of the buffers. */
 770static void
 771net_rx(struct net_device *dev)
 772{
 773        struct net_local *lp = (struct net_local *)dev->priv;
 774        int ioaddr = dev->base_addr;
 775        int boguscount = 5;
 776
 777        while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
 778                ushort status = inw(ioaddr + DATAPORT);
 779                ushort pkt_len = inw(ioaddr + DATAPORT);
 780
 781                if (net_debug > 4)
 782                        printk("%s: Rxing packet mode %02x status %04x.\n",
 783                                   dev->name, inb(ioaddr + RX_MODE), status);
 784#ifndef final_version
 785                if (status == 0) {
 786                        outb(0x05, ioaddr + RX_CTRL);
 787                        break;
 788                }
 789#endif
 790
 791                if ((status & 0xF0) != 0x20) {  /* There was an error. */
 792                        lp->stats.rx_errors++;
 793                        if (status & 0x08) lp->stats.rx_length_errors++;
 794                        if (status & 0x04) lp->stats.rx_frame_errors++;
 795                        if (status & 0x02) lp->stats.rx_crc_errors++;
 796                        if (status & 0x01) lp->stats.rx_over_errors++;
 797                } else {
 798                        /* Malloc up new buffer. */
 799                        struct sk_buff *skb;
 800
 801                        if (pkt_len > 1550) {
 802                                printk("%s: The AT1700 claimed a very large packet, size %d.\n",
 803                                           dev->name, pkt_len);
 804                                /* Prime the FIFO and then flush the packet. */
 805                                inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
 806                                outb(0x05, ioaddr + RX_CTRL);
 807                                lp->stats.rx_errors++;
 808                                break;
 809                        }
 810                        skb = dev_alloc_skb(pkt_len+3);
 811                        if (skb == NULL) {
 812                                printk("%s: Memory squeeze, dropping packet (len %d).\n",
 813                                           dev->name, pkt_len);
 814                                /* Prime the FIFO and then flush the packet. */
 815                                inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
 816                                outb(0x05, ioaddr + RX_CTRL);
 817                                lp->stats.rx_dropped++;
 818                                break;
 819                        }
 820                        skb->dev = dev;
 821                        skb_reserve(skb,2);
 822
 823                        insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
 824                        skb->protocol=eth_type_trans(skb, dev);
 825                        netif_rx(skb);
 826                        dev->last_rx = jiffies;
 827                        lp->stats.rx_packets++;
 828                        lp->stats.rx_bytes += pkt_len;
 829                }
 830                if (--boguscount <= 0)
 831                        break;
 832        }
 833
 834        /* If any worth-while packets have been received, dev_rint()
 835           has done a mark_bh(NET_BH) for us and will work on them
 836           when we get to the bottom-half routine. */
 837        {
 838                int i;
 839                for (i = 0; i < 20; i++) {
 840                        if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
 841                                break;
 842                        inw(ioaddr + DATAPORT);                         /* dummy status read */
 843                        outb(0x05, ioaddr + RX_CTRL);
 844                }
 845
 846                if (net_debug > 5)
 847                        printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
 848                                   dev->name, inb(ioaddr + RX_MODE), i);
 849        }
 850        return;
 851}
 852
 853/* The inverse routine to net_open(). */
 854static int net_close(struct net_device *dev)
 855{
 856        struct net_local *lp = (struct net_local *)dev->priv;
 857        int ioaddr = dev->base_addr;
 858
 859        netif_stop_queue(dev);
 860
 861        /* Set configuration register 0 to disable Tx and Rx. */
 862        outb(0xda, ioaddr + CONFIG_0);
 863
 864        /* No statistic counters on the chip to update. */
 865
 866        /* Disable the IRQ on boards of fmv18x where it is feasible. */
 867        if (lp->jumpered) {
 868                outb(0x00, ioaddr + IOCONFIG1);
 869                free_irq(dev->irq, dev);
 870        }
 871
 872        /* Power-down the chip.  Green, green, green! */
 873        outb(0x00, ioaddr + CONFIG_1);
 874        return 0;
 875}
 876
 877/* Get the current statistics.
 878   This may be called with the card open or closed.
 879   There are no on-chip counters, so this function is trivial.
 880*/
 881static struct net_device_stats *
 882net_get_stats(struct net_device *dev)
 883{
 884        struct net_local *lp = (struct net_local *)dev->priv;
 885        return &lp->stats;
 886}
 887
 888/*
 889  Set the multicast/promiscuous mode for this adaptor.
 890*/
 891
 892static void
 893set_rx_mode(struct net_device *dev)
 894{
 895        int ioaddr = dev->base_addr;
 896        struct net_local *lp = (struct net_local *)dev->priv;
 897        unsigned char mc_filter[8];              /* Multicast hash filter */
 898        unsigned long flags;
 899        int i;
 900
 901        if (dev->flags & IFF_PROMISC) {
 902                /* Unconditionally log net taps. */
 903                printk("%s: Promiscuous mode enabled.\n", dev->name);
 904                memset(mc_filter, 0xff, sizeof(mc_filter));
 905                outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
 906        } else if (dev->mc_count > MC_FILTERBREAK
 907                           ||  (dev->flags & IFF_ALLMULTI)) {
 908                /* Too many to filter perfectly -- accept all multicasts. */
 909                memset(mc_filter, 0xff, sizeof(mc_filter));
 910                outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
 911        } else if (dev->mc_count == 0) {
 912                memset(mc_filter, 0x00, sizeof(mc_filter));
 913                outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
 914        } else {
 915                struct dev_mc_list *mclist;
 916                int i;
 917
 918                memset(mc_filter, 0, sizeof(mc_filter));
 919                for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
 920                         i++, mclist = mclist->next) {
 921                        unsigned int bit =
 922                                ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
 923                        mc_filter[bit >> 3] |= (1 << bit);
 924                }
 925                outb(0x02, ioaddr + RX_MODE);   /* Use normal mode. */
 926        }
 927
 928        spin_lock_irqsave (&lp->lock, flags);
 929        if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
 930                int saved_bank = inw(ioaddr + CONFIG_0);
 931                /* Switch to bank 1 and set the multicast table. */
 932                outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
 933                for (i = 0; i < 8; i++)
 934                        outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
 935                memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
 936                outw(saved_bank, ioaddr + CONFIG_0);
 937        }
 938        spin_unlock_irqrestore (&lp->lock, flags);
 939        return;
 940}
 941
 942#ifdef MODULE
 943static struct net_device dev_at1700;
 944#ifndef CONFIG_X86_PC9800
 945static int io = 0x260;
 946#else
 947static int io = 0xd0;
 948#endif
 949
 950static int irq;
 951
 952MODULE_PARM(io, "i");
 953MODULE_PARM(irq, "i");
 954MODULE_PARM(net_debug, "i");
 955MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
 956MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
 957MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
 958
 959int init_module(void)
 960{
 961        if (io == 0)
 962                printk("at1700: You should not use auto-probing with insmod!\n");
 963        dev_at1700.base_addr = io;
 964        dev_at1700.irq       = irq;
 965        dev_at1700.init      = at1700_probe;
 966        if (register_netdev(&dev_at1700) != 0) {
 967                printk("at1700: register_netdev() returned non-zero.\n");
 968                return -EIO;
 969        }
 970        return 0;
 971}
 972
 973void
 974cleanup_module(void)
 975{
 976#ifdef CONFIG_MCA       
 977        struct net_local *lp = dev_at1700.priv;
 978        if(lp->mca_slot)
 979        {
 980                mca_mark_as_unused(lp->mca_slot);
 981        }
 982#endif  
 983        unregister_netdev(&dev_at1700);
 984        kfree(dev_at1700.priv);
 985        dev_at1700.priv = NULL;
 986
 987        /* If we don't do this, we can't re-insmod it later. */
 988        free_irq(dev_at1700.irq, NULL);
 989#ifndef CONFIG_X86_PC9800
 990        release_region(dev_at1700.base_addr, AT1700_IO_EXTENT);
 991#else
 992        {
 993                int i;
 994                for (i = 0; i < 0x2000; i += 0x200)
 995                        release_region(dev_at1700.base_addr + i, 2);
 996        }
 997#endif
 998}
 999#endif /* MODULE */
1000MODULE_LICENSE("GPL");
1001
1002
1003/*
1004 * Local variables:
1005 *  compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c at1700.c"
1006 *  alt-compile-command: "gcc -DMODVERSIONS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c at1700.c"
1007 *  tab-width: 4
1008 *  c-basic-offset: 4
1009 *  c-indent-level: 4
1010 * End:
1011 */
1012
1013
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.