linux-bk/drivers/net/pcmcia/nmclan_cs.c
<<
>>
Prefs
   1/* ----------------------------------------------------------------------------
   2Linux PCMCIA ethernet adapter driver for the New Media Ethernet LAN.
   3  nmclan_cs.c,v 0.16 1995/07/01 06:42:17 rpao Exp rpao
   4
   5  The Ethernet LAN uses the Advanced Micro Devices (AMD) Am79C940 Media
   6  Access Controller for Ethernet (MACE).  It is essentially the Am2150
   7  PCMCIA Ethernet card contained in the Am2150 Demo Kit.
   8
   9Written by Roger C. Pao <rpao@paonet.org>
  10  Copyright 1995 Roger C. Pao
  11  Linux 2.5 cleanups Copyright Red Hat 2003
  12
  13  This software may be used and distributed according to the terms of
  14  the GNU General Public License.
  15
  16Ported to Linux 1.3.* network driver environment by
  17  Matti Aarnio <mea@utu.fi>
  18
  19References
  20
  21  Am2150 Technical Reference Manual, Revision 1.0, August 17, 1993
  22  Am79C940 (MACE) Data Sheet, 1994
  23  Am79C90 (C-LANCE) Data Sheet, 1994
  24  Linux PCMCIA Programmer's Guide v1.17
  25  /usr/src/linux/net/inet/dev.c, Linux kernel 1.2.8
  26
  27  Eric Mears, New Media Corporation
  28  Tom Pollard, New Media Corporation
  29  Dean Siasoyco, New Media Corporation
  30  Ken Lesniak, Silicon Graphics, Inc. <lesniak@boston.sgi.com>
  31  Donald Becker <becker@scyld.com>
  32  David Hinds <dahinds@users.sourceforge.net>
  33
  34  The Linux client driver is based on the 3c589_cs.c client driver by
  35  David Hinds.
  36
  37  The Linux network driver outline is based on the 3c589_cs.c driver,
  38  the 8390.c driver, and the example skeleton.c kernel code, which are
  39  by Donald Becker.
  40
  41  The Am2150 network driver hardware interface code is based on the
  42  OS/9000 driver for the New Media Ethernet LAN by Eric Mears.
  43
  44  Special thanks for testing and help in debugging this driver goes
  45  to Ken Lesniak.
  46
  47-------------------------------------------------------------------------------
  48Driver Notes and Issues
  49-------------------------------------------------------------------------------
  50
  511. Developed on a Dell 320SLi
  52   PCMCIA Card Services 2.6.2
  53   Linux dell 1.2.10 #1 Thu Jun 29 20:23:41 PDT 1995 i386
  54
  552. rc.pcmcia may require loading pcmcia_core with io_speed=300:
  56   'insmod pcmcia_core.o io_speed=300'.
  57   This will avoid problems with fast systems which causes rx_framecnt
  58   to return random values.
  59
  603. If hot extraction does not work for you, use 'ifconfig eth0 down'
  61   before extraction.
  62
  634. There is a bad slow-down problem in this driver.
  64
  655. Future: Multicast processing.  In the meantime, do _not_ compile your
  66   kernel with multicast ip enabled.
  67
  68-------------------------------------------------------------------------------
  69History
  70-------------------------------------------------------------------------------
  71Log: nmclan_cs.c,v
  72 * 2.5.75-ac1 2003/07/11 Alan Cox <alan@redhat.com>
  73 * Fixed hang on card eject as we probe it
  74 * Cleaned up to use new style locking.
  75 *
  76 * Revision 0.16  1995/07/01  06:42:17  rpao
  77 * Bug fix: nmclan_reset() called CardServices incorrectly.
  78 *
  79 * Revision 0.15  1995/05/24  08:09:47  rpao
  80 * Re-implement MULTI_TX dev->tbusy handling.
  81 *
  82 * Revision 0.14  1995/05/23  03:19:30  rpao
  83 * Added, in nmclan_config(), "tuple.Attributes = 0;".
  84 * Modified MACE ID check to ignore chip revision level.
  85 * Avoid tx_free_frames race condition between _start_xmit and _interrupt.
  86 *
  87 * Revision 0.13  1995/05/18  05:56:34  rpao
  88 * Statistics changes.
  89 * Bug fix: nmclan_reset did not enable TX and RX: call restore_multicast_list.
  90 * Bug fix: mace_interrupt checks ~MACE_IMR_DEFAULT.  Fixes driver lockup.
  91 *
  92 * Revision 0.12  1995/05/14  00:12:23  rpao
  93 * Statistics overhaul.
  94 *
  95
  9695/05/13 rpao   V0.10a
  97                Bug fix: MACE statistics counters used wrong I/O ports.
  98                Bug fix: mace_interrupt() needed to allow statistics to be
  99                processed without RX or TX interrupts pending.
 10095/05/11 rpao   V0.10
 101                Multiple transmit request processing.
 102                Modified statistics to use MACE counters where possible.
 10395/05/10 rpao   V0.09 Bug fix: Must use IO_DATA_PATH_WIDTH_AUTO.
 104                *Released
 10595/05/10 rpao   V0.08
 106                Bug fix: Make all non-exported functions private by using
 107                static keyword.
 108                Bug fix: Test IntrCnt _before_ reading MACE_IR.
 10995/05/10 rpao   V0.07 Statistics.
 11095/05/09 rpao   V0.06 Fix rx_framecnt problem by addition of PCIC wait states.
 111
 112---------------------------------------------------------------------------- */
 113
 114#define DRV_NAME        "nmclan_cs"
 115#define DRV_VERSION     "0.16"
 116
 117
 118/* ----------------------------------------------------------------------------
 119Conditional Compilation Options
 120---------------------------------------------------------------------------- */
 121
 122#define MULTI_TX                        0
 123#define RESET_ON_TIMEOUT                1
 124#define TX_INTERRUPTABLE                1
 125#define RESET_XILINX                    0
 126
 127/* ----------------------------------------------------------------------------
 128Include Files
 129---------------------------------------------------------------------------- */
 130
 131#include <linux/module.h>
 132#include <linux/kernel.h>
 133#include <linux/init.h>
 134#include <linux/ptrace.h>
 135#include <linux/slab.h>
 136#include <linux/string.h>
 137#include <linux/timer.h>
 138#include <linux/interrupt.h>
 139#include <linux/in.h>
 140#include <linux/delay.h>
 141#include <linux/ethtool.h>
 142#include <linux/netdevice.h>
 143#include <linux/etherdevice.h>
 144#include <linux/skbuff.h>
 145#include <linux/if_arp.h>
 146#include <linux/ioport.h>
 147
 148#include <pcmcia/version.h>
 149#include <pcmcia/cs_types.h>
 150#include <pcmcia/cs.h>
 151#include <pcmcia/cisreg.h>
 152#include <pcmcia/cistpl.h>
 153#include <pcmcia/ds.h>
 154
 155#include <asm/uaccess.h>
 156#include <asm/io.h>
 157#include <asm/system.h>
 158#include <asm/bitops.h>
 159
 160/* ----------------------------------------------------------------------------
 161Defines
 162---------------------------------------------------------------------------- */
 163
 164#define ETHER_ADDR_LEN                  ETH_ALEN
 165                                        /* 6 bytes in an Ethernet Address */
 166#define MACE_LADRF_LEN                  8
 167                                        /* 8 bytes in Logical Address Filter */
 168
 169/* Loop Control Defines */
 170#define MACE_MAX_IR_ITERATIONS          10
 171#define MACE_MAX_RX_ITERATIONS          12
 172        /*
 173        TBD: Dean brought this up, and I assumed the hardware would
 174        handle it:
 175
 176        If MACE_MAX_RX_ITERATIONS is > 1, rx_framecnt may still be
 177        non-zero when the isr exits.  We may not get another interrupt
 178        to process the remaining packets for some time.
 179        */
 180
 181/*
 182The Am2150 has a Xilinx XC3042 field programmable gate array (FPGA)
 183which manages the interface between the MACE and the PCMCIA bus.  It
 184also includes buffer management for the 32K x 8 SRAM to control up to
 185four transmit and 12 receive frames at a time.
 186*/
 187#define AM2150_MAX_TX_FRAMES            4
 188#define AM2150_MAX_RX_FRAMES            12
 189
 190/* Am2150 Ethernet Card I/O Mapping */
 191#define AM2150_RCV                      0x00
 192#define AM2150_XMT                      0x04
 193#define AM2150_XMT_SKIP                 0x09
 194#define AM2150_RCV_NEXT                 0x0A
 195#define AM2150_RCV_FRAME_COUNT          0x0B
 196#define AM2150_MACE_BANK                0x0C
 197#define AM2150_MACE_BASE                0x10
 198
 199/* MACE Registers */
 200#define MACE_RCVFIFO                    0
 201#define MACE_XMTFIFO                    1
 202#define MACE_XMTFC                      2
 203#define MACE_XMTFS                      3
 204#define MACE_XMTRC                      4
 205#define MACE_RCVFC                      5
 206#define MACE_RCVFS                      6
 207#define MACE_FIFOFC                     7
 208#define MACE_IR                         8
 209#define MACE_IMR                        9
 210#define MACE_PR                         10
 211#define MACE_BIUCC                      11
 212#define MACE_FIFOCC                     12
 213#define MACE_MACCC                      13
 214#define MACE_PLSCC                      14
 215#define MACE_PHYCC                      15
 216#define MACE_CHIPIDL                    16
 217#define MACE_CHIPIDH                    17
 218#define MACE_IAC                        18
 219/* Reserved */
 220#define MACE_LADRF                      20
 221#define MACE_PADR                       21
 222/* Reserved */
 223/* Reserved */
 224#define MACE_MPC                        24
 225/* Reserved */
 226#define MACE_RNTPC                      26
 227#define MACE_RCVCC                      27
 228/* Reserved */
 229#define MACE_UTR                        29
 230#define MACE_RTR1                       30
 231#define MACE_RTR2                       31
 232
 233/* MACE Bit Masks */
 234#define MACE_XMTRC_EXDEF                0x80
 235#define MACE_XMTRC_XMTRC                0x0F
 236
 237#define MACE_XMTFS_XMTSV                0x80
 238#define MACE_XMTFS_UFLO                 0x40
 239#define MACE_XMTFS_LCOL                 0x20
 240#define MACE_XMTFS_MORE                 0x10
 241#define MACE_XMTFS_ONE                  0x08
 242#define MACE_XMTFS_DEFER                0x04
 243#define MACE_XMTFS_LCAR                 0x02
 244#define MACE_XMTFS_RTRY                 0x01
 245
 246#define MACE_RCVFS_RCVSTS               0xF000
 247#define MACE_RCVFS_OFLO                 0x8000
 248#define MACE_RCVFS_CLSN                 0x4000
 249#define MACE_RCVFS_FRAM                 0x2000
 250#define MACE_RCVFS_FCS                  0x1000
 251
 252#define MACE_FIFOFC_RCVFC               0xF0
 253#define MACE_FIFOFC_XMTFC               0x0F
 254
 255#define MACE_IR_JAB                     0x80
 256#define MACE_IR_BABL                    0x40
 257#define MACE_IR_CERR                    0x20
 258#define MACE_IR_RCVCCO                  0x10
 259#define MACE_IR_RNTPCO                  0x08
 260#define MACE_IR_MPCO                    0x04
 261#define MACE_IR_RCVINT                  0x02
 262#define MACE_IR_XMTINT                  0x01
 263
 264#define MACE_MACCC_PROM                 0x80
 265#define MACE_MACCC_DXMT2PD              0x40
 266#define MACE_MACCC_EMBA                 0x20
 267#define MACE_MACCC_RESERVED             0x10
 268#define MACE_MACCC_DRCVPA               0x08
 269#define MACE_MACCC_DRCVBC               0x04
 270#define MACE_MACCC_ENXMT                0x02
 271#define MACE_MACCC_ENRCV                0x01
 272
 273#define MACE_PHYCC_LNKFL                0x80
 274#define MACE_PHYCC_DLNKTST              0x40
 275#define MACE_PHYCC_REVPOL               0x20
 276#define MACE_PHYCC_DAPC                 0x10
 277#define MACE_PHYCC_LRT                  0x08
 278#define MACE_PHYCC_ASEL                 0x04
 279#define MACE_PHYCC_RWAKE                0x02
 280#define MACE_PHYCC_AWAKE                0x01
 281
 282#define MACE_IAC_ADDRCHG                0x80
 283#define MACE_IAC_PHYADDR                0x04
 284#define MACE_IAC_LOGADDR                0x02
 285
 286#define MACE_UTR_RTRE                   0x80
 287#define MACE_UTR_RTRD                   0x40
 288#define MACE_UTR_RPA                    0x20
 289#define MACE_UTR_FCOLL                  0x10
 290#define MACE_UTR_RCVFCSE                0x08
 291#define MACE_UTR_LOOP_INCL_MENDEC       0x06
 292#define MACE_UTR_LOOP_NO_MENDEC         0x04
 293#define MACE_UTR_LOOP_EXTERNAL          0x02
 294#define MACE_UTR_LOOP_NONE              0x00
 295#define MACE_UTR_RESERVED               0x01
 296
 297/* Switch MACE register bank (only 0 and 1 are valid) */
 298#define MACEBANK(win_num) outb((win_num), ioaddr + AM2150_MACE_BANK)
 299
 300#define MACE_IMR_DEFAULT \
 301  (0xFF - \
 302    ( \
 303      MACE_IR_CERR | \
 304      MACE_IR_RCVCCO | \
 305      MACE_IR_RNTPCO | \
 306      MACE_IR_MPCO | \
 307      MACE_IR_RCVINT | \
 308      MACE_IR_XMTINT \
 309    ) \
 310  )
 311#undef MACE_IMR_DEFAULT
 312#define MACE_IMR_DEFAULT 0x00 /* New statistics handling: grab everything */
 313
 314#define TX_TIMEOUT              ((400*HZ)/1000)
 315
 316/* ----------------------------------------------------------------------------
 317Type Definitions
 318---------------------------------------------------------------------------- */
 319
 320typedef struct _mace_statistics {
 321    /* MACE_XMTFS */
 322    int xmtsv;
 323    int uflo;
 324    int lcol;
 325    int more;
 326    int one;
 327    int defer;
 328    int lcar;
 329    int rtry;
 330
 331    /* MACE_XMTRC */
 332    int exdef;
 333    int xmtrc;
 334
 335    /* RFS1--Receive Status (RCVSTS) */
 336    int oflo;
 337    int clsn;
 338    int fram;
 339    int fcs;
 340
 341    /* RFS2--Runt Packet Count (RNTPC) */
 342    int rfs_rntpc;
 343
 344    /* RFS3--Receive Collision Count (RCVCC) */
 345    int rfs_rcvcc;
 346
 347    /* MACE_IR */
 348    int jab;
 349    int babl;
 350    int cerr;
 351    int rcvcco;
 352    int rntpco;
 353    int mpco;
 354
 355    /* MACE_MPC */
 356    int mpc;
 357
 358    /* MACE_RNTPC */
 359    int rntpc;
 360
 361    /* MACE_RCVCC */
 362    int rcvcc;
 363} mace_statistics;
 364
 365typedef struct _mace_private {
 366    dev_link_t link;
 367    dev_node_t node;
 368    struct net_device_stats linux_stats; /* Linux statistics counters */
 369    mace_statistics mace_stats; /* MACE chip statistics counters */
 370
 371    /* restore_multicast_list() state variables */
 372    int multicast_ladrf[MACE_LADRF_LEN]; /* Logical address filter */
 373    int multicast_num_addrs;
 374
 375    char tx_free_frames; /* Number of free transmit frame buffers */
 376    char tx_irq_disabled; /* MACE TX interrupt disabled */
 377    
 378    spinlock_t bank_lock; /* Must be held if you step off bank 0 */
 379} mace_private;
 380
 381/* ----------------------------------------------------------------------------
 382Private Global Variables
 383---------------------------------------------------------------------------- */
 384
 385#ifdef PCMCIA_DEBUG
 386static char rcsid[] =
 387"nmclan_cs.c,v 0.16 1995/07/01 06:42:17 rpao Exp rpao";
 388static char *version =
 389DRV_NAME " " DRV_VERSION " (Roger C. Pao)";
 390#endif
 391
 392static dev_info_t dev_info="nmclan_cs";
 393static dev_link_t *dev_list;
 394
 395static char *if_names[]={
 396    "Auto", "10baseT", "BNC",
 397};
 398
 399/* ----------------------------------------------------------------------------
 400Parameters
 401        These are the parameters that can be set during loading with
 402        'insmod'.
 403---------------------------------------------------------------------------- */
 404
 405MODULE_DESCRIPTION("New Media PCMCIA ethernet driver");
 406MODULE_LICENSE("GPL");
 407
 408#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
 409
 410static int irq_list[4] = { -1 };
 411MODULE_PARM(irq_list, "1-4i");
 412
 413/* 0=auto, 1=10baseT, 2 = 10base2, default=auto */
 414INT_MODULE_PARM(if_port, 0);
 415/* Bit map of interrupts to choose from */
 416INT_MODULE_PARM(irq_mask, 0xdeb8);
 417
 418#ifdef PCMCIA_DEBUG
 419INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
 420#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 421#else
 422#define DEBUG(n, args...)
 423#endif
 424
 425/* ----------------------------------------------------------------------------
 426Function Prototypes
 427---------------------------------------------------------------------------- */
 428
 429static void nmclan_config(dev_link_t *link);
 430static void nmclan_release(dev_link_t *link);
 431static int nmclan_event(event_t event, int priority,
 432                        event_callback_args_t *args);
 433
 434static void nmclan_reset(struct net_device *dev);
 435static int mace_config(struct net_device *dev, struct ifmap *map);
 436static int mace_open(struct net_device *dev);
 437static int mace_close(struct net_device *dev);
 438static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev);
 439static void mace_tx_timeout(struct net_device *dev);
 440static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 441static struct net_device_stats *mace_get_stats(struct net_device *dev);
 442static int mace_rx(struct net_device *dev, unsigned char RxCnt);
 443static void restore_multicast_list(struct net_device *dev);
 444static void set_multicast_list(struct net_device *dev);
 445static struct ethtool_ops netdev_ethtool_ops;
 446
 447
 448static dev_link_t *nmclan_attach(void);
 449static void nmclan_detach(dev_link_t *);
 450
 451/* ----------------------------------------------------------------------------
 452nmclan_attach
 453        Creates an "instance" of the driver, allocating local data
 454        structures for one device.  The device is registered with Card
 455        Services.
 456---------------------------------------------------------------------------- */
 457
 458static dev_link_t *nmclan_attach(void)
 459{
 460    mace_private *lp;
 461    dev_link_t *link;
 462    struct net_device *dev;
 463    client_reg_t client_reg;
 464    int i, ret;
 465
 466    DEBUG(0, "nmclan_attach()\n");
 467    DEBUG(1, "%s\n", rcsid);
 468
 469    /* Create new ethernet device */
 470    dev = alloc_etherdev(sizeof(mace_private));
 471    if (!dev)
 472        return NULL;
 473    lp = dev->priv;
 474    link = &lp->link;
 475    link->priv = dev;
 476    
 477    spin_lock_init(&lp->bank_lock);
 478    link->io.NumPorts1 = 32;
 479    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
 480    link->io.IOAddrLines = 5;
 481    link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
 482    link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
 483    if (irq_list[0] == -1)
 484        link->irq.IRQInfo2 = irq_mask;
 485    else
 486        for (i = 0; i < 4; i++)
 487            link->irq.IRQInfo2 |= 1 << irq_list[i];
 488    link->irq.Handler = &mace_interrupt;
 489    link->irq.Instance = dev;
 490    link->conf.Attributes = CONF_ENABLE_IRQ;
 491    link->conf.Vcc = 50;
 492    link->conf.IntType = INT_MEMORY_AND_IO;
 493    link->conf.ConfigIndex = 1;
 494    link->conf.Present = PRESENT_OPTION;
 495
 496    lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
 497
 498    SET_MODULE_OWNER(dev);
 499    dev->hard_start_xmit = &mace_start_xmit;
 500    dev->set_config = &mace_config;
 501    dev->get_stats = &mace_get_stats;
 502    dev->set_multicast_list = &set_multicast_list;
 503    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
 504    dev->open = &mace_open;
 505    dev->stop = &mace_close;
 506#ifdef HAVE_TX_TIMEOUT
 507    dev->tx_timeout = mace_tx_timeout;
 508    dev->watchdog_timeo = TX_TIMEOUT;
 509#endif
 510
 511    /* Register with Card Services */
 512    link->next = dev_list;
 513    dev_list = link;
 514    client_reg.dev_info = &dev_info;
 515    client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
 516    client_reg.EventMask =
 517        CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
 518        CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
 519        CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
 520    client_reg.event_handler = &nmclan_event;
 521    client_reg.Version = 0x0210;
 522    client_reg.event_callback_args.client_data = link;
 523    ret = CardServices(RegisterClient, &link->handle, &client_reg);
 524    if (ret != 0) {
 525        cs_error(link->handle, RegisterClient, ret);
 526        nmclan_detach(link);
 527        return NULL;
 528    }
 529
 530    return link;
 531} /* nmclan_attach */
 532
 533/* ----------------------------------------------------------------------------
 534nmclan_detach
 535        This deletes a driver "instance".  The device is de-registered
 536        with Card Services.  If it has been released, all local data
 537        structures are freed.  Otherwise, the structures will be freed
 538        when the device is released.
 539---------------------------------------------------------------------------- */
 540
 541static void nmclan_detach(dev_link_t *link)
 542{
 543    struct net_device *dev = link->priv;
 544    dev_link_t **linkp;
 545
 546    DEBUG(0, "nmclan_detach(0x%p)\n", link);
 547
 548    /* Locate device structure */
 549    for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
 550        if (*linkp == link) break;
 551    if (*linkp == NULL)
 552        return;
 553
 554    if (link->state & DEV_CONFIG) {
 555        nmclan_release(link);
 556        if (link->state & DEV_STALE_CONFIG)
 557            return;
 558    }
 559
 560    if (link->handle)
 561        CardServices(DeregisterClient, link->handle);
 562
 563    /* Unlink device structure, free bits */
 564    *linkp = link->next;
 565    if (link->dev) {
 566        unregister_netdev(dev);
 567        free_netdev(dev);
 568    } else
 569        kfree(dev);
 570
 571} /* nmclan_detach */
 572
 573/* ----------------------------------------------------------------------------
 574mace_read
 575        Reads a MACE register.  This is bank independent; however, the
 576        caller must ensure that this call is not interruptable.  We are
 577        assuming that during normal operation, the MACE is always in
 578        bank 0.
 579---------------------------------------------------------------------------- */
 580static int mace_read(mace_private *lp, ioaddr_t ioaddr, int reg)
 581{
 582  int data = 0xFF;
 583  unsigned long flags;
 584
 585  switch (reg >> 4) {
 586    case 0: /* register 0-15 */
 587      data = inb(ioaddr + AM2150_MACE_BASE + reg);
 588      break;
 589    case 1: /* register 16-31 */
 590      spin_lock_irqsave(&lp->bank_lock, flags);
 591      MACEBANK(1);
 592      data = inb(ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
 593      MACEBANK(0);
 594      spin_unlock_irqrestore(&lp->bank_lock, flags);
 595      break;
 596  }
 597  return (data & 0xFF);
 598} /* mace_read */
 599
 600/* ----------------------------------------------------------------------------
 601mace_write
 602        Writes to a MACE register.  This is bank independent; however,
 603        the caller must ensure that this call is not interruptable.  We
 604        are assuming that during normal operation, the MACE is always in
 605        bank 0.
 606---------------------------------------------------------------------------- */
 607static void mace_write(mace_private *lp, ioaddr_t ioaddr, int reg, int data)
 608{
 609  unsigned long flags;
 610
 611  switch (reg >> 4) {
 612    case 0: /* register 0-15 */
 613      outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + reg);
 614      break;
 615    case 1: /* register 16-31 */
 616      spin_lock_irqsave(&lp->bank_lock, flags);
 617      MACEBANK(1);
 618      outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
 619      MACEBANK(0);
 620      spin_unlock_irqrestore(&lp->bank_lock, flags);
 621      break;
 622  }
 623} /* mace_write */
 624
 625/* ----------------------------------------------------------------------------
 626mace_init
 627        Resets the MACE chip.
 628---------------------------------------------------------------------------- */
 629static int mace_init(mace_private *lp, ioaddr_t ioaddr, char *enet_addr)
 630{
 631  int i;
 632  int ct = 0;
 633
 634  /* MACE Software reset */
 635  mace_write(lp, ioaddr, MACE_BIUCC, 1);
 636  while (mace_read(lp, ioaddr, MACE_BIUCC) & 0x01) {
 637    /* Wait for reset bit to be cleared automatically after <= 200ns */;
 638    if(++ct > 500)
 639    {
 640        printk(KERN_ERR "mace: reset failed, card removed ?\n");
 641        return -1;
 642    }
 643    udelay(1);
 644  }
 645  mace_write(lp, ioaddr, MACE_BIUCC, 0);
 646
 647  /* The Am2150 requires that the MACE FIFOs operate in burst mode. */
 648  mace_write(lp, ioaddr, MACE_FIFOCC, 0x0F);
 649
 650  mace_write(lp,ioaddr, MACE_RCVFC, 0); /* Disable Auto Strip Receive */
 651  mace_write(lp, ioaddr, MACE_IMR, 0xFF); /* Disable all interrupts until _open */
 652
 653  /*
 654   * Bit 2-1 PORTSEL[1-0] Port Select.
 655   * 00 AUI/10Base-2
 656   * 01 10Base-T
 657   * 10 DAI Port (reserved in Am2150)
 658   * 11 GPSI
 659   * For this card, only the first two are valid.
 660   * So, PLSCC should be set to
 661   * 0x00 for 10Base-2
 662   * 0x02 for 10Base-T
 663   * Or just set ASEL in PHYCC below!
 664   */
 665  switch (if_port) {
 666    case 1:
 667      mace_write(lp, ioaddr, MACE_PLSCC, 0x02);
 668      break;
 669    case 2:
 670      mace_write(lp, ioaddr, MACE_PLSCC, 0x00);
 671      break;
 672    default:
 673      mace_write(lp, ioaddr, MACE_PHYCC, /* ASEL */ 4);
 674      /* ASEL Auto Select.  When set, the PORTSEL[1-0] bits are overridden,
 675         and the MACE device will automatically select the operating media
 676         interface port. */
 677      break;
 678  }
 679
 680  mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_PHYADDR);
 681  /* Poll ADDRCHG bit */
 682  ct = 0;
 683  while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
 684  {
 685        if(++ ct > 500)
 686        {
 687                printk(KERN_ERR "mace: ADDRCHG timeout, card removed ?\n");
 688                return -1;
 689        }
 690  }
 691  /* Set PADR register */
 692  for (i = 0; i < ETHER_ADDR_LEN; i++)
 693    mace_write(lp, ioaddr, MACE_PADR, enet_addr[i]);
 694
 695  /* MAC Configuration Control Register should be written last */
 696  /* Let set_multicast_list set this. */
 697  /* mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV); */
 698  mace_write(lp, ioaddr, MACE_MACCC, 0x00);
 699  return 0;
 700} /* mace_init */
 701
 702/* ----------------------------------------------------------------------------
 703nmclan_config
 704        This routine is scheduled to run after a CARD_INSERTION event
 705        is received, to configure the PCMCIA socket, and to make the
 706        ethernet device available to the system.
 707---------------------------------------------------------------------------- */
 708
 709#define CS_CHECK(fn, args...) \
 710while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
 711
 712static void nmclan_config(dev_link_t *link)
 713{
 714  client_handle_t handle = link->handle;
 715  struct net_device *dev = link->priv;
 716  mace_private *lp = dev->priv;
 717  tuple_t tuple;
 718  cisparse_t parse;
 719  u_char buf[64];
 720  int i, last_ret, last_fn;
 721  ioaddr_t ioaddr;
 722
 723  DEBUG(0, "nmclan_config(0x%p)\n", link);
 724
 725  tuple.Attributes = 0;
 726  tuple.TupleData = buf;
 727  tuple.TupleDataMax = 64;
 728  tuple.TupleOffset = 0;
 729  tuple.DesiredTuple = CISTPL_CONFIG;
 730  CS_CHECK(GetFirstTuple, handle, &tuple);
 731  CS_CHECK(GetTupleData, handle, &tuple);
 732  CS_CHECK(ParseTuple, handle, &tuple, &parse);
 733  link->conf.ConfigBase = parse.config.base;
 734
 735  /* Configure card */
 736  link->state |= DEV_CONFIG;
 737
 738  CS_CHECK(RequestIO, handle, &link->io);
 739  CS_CHECK(RequestIRQ, handle, &link->irq);
 740  CS_CHECK(RequestConfiguration, handle, &link->conf);
 741  dev->irq = link->irq.AssignedIRQ;
 742  dev->base_addr = link->io.BasePort1;
 743  i = register_netdev(dev);
 744  if (i != 0) {
 745    printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n");
 746    goto failed;
 747  }
 748
 749  ioaddr = dev->base_addr;
 750
 751  /* Read the ethernet address from the CIS. */
 752  tuple.DesiredTuple = 0x80 /* CISTPL_CFTABLE_ENTRY_MISC */;
 753  tuple.TupleData = buf;
 754  tuple.TupleDataMax = 64;
 755  tuple.TupleOffset = 0;
 756  CS_CHECK(GetFirstTuple, handle, &tuple);
 757  CS_CHECK(GetTupleData, handle, &tuple);
 758  memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN);
 759
 760  /* Verify configuration by reading the MACE ID. */
 761  {
 762    char sig[2];
 763
 764    sig[0] = mace_read(lp, ioaddr, MACE_CHIPIDL);
 765    sig[1] = mace_read(lp, ioaddr, MACE_CHIPIDH);
 766    if ((sig[0] == 0x40) && ((sig[1] & 0x0F) == 0x09)) {
 767      DEBUG(0, "nmclan_cs configured: mace id=%x %x\n",
 768            sig[0], sig[1]);
 769    } else {
 770      printk(KERN_NOTICE "nmclan_cs: mace id not found: %x %x should"
 771             " be 0x40 0x?9\n", sig[0], sig[1]);
 772      link->state &= ~DEV_CONFIG_PENDING;
 773      return;
 774    }
 775  }
 776
 777  if(mace_init(lp, ioaddr, dev->dev_addr) == -1)
 778        goto failed;
 779
 780  /* The if_port symbol can be set when the module is loaded */
 781  if (if_port <= 2)
 782    dev->if_port = if_port;
 783  else
 784    printk(KERN_NOTICE "nmclan_cs: invalid if_port requested\n");
 785
 786  strcpy(lp->node.dev_name, dev->name);
 787  link->dev = &lp->node;
 788  link->state &= ~DEV_CONFIG_PENDING;
 789
 790  printk(KERN_INFO "%s: nmclan: port %#3lx, irq %d, %s port, hw_addr ",
 791         dev->name, dev->base_addr, dev->irq, if_names[dev->if_port]);
 792  for (i = 0; i < 6; i++)
 793      printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
 794  return;
 795
 796cs_failed:
 797    cs_error(link->handle, last_fn, last_ret);
 798failed:
 799    nmclan_release(link);
 800    return;
 801
 802} /* nmclan_config */
 803
 804/* ----------------------------------------------------------------------------
 805nmclan_release
 806        After a card is removed, nmclan_release() will unregister the
 807        net device, and release the PCMCIA configuration.  If the device
 808        is still open, this will be postponed until it is closed.
 809---------------------------------------------------------------------------- */
 810static void nmclan_release(dev_link_t *link)
 811{
 812
 813  DEBUG(0, "nmclan_release(0x%p)\n", link);
 814
 815  if (link->open) {
 816    DEBUG(1, "nmclan_cs: release postponed, '%s' "
 817          "still open\n", link->dev->dev_name);
 818    link->state |= DEV_STALE_CONFIG;
 819    return;
 820  }
 821
 822  CardServices(ReleaseConfiguration, link->handle);
 823  CardServices(ReleaseIO, link->handle, &link->io);
 824  CardServices(ReleaseIRQ, link->handle, &link->irq);
 825
 826  link->state &= ~DEV_CONFIG;
 827
 828  if (link->state & DEV_STALE_CONFIG)
 829          nmclan_detach(link);
 830}
 831
 832/* ----------------------------------------------------------------------------
 833nmclan_event
 834        The card status event handler.  Mostly, this schedules other
 835        stuff to run after an event is received.  A CARD_REMOVAL event
 836        also sets some flags to discourage the net drivers from trying
 837        to talk to the card any more.
 838---------------------------------------------------------------------------- */
 839static int nmclan_event(event_t event, int priority,
 840                       event_callback_args_t *args)
 841{
 842  dev_link_t *link = args->client_data;
 843  struct net_device *dev = link->priv;
 844
 845  DEBUG(1, "nmclan_event(0x%06x)\n", event);
 846
 847  switch (event) {
 848    case CS_EVENT_CARD_REMOVAL:
 849      link->state &= ~DEV_PRESENT;
 850      if (link->state & DEV_CONFIG) {
 851        netif_device_detach(dev);
 852        nmclan_release(link);
 853      }
 854      break;
 855    case CS_EVENT_CARD_INSERTION:
 856      link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
 857      nmclan_config(link);
 858      break;
 859    case CS_EVENT_PM_SUSPEND:
 860      link->state |= DEV_SUSPEND;
 861      /* Fall through... */
 862    case CS_EVENT_RESET_PHYSICAL:
 863      if (link->state & DEV_CONFIG) {
 864        if (link->open)
 865          netif_device_detach(dev);
 866        CardServices(ReleaseConfiguration, link->handle);
 867      }
 868      break;
 869    case CS_EVENT_PM_RESUME:
 870      link->state &= ~DEV_SUSPEND;
 871      /* Fall through... */
 872    case CS_EVENT_CARD_RESET:
 873      if (link->state & DEV_CONFIG) {
 874        CardServices(RequestConfiguration, link->handle, &link->conf);
 875        if (link->open) {
 876          nmclan_reset(dev);
 877          netif_device_attach(dev);
 878        }
 879      }
 880      break;
 881    case CS_EVENT_RESET_REQUEST:
 882      return 1;
 883      break;
 884  }
 885  return 0;
 886} /* nmclan_event */
 887
 888/* ----------------------------------------------------------------------------
 889nmclan_reset
 890        Reset and restore all of the Xilinx and MACE registers.
 891---------------------------------------------------------------------------- */
 892static void nmclan_reset(struct net_device *dev)
 893{
 894  mace_private *lp = dev->priv;
 895
 896#if RESET_XILINX
 897  dev_link_t *link = &lp->link;
 898  conf_reg_t reg;
 899  u_long OrigCorValue; 
 900
 901  /* Save original COR value */
 902  reg.Function = 0;
 903  reg.Action = CS_READ;
 904  reg.Offset = CISREG_COR;
 905  reg.Value = 0;
 906  CardServices(AccessConfigurationRegister, link->handle, &reg);
 907  OrigCorValue = reg.Value;
 908
 909  /* Reset Xilinx */
 910  reg.Action = CS_WRITE;
 911  reg.Offset = CISREG_COR;
 912  DEBUG(1, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
 913        OrigCorValue);
 914  reg.Value = COR_SOFT_RESET;
 915  CardServices(AccessConfigurationRegister, link->handle, &reg);
 916  /* Need to wait for 20 ms for PCMCIA to finish reset. */
 917
 918  /* Restore original COR configuration index */
 919  reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
 920  CardServices(AccessConfigurationRegister, link->handle, &reg);
 921  /* Xilinx is now completely reset along with the MACE chip. */
 922  lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
 923
 924#endif /* #if RESET_XILINX */
 925
 926  /* Xilinx is now completely reset along with the MACE chip. */
 927  lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
 928
 929  /* Reinitialize the MACE chip for operation. */
 930  mace_init(lp, dev->base_addr, dev->dev_addr);
 931  mace_write(lp, dev->base_addr, MACE_IMR, MACE_IMR_DEFAULT);
 932
 933  /* Restore the multicast list and enable TX and RX. */
 934  restore_multicast_list(dev);
 935} /* nmclan_reset */
 936
 937/* ----------------------------------------------------------------------------
 938mace_config
 939        [Someone tell me what this is supposed to do?  Is if_port a defined
 940        standard?  If so, there should be defines to indicate 1=10Base-T,
 941        2=10Base-2, etc. including limited automatic detection.]
 942---------------------------------------------------------------------------- */
 943static int mace_config(struct net_device *dev, struct ifmap *map)
 944{
 945  if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
 946    if (map->port <= 2) {
 947      dev->if_port = map->port;
 948      printk(KERN_INFO "%s: switched to %s port\n", dev->name,
 949             if_names[dev->if_port]);
 950    } else
 951      return -EINVAL;
 952  }
 953  return 0;
 954} /* mace_config */
 955
 956/* ----------------------------------------------------------------------------
 957mace_open
 958        Open device driver.
 959---------------------------------------------------------------------------- */
 960static int mace_open(struct net_device *dev)
 961{
 962  ioaddr_t ioaddr = dev->base_addr;
 963  mace_private *lp = dev->priv;
 964  dev_link_t *link = &lp->link;
 965
 966  if (!DEV_OK(link))
 967    return -ENODEV;
 968
 969  link->open++;
 970
 971  MACEBANK(0);
 972
 973  netif_start_queue(dev);
 974  nmclan_reset(dev);
 975
 976  return 0; /* Always succeed */
 977} /* mace_open */
 978
 979/* ----------------------------------------------------------------------------
 980mace_close
 981        Closes device driver.
 982---------------------------------------------------------------------------- */
 983static int mace_close(struct net_device *dev)
 984{
 985  ioaddr_t ioaddr = dev->base_addr;
 986  mace_private *lp = dev->priv;
 987  dev_link_t *link = &lp->link;
 988
 989  DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
 990
 991  /* Mask off all interrupts from the MACE chip. */
 992  outb(0xFF, ioaddr + AM2150_MACE_BASE + MACE_IMR);
 993
 994  link->open--;
 995  netif_stop_queue(dev);
 996  if (link->state & DEV_STALE_CONFIG)
 997          nmclan_release(link);
 998
 999  return 0;
1000} /* mace_close */
1001
1002static void netdev_get_drvinfo(struct net_device *dev,
1003                               struct ethtool_drvinfo *info)
1004{
1005        strcpy(info->driver, DRV_NAME);
1006        strcpy(info->version, DRV_VERSION);
1007        sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1008}
1009
1010#ifdef PCMCIA_DEBUG
1011static u32 netdev_get_msglevel(struct net_device *dev)
1012{
1013        return pc_debug;
1014}
1015
1016static void netdev_set_msglevel(struct net_device *dev, u32 level)
1017{
1018        pc_debug = level;
1019}
1020#endif /* PCMCIA_DEBUG */
1021
1022static struct ethtool_ops netdev_ethtool_ops = {
1023        .get_drvinfo            = netdev_get_drvinfo,
1024#ifdef PCMCIA_DEBUG
1025        .get_msglevel           = netdev_get_msglevel,
1026        .set_msglevel           = netdev_set_msglevel,
1027#endif /* PCMCIA_DEBUG */
1028};
1029
1030/* ----------------------------------------------------------------------------
1031mace_start_xmit
1032        This routine begins the packet transmit function.  When completed,
1033        it will generate a transmit interrupt.
1034
1035        According to /usr/src/linux/net/inet/dev.c, if _start_xmit
1036        returns 0, the "packet is now solely the responsibility of the
1037        driver."  If _start_xmit returns non-zero, the "transmission
1038        failed, put skb back into a list."
1039---------------------------------------------------------------------------- */
1040
1041static void mace_tx_timeout(struct net_device *dev)
1042{
1043  mace_private *lp = (mace_private *)dev->priv;
1044  dev_link_t *link = &lp->link;
1045
1046  printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
1047#if RESET_ON_TIMEOUT
1048  printk("resetting card\n");
1049  CardServices(ResetCard, link->handle);
1050#else /* #if RESET_ON_TIMEOUT */
1051  printk("NOT resetting card\n");
1052#endif /* #if RESET_ON_TIMEOUT */
1053  dev->trans_start = jiffies;
1054  netif_wake_queue(dev);
1055}
1056
1057static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev)
1058{
1059  mace_private *lp = (mace_private *)dev->priv;
1060  ioaddr_t ioaddr = dev->base_addr;
1061
1062  netif_stop_queue(dev);
1063
1064  DEBUG(3, "%s: mace_start_xmit(length = %ld) called.\n",
1065        dev->name, (long)skb->len);
1066
1067#if (!TX_INTERRUPTABLE)
1068  /* Disable MACE TX interrupts. */
1069  outb(MACE_IMR_DEFAULT | MACE_IR_XMTINT,
1070    ioaddr + AM2150_MACE_BASE + MACE_IMR);
1071  lp->tx_irq_disabled=1;
1072#endif /* #if (!TX_INTERRUPTABLE) */
1073
1074  {
1075    /* This block must not be interrupted by another transmit request!
1076       mace_tx_timeout will take care of timer-based retransmissions from
1077       the upper layers.  The interrupt handler is guaranteed never to
1078       service a transmit interrupt while we are in here.
1079    */
1080
1081    lp->linux_stats.tx_bytes += skb->len;
1082    lp->tx_free_frames--;
1083
1084    /* WARNING: Write the _exact_ number of bytes written in the header! */
1085    /* Put out the word header [must be an outw()] . . . */
1086    outw(skb->len, ioaddr + AM2150_XMT);
1087    /* . . . and the packet [may be any combination of outw() and outb()] */
1088    outsw(ioaddr + AM2150_XMT, skb->data, skb->len >> 1);
1089    if (skb->len & 1) {
1090      /* Odd byte transfer */
1091      outb(skb->data[skb->len-1], ioaddr + AM2150_XMT);
1092    }
1093
1094    dev->trans_start = jiffies;
1095
1096#if MULTI_TX
1097    if (lp->tx_free_frames > 0)
1098      netif_start_queue(dev);
1099#endif /* #if MULTI_TX */
1100  }
1101
1102#if (!TX_INTERRUPTABLE)
1103  /* Re-enable MACE TX interrupts. */
1104  lp->tx_irq_disabled=0;
1105  outb(MACE_IMR_DEFAULT, ioaddr + AM2150_MACE_BASE + MACE_IMR);
1106#endif /* #if (!TX_INTERRUPTABLE) */
1107
1108  dev_kfree_skb(skb);
1109
1110  return 0;
1111} /* mace_start_xmit */
1112
1113/* ----------------------------------------------------------------------------
1114mace_interrupt
1115        The interrupt handler.
1116---------------------------------------------------------------------------- */
1117static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1118{
1119  struct net_device *dev = (struct net_device *) dev_id;
1120  mace_private *lp = dev->priv;
1121  ioaddr_t ioaddr = dev->base_addr;
1122  int status;
1123  int IntrCnt = MACE_MAX_IR_ITERATIONS;
1124
1125  if (dev == NULL) {
1126    DEBUG(2, "mace_interrupt(): irq 0x%X for unknown device.\n",
1127          irq);
1128    return IRQ_NONE;
1129  }
1130
1131  if (lp->tx_irq_disabled) {
1132    printk(
1133      (lp->tx_irq_disabled?
1134       KERN_NOTICE "%s: Interrupt with tx_irq_disabled "
1135       "[isr=%02X, imr=%02X]\n": 
1136       KERN_NOTICE "%s: Re-entering the interrupt handler "
1137       "[isr=%02X, imr=%02X]\n"),
1138      dev->name,
1139      inb(ioaddr + AM2150_MACE_BASE + MACE_IR),
1140      inb(ioaddr + AM2150_MACE_BASE + MACE_IMR)
1141    );
1142    /* WARNING: MACE_IR has been read! */
1143    return IRQ_NONE;
1144  }
1145
1146  if (!netif_device_present(dev)) {
1147    DEBUG(2, "%s: interrupt from dead card\n", dev->name);
1148    return IRQ_NONE;
1149  }
1150
1151  do {
1152    /* WARNING: MACE_IR is a READ/CLEAR port! */
1153    status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR);
1154
1155    DEBUG(3, "mace_interrupt: irq 0x%X status 0x%X.\n", irq, status);
1156
1157    if (status & MACE_IR_RCVINT) {
1158      mace_rx(dev, MACE_MAX_RX_ITERATIONS);
1159    }
1160
1161    if (status & MACE_IR_XMTINT) {
1162      unsigned char fifofc;
1163      unsigned char xmtrc;
1164      unsigned char xmtfs;
1165
1166      fifofc = inb(ioaddr + AM2150_MACE_BASE + MACE_FIFOFC);
1167      if ((fifofc & MACE_FIFOFC_XMTFC)==0) {
1168        lp->linux_stats.tx_errors++;
1169        outb(0xFF, ioaddr + AM2150_XMT_SKIP);
1170      }
1171
1172      /* Transmit Retry Count (XMTRC, reg 4) */
1173      xmtrc = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTRC);
1174      if (xmtrc & MACE_XMTRC_EXDEF) lp->mace_stats.exdef++;
1175      lp->mace_stats.xmtrc += (xmtrc & MACE_XMTRC_XMTRC);
1176
1177      if (
1178        (xmtfs = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTFS)) &
1179        MACE_XMTFS_XMTSV /* Transmit Status Valid */
1180      ) {
1181        lp->mace_stats.xmtsv++;
1182
1183        if (xmtfs & ~MACE_XMTFS_XMTSV) {
1184          if (xmtfs & MACE_XMTFS_UFLO) {
1185            /* Underflow.  Indicates that the Transmit FIFO emptied before
1186               the end of frame was reached. */
1187            lp->mace_stats.uflo++;
1188          }
1189          if (xmtfs & MACE_XMTFS_LCOL) {
1190            /* Late Collision */
1191            lp->mace_stats.lcol++;
1192          }
1193          if (xmtfs & MACE_XMTFS_MORE) {
1194            /* MORE than one retry was needed */
1195            lp->mace_stats.more++;
1196          }
1197          if (xmtfs & MACE_XMTFS_ONE) {
1198            /* Exactly ONE retry occurred */
1199            lp->mace_stats.one++;
1200          }
1201          if (xmtfs & MACE_XMTFS_DEFER) {
1202            /* Transmission was defered */
1203            lp->mace_stats.defer++;
1204          }
1205          if (xmtfs & MACE_XMTFS_LCAR) {
1206            /* Loss of carrier */
1207            lp->mace_stats.lcar++;
1208          }
1209          if (xmtfs & MACE_XMTFS_RTRY) {
1210            /* Retry error: transmit aborted after 16 attempts */
1211            lp->mace_stats.rtry++;
1212          }
1213        } /* if (xmtfs & ~MACE_XMTFS_XMTSV) */
1214
1215      } /* if (xmtfs & MACE_XMTFS_XMTSV) */
1216
1217      lp->linux_stats.tx_packets++;
1218      lp->tx_free_frames++;
1219      netif_wake_queue(dev);
1220    } /* if (status & MACE_IR_XMTINT) */
1221
1222    if (status & ~MACE_IMR_DEFAULT & ~MACE_IR_RCVINT & ~MACE_IR_XMTINT) {
1223      if (status & MACE_IR_JAB) {
1224        /* Jabber Error.  Excessive transmit duration (20-150ms). */
1225        lp->mace_stats.jab++;
1226      }
1227      if (status & MACE_IR_BABL) {
1228        /* Babble Error.  >1518 bytes transmitted. */
1229        lp->mace_stats.babl++;
1230      }
1231      if (status & MACE_IR_CERR) {
1232        /* Collision Error.  CERR indicates the absence of the
1233           Signal Quality Error Test message after a packet
1234           transmission. */
1235        lp->mace_stats.cerr++;
1236      }
1237      if (status & MACE_IR_RCVCCO) {
1238        /* Receive Collision Count Overflow; */
1239        lp->mace_stats.rcvcco++;
1240      }
1241      if (status & MACE_IR_RNTPCO) {
1242        /* Runt Packet Count Overflow */
1243        lp->mace_stats.rntpco++;
1244      }
1245      if (status & MACE_IR_MPCO) {
1246        /* Missed Packet Count Overflow */
1247        lp->mace_stats.mpco++;
1248      }
1249    } /* if (status & ~MACE_IMR_DEFAULT & ~MACE_IR_RCVINT & ~MACE_IR_XMTINT) */
1250
1251  } while ((status & ~MACE_IMR_DEFAULT) && (--IntrCnt));
1252
1253  return IRQ_HANDLED;
1254} /* mace_interrupt */
1255
1256/* ----------------------------------------------------------------------------
1257mace_rx
1258        Receives packets.
1259---------------------------------------------------------------------------- */
1260static int mace_rx(struct net_device *dev, unsigned char RxCnt)
1261{
1262  mace_private *lp = (mace_private *)dev->priv;
1263  ioaddr_t ioaddr = dev->base_addr;
1264  unsigned char rx_framecnt;
1265  unsigned short rx_status;
1266
1267  while (
1268    ((rx_framecnt = inb(ioaddr + AM2150_RCV_FRAME_COUNT)) > 0) &&
1269    (rx_framecnt <= 12) && /* rx_framecnt==0xFF if card is extracted. */
1270    (RxCnt--)
1271  ) {
1272    rx_status = inw(ioaddr + AM2150_RCV);
1273
1274    DEBUG(3, "%s: in mace_rx(), framecnt 0x%X, rx_status"
1275          " 0x%X.\n", dev->name, rx_framecnt, rx_status);
1276
1277    if (rx_status & MACE_RCVFS_RCVSTS) { /* Error, update stats. */
1278      lp->linux_stats.rx_errors++;
1279      if (rx_status & MACE_RCVFS_OFLO) {
1280        lp->mace_stats.oflo++;
1281      }
1282      if (rx_status & MACE_RCVFS_CLSN) {
1283        lp->mace_stats.clsn++;
1284      }
1285      if (rx_status & MACE_RCVFS_FRAM) {
1286        lp->mace_stats.fram++;
1287      }
1288      if (rx_status & MACE_RCVFS_FCS) {
1289        lp->mace_stats.fcs++;
1290      }
1291    } else {
1292      short pkt_len = (rx_status & ~MACE_RCVFS_RCVSTS) - 4;
1293        /* Auto Strip is off, always subtract 4 */
1294      struct sk_buff *skb;
1295
1296      lp->mace_stats.rfs_rntpc += inb(ioaddr + AM2150_RCV);
1297        /* runt packet count */
1298      lp->mace_stats.rfs_rcvcc += inb(ioaddr + AM2150_RCV);
1299        /* rcv collision count */
1300
1301      DEBUG(3, "    receiving packet size 0x%X rx_status"
1302            " 0x%X.\n", pkt_len, rx_status);
1303
1304      skb = dev_alloc_skb(pkt_len+2);
1305
1306      if (skb != NULL) {
1307        skb->dev = dev;
1308
1309        skb_reserve(skb, 2);
1310        insw(ioaddr + AM2150_RCV, skb_put(skb, pkt_len), pkt_len>>1);
1311        if (pkt_len & 1)
1312            *(skb->tail-1) = inb(ioaddr + AM2150_RCV);
1313        skb->protocol = eth_type_trans(skb, dev);
1314        
1315        netif_rx(skb); /* Send the packet to the upper (protocol) layers. */
1316
1317        dev->last_rx = jiffies;
1318        lp->linux_stats.rx_packets++;
1319        lp->linux_stats.rx_bytes += skb->len;
1320        outb(0xFF, ioaddr + AM2150_RCV_NEXT); /* skip to next frame */
1321        continue;
1322      } else {
1323        DEBUG(1, "%s: couldn't allocate a sk_buff of size"
1324              " %d.\n", dev->name, pkt_len);
1325        lp->linux_stats.rx_dropped++;
1326      }
1327    }
1328    outb(0xFF, ioaddr + AM2150_RCV_NEXT); /* skip to next frame */
1329  } /* while */
1330
1331  return 0;
1332} /* mace_rx */
1333
1334/* ----------------------------------------------------------------------------
1335pr_linux_stats
1336---------------------------------------------------------------------------- */
1337static void pr_linux_stats(struct net_device_stats *pstats)
1338{
1339  DEBUG(2, "pr_linux_stats\n");
1340  DEBUG(2, " rx_packets=%-7ld        tx_packets=%ld\n",
1341        (long)pstats->rx_packets, (long)pstats->tx_packets);
1342  DEBUG(2, " rx_errors=%-7ld         tx_errors=%ld\n",
1343        (long)pstats->rx_errors, (long)pstats->tx_errors);
1344  DEBUG(2, " rx_dropped=%-7ld        tx_dropped=%ld\n",
1345        (long)pstats->rx_dropped, (long)pstats->tx_dropped);
1346  DEBUG(2, " multicast=%-7ld         collisions=%ld\n",
1347        (long)pstats->multicast, (long)pstats->collisions);
1348
1349  DEBUG(2, " rx_length_errors=%-7ld  rx_over_errors=%ld\n",
1350        (long)pstats->rx_length_errors, (long)pstats->rx_over_errors);
1351  DEBUG(2, " rx_crc_errors=%-7ld     rx_frame_errors=%ld\n",
1352        (long)pstats->rx_crc_errors, (long)pstats->rx_frame_errors);
1353  DEBUG(2, " rx_fifo_errors=%-7ld    rx_missed_errors=%ld\n",
1354        (long)pstats->rx_fifo_errors, (long)pstats->rx_missed_errors);
1355
1356  DEBUG(2, " tx_aborted_errors=%-7ld tx_carrier_errors=%ld\n",
1357        (long)pstats->tx_aborted_errors, (long)pstats->tx_carrier_errors);
1358  DEBUG(2, " tx_fifo_errors=%-7ld    tx_heartbeat_errors=%ld\n",
1359        (long)pstats->tx_fifo_errors, (long)pstats->tx_heartbeat_errors);
1360  DEBUG(2, " tx_window_errors=%ld\n",
1361        (long)pstats->tx_window_errors);
1362} /* pr_linux_stats */
1363
1364/* ----------------------------------------------------------------------------
1365pr_mace_stats
1366---------------------------------------------------------------------------- */
1367static void pr_mace_stats(mace_statistics *pstats)
1368{
1369  DEBUG(2, "pr_mace_stats\n");
1370
1371  DEBUG(2, " xmtsv=%-7d             uflo=%d\n",
1372        pstats->xmtsv, pstats->uflo);
1373  DEBUG(2, " lcol=%-7d              more=%d\n",
1374        pstats->lcol, pstats->more);
1375  DEBUG(2, " one=%-7d               defer=%d\n",
1376        pstats->one, pstats->defer);
1377  DEBUG(2, " lcar=%-7d              rtry=%d\n",
1378        pstats->lcar, pstats->rtry);
1379
1380  /* MACE_XMTRC */
1381  DEBUG(2, " exdef=%-7d             xmtrc=%d\n",
1382        pstats->exdef, pstats->xmtrc);
1383
1384  /* RFS1--Receive Status (RCVSTS) */
1385  DEBUG(2, " oflo=%-7d              clsn=%d\n",
1386        pstats->oflo, pstats->clsn);
1387  DEBUG(2, " fram=%-7d              fcs=%d\n",
1388        pstats->fram, pstats->fcs);
1389
1390  /* RFS2--Runt Packet Count (RNTPC) */
1391  /* RFS3--Receive Collision Count (RCVCC) */
1392  DEBUG(2, " rfs_rntpc=%-7d         rfs_rcvcc=%d\n",
1393        pstats->rfs_rntpc, pstats->rfs_rcvcc);
1394
1395  /* MACE_IR */
1396  DEBUG(2, " jab=%-7d               babl=%d\n",
1397        pstats->jab, pstats->babl);
1398  DEBUG(2, " cerr=%-7d              rcvcco=%d\n",
1399        pstats->cerr, pstats->rcvcco);
1400  DEBUG(2, " rntpco=%-7d            mpco=%d\n",
1401        pstats->rntpco, pstats->mpco);
1402
1403  /* MACE_MPC */
1404  DEBUG(2, " mpc=%d\n", pstats->mpc);
1405
1406  /* MACE_RNTPC */
1407  DEBUG(2, " rntpc=%d\n", pstats->rntpc);
1408
1409  /* MACE_RCVCC */
1410  DEBUG(2, " rcvcc=%d\n", pstats->rcvcc);
1411
1412} /* pr_mace_stats */
1413
1414/* ----------------------------------------------------------------------------
1415update_stats
1416        Update statistics.  We change to register window 1, so this
1417        should be run single-threaded if the device is active. This is
1418        expected to be a rare operation, and it's simpler for the rest
1419        of the driver to assume that window 0 is always valid rather
1420        than use a special window-state variable.
1421
1422        oflo & uflo should _never_ occur since it would mean the Xilinx
1423        was not able to transfer data between the MACE FIFO and the
1424        card's SRAM fast enough.  If this happens, something is
1425        seriously wrong with the hardware.
1426---------------------------------------------------------------------------- */
1427static void update_stats(ioaddr_t ioaddr, struct net_device *dev)
1428{
1429  mace_private *lp = (mace_private *)dev->priv;
1430
1431  lp->mace_stats.rcvcc += mace_read(lp, ioaddr, MACE_RCVCC);
1432  lp->mace_stats.rntpc += mace_read(lp, ioaddr, MACE_RNTPC);
1433  lp->mace_stats.mpc += mace_read(lp, ioaddr, MACE_MPC);
1434  /* At this point, mace_stats is fully updated for this call.
1435     We may now update the linux_stats. */
1436
1437  /* The MACE has no equivalent for linux_stats field which are commented
1438     out. */
1439
1440  /* lp->linux_stats.multicast; */
1441  lp->linux_stats.collisions = 
1442    lp->mace_stats.rcvcco * 256 + lp->mace_stats.rcvcc;
1443    /* Collision: The MACE may retry sending a packet 15 times
1444       before giving up.  The retry count is in XMTRC.
1445       Does each retry constitute a collision?
1446       If so, why doesn't the RCVCC record these collisions? */
1447
1448  /* detailed rx_errors: */
1449  lp->linux_stats.rx_length_errors = 
1450    lp->mace_stats.rntpco * 256 + lp->mace_stats.rntpc;
1451  /* lp->linux_stats.rx_over_errors */
1452  lp->linux_stats.rx_crc_errors = lp->mace_stats.fcs;
1453  lp->linux_stats.rx_frame_errors = lp->mace_stats.fram;
1454  lp->linux_stats.rx_fifo_errors = lp->mace_stats.oflo;
1455  lp->linux_stats.rx_missed_errors = 
1456    lp->mace_stats.mpco * 256 + lp->mace_stats.mpc;
1457
1458  /* detailed tx_errors */
1459  lp->linux_stats.tx_aborted_errors = lp->mace_stats.rtry;
1460  lp->linux_stats.tx_carrier_errors = lp->mace_stats.lcar;
1461    /* LCAR usually results from bad cabling. */
1462  lp->linux_stats.tx_fifo_errors = lp->mace_stats.uflo;
1463  lp->linux_stats.tx_heartbeat_errors = lp->mace_stats.cerr;
1464  /* lp->linux_stats.tx_window_errors; */
1465
1466  return;
1467} /* update_stats */
1468
1469/* ----------------------------------------------------------------------------
1470mace_get_stats
1471        Gathers ethernet statistics from the MACE chip.
1472---------------------------------------------------------------------------- */
1473static struct net_device_stats *mace_get_stats(struct net_device *dev)
1474{
1475  mace_private *lp = (mace_private *)dev->priv;
1476
1477  update_stats(dev->base_addr, dev);
1478
1479  DEBUG(1, "%s: updating the statistics.\n", dev->name);
1480  pr_linux_stats(&lp->linux_stats);
1481  pr_mace_stats(&lp->mace_stats);
1482
1483  return &lp->linux_stats;
1484} /* net_device_stats */
1485
1486/* ----------------------------------------------------------------------------
1487updateCRC
1488        Modified from Am79C90 data sheet.
1489---------------------------------------------------------------------------- */
1490
1491#if BROKEN_MULTICAST
1492
1493static void updateCRC(int *CRC, int bit)
1494{
1495  int poly[]={
1496    1,1,1,0, 1,1,0,1,
1497    1,0,1,1, 1,0,0,0,
1498    1,0,0,0, 0,0,1,1,
1499    0,0,1,0, 0,0,0,0
1500  }; /* CRC polynomial.  poly[n] = coefficient of the x**n term of the
1501        CRC generator polynomial. */
1502
1503  int j;
1504
1505  /* shift CRC and control bit (CRC[32]) */
1506  for (j = 32; j > 0; j--)
1507    CRC[j] = CRC[j-1];
1508  CRC[0] = 0;
1509
1510  /* If bit XOR(control bit) = 1, set CRC = CRC XOR polynomial. */
1511  if (bit ^ CRC[32])
1512    for (j = 0; j < 32; j++)
1513      CRC[j] ^= poly[j];
1514} /* updateCRC */
1515
1516/* ----------------------------------------------------------------------------
1517BuildLAF
1518        Build logical address filter.
1519        Modified from Am79C90 data sheet.
1520
1521Input
1522        ladrf: logical address filter (contents initialized to 0)
1523        adr: ethernet address
1524---------------------------------------------------------------------------- */
1525static void BuildLAF(int *ladrf, int *adr)
1526{
1527  int CRC[33]={1}; /* CRC register, 1 word/bit + extra control bit */
1528
1529  int i, byte; /* temporary array indices */
1530  int hashcode; /* the output object */
1531
1532  CRC[32]=0;
1533
1534  for (byte = 0; byte < 6; byte++)
1535    for (i = 0; i < 8; i++)
1536      updateCRC(CRC, (adr[byte] >> i) & 1);
1537
1538  hashcode = 0;
1539  for (i = 0; i < 6; i++)
1540    hashcode = (hashcode << 1) + CRC[i];
1541
1542  byte = hashcode >> 3;
1543  ladrf[byte] |= (1 << (hashcode & 7));
1544
1545#ifdef PCMCIA_DEBUG
1546  if (pc_debug > 2) {
1547    printk(KERN_DEBUG "    adr =");
1548    for (i = 0; i < 6; i++)
1549      printk(" %02X", adr[i]);
1550    printk("\n" KERN_DEBUG "    hashcode = %d(decimal), ladrf[0:63]"
1551           " =", hashcode);
1552    for (i = 0; i < 8; i++)
1553      printk(" %02X", ladrf[i]);
1554    printk("\n");
1555  }
1556#endif
1557} /* BuildLAF */
1558
1559/* ----------------------------------------------------------------------------
1560restore_multicast_list
1561        Restores the multicast filter for MACE chip to the last
1562        set_multicast_list() call.
1563
1564Input
1565        multicast_num_addrs
1566        multicast_ladrf[]
1567---------------------------------------------------------------------------- */
1568static void restore_multicast_list(struct net_device *dev)
1569{
1570  mace_private *lp = (mace_private *)dev->priv;
1571  int num_addrs = lp->multicast_num_addrs;
1572  int *ladrf = lp->multicast_ladrf;
1573  ioaddr_t ioaddr = dev->base_addr;
1574  int i;
1575
1576  DEBUG(2, "%s: restoring Rx mode to %d addresses.\n",
1577        dev->name, num_addrs);
1578
1579  if (num_addrs > 0) {
1580
1581    DEBUG(1, "Attempt to restore multicast list detected.\n");
1582
1583    mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_LOGADDR);
1584    /* Poll ADDRCHG bit */
1585    while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
1586      ;
1587    /* Set LADRF register */
1588    for (i = 0; i < MACE_LADRF_LEN; i++)
1589      mace_write(lp, ioaddr, MACE_LADRF, ladrf[i]);
1590
1591    mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_RCVFCSE | MACE_UTR_LOOP_EXTERNAL);
1592    mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1593
1594  } else if (num_addrs < 0) {
1595
1596    /* Promiscuous mode: receive all packets */
1597    mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1598    mace_write(lp, ioaddr, MACE_MACCC,
1599      MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1600    );
1601
1602  } else {
1603
1604    /* Normal mode */
1605    mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1606    mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1607
1608  }
1609} /* restore_multicast_list */
1610
1611/* ----------------------------------------------------------------------------
1612set_multicast_list
1613        Set or clear the multicast filter for this adaptor.
1614
1615Input
1616        num_addrs == -1 Promiscuous mode, receive all packets
1617        num_addrs == 0  Normal mode, clear multicast list
1618        num_addrs > 0   Multicast mode, receive normal and MC packets, and do
1619                        best-effort filtering.
1620Output
1621        multicast_num_addrs
1622        multicast_ladrf[]
1623---------------------------------------------------------------------------- */
1624
1625static void set_multicast_list(struct net_device *dev)
1626{
1627  mace_private *lp = (mace_private *)dev->priv;
1628  int adr[ETHER_ADDR_LEN] = {0}; /* Ethernet address */
1629  int i;
1630  struct dev_mc_list *dmi = dev->mc_list;
1631
1632#ifdef PCMCIA_DEBUG
1633  if (pc_debug > 1) {
1634    static int old;
1635    if (dev->mc_count != old) {
1636      old = dev->mc_count;
1637      DEBUG(0, "%s: setting Rx mode to %d addresses.\n",
1638            dev->name, old);
1639    }
1640  }
1641#endif
1642
1643  /* Set multicast_num_addrs. */
1644  lp->multicast_num_addrs = dev->mc_count;
1645
1646  /* Set multicast_ladrf. */
1647  if (num_addrs > 0) {
1648    /* Calculate multicast logical address filter */
1649    memset(lp->multicast_ladrf, 0, MACE_LADRF_LEN);
1650    for (i = 0; i < dev->mc_count; i++) {
1651      memcpy(adr, dmi->dmi_addr, ETHER_ADDR_LEN);
1652      dmi = dmi->next;
1653      BuildLAF(lp->multicast_ladrf, adr);
1654    }
1655  }
1656
1657  restore_multicast_list(dev);
1658
1659} /* set_multicast_list */
1660
1661#endif /* BROKEN_MULTICAST */
1662
1663static void restore_multicast_list(struct net_device *dev)
1664{
1665  ioaddr_t ioaddr = dev->base_addr;
1666  mace_private *lp = (mace_private *)dev->priv;
1667
1668  DEBUG(2, "%s: restoring Rx mode to %d addresses.\n", dev->name,
1669        ((mace_private *)(dev->priv))->multicast_num_addrs);
1670
1671  if (dev->flags & IFF_PROMISC) {
1672    /* Promiscuous mode: receive all packets */
1673    mace_write(lp,ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1674    mace_write(lp, ioaddr, MACE_MACCC,
1675      MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1676    );
1677  } else {
1678    /* Normal mode */
1679    mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1680    mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1681  }
1682} /* restore_multicast_list */
1683
1684static void set_multicast_list(struct net_device *dev)
1685{
1686  mace_private *lp = (mace_private *)dev->priv;
1687
1688#ifdef PCMCIA_DEBUG
1689  if (pc_debug > 1) {
1690    static int old;
1691    if (dev->mc_count != old) {
1692      old = dev->mc_count;
1693      DEBUG(0, "%s: setting Rx mode to %d addresses.\n",
1694            dev->name, old);
1695    }
1696  }
1697#endif
1698
1699  lp->multicast_num_addrs = dev->mc_count;
1700  restore_multicast_list(dev);
1701
1702} /* set_multicast_list */
1703
1704static struct pcmcia_driver nmclan_cs_driver = {
1705        .owner          = THIS_MODULE,
1706        .drv            = {
1707                .name   = "nmclan_cs",
1708        },
1709        .attach         = nmclan_attach,
1710        .detach         = nmclan_detach,
1711};
1712
1713static int __init init_nmclan_cs(void)
1714{
1715        return pcmcia_register_driver(&nmclan_cs_driver);
1716}
1717
1718static void __exit exit_nmclan_cs(void)
1719{
1720        pcmcia_unregister_driver(&nmclan_cs_driver);
1721        while (dev_list != NULL)
1722                nmclan_detach(dev_list);
1723}
1724
1725module_init(init_nmclan_cs);
1726module_exit(exit_nmclan_cs);
1727
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.