linux/drivers/net/pcmcia/fmvj18x_cs.c
<<
>>
Prefs
   1/*======================================================================
   2    fmvj18x_cs.c 2.8 2002/03/23
   3
   4    A fmvj18x (and its compatibles) PCMCIA client driver
   5
   6    Contributed by Shingo Fujimoto, shingo@flab.fujitsu.co.jp
   7
   8    TDK LAK-CD021 and CONTEC C-NET(PC)C support added by 
   9    Nobuhiro Katayama, kata-n@po.iijnet.or.jp
  10
  11    The PCMCIA client code is based on code written by David Hinds.
  12    Network code is based on the "FMV-18x driver" by Yutaka TAMIYA
  13    but is actually largely Donald Becker's AT1700 driver, which
  14    carries the following attribution:
  15
  16    Written 1993-94 by Donald Becker.
  17
  18    Copyright 1993 United States Government as represented by the
  19    Director, National Security Agency.
  20    
  21    This software may be used and distributed according to the terms
  22    of the GNU General Public License, incorporated herein by reference.
  23    
  24    The author may be reached as becker@scyld.com, or C/O
  25    Scyld Computing Corporation
  26    410 Severn Ave., Suite 210
  27    Annapolis MD 21403
  28   
  29======================================================================*/
  30
  31#define DRV_NAME        "fmvj18x_cs"
  32#define DRV_VERSION     "2.9"
  33
  34#include <linux/module.h>
  35#include <linux/kernel.h>
  36#include <linux/init.h>
  37#include <linux/ptrace.h>
  38#include <linux/slab.h>
  39#include <linux/string.h>
  40#include <linux/timer.h>
  41#include <linux/interrupt.h>
  42#include <linux/in.h>
  43#include <linux/delay.h>
  44#include <linux/ethtool.h>
  45#include <linux/netdevice.h>
  46#include <linux/etherdevice.h>
  47#include <linux/skbuff.h>
  48#include <linux/if_arp.h>
  49#include <linux/ioport.h>
  50#include <linux/crc32.h>
  51
  52#include <pcmcia/cs_types.h>
  53#include <pcmcia/cs.h>
  54#include <pcmcia/cistpl.h>
  55#include <pcmcia/ciscode.h>
  56#include <pcmcia/ds.h>
  57
  58#include <asm/uaccess.h>
  59#include <asm/io.h>
  60#include <asm/system.h>
  61
  62/*====================================================================*/
  63
  64/* Module parameters */
  65
  66MODULE_DESCRIPTION("fmvj18x and compatible PCMCIA ethernet driver");
  67MODULE_LICENSE("GPL");
  68
  69#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
  70
  71/* SRAM configuration */
  72/* 0:4KB*2 TX buffer   else:8KB*2 TX buffer */
  73INT_MODULE_PARM(sram_config, 0);
  74
  75#ifdef PCMCIA_DEBUG
  76INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
  77#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
  78static char *version = DRV_NAME ".c " DRV_VERSION " 2002/03/23";
  79#else
  80#define DEBUG(n, args...)
  81#endif
  82
  83/*====================================================================*/
  84/*
  85    PCMCIA event handlers
  86 */
  87static int fmvj18x_config(struct pcmcia_device *link);
  88static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id);
  89static int fmvj18x_setup_mfc(struct pcmcia_device *link);
  90static void fmvj18x_release(struct pcmcia_device *link);
  91static void fmvj18x_detach(struct pcmcia_device *p_dev);
  92
  93/*
  94    LAN controller(MBH86960A) specific routines
  95 */
  96static int fjn_config(struct net_device *dev, struct ifmap *map);
  97static int fjn_open(struct net_device *dev);
  98static int fjn_close(struct net_device *dev);
  99static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev);
 100static irqreturn_t fjn_interrupt(int irq, void *dev_id);
 101static void fjn_rx(struct net_device *dev);
 102static void fjn_reset(struct net_device *dev);
 103static struct net_device_stats *fjn_get_stats(struct net_device *dev);
 104static void set_rx_mode(struct net_device *dev);
 105static void fjn_tx_timeout(struct net_device *dev);
 106static const struct ethtool_ops netdev_ethtool_ops;
 107
 108/*
 109    card type
 110 */
 111typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN, 
 112               XXX10304, NEC, KME
 113} cardtype_t;
 114
 115/*
 116    driver specific data structure
 117*/
 118typedef struct local_info_t {
 119        struct pcmcia_device    *p_dev;
 120    dev_node_t node;
 121    struct net_device_stats stats;
 122    long open_time;
 123    uint tx_started:1;
 124    uint tx_queue;
 125    u_short tx_queue_len;
 126    cardtype_t cardtype;
 127    u_short sent;
 128} local_info_t;
 129
 130#define MC_FILTERBREAK 64
 131
 132/*====================================================================*/
 133/* 
 134    ioport offset from the base address 
 135 */
 136#define TX_STATUS               0 /* transmit status register */
 137#define RX_STATUS               1 /* receive status register */
 138#define TX_INTR                 2 /* transmit interrupt mask register */
 139#define RX_INTR                 3 /* receive interrupt mask register */
 140#define TX_MODE                 4 /* transmit mode register */
 141#define RX_MODE                 5 /* receive mode register */
 142#define CONFIG_0                6 /* configuration register 0 */
 143#define CONFIG_1                7 /* configuration register 1 */
 144
 145#define NODE_ID                 8 /* node ID register            (bank 0) */
 146#define MAR_ADR                 8 /* multicast address registers (bank 1) */
 147
 148#define DATAPORT                8 /* buffer mem port registers   (bank 2) */
 149#define TX_START               10 /* transmit start register */
 150#define COL_CTRL               11 /* 16 collision control register */
 151#define BMPR12                 12 /* reserved */
 152#define BMPR13                 13 /* reserved */
 153#define RX_SKIP                14 /* skip received packet register */
 154
 155#define LAN_CTRL               16 /* LAN card control register */
 156
 157#define MAC_ID               0x1a /* hardware address */
 158#define UNGERMANN_MAC_ID     0x18 /* UNGERMANN-BASS hardware address */
 159
 160/* 
 161    control bits 
 162 */
 163#define ENA_TMT_OK           0x80
 164#define ENA_TMT_REC          0x20
 165#define ENA_COL              0x04
 166#define ENA_16_COL           0x02
 167#define ENA_TBUS_ERR         0x01
 168
 169#define ENA_PKT_RDY          0x80
 170#define ENA_BUS_ERR          0x40
 171#define ENA_LEN_ERR          0x08
 172#define ENA_ALG_ERR          0x04
 173#define ENA_CRC_ERR          0x02
 174#define ENA_OVR_FLO          0x01
 175
 176/* flags */
 177#define F_TMT_RDY            0x80 /* can accept new packet */
 178#define F_NET_BSY            0x40 /* carrier is detected */
 179#define F_TMT_OK             0x20 /* send packet successfully */
 180#define F_SRT_PKT            0x10 /* short packet error */
 181#define F_COL_ERR            0x04 /* collision error */
 182#define F_16_COL             0x02 /* 16 collision error */
 183#define F_TBUS_ERR           0x01 /* bus read error */
 184
 185#define F_PKT_RDY            0x80 /* packet(s) in buffer */
 186#define F_BUS_ERR            0x40 /* bus read error */
 187#define F_LEN_ERR            0x08 /* short packet */
 188#define F_ALG_ERR            0x04 /* frame error */
 189#define F_CRC_ERR            0x02 /* CRC error */
 190#define F_OVR_FLO            0x01 /* overflow error */
 191
 192#define F_BUF_EMP            0x40 /* receive buffer is empty */
 193
 194#define F_SKP_PKT            0x05 /* drop packet in buffer */
 195
 196/* default bitmaps */
 197#define D_TX_INTR  ( ENA_TMT_OK )
 198#define D_RX_INTR  ( ENA_PKT_RDY | ENA_LEN_ERR \
 199                   | ENA_ALG_ERR | ENA_CRC_ERR | ENA_OVR_FLO )
 200#define TX_STAT_M  ( F_TMT_RDY )
 201#define RX_STAT_M  ( F_PKT_RDY | F_LEN_ERR \
 202                   | F_ALG_ERR | F_CRC_ERR | F_OVR_FLO )
 203
 204/* commands */
 205#define D_TX_MODE            0x06 /* no tests, detect carrier */
 206#define ID_MATCHED           0x02 /* (RX_MODE) */
 207#define RECV_ALL             0x03 /* (RX_MODE) */
 208#define CONFIG0_DFL          0x5a /* 16bit bus, 4K x 2 Tx queues */
 209#define CONFIG0_DFL_1        0x5e /* 16bit bus, 8K x 2 Tx queues */
 210#define CONFIG0_RST          0xda /* Data Link Controller off (CONFIG_0) */
 211#define CONFIG0_RST_1        0xde /* Data Link Controller off (CONFIG_0) */
 212#define BANK_0               0xa0 /* bank 0 (CONFIG_1) */
 213#define BANK_1               0xa4 /* bank 1 (CONFIG_1) */
 214#define BANK_2               0xa8 /* bank 2 (CONFIG_1) */
 215#define CHIP_OFF             0x80 /* contrl chip power off (CONFIG_1) */
 216#define DO_TX                0x80 /* do transmit packet */
 217#define SEND_PKT             0x81 /* send a packet */
 218#define AUTO_MODE            0x07 /* Auto skip packet on 16 col detected */
 219#define MANU_MODE            0x03 /* Stop and skip packet on 16 col */
 220#define TDK_AUTO_MODE        0x47 /* Auto skip packet on 16 col detected */
 221#define TDK_MANU_MODE        0x43 /* Stop and skip packet on 16 col */
 222#define INTR_OFF             0x0d /* LAN controller ignores interrupts */
 223#define INTR_ON              0x1d /* LAN controller will catch interrupts */
 224
 225#define TX_TIMEOUT              ((400*HZ)/1000)
 226
 227#define BANK_0U              0x20 /* bank 0 (CONFIG_1) */
 228#define BANK_1U              0x24 /* bank 1 (CONFIG_1) */
 229#define BANK_2U              0x28 /* bank 2 (CONFIG_1) */
 230
 231static int fmvj18x_probe(struct pcmcia_device *link)
 232{
 233    local_info_t *lp;
 234    struct net_device *dev;
 235
 236    DEBUG(0, "fmvj18x_attach()\n");
 237
 238    /* Make up a FMVJ18x specific data structure */
 239    dev = alloc_etherdev(sizeof(local_info_t));
 240    if (!dev)
 241        return -ENOMEM;
 242    lp = netdev_priv(dev);
 243    link->priv = dev;
 244    lp->p_dev = link;
 245
 246    /* The io structure describes IO port mapping */
 247    link->io.NumPorts1 = 32;
 248    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
 249    link->io.IOAddrLines = 5;
 250
 251    /* Interrupt setup */
 252    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
 253    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
 254    link->irq.Handler = &fjn_interrupt;
 255    link->irq.Instance = dev;
 256
 257    /* General socket configuration */
 258    link->conf.Attributes = CONF_ENABLE_IRQ;
 259    link->conf.IntType = INT_MEMORY_AND_IO;
 260
 261    /* The FMVJ18x specific entries in the device structure. */
 262    dev->hard_start_xmit = &fjn_start_xmit;
 263    dev->set_config = &fjn_config;
 264    dev->get_stats = &fjn_get_stats;
 265    dev->set_multicast_list = &set_rx_mode;
 266    dev->open = &fjn_open;
 267    dev->stop = &fjn_close;
 268#ifdef HAVE_TX_TIMEOUT
 269    dev->tx_timeout = fjn_tx_timeout;
 270    dev->watchdog_timeo = TX_TIMEOUT;
 271#endif
 272    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
 273
 274    return fmvj18x_config(link);
 275} /* fmvj18x_attach */
 276
 277/*====================================================================*/
 278
 279static void fmvj18x_detach(struct pcmcia_device *link)
 280{
 281    struct net_device *dev = link->priv;
 282
 283    DEBUG(0, "fmvj18x_detach(0x%p)\n", link);
 284
 285    if (link->dev_node)
 286        unregister_netdev(dev);
 287
 288    fmvj18x_release(link);
 289
 290    free_netdev(dev);
 291} /* fmvj18x_detach */
 292
 293/*====================================================================*/
 294
 295#define CS_CHECK(fn, ret) \
 296do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 297
 298static int mfc_try_io_port(struct pcmcia_device *link)
 299{
 300    int i, ret;
 301    static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
 302
 303    for (i = 0; i < 5; i++) {
 304        link->io.BasePort2 = serial_base[i];
 305        link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
 306        if (link->io.BasePort2 == 0) {
 307            link->io.NumPorts2 = 0;
 308            printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
 309        }
 310        ret = pcmcia_request_io(link, &link->io);
 311        if (ret == CS_SUCCESS) return ret;
 312    }
 313    return ret;
 314}
 315
 316static int ungermann_try_io_port(struct pcmcia_device *link)
 317{
 318    int ret;
 319    kio_addr_t ioaddr;
 320    /*
 321        Ungermann-Bass Access/CARD accepts 0x300,0x320,0x340,0x360
 322        0x380,0x3c0 only for ioport.
 323    */
 324    for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
 325        link->io.BasePort1 = ioaddr;
 326        ret = pcmcia_request_io(link, &link->io);
 327        if (ret == CS_SUCCESS) {
 328            /* calculate ConfigIndex value */
 329            link->conf.ConfigIndex = 
 330                ((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
 331            return ret;
 332        }
 333    }
 334    return ret; /* RequestIO failed */
 335}
 336
 337static int fmvj18x_config(struct pcmcia_device *link)
 338{
 339    struct net_device *dev = link->priv;
 340    local_info_t *lp = netdev_priv(dev);
 341    tuple_t tuple;
 342    cisparse_t parse;
 343    u_short buf[32];
 344    int i, last_fn = 0, last_ret = 0, ret;
 345    kio_addr_t ioaddr;
 346    cardtype_t cardtype;
 347    char *card_name = "unknown";
 348    u_char *node_id;
 349    DECLARE_MAC_BUF(mac);
 350
 351    DEBUG(0, "fmvj18x_config(0x%p)\n", link);
 352
 353    tuple.TupleData = (u_char *)buf;
 354    tuple.TupleDataMax = 64;
 355    tuple.TupleOffset = 0;
 356    tuple.DesiredTuple = CISTPL_FUNCE;
 357    tuple.TupleOffset = 0;
 358    if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
 359        /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
 360        tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
 361        CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
 362        CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
 363        CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
 364        link->conf.ConfigIndex = parse.cftable_entry.index;
 365        switch (link->manf_id) {
 366        case MANFID_TDK:
 367            cardtype = TDK;
 368            if (link->card_id == PRODID_TDK_GN3410
 369                        || link->card_id == PRODID_TDK_NP9610
 370                        || link->card_id == PRODID_TDK_MN3200) {
 371                /* MultiFunction Card */
 372                link->conf.ConfigBase = 0x800;
 373                link->conf.ConfigIndex = 0x47;
 374                link->io.NumPorts2 = 8;
 375            }
 376            break;
 377        case MANFID_NEC:
 378            cardtype = NEC; /* MultiFunction Card */
 379            link->conf.ConfigBase = 0x800;
 380            link->conf.ConfigIndex = 0x47;
 381            link->io.NumPorts2 = 8;
 382            break;
 383        case MANFID_KME:
 384            cardtype = KME; /* MultiFunction Card */
 385            link->conf.ConfigBase = 0x800;
 386            link->conf.ConfigIndex = 0x47;
 387            link->io.NumPorts2 = 8;
 388            break;
 389        case MANFID_CONTEC:
 390            cardtype = CONTEC;
 391            break;
 392        case MANFID_FUJITSU:
 393            if (link->card_id == PRODID_FUJITSU_MBH10302)
 394                /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302),
 395                   but these are MBH10304 based card. */ 
 396                cardtype = MBH10304;
 397            else if (link->card_id == PRODID_FUJITSU_MBH10304)
 398                cardtype = MBH10304;
 399            else
 400                cardtype = LA501;
 401            break;
 402        default:
 403            cardtype = MBH10304;
 404        }
 405    } else {
 406        /* old type card */
 407        switch (link->manf_id) {
 408        case MANFID_FUJITSU:
 409            if (link->card_id == PRODID_FUJITSU_MBH10304) {
 410                cardtype = XXX10304;    /* MBH10304 with buggy CIS */
 411                link->conf.ConfigIndex = 0x20;
 412            } else {
 413                cardtype = MBH10302;    /* NextCom NC5310, etc. */
 414                link->conf.ConfigIndex = 1;
 415            }
 416            break;
 417        case MANFID_UNGERMANN:
 418            cardtype = UNGERMANN;
 419            break;
 420        default:
 421            cardtype = MBH10302;
 422            link->conf.ConfigIndex = 1;
 423        }
 424    }
 425
 426    if (link->io.NumPorts2 != 0) {
 427        link->irq.Attributes =
 428                IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
 429        ret = mfc_try_io_port(link);
 430        if (ret != CS_SUCCESS) goto cs_failed;
 431    } else if (cardtype == UNGERMANN) {
 432        ret = ungermann_try_io_port(link);
 433        if (ret != CS_SUCCESS) goto cs_failed;
 434    } else { 
 435        CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));
 436    }
 437    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
 438    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
 439    dev->irq = link->irq.AssignedIRQ;
 440    dev->base_addr = link->io.BasePort1;
 441
 442    if (link->io.BasePort2 != 0)
 443        fmvj18x_setup_mfc(link);
 444
 445    ioaddr = dev->base_addr;
 446
 447    /* Reset controller */
 448    if (sram_config == 0) 
 449        outb(CONFIG0_RST, ioaddr + CONFIG_0);
 450    else
 451        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
 452
 453    /* Power On chip and select bank 0 */
 454    if (cardtype == MBH10302)
 455        outb(BANK_0, ioaddr + CONFIG_1);
 456    else
 457        outb(BANK_0U, ioaddr + CONFIG_1);
 458    
 459    /* Set hardware address */
 460    switch (cardtype) {
 461    case MBH10304:
 462    case TDK:
 463    case LA501:
 464    case CONTEC:
 465    case NEC:
 466    case KME:
 467        tuple.DesiredTuple = CISTPL_FUNCE;
 468        tuple.TupleOffset = 0;
 469        CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
 470        tuple.TupleOffset = 0;
 471        CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
 472        if (cardtype == MBH10304) {
 473            /* MBH10304's CIS_FUNCE is corrupted */
 474            node_id = &(tuple.TupleData[5]);
 475            card_name = "FMV-J182";
 476        } else {
 477            while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
 478                CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
 479                CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
 480            }
 481            node_id = &(tuple.TupleData[2]);
 482            if( cardtype == TDK ) {
 483                card_name = "TDK LAK-CD021";
 484            } else if( cardtype == LA501 ) {
 485                card_name = "LA501";
 486            } else if( cardtype == NEC ) {
 487                card_name = "PK-UG-J001";
 488            } else if( cardtype == KME ) {
 489                card_name = "Panasonic";
 490            } else {
 491                card_name = "C-NET(PC)C";
 492            }
 493        }
 494        /* Read MACID from CIS */
 495        for (i = 0; i < 6; i++)
 496            dev->dev_addr[i] = node_id[i];
 497        break;
 498    case UNGERMANN:
 499        /* Read MACID from register */
 500        for (i = 0; i < 6; i++) 
 501            dev->dev_addr[i] = inb(ioaddr + UNGERMANN_MAC_ID + i);
 502        card_name = "Access/CARD";
 503        break;
 504    case XXX10304:
 505        /* Read MACID from Buggy CIS */
 506        if (fmvj18x_get_hwinfo(link, tuple.TupleData) == -1) {
 507            printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n");
 508            goto failed;
 509        }
 510        for (i = 0 ; i < 6; i++) {
 511            dev->dev_addr[i] = tuple.TupleData[i];
 512        }
 513        card_name = "FMV-J182";
 514        break;
 515    case MBH10302:
 516    default:
 517        /* Read MACID from register */
 518        for (i = 0; i < 6; i++) 
 519            dev->dev_addr[i] = inb(ioaddr + MAC_ID + i);
 520        card_name = "FMV-J181";
 521        break;
 522    }
 523
 524    lp->cardtype = cardtype;
 525    link->dev_node = &lp->node;
 526    SET_NETDEV_DEV(dev, &handle_to_dev(link));
 527
 528    if (register_netdev(dev) != 0) {
 529        printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n");
 530        link->dev_node = NULL;
 531        goto failed;
 532    }
 533
 534    strcpy(lp->node.dev_name, dev->name);
 535
 536    /* print current configuration */
 537    printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, "
 538           "hw_addr %s\n",
 539           dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2", 
 540           dev->base_addr, dev->irq, print_mac(mac, dev->dev_addr));
 541
 542    return 0;
 543    
 544cs_failed:
 545    /* All Card Services errors end up here */
 546    cs_error(link, last_fn, last_ret);
 547failed:
 548    fmvj18x_release(link);
 549    return -ENODEV;
 550} /* fmvj18x_config */
 551/*====================================================================*/
 552
 553static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
 554{
 555    win_req_t req;
 556    memreq_t mem;
 557    u_char __iomem *base;
 558    int i, j;
 559
 560    /* Allocate a small memory window */
 561    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 562    req.Base = 0; req.Size = 0;
 563    req.AccessSpeed = 0;
 564    i = pcmcia_request_window(&link, &req, &link->win);
 565    if (i != CS_SUCCESS) {
 566        cs_error(link, RequestWindow, i);
 567        return -1;
 568    }
 569
 570    base = ioremap(req.Base, req.Size);
 571    mem.Page = 0;
 572    mem.CardOffset = 0;
 573    pcmcia_map_mem_page(link->win, &mem);
 574
 575    /*
 576     *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
 577     *  22 0d xx xx xx 04 06 yy yy yy yy yy yy ff
 578     *  'xx' is garbage.
 579     *  'yy' is MAC address.
 580    */ 
 581    for (i = 0; i < 0x200; i++) {
 582        if (readb(base+i*2) == 0x22) {  
 583            if (readb(base+(i-1)*2) == 0xff
 584             && readb(base+(i+5)*2) == 0x04
 585             && readb(base+(i+6)*2) == 0x06
 586             && readb(base+(i+13)*2) == 0xff) 
 587                break;
 588        }
 589    }
 590
 591    if (i != 0x200) {
 592        for (j = 0 ; j < 6; j++,i++) {
 593            node_id[j] = readb(base+(i+7)*2);
 594        }
 595    }
 596
 597    iounmap(base);
 598    j = pcmcia_release_window(link->win);
 599    if (j != CS_SUCCESS)
 600        cs_error(link, ReleaseWindow, j);
 601    return (i != 0x200) ? 0 : -1;
 602
 603} /* fmvj18x_get_hwinfo */
 604/*====================================================================*/
 605
 606static int fmvj18x_setup_mfc(struct pcmcia_device *link)
 607{
 608    win_req_t req;
 609    memreq_t mem;
 610    u_char __iomem *base;
 611    int i, j;
 612    struct net_device *dev = link->priv;
 613    kio_addr_t ioaddr;
 614
 615    /* Allocate a small memory window */
 616    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 617    req.Base = 0; req.Size = 0;
 618    req.AccessSpeed = 0;
 619    i = pcmcia_request_window(&link, &req, &link->win);
 620    if (i != CS_SUCCESS) {
 621        cs_error(link, RequestWindow, i);
 622        return -1;
 623    }
 624
 625    base = ioremap(req.Base, req.Size);
 626    mem.Page = 0;
 627    mem.CardOffset = 0;
 628    pcmcia_map_mem_page(link->win, &mem);
 629
 630    ioaddr = dev->base_addr;
 631    writeb(0x47, base+0x800);   /* Config Option Register of LAN */
 632    writeb(0x0, base+0x802);    /* Config and Status Register */
 633
 634    writeb(ioaddr & 0xff, base+0x80a);          /* I/O Base(Low) of LAN */
 635    writeb((ioaddr >> 8) & 0xff, base+0x80c);   /* I/O Base(High) of LAN */
 636   
 637    writeb(0x45, base+0x820);   /* Config Option Register of Modem */
 638    writeb(0x8, base+0x822);    /* Config and Status Register */
 639
 640    iounmap(base);
 641    j = pcmcia_release_window(link->win);
 642    if (j != CS_SUCCESS)
 643        cs_error(link, ReleaseWindow, j);
 644    return 0;
 645
 646}
 647/*====================================================================*/
 648
 649static void fmvj18x_release(struct pcmcia_device *link)
 650{
 651        DEBUG(0, "fmvj18x_release(0x%p)\n", link);
 652        pcmcia_disable_device(link);
 653}
 654
 655static int fmvj18x_suspend(struct pcmcia_device *link)
 656{
 657        struct net_device *dev = link->priv;
 658
 659        if (link->open)
 660                netif_device_detach(dev);
 661
 662        return 0;
 663}
 664
 665static int fmvj18x_resume(struct pcmcia_device *link)
 666{
 667        struct net_device *dev = link->priv;
 668
 669        if (link->open) {
 670                fjn_reset(dev);
 671                netif_device_attach(dev);
 672        }
 673
 674        return 0;
 675}
 676
 677/*====================================================================*/
 678
 679static struct pcmcia_device_id fmvj18x_ids[] = {
 680        PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004),
 681        PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59),
 682        PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922),
 683        PCMCIA_DEVICE_PROD_ID12("Eiger labs,Inc.", "EPX-10BT PC Card Ethernet 10BT", 0xf47e6c66, 0x877f9922),
 684        PCMCIA_DEVICE_PROD_ID12("FUJITSU", "LAN Card(FMV-J182)", 0x6ee5a3d8, 0x5baf31db),
 685        PCMCIA_DEVICE_PROD_ID12("FUJITSU", "MBH10308", 0x6ee5a3d8, 0x3f04875e),
 686        PCMCIA_DEVICE_PROD_ID12("FUJITSU TOWA", "LA501", 0xb8451188, 0x12939ba2),
 687        PCMCIA_DEVICE_PROD_ID12("HITACHI", "HT-4840-11", 0xf4f43949, 0x773910f4),
 688        PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310B Ver1.0       ", 0x8cef4d3a, 0x075fc7b6),
 689        PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310 Ver1.0        ", 0x8cef4d3a, 0xbccf43e6),
 690        PCMCIA_DEVICE_PROD_ID12("RATOC System Inc.", "10BASE_T CARD R280", 0x85c10e17, 0xd9413666),
 691        PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CD02x", 0x1eae9475, 0x8fa0ee70),
 692        PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CF010", 0x1eae9475, 0x7683bc9a),
 693        PCMCIA_DEVICE_PROD_ID1("CONTEC Co.,Ltd.", 0x58d8fee2),
 694        PCMCIA_DEVICE_PROD_ID1("PCMCIA LAN MBH10304  ES", 0x2599f454),
 695        PCMCIA_DEVICE_PROD_ID1("PCMCIA MBH10302", 0x8f4005da),
 696        PCMCIA_DEVICE_PROD_ID1("UBKK,V2.0", 0x90888080),
 697        PCMCIA_PFC_DEVICE_PROD_ID12(0, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
 698        PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
 699        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0d0a),
 700        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
 701        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
 702        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
 703        PCMCIA_DEVICE_NULL,
 704};
 705MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
 706
 707static struct pcmcia_driver fmvj18x_cs_driver = {
 708        .owner          = THIS_MODULE,
 709        .drv            = {
 710                .name   = "fmvj18x_cs",
 711        },
 712        .probe          = fmvj18x_probe,
 713        .remove         = fmvj18x_detach,
 714        .id_table       = fmvj18x_ids,
 715        .suspend        = fmvj18x_suspend,
 716        .resume         = fmvj18x_resume,
 717};
 718
 719static int __init init_fmvj18x_cs(void)
 720{
 721        return pcmcia_register_driver(&fmvj18x_cs_driver);
 722}
 723
 724static void __exit exit_fmvj18x_cs(void)
 725{
 726        pcmcia_unregister_driver(&fmvj18x_cs_driver);
 727}
 728
 729module_init(init_fmvj18x_cs);
 730module_exit(exit_fmvj18x_cs);
 731
 732/*====================================================================*/
 733
 734static irqreturn_t fjn_interrupt(int irq, void *dev_id)
 735{
 736    struct net_device *dev = dev_id;
 737    local_info_t *lp = netdev_priv(dev);
 738    kio_addr_t ioaddr;
 739    unsigned short tx_stat, rx_stat;
 740
 741    if (lp == NULL) {
 742        printk(KERN_NOTICE "fjn_interrupt(): irq %d for "
 743               "unknown device.\n", irq);
 744        return IRQ_NONE;
 745    }
 746    ioaddr = dev->base_addr;
 747
 748    /* avoid multiple interrupts */
 749    outw(0x0000, ioaddr + TX_INTR);
 750
 751    /* wait for a while */
 752    udelay(1);
 753
 754    /* get status */
 755    tx_stat = inb(ioaddr + TX_STATUS);
 756    rx_stat = inb(ioaddr + RX_STATUS);
 757
 758    /* clear status */
 759    outb(tx_stat, ioaddr + TX_STATUS);
 760    outb(rx_stat, ioaddr + RX_STATUS);
 761    
 762    DEBUG(4, "%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
 763    DEBUG(4, "               tx_status %02x.\n", tx_stat);
 764    
 765    if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
 766        /* there is packet(s) in rx buffer */
 767        fjn_rx(dev);
 768    }
 769    if (tx_stat & F_TMT_RDY) {
 770        lp->stats.tx_packets += lp->sent ;
 771        lp->sent = 0 ;
 772        if (lp->tx_queue) {
 773            outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
 774            lp->sent = lp->tx_queue ;
 775            lp->tx_queue = 0;
 776            lp->tx_queue_len = 0;
 777            dev->trans_start = jiffies;
 778        } else {
 779            lp->tx_started = 0;
 780        }
 781        netif_wake_queue(dev);
 782    }
 783    DEBUG(4, "%s: exiting interrupt,\n", dev->name);
 784    DEBUG(4, "    tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
 785
 786    outb(D_TX_INTR, ioaddr + TX_INTR);
 787    outb(D_RX_INTR, ioaddr + RX_INTR);
 788    return IRQ_HANDLED;
 789
 790} /* fjn_interrupt */
 791
 792/*====================================================================*/
 793
 794static void fjn_tx_timeout(struct net_device *dev)
 795{
 796    struct local_info_t *lp = netdev_priv(dev);
 797    kio_addr_t ioaddr = dev->base_addr;
 798
 799    printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
 800           dev->name, htons(inw(ioaddr + TX_STATUS)),
 801           inb(ioaddr + TX_STATUS) & F_TMT_RDY
 802           ? "IRQ conflict" : "network cable problem");
 803    printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
 804           "%04x %04x %04x %04x %04x.\n",
 805           dev->name, htons(inw(ioaddr + 0)),
 806           htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
 807           htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
 808           htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
 809           htons(inw(ioaddr +14)));
 810    lp->stats.tx_errors++;
 811    /* ToDo: We should try to restart the adaptor... */
 812    local_irq_disable();
 813    fjn_reset(dev);
 814
 815    lp->tx_started = 0;
 816    lp->tx_queue = 0;
 817    lp->tx_queue_len = 0;
 818    lp->sent = 0;
 819    lp->open_time = jiffies;
 820    local_irq_enable();
 821    netif_wake_queue(dev);
 822}
 823
 824static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev)
 825{
 826    struct local_info_t *lp = netdev_priv(dev);
 827    kio_addr_t ioaddr = dev->base_addr;
 828    short length = skb->len;
 829    
 830    if (length < ETH_ZLEN)
 831    {
 832        if (skb_padto(skb, ETH_ZLEN))
 833                return 0;
 834        length = ETH_ZLEN;
 835    }
 836
 837    netif_stop_queue(dev);
 838
 839    {
 840        unsigned char *buf = skb->data;
 841
 842        if (length > ETH_FRAME_LEN) {
 843            printk(KERN_NOTICE "%s: Attempting to send a large packet"
 844                   " (%d bytes).\n", dev->name, length);
 845            return 1;
 846        }
 847
 848        DEBUG(4, "%s: Transmitting a packet of length %lu.\n",
 849              dev->name, (unsigned long)skb->len);
 850        lp->stats.tx_bytes += skb->len;
 851
 852        /* Disable both interrupts. */
 853        outw(0x0000, ioaddr + TX_INTR);
 854
 855        /* wait for a while */
 856        udelay(1);
 857
 858        outw(length, ioaddr + DATAPORT);
 859        outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
 860
 861        lp->tx_queue++;
 862        lp->tx_queue_len += ((length+3) & ~1);
 863
 864        if (lp->tx_started == 0) {
 865            /* If the Tx is idle, always trigger a transmit. */
 866            outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
 867            lp->sent = lp->tx_queue ;
 868            lp->tx_queue = 0;
 869            lp->tx_queue_len = 0;
 870            dev->trans_start = jiffies;
 871            lp->tx_started = 1;
 872            netif_start_queue(dev);
 873        } else {
 874            if( sram_config == 0 ) {
 875                if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
 876                    /* Yes, there is room for one more packet. */
 877                    netif_start_queue(dev);
 878            } else {
 879                if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) && 
 880                                                lp->tx_queue < 127 )
 881                    /* Yes, there is room for one more packet. */
 882                    netif_start_queue(dev);
 883            }
 884        }
 885
 886        /* Re-enable interrupts */
 887        outb(D_TX_INTR, ioaddr + TX_INTR);
 888        outb(D_RX_INTR, ioaddr + RX_INTR);
 889    }
 890    dev_kfree_skb (skb);
 891
 892    return 0;
 893} /* fjn_start_xmit */
 894
 895/*====================================================================*/
 896
 897static void fjn_reset(struct net_device *dev)
 898{
 899    struct local_info_t *lp = netdev_priv(dev);
 900    kio_addr_t ioaddr = dev->base_addr;
 901    int i;
 902
 903    DEBUG(4, "fjn_reset(%s) called.\n",dev->name);
 904
 905    /* Reset controller */
 906    if( sram_config == 0 ) 
 907        outb(CONFIG0_RST, ioaddr + CONFIG_0);
 908    else
 909        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
 910
 911    /* Power On chip and select bank 0 */
 912    if (lp->cardtype == MBH10302)
 913        outb(BANK_0, ioaddr + CONFIG_1);
 914    else
 915        outb(BANK_0U, ioaddr + CONFIG_1);
 916
 917    /* Set Tx modes */
 918    outb(D_TX_MODE, ioaddr + TX_MODE);
 919    /* set Rx modes */
 920    outb(ID_MATCHED, ioaddr + RX_MODE);
 921
 922    /* Set hardware address */
 923    for (i = 0; i < 6; i++) 
 924        outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
 925
 926    /* (re)initialize the multicast table */
 927    set_rx_mode(dev);
 928
 929    /* Switch to bank 2 (runtime mode) */
 930    if (lp->cardtype == MBH10302)
 931        outb(BANK_2, ioaddr + CONFIG_1);
 932    else
 933        outb(BANK_2U, ioaddr + CONFIG_1);
 934
 935    /* set 16col ctrl bits */
 936    if( lp->cardtype == TDK || lp->cardtype == CONTEC) 
 937        outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
 938    else
 939        outb(AUTO_MODE, ioaddr + COL_CTRL);
 940
 941    /* clear Reserved Regs */
 942    outb(0x00, ioaddr + BMPR12);
 943    outb(0x00, ioaddr + BMPR13);
 944
 945    /* reset Skip packet reg. */
 946    outb(0x01, ioaddr + RX_SKIP);
 947
 948    /* Enable Tx and Rx */
 949    if( sram_config == 0 )
 950        outb(CONFIG0_DFL, ioaddr + CONFIG_0);
 951    else
 952        outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
 953
 954    /* Init receive pointer ? */
 955    inw(ioaddr + DATAPORT);
 956    inw(ioaddr + DATAPORT);
 957
 958    /* Clear all status */
 959    outb(0xff, ioaddr + TX_STATUS);
 960    outb(0xff, ioaddr + RX_STATUS);
 961
 962    if (lp->cardtype == MBH10302)
 963        outb(INTR_OFF, ioaddr + LAN_CTRL);
 964
 965    /* Turn on Rx interrupts */
 966    outb(D_TX_INTR, ioaddr + TX_INTR);
 967    outb(D_RX_INTR, ioaddr + RX_INTR);
 968
 969    /* Turn on interrupts from LAN card controller */
 970    if (lp->cardtype == MBH10302)
 971        outb(INTR_ON, ioaddr + LAN_CTRL);
 972} /* fjn_reset */
 973
 974/*====================================================================*/
 975
 976static void fjn_rx(struct net_device *dev)
 977{
 978    struct local_info_t *lp = netdev_priv(dev);
 979    kio_addr_t ioaddr = dev->base_addr;
 980    int boguscount = 10;        /* 5 -> 10: by agy 19940922 */
 981
 982    DEBUG(4, "%s: in rx_packet(), rx_status %02x.\n",
 983          dev->name, inb(ioaddr + RX_STATUS));
 984
 985    while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
 986        u_short status = inw(ioaddr + DATAPORT);
 987
 988        DEBUG(4, "%s: Rxing packet mode %02x status %04x.\n",
 989              dev->name, inb(ioaddr + RX_MODE), status);
 990#ifndef final_version
 991        if (status == 0) {
 992            outb(F_SKP_PKT, ioaddr + RX_SKIP);
 993            break;
 994        }
 995#endif
 996        if ((status & 0xF0) != 0x20) {  /* There was an error. */
 997            lp->stats.rx_errors++;
 998            if (status & F_LEN_ERR) lp->stats.rx_length_errors++;
 999            if (status & F_ALG_ERR) lp->stats.rx_frame_errors++;
1000            if (status & F_CRC_ERR) lp->stats.rx_crc_errors++;
1001            if (status & F_OVR_FLO) lp->stats.rx_over_errors++;
1002        } else {
1003            u_short pkt_len = inw(ioaddr + DATAPORT);
1004            /* Malloc up new buffer. */
1005            struct sk_buff *skb;
1006
1007            if (pkt_len > 1550) {
1008                printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
1009                       "large packet, size %d.\n", dev->name, pkt_len);
1010                outb(F_SKP_PKT, ioaddr + RX_SKIP);
1011                lp->stats.rx_errors++;
1012                break;
1013            }
1014            skb = dev_alloc_skb(pkt_len+2);
1015            if (skb == NULL) {
1016                printk(KERN_NOTICE "%s: Memory squeeze, dropping "
1017                       "packet (len %d).\n", dev->name, pkt_len);
1018                outb(F_SKP_PKT, ioaddr + RX_SKIP);
1019                lp->stats.rx_dropped++;
1020                break;
1021            }
1022
1023            skb_reserve(skb, 2);
1024            insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1025                 (pkt_len + 1) >> 1);
1026            skb->protocol = eth_type_trans(skb, dev);
1027
1028#ifdef PCMCIA_DEBUG
1029            if (pc_debug > 5) {
1030                int i;
1031                printk(KERN_DEBUG "%s: Rxed packet of length %d: ",
1032                       dev->name, pkt_len);
1033                for (i = 0; i < 14; i++)
1034                    printk(" %02x", skb->data[i]);
1035                printk(".\n");
1036            }
1037#endif
1038
1039            netif_rx(skb);
1040            dev->last_rx = jiffies;
1041            lp->stats.rx_packets++;
1042            lp->stats.rx_bytes += pkt_len;
1043        }
1044        if (--boguscount <= 0)
1045            break;
1046    }
1047
1048    /* If any worth-while packets have been received, dev_rint()
1049           has done a netif_wake_queue() for us and will work on them
1050           when we get to the bottom-half routine. */
1051/*
1052    if (lp->cardtype != TDK) {
1053        int i;
1054        for (i = 0; i < 20; i++) {
1055            if ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == F_BUF_EMP)
1056                break;
1057            (void)inw(ioaddr + DATAPORT);  /+ dummy status read +/
1058            outb(F_SKP_PKT, ioaddr + RX_SKIP);
1059        }
1060
1061        if (i > 0)
1062            DEBUG(5, "%s: Exint Rx packet with mode %02x after "
1063                  "%d ticks.\n", dev->name, inb(ioaddr + RX_MODE), i);
1064    }
1065*/
1066
1067    return;
1068} /* fjn_rx */
1069
1070/*====================================================================*/
1071
1072static void netdev_get_drvinfo(struct net_device *dev,
1073                               struct ethtool_drvinfo *info)
1074{
1075        strcpy(info->driver, DRV_NAME);
1076        strcpy(info->version, DRV_VERSION);
1077        sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1078}
1079
1080#ifdef PCMCIA_DEBUG
1081static u32 netdev_get_msglevel(struct net_device *dev)
1082{
1083        return pc_debug;
1084}
1085
1086static void netdev_set_msglevel(struct net_device *dev, u32 level)
1087{
1088        pc_debug = level;
1089}
1090#endif /* PCMCIA_DEBUG */
1091
1092static const struct ethtool_ops netdev_ethtool_ops = {
1093        .get_drvinfo            = netdev_get_drvinfo,
1094#ifdef PCMCIA_DEBUG
1095        .get_msglevel           = netdev_get_msglevel,
1096        .set_msglevel           = netdev_set_msglevel,
1097#endif /* PCMCIA_DEBUG */
1098};
1099
1100static int fjn_config(struct net_device *dev, struct ifmap *map){
1101    return 0;
1102}
1103
1104static int fjn_open(struct net_device *dev)
1105{
1106    struct local_info_t *lp = netdev_priv(dev);
1107    struct pcmcia_device *link = lp->p_dev;
1108
1109    DEBUG(4, "fjn_open('%s').\n", dev->name);
1110
1111    if (!pcmcia_dev_present(link))
1112        return -ENODEV;
1113    
1114    link->open++;
1115    
1116    fjn_reset(dev);
1117    
1118    lp->tx_started = 0;
1119    lp->tx_queue = 0;
1120    lp->tx_queue_len = 0;
1121    lp->open_time = jiffies;
1122    netif_start_queue(dev);
1123    
1124    return 0;
1125} /* fjn_open */
1126
1127/*====================================================================*/
1128
1129static int fjn_close(struct net_device *dev)
1130{
1131    struct local_info_t *lp = netdev_priv(dev);
1132    struct pcmcia_device *link = lp->p_dev;
1133    kio_addr_t ioaddr = dev->base_addr;
1134
1135    DEBUG(4, "fjn_close('%s').\n", dev->name);
1136
1137    lp->open_time = 0;
1138    netif_stop_queue(dev);
1139
1140    /* Set configuration register 0 to disable Tx and Rx. */
1141    if( sram_config == 0 ) 
1142        outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1143    else
1144        outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1145
1146    /* Update the statistics -- ToDo. */
1147
1148    /* Power-down the chip.  Green, green, green! */
1149    outb(CHIP_OFF ,ioaddr + CONFIG_1);
1150
1151    /* Set the ethernet adaptor disable IRQ */
1152    if (lp->cardtype == MBH10302)
1153        outb(INTR_OFF, ioaddr + LAN_CTRL);
1154
1155    link->open--;
1156
1157    return 0;
1158} /* fjn_close */
1159
1160/*====================================================================*/
1161
1162static struct net_device_stats *fjn_get_stats(struct net_device *dev)
1163{
1164    local_info_t *lp = netdev_priv(dev);
1165    return &lp->stats;
1166} /* fjn_get_stats */
1167
1168/*====================================================================*/
1169
1170/*
1171  Set the multicast/promiscuous mode for this adaptor.
1172*/
1173
1174static void set_rx_mode(struct net_device *dev)
1175{
1176    kio_addr_t ioaddr = dev->base_addr;
1177    u_char mc_filter[8];                 /* Multicast hash filter */
1178    u_long flags;
1179    int i;
1180    
1181    int saved_bank;
1182    int saved_config_0 = inb(ioaddr + CONFIG_0);
1183     
1184    local_irq_save(flags); 
1185
1186    /* Disable Tx and Rx */
1187    if (sram_config == 0) 
1188        outb(CONFIG0_RST, ioaddr + CONFIG_0);
1189    else
1190        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1191
1192    if (dev->flags & IFF_PROMISC) {
1193        memset(mc_filter, 0xff, sizeof(mc_filter));
1194        outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
1195    } else if (dev->mc_count > MC_FILTERBREAK
1196               ||  (dev->flags & IFF_ALLMULTI)) {
1197        /* Too many to filter perfectly -- accept all multicasts. */
1198        memset(mc_filter, 0xff, sizeof(mc_filter));
1199        outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1200    } else if (dev->mc_count == 0) {
1201        memset(mc_filter, 0x00, sizeof(mc_filter));
1202        outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
1203    } else {
1204        struct dev_mc_list *mclist;
1205        int i;
1206        
1207        memset(mc_filter, 0, sizeof(mc_filter));
1208        for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1209             i++, mclist = mclist->next) {
1210            unsigned int bit =
1211                ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1212            mc_filter[bit >> 3] |= (1 << (bit & 7));
1213        }
1214        outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1215    }
1216
1217    /* Switch to bank 1 and set the multicast table. */
1218    saved_bank = inb(ioaddr + CONFIG_1);
1219    outb(0xe4, ioaddr + CONFIG_1);
1220
1221    for (i = 0; i < 8; i++)
1222        outb(mc_filter[i], ioaddr + MAR_ADR + i);
1223    outb(saved_bank, ioaddr + CONFIG_1);
1224
1225    outb(saved_config_0, ioaddr + CONFIG_0);
1226
1227    local_irq_restore(flags);
1228}
1229