linux/drivers/net/wireless/netwave_cs.c
<<
>>
Prefs
   1/*********************************************************************
   2 *                
   3 * Filename:      netwave_cs.c
   4 * Version:       0.4.1
   5 * Description:   Netwave AirSurfer Wireless LAN PC Card driver
   6 * Status:        Experimental.
   7 * Authors:       John Markus Bjørndalen <johnm@cs.uit.no>
   8 *                Dag Brattli <dagb@cs.uit.no>
   9 *                David Hinds <dahinds@users.sourceforge.net>
  10 * Created at:    A long time ago!
  11 * Modified at:   Mon Nov 10 11:54:37 1997
  12 * Modified by:   Dag Brattli <dagb@cs.uit.no>
  13 * 
  14 *     Copyright (c) 1997 University of Tromsø, Norway
  15 *
  16 * Revision History:
  17 *
  18 *   08-Nov-97 15:14:47   John Markus Bjørndalen <johnm@cs.uit.no>
  19 *    - Fixed some bugs in netwave_rx and cleaned it up a bit. 
  20 *      (One of the bugs would have destroyed packets when receiving
  21 *      multiple packets per interrupt). 
  22 *    - Cleaned up parts of newave_hw_xmit. 
  23 *    - A few general cleanups. 
  24 *   24-Oct-97 13:17:36   Dag Brattli <dagb@cs.uit.no>
  25 *    - Fixed netwave_rx receive function (got updated docs)
  26 *   Others:
  27 *    - Changed name from xircnw to netwave, take a look at 
  28 *      http://www.netwave-wireless.com
  29 *    - Some reorganizing of the code
  30 *    - Removed possible race condition between interrupt handler and transmit
  31 *      function
  32 *    - Started to add wireless extensions, but still needs some coding
  33 *    - Added watchdog for better handling of transmission timeouts 
  34 *      (hopefully this works better)
  35 ********************************************************************/
  36
  37/* To have statistics (just packets sent) define this */
  38#undef NETWAVE_STATS
  39
  40#include <linux/module.h>
  41#include <linux/kernel.h>
  42#include <linux/init.h>
  43#include <linux/types.h>
  44#include <linux/fcntl.h>
  45#include <linux/interrupt.h>
  46#include <linux/ptrace.h>
  47#include <linux/ioport.h>
  48#include <linux/in.h>
  49#include <linux/slab.h>
  50#include <linux/string.h>
  51#include <linux/timer.h>
  52#include <linux/errno.h>
  53#include <linux/netdevice.h>
  54#include <linux/etherdevice.h>
  55#include <linux/skbuff.h>
  56#include <linux/bitops.h>
  57#include <linux/wireless.h>
  58#include <net/iw_handler.h>
  59
  60#include <pcmcia/cs_types.h>
  61#include <pcmcia/cs.h>
  62#include <pcmcia/cistpl.h>
  63#include <pcmcia/cisreg.h>
  64#include <pcmcia/ds.h>
  65#include <pcmcia/mem_op.h>
  66
  67#include <asm/system.h>
  68#include <asm/io.h>
  69#include <asm/dma.h>
  70
  71#define NETWAVE_REGOFF         0x8000
  72/* The Netwave IO registers, offsets to iobase */
  73#define NETWAVE_REG_COR        0x0
  74#define NETWAVE_REG_CCSR       0x2
  75#define NETWAVE_REG_ASR        0x4
  76#define NETWAVE_REG_IMR        0xa
  77#define NETWAVE_REG_PMR        0xc
  78#define NETWAVE_REG_IOLOW      0x6
  79#define NETWAVE_REG_IOHI       0x7
  80#define NETWAVE_REG_IOCONTROL  0x8
  81#define NETWAVE_REG_DATA       0xf
  82/* The Netwave Extended IO registers, offsets to RamBase */
  83#define NETWAVE_EREG_ASCC      0x114
  84#define NETWAVE_EREG_RSER      0x120
  85#define NETWAVE_EREG_RSERW     0x124
  86#define NETWAVE_EREG_TSER      0x130
  87#define NETWAVE_EREG_TSERW     0x134
  88#define NETWAVE_EREG_CB        0x100
  89#define NETWAVE_EREG_SPCQ      0x154
  90#define NETWAVE_EREG_SPU       0x155
  91#define NETWAVE_EREG_LIF       0x14e
  92#define NETWAVE_EREG_ISPLQ     0x156
  93#define NETWAVE_EREG_HHC       0x158
  94#define NETWAVE_EREG_NI        0x16e
  95#define NETWAVE_EREG_MHS       0x16b
  96#define NETWAVE_EREG_TDP       0x140
  97#define NETWAVE_EREG_RDP       0x150
  98#define NETWAVE_EREG_PA        0x160
  99#define NETWAVE_EREG_EC        0x180
 100#define NETWAVE_EREG_CRBP      0x17a
 101#define NETWAVE_EREG_ARW       0x166
 102
 103/*
 104 * Commands used in the extended command buffer
 105 * NETWAVE_EREG_CB (0x100-0x10F) 
 106 */
 107#define NETWAVE_CMD_NOP        0x00
 108#define NETWAVE_CMD_SRC        0x01
 109#define NETWAVE_CMD_STC        0x02
 110#define NETWAVE_CMD_AMA        0x03
 111#define NETWAVE_CMD_DMA        0x04
 112#define NETWAVE_CMD_SAMA       0x05
 113#define NETWAVE_CMD_ER         0x06
 114#define NETWAVE_CMD_DR         0x07
 115#define NETWAVE_CMD_TL         0x08
 116#define NETWAVE_CMD_SRP        0x09
 117#define NETWAVE_CMD_SSK        0x0a
 118#define NETWAVE_CMD_SMD        0x0b
 119#define NETWAVE_CMD_SAPD       0x0c
 120#define NETWAVE_CMD_SSS        0x11
 121/* End of Command marker */
 122#define NETWAVE_CMD_EOC        0x00
 123
 124/* ASR register bits */
 125#define NETWAVE_ASR_RXRDY   0x80
 126#define NETWAVE_ASR_TXBA    0x01
 127
 128#define TX_TIMEOUT              ((32*HZ)/100)
 129
 130static const unsigned int imrConfRFU1 = 0x10; /* RFU interrupt mask, keep high */
 131static const unsigned int imrConfIENA = 0x02; /* Interrupt enable */
 132
 133static const unsigned int corConfIENA   = 0x01; /* Interrupt enable */
 134static const unsigned int corConfLVLREQ = 0x40; /* Keep high */
 135
 136static const unsigned int rxConfRxEna  = 0x80; /* Receive Enable */
 137static const unsigned int rxConfMAC    = 0x20; /* MAC host receive mode*/ 
 138static const unsigned int rxConfPro    = 0x10; /* Promiscuous */
 139static const unsigned int rxConfAMP    = 0x08; /* Accept Multicast Packets */
 140static const unsigned int rxConfBcast  = 0x04; /* Accept Broadcast Packets */
 141
 142static const unsigned int txConfTxEna  = 0x80; /* Transmit Enable */
 143static const unsigned int txConfMAC    = 0x20; /* Host sends MAC mode */
 144static const unsigned int txConfEUD    = 0x10; /* Enable Uni-Data packets */
 145static const unsigned int txConfKey    = 0x02; /* Scramble data packets */
 146static const unsigned int txConfLoop   = 0x01; /* Loopback mode */
 147
 148/*
 149   All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
 150   you do not define PCMCIA_DEBUG at all, all the debug code will be
 151   left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
 152   be present but disabled -- but it can then be enabled for specific
 153   modules at load time with a 'pc_debug=#' option to insmod.
 154*/
 155
 156#ifdef PCMCIA_DEBUG
 157static int pc_debug = PCMCIA_DEBUG;
 158module_param(pc_debug, int, 0);
 159#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 160static char *version =
 161"netwave_cs.c 0.3.0 Thu Jul 17 14:36:02 1997 (John Markus Bjørndalen)\n";
 162#else
 163#define DEBUG(n, args...)
 164#endif
 165
 166/*====================================================================*/
 167
 168/* Parameters that can be set with 'insmod' */
 169
 170/* Choose the domain, default is 0x100 */
 171static u_int  domain = 0x100;
 172
 173/* Scramble key, range from 0x0 to 0xffff.  
 174 * 0x0 is no scrambling. 
 175 */
 176static u_int  scramble_key = 0x0;
 177
 178/* Shared memory speed, in ns. The documentation states that 
 179 * the card should not be read faster than every 400ns. 
 180 * This timing should be provided by the HBA. If it becomes a 
 181 * problem, try setting mem_speed to 400. 
 182 */
 183static int mem_speed;
 184
 185module_param(domain, int, 0);
 186module_param(scramble_key, int, 0);
 187module_param(mem_speed, int, 0);
 188
 189/*====================================================================*/
 190
 191/* PCMCIA (Card Services) related functions */
 192static void netwave_release(struct pcmcia_device *link);     /* Card removal */
 193static int netwave_pcmcia_config(struct pcmcia_device *arg); /* Runs after card
 194                                                                                                           insertion */
 195static void netwave_detach(struct pcmcia_device *p_dev);    /* Destroy instance */
 196
 197/* Hardware configuration */
 198static void netwave_doreset(kio_addr_t iobase, u_char __iomem *ramBase);
 199static void netwave_reset(struct net_device *dev);
 200
 201/* Misc device stuff */
 202static int netwave_open(struct net_device *dev);  /* Open the device */
 203static int netwave_close(struct net_device *dev); /* Close the device */
 204
 205/* Packet transmission and Packet reception */
 206static int netwave_start_xmit( struct sk_buff *skb, struct net_device *dev);
 207static int netwave_rx( struct net_device *dev);
 208
 209/* Interrupt routines */
 210static irqreturn_t netwave_interrupt(int irq, void *dev_id);
 211static void netwave_watchdog(struct net_device *);
 212
 213/* Statistics */
 214static void update_stats(struct net_device *dev);
 215static struct net_device_stats *netwave_get_stats(struct net_device *dev);
 216
 217/* Wireless extensions */
 218static struct iw_statistics* netwave_get_wireless_stats(struct net_device *dev);
 219
 220static void set_multicast_list(struct net_device *dev);
 221
 222/*
 223   A struct pcmcia_device structure has fields for most things that are needed
 224   to keep track of a socket, but there will usually be some device
 225   specific information that also needs to be kept track of.  The
 226   'priv' pointer in a struct pcmcia_device structure can be used to point to
 227   a device-specific private data structure, like this.
 228
 229   A driver needs to provide a dev_node_t structure for each device
 230   on a card.  In some cases, there is only one device per card (for
 231   example, ethernet cards, modems).  In other cases, there may be
 232   many actual or logical devices (SCSI adapters, memory cards with
 233   multiple partitions).  The dev_node_t structures need to be kept
 234   in a linked list starting at the 'dev' field of a struct pcmcia_device
 235   structure.  We allocate them in the card's private data structure,
 236   because they generally can't be allocated dynamically.
 237*/
 238
 239static const struct iw_handler_def      netwave_handler_def;
 240
 241#define SIOCGIPSNAP     SIOCIWFIRSTPRIV + 1     /* Site Survey Snapshot */
 242
 243#define MAX_ESA 10
 244
 245typedef struct net_addr {
 246    u_char addr48[6];
 247} net_addr;
 248
 249struct site_survey {
 250    u_short length;
 251    u_char  struct_revision;
 252    u_char  roaming_state;
 253        
 254    u_char  sp_existsFlag;
 255    u_char  sp_link_quality;
 256    u_char  sp_max_link_quality;
 257    u_char  linkQualityGoodFairBoundary;
 258    u_char  linkQualityFairPoorBoundary;
 259    u_char  sp_utilization;
 260    u_char  sp_goodness;
 261    u_char  sp_hotheadcount;
 262    u_char  roaming_condition;
 263        
 264    net_addr sp;
 265    u_char   numAPs;
 266    net_addr nearByAccessPoints[MAX_ESA];
 267};      
 268   
 269typedef struct netwave_private {
 270        struct pcmcia_device    *p_dev;
 271    spinlock_t  spinlock;       /* Serialize access to the hardware (SMP) */
 272    dev_node_t node;
 273    u_char     __iomem *ramBase;
 274    int        timeoutCounter;
 275    int        lastExec;
 276    struct timer_list      watchdog;    /* To avoid blocking state */
 277    struct site_survey     nss;
 278    struct net_device_stats stats;
 279    struct iw_statistics   iw_stats;    /* Wireless stats */
 280} netwave_private;
 281
 282#ifdef NETWAVE_STATS
 283static struct net_device_stats *netwave_get_stats(struct net_device *dev);
 284#endif
 285
 286/*
 287 * The Netwave card is little-endian, so won't work for big endian
 288 * systems.
 289 */
 290static inline unsigned short get_uint16(u_char __iomem *staddr) 
 291{
 292    return readw(staddr); /* Return only 16 bits */
 293}
 294
 295static inline short get_int16(u_char __iomem * staddr)
 296{
 297    return readw(staddr);
 298}
 299
 300/* 
 301 * Wait until the WOC (Write Operation Complete) bit in the 
 302 * ASR (Adapter Status Register) is asserted. 
 303 * This should have aborted if it takes too long time. 
 304 */
 305static inline void wait_WOC(unsigned int iobase)
 306{
 307    /* Spin lock */
 308    while ((inb(iobase + NETWAVE_REG_ASR) & 0x8) != 0x8) ; 
 309}
 310
 311static void netwave_snapshot(netwave_private *priv, u_char __iomem *ramBase, 
 312                             kio_addr_t iobase) {
 313    u_short resultBuffer;
 314
 315    /* if time since last snapshot is > 1 sec. (100 jiffies?)  then take 
 316     * new snapshot, else return cached data. This is the recommended rate.  
 317     */
 318    if ( jiffies - priv->lastExec > 100) { 
 319        /* Take site survey  snapshot */ 
 320        /*printk( KERN_DEBUG "Taking new snapshot. %ld\n", jiffies -
 321          priv->lastExec); */
 322        wait_WOC(iobase); 
 323        writeb(NETWAVE_CMD_SSS, ramBase + NETWAVE_EREG_CB + 0); 
 324        writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 
 325        wait_WOC(iobase); 
 326
 327        /* Get result and copy to cach */ 
 328        resultBuffer = readw(ramBase + NETWAVE_EREG_CRBP); 
 329        copy_from_pc( &priv->nss, ramBase+resultBuffer, 
 330                      sizeof(struct site_survey)); 
 331    } 
 332}
 333
 334/*
 335 * Function netwave_get_wireless_stats (dev)
 336 *
 337 *    Wireless extensions statistics
 338 *
 339 */
 340static struct iw_statistics *netwave_get_wireless_stats(struct net_device *dev)
 341{       
 342    unsigned long flags;
 343    kio_addr_t iobase = dev->base_addr;
 344    netwave_private *priv = netdev_priv(dev);
 345    u_char __iomem *ramBase = priv->ramBase;
 346    struct iw_statistics* wstats;
 347        
 348    wstats = &priv->iw_stats;
 349
 350    spin_lock_irqsave(&priv->spinlock, flags);
 351        
 352    netwave_snapshot( priv, ramBase, iobase);
 353
 354    wstats->status = priv->nss.roaming_state;
 355    wstats->qual.qual = readb( ramBase + NETWAVE_EREG_SPCQ); 
 356    wstats->qual.level = readb( ramBase + NETWAVE_EREG_ISPLQ);
 357    wstats->qual.noise = readb( ramBase + NETWAVE_EREG_SPU) & 0x3f;
 358    wstats->discard.nwid = 0L;
 359    wstats->discard.code = 0L;
 360    wstats->discard.misc = 0L;
 361
 362    spin_unlock_irqrestore(&priv->spinlock, flags);
 363    
 364    return &priv->iw_stats;
 365}
 366
 367/*
 368 * Function netwave_attach (void)
 369 *
 370 *     Creates an "instance" of the driver, allocating local data 
 371 *     structures for one device.  The device is registered with Card 
 372 *     Services.
 373 *
 374 *     The dev_link structure is initialized, but we don't actually
 375 *     configure the card at this point -- we wait until we receive a
 376 *     card insertion event.
 377 */
 378static int netwave_probe(struct pcmcia_device *link)
 379{
 380    struct net_device *dev;
 381    netwave_private *priv;
 382
 383    DEBUG(0, "netwave_attach()\n");
 384
 385    /* Initialize the struct pcmcia_device structure */
 386    dev = alloc_etherdev(sizeof(netwave_private));
 387    if (!dev)
 388        return -ENOMEM;
 389    priv = netdev_priv(dev);
 390    priv->p_dev = link;
 391    link->priv = dev;
 392
 393    /* The io structure describes IO port mapping */
 394    link->io.NumPorts1 = 16;
 395    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
 396    /* link->io.NumPorts2 = 16; 
 397       link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; */
 398    link->io.IOAddrLines = 5;
 399    
 400    /* Interrupt setup */
 401    link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
 402    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
 403    link->irq.Handler = &netwave_interrupt;
 404    
 405    /* General socket configuration */
 406    link->conf.Attributes = CONF_ENABLE_IRQ;
 407    link->conf.IntType = INT_MEMORY_AND_IO;
 408    link->conf.ConfigIndex = 1;
 409
 410    /* Netwave private struct init. link/dev/node already taken care of,
 411     * other stuff zero'd - Jean II */
 412    spin_lock_init(&priv->spinlock);
 413
 414    /* Netwave specific entries in the device structure */
 415    dev->hard_start_xmit = &netwave_start_xmit;
 416    dev->get_stats  = &netwave_get_stats;
 417    dev->set_multicast_list = &set_multicast_list;
 418    /* wireless extensions */
 419    dev->wireless_handlers = (struct iw_handler_def *)&netwave_handler_def;
 420
 421    dev->tx_timeout = &netwave_watchdog;
 422    dev->watchdog_timeo = TX_TIMEOUT;
 423
 424    dev->open = &netwave_open;
 425    dev->stop = &netwave_close;
 426    link->irq.Instance = dev;
 427
 428    return netwave_pcmcia_config( link);
 429} /* netwave_attach */
 430
 431/*
 432 * Function netwave_detach (link)
 433 *
 434 *    This deletes a driver "instance".  The device is de-registered
 435 *    with Card Services.  If it has been released, all local data
 436 *    structures are freed.  Otherwise, the structures will be freed
 437 *    when the device is released.
 438 */
 439static void netwave_detach(struct pcmcia_device *link)
 440{
 441        struct net_device *dev = link->priv;
 442
 443        DEBUG(0, "netwave_detach(0x%p)\n", link);
 444
 445        netwave_release(link);
 446
 447        if (link->dev_node)
 448                unregister_netdev(dev);
 449
 450        free_netdev(dev);
 451} /* netwave_detach */
 452
 453/*
 454 * Wireless Handler : get protocol name
 455 */
 456static int netwave_get_name(struct net_device *dev,
 457                            struct iw_request_info *info,
 458                            union iwreq_data *wrqu,
 459                            char *extra)
 460{
 461        strcpy(wrqu->name, "Netwave");
 462        return 0;
 463}
 464
 465/*
 466 * Wireless Handler : set Network ID
 467 */
 468static int netwave_set_nwid(struct net_device *dev,
 469                            struct iw_request_info *info,
 470                            union iwreq_data *wrqu,
 471                            char *extra)
 472{
 473        unsigned long flags;
 474        kio_addr_t iobase = dev->base_addr;
 475        netwave_private *priv = netdev_priv(dev);
 476        u_char __iomem *ramBase = priv->ramBase;
 477
 478        /* Disable interrupts & save flags */
 479        spin_lock_irqsave(&priv->spinlock, flags);
 480
 481        if(!wrqu->nwid.disabled) {
 482            domain = wrqu->nwid.value;
 483            printk( KERN_DEBUG "Setting domain to 0x%x%02x\n", 
 484                    (domain >> 8) & 0x01, domain & 0xff);
 485            wait_WOC(iobase);
 486            writeb(NETWAVE_CMD_SMD, ramBase + NETWAVE_EREG_CB + 0);
 487            writeb( domain & 0xff, ramBase + NETWAVE_EREG_CB + 1);
 488            writeb((domain >>8 ) & 0x01,ramBase + NETWAVE_EREG_CB+2);
 489            writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3);
 490        }
 491
 492        /* ReEnable interrupts & restore flags */
 493        spin_unlock_irqrestore(&priv->spinlock, flags);
 494    
 495        return 0;
 496}
 497
 498/*
 499 * Wireless Handler : get Network ID
 500 */
 501static int netwave_get_nwid(struct net_device *dev,
 502                            struct iw_request_info *info,
 503                            union iwreq_data *wrqu,
 504                            char *extra)
 505{
 506        wrqu->nwid.value = domain;
 507        wrqu->nwid.disabled = 0;
 508        wrqu->nwid.fixed = 1;
 509        return 0;
 510}
 511
 512/*
 513 * Wireless Handler : set scramble key
 514 */
 515static int netwave_set_scramble(struct net_device *dev,
 516                                struct iw_request_info *info,
 517                                union iwreq_data *wrqu,
 518                                char *key)
 519{
 520        unsigned long flags;
 521        kio_addr_t iobase = dev->base_addr;
 522        netwave_private *priv = netdev_priv(dev);
 523        u_char __iomem *ramBase = priv->ramBase;
 524
 525        /* Disable interrupts & save flags */
 526        spin_lock_irqsave(&priv->spinlock, flags);
 527
 528        scramble_key = (key[0] << 8) | key[1];
 529        wait_WOC(iobase);
 530        writeb(NETWAVE_CMD_SSK, ramBase + NETWAVE_EREG_CB + 0);
 531        writeb(scramble_key & 0xff, ramBase + NETWAVE_EREG_CB + 1);
 532        writeb((scramble_key>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2);
 533        writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3);
 534
 535        /* ReEnable interrupts & restore flags */
 536        spin_unlock_irqrestore(&priv->spinlock, flags);
 537    
 538        return 0;
 539}
 540
 541/*
 542 * Wireless Handler : get scramble key
 543 */
 544static int netwave_get_scramble(struct net_device *dev,
 545                                struct iw_request_info *info,
 546                                union iwreq_data *wrqu,
 547                                char *key)
 548{
 549        key[1] = scramble_key & 0xff;
 550        key[0] = (scramble_key>>8) & 0xff;
 551        wrqu->encoding.flags = IW_ENCODE_ENABLED;
 552        wrqu->encoding.length = 2;
 553        return 0;
 554}
 555
 556/*
 557 * Wireless Handler : get mode
 558 */
 559static int netwave_get_mode(struct net_device *dev,
 560                            struct iw_request_info *info,
 561                            union iwreq_data *wrqu,
 562                            char *extra)
 563{
 564        if(domain & 0x100)
 565                wrqu->mode = IW_MODE_INFRA;
 566        else
 567                wrqu->mode = IW_MODE_ADHOC;
 568
 569        return 0;
 570}
 571
 572/*
 573 * Wireless Handler : get range info
 574 */
 575static int netwave_get_range(struct net_device *dev,
 576                             struct iw_request_info *info,
 577                             union iwreq_data *wrqu,
 578                             char *extra)
 579{
 580        struct iw_range *range = (struct iw_range *) extra;
 581        int ret = 0;
 582
 583        /* Set the length (very important for backward compatibility) */
 584        wrqu->data.length = sizeof(struct iw_range);
 585
 586        /* Set all the info we don't care or don't know about to zero */
 587        memset(range, 0, sizeof(struct iw_range));
 588
 589        /* Set the Wireless Extension versions */
 590        range->we_version_compiled = WIRELESS_EXT;
 591        range->we_version_source = 9;   /* Nothing for us in v10 and v11 */
 592                   
 593        /* Set information in the range struct */
 594        range->throughput = 450 * 1000; /* don't argue on this ! */
 595        range->min_nwid = 0x0000;
 596        range->max_nwid = 0x01FF;
 597
 598        range->num_channels = range->num_frequency = 0;
 599                   
 600        range->sensitivity = 0x3F;
 601        range->max_qual.qual = 255;
 602        range->max_qual.level = 255;
 603        range->max_qual.noise = 0;
 604                   
 605        range->num_bitrates = 1;
 606        range->bitrate[0] = 1000000;    /* 1 Mb/s */
 607
 608        range->encoding_size[0] = 2;            /* 16 bits scrambling */
 609        range->num_encoding_sizes = 1;
 610        range->max_encoding_tokens = 1; /* Only one key possible */
 611
 612        return ret;
 613}
 614
 615/*
 616 * Wireless Private Handler : get snapshot
 617 */
 618static int netwave_get_snap(struct net_device *dev,
 619                            struct iw_request_info *info,
 620                            union iwreq_data *wrqu,
 621                            char *extra)
 622{
 623        unsigned long flags;
 624        kio_addr_t iobase = dev->base_addr;
 625        netwave_private *priv = netdev_priv(dev);
 626        u_char __iomem *ramBase = priv->ramBase;
 627
 628        /* Disable interrupts & save flags */
 629        spin_lock_irqsave(&priv->spinlock, flags);
 630
 631        /* Take snapshot of environment */
 632        netwave_snapshot( priv, ramBase, iobase);
 633        wrqu->data.length = priv->nss.length;
 634        memcpy(extra, (u_char *) &priv->nss, sizeof( struct site_survey));
 635
 636        priv->lastExec = jiffies;
 637
 638        /* ReEnable interrupts & restore flags */
 639        spin_unlock_irqrestore(&priv->spinlock, flags);
 640    
 641        return(0);
 642}
 643
 644/*
 645 * Structures to export the Wireless Handlers
 646 *     This is the stuff that are treated the wireless extensions (iwconfig)
 647 */
 648
 649static const struct iw_priv_args netwave_private_args[] = {
 650/*{ cmd,         set_args,                            get_args, name } */
 651  { SIOCGIPSNAP, 0, 
 652    IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof(struct site_survey), 
 653    "getsitesurvey" },
 654};
 655
 656static const iw_handler         netwave_handler[] =
 657{
 658        NULL,                           /* SIOCSIWNAME */
 659        netwave_get_name,               /* SIOCGIWNAME */
 660        netwave_set_nwid,               /* SIOCSIWNWID */
 661        netwave_get_nwid,               /* SIOCGIWNWID */
 662        NULL,                           /* SIOCSIWFREQ */
 663        NULL,                           /* SIOCGIWFREQ */
 664        NULL,                           /* SIOCSIWMODE */
 665        netwave_get_mode,               /* SIOCGIWMODE */
 666        NULL,                           /* SIOCSIWSENS */
 667        NULL,                           /* SIOCGIWSENS */
 668        NULL,                           /* SIOCSIWRANGE */
 669        netwave_get_range,              /* SIOCGIWRANGE */
 670        NULL,                           /* SIOCSIWPRIV */
 671        NULL,                           /* SIOCGIWPRIV */
 672        NULL,                           /* SIOCSIWSTATS */
 673        NULL,                           /* SIOCGIWSTATS */
 674        NULL,                           /* SIOCSIWSPY */
 675        NULL,                           /* SIOCGIWSPY */
 676        NULL,                           /* -- hole -- */
 677        NULL,                           /* -- hole -- */
 678        NULL,                           /* SIOCSIWAP */
 679        NULL,                           /* SIOCGIWAP */
 680        NULL,                           /* -- hole -- */
 681        NULL,                           /* SIOCGIWAPLIST */
 682        NULL,                           /* -- hole -- */
 683        NULL,                           /* -- hole -- */
 684        NULL,                           /* SIOCSIWESSID */
 685        NULL,                           /* SIOCGIWESSID */
 686        NULL,                           /* SIOCSIWNICKN */
 687        NULL,                           /* SIOCGIWNICKN */
 688        NULL,                           /* -- hole -- */
 689        NULL,                           /* -- hole -- */
 690        NULL,                           /* SIOCSIWRATE */
 691        NULL,                           /* SIOCGIWRATE */
 692        NULL,                           /* SIOCSIWRTS */
 693        NULL,                           /* SIOCGIWRTS */
 694        NULL,                           /* SIOCSIWFRAG */
 695        NULL,                           /* SIOCGIWFRAG */
 696        NULL,                           /* SIOCSIWTXPOW */
 697        NULL,                           /* SIOCGIWTXPOW */
 698        NULL,                           /* SIOCSIWRETRY */
 699        NULL,                           /* SIOCGIWRETRY */
 700        netwave_set_scramble,           /* SIOCSIWENCODE */
 701        netwave_get_scramble,           /* SIOCGIWENCODE */
 702};
 703
 704static const iw_handler         netwave_private_handler[] =
 705{
 706        NULL,                           /* SIOCIWFIRSTPRIV */
 707        netwave_get_snap,               /* SIOCIWFIRSTPRIV + 1 */
 708};
 709
 710static const struct iw_handler_def      netwave_handler_def =
 711{
 712        .num_standard   = ARRAY_SIZE(netwave_handler),
 713        .num_private    = ARRAY_SIZE(netwave_private_handler),
 714        .num_private_args = ARRAY_SIZE(netwave_private_args),
 715        .standard       = (iw_handler *) netwave_handler,
 716        .private        = (iw_handler *) netwave_private_handler,
 717        .private_args   = (struct iw_priv_args *) netwave_private_args,
 718        .get_wireless_stats = netwave_get_wireless_stats,
 719};
 720
 721/*
 722 * Function netwave_pcmcia_config (link)
 723 *
 724 *     netwave_pcmcia_config() is scheduled to run after a CARD_INSERTION 
 725 *     event is received, to configure the PCMCIA socket, and to make the
 726 *     device available to the system. 
 727 *
 728 */
 729
 730#define CS_CHECK(fn, ret) \
 731do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 732
 733static int netwave_pcmcia_config(struct pcmcia_device *link) {
 734    struct net_device *dev = link->priv;
 735    netwave_private *priv = netdev_priv(dev);
 736    int i, j, last_ret, last_fn;
 737    win_req_t req;
 738    memreq_t mem;
 739    u_char __iomem *ramBase = NULL;
 740    DECLARE_MAC_BUF(mac);
 741
 742    DEBUG(0, "netwave_pcmcia_config(0x%p)\n", link);
 743
 744    /*
 745     *  Try allocating IO ports.  This tries a few fixed addresses.
 746     *  If you want, you can also read the card's config table to
 747     *  pick addresses -- see the serial driver for an example.
 748     */
 749    for (i = j = 0x0; j < 0x400; j += 0x20) {
 750        link->io.BasePort1 = j ^ 0x300;
 751        i = pcmcia_request_io(link, &link->io);
 752        if (i == CS_SUCCESS) break;
 753    }
 754    if (i != CS_SUCCESS) {
 755        cs_error(link, RequestIO, i);
 756        goto failed;
 757    }
 758
 759    /*
 760     *  Now allocate an interrupt line.  Note that this does not
 761     *  actually assign a handler to the interrupt.
 762     */
 763    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
 764
 765    /*
 766     *  This actually configures the PCMCIA socket -- setting up
 767     *  the I/O windows and the interrupt mapping.
 768     */
 769    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
 770
 771    /*
 772     *  Allocate a 32K memory window.  Note that the struct pcmcia_device
 773     *  structure provides space for one window handle -- if your
 774     *  device needs several windows, you'll need to keep track of
 775     *  the handles in your private data structure, dev->priv.
 776     */
 777    DEBUG(1, "Setting mem speed of %d\n", mem_speed);
 778
 779    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 780    req.Base = 0; req.Size = 0x8000;
 781    req.AccessSpeed = mem_speed;
 782    CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win));
 783    mem.CardOffset = 0x20000; mem.Page = 0; 
 784    CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
 785
 786    /* Store base address of the common window frame */
 787    ramBase = ioremap(req.Base, 0x8000);
 788    priv->ramBase = ramBase;
 789
 790    dev->irq = link->irq.AssignedIRQ;
 791    dev->base_addr = link->io.BasePort1;
 792    SET_NETDEV_DEV(dev, &handle_to_dev(link));
 793
 794    if (register_netdev(dev) != 0) {
 795        printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n");
 796        goto failed;
 797    }
 798
 799    strcpy(priv->node.dev_name, dev->name);
 800    link->dev_node = &priv->node;
 801
 802    /* Reset card before reading physical address */
 803    netwave_doreset(dev->base_addr, ramBase);
 804
 805    /* Read the ethernet address and fill in the Netwave registers. */
 806    for (i = 0; i < 6; i++) 
 807        dev->dev_addr[i] = readb(ramBase + NETWAVE_EREG_PA + i);
 808
 809    printk(KERN_INFO "%s: Netwave: port %#3lx, irq %d, mem %lx, "
 810           "id %c%c, hw_addr %s\n",
 811           dev->name, dev->base_addr, dev->irq,
 812           (u_long) ramBase,
 813           (int) readb(ramBase+NETWAVE_EREG_NI),
 814           (int) readb(ramBase+NETWAVE_EREG_NI+1),
 815           print_mac(mac, dev->dev_addr));
 816
 817    /* get revision words */
 818    printk(KERN_DEBUG "Netwave_reset: revision %04x %04x\n", 
 819           get_uint16(ramBase + NETWAVE_EREG_ARW),
 820           get_uint16(ramBase + NETWAVE_EREG_ARW+2));
 821    return 0;
 822
 823cs_failed:
 824    cs_error(link, last_fn, last_ret);
 825failed:
 826    netwave_release(link);
 827    return -ENODEV;
 828} /* netwave_pcmcia_config */
 829
 830/*
 831 * Function netwave_release (arg)
 832 *
 833 *    After a card is removed, netwave_release() will unregister the net
 834 *    device, and release the PCMCIA configuration.  If the device is
 835 *    still open, this will be postponed until it is closed.
 836 */
 837static void netwave_release(struct pcmcia_device *link)
 838{
 839        struct net_device *dev = link->priv;
 840        netwave_private *priv = netdev_priv(dev);
 841
 842        DEBUG(0, "netwave_release(0x%p)\n", link);
 843
 844        pcmcia_disable_device(link);
 845        if (link->win)
 846                iounmap(priv->ramBase);
 847}
 848
 849static int netwave_suspend(struct pcmcia_device *link)
 850{
 851        struct net_device *dev = link->priv;
 852
 853        if (link->open)
 854                netif_device_detach(dev);
 855
 856        return 0;
 857}
 858
 859static int netwave_resume(struct pcmcia_device *link)
 860{
 861        struct net_device *dev = link->priv;
 862
 863        if (link->open) {
 864                netwave_reset(dev);
 865                netif_device_attach(dev);
 866        }
 867
 868        return 0;
 869}
 870
 871
 872/*
 873 * Function netwave_doreset (ioBase, ramBase)
 874 *
 875 *    Proper hardware reset of the card.
 876 */
 877static void netwave_doreset(kio_addr_t ioBase, u_char __iomem *ramBase)
 878{
 879    /* Reset card */
 880    wait_WOC(ioBase);
 881    outb(0x80, ioBase + NETWAVE_REG_PMR);
 882    writeb(0x08, ramBase + NETWAVE_EREG_ASCC); /* Bit 3 is WOC */
 883    outb(0x0, ioBase + NETWAVE_REG_PMR); /* release reset */
 884}
 885
 886/*
 887 * Function netwave_reset (dev)
 888 *
 889 *    Reset and restore all of the netwave registers 
 890 */
 891static void netwave_reset(struct net_device *dev) {
 892    /* u_char state; */
 893    netwave_private *priv = netdev_priv(dev);
 894    u_char __iomem *ramBase = priv->ramBase;
 895    kio_addr_t iobase = dev->base_addr;
 896
 897    DEBUG(0, "netwave_reset: Done with hardware reset\n");
 898
 899    priv->timeoutCounter = 0;
 900
 901    /* Reset card */
 902    netwave_doreset(iobase, ramBase);
 903    printk(KERN_DEBUG "netwave_reset: Done with hardware reset\n");
 904        
 905    /* Write a NOP to check the card */
 906    wait_WOC(iobase);
 907    writeb(NETWAVE_CMD_NOP, ramBase + NETWAVE_EREG_CB + 0);
 908    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1);
 909        
 910    /* Set receive conf */
 911    wait_WOC(iobase);
 912    writeb(NETWAVE_CMD_SRC, ramBase + NETWAVE_EREG_CB + 0);
 913    writeb(rxConfRxEna + rxConfBcast, ramBase + NETWAVE_EREG_CB + 1);
 914    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2);
 915    
 916    /* Set transmit conf */
 917    wait_WOC(iobase);
 918    writeb(NETWAVE_CMD_STC, ramBase + NETWAVE_EREG_CB + 0);
 919    writeb(txConfTxEna, ramBase + NETWAVE_EREG_CB + 1);
 920    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2);
 921    
 922    /* Now set the MU Domain */
 923    printk(KERN_DEBUG "Setting domain to 0x%x%02x\n", (domain >> 8) & 0x01, domain & 0xff);
 924    wait_WOC(iobase);
 925    writeb(NETWAVE_CMD_SMD, ramBase + NETWAVE_EREG_CB + 0);
 926    writeb(domain & 0xff, ramBase + NETWAVE_EREG_CB + 1);
 927    writeb((domain>>8) & 0x01, ramBase + NETWAVE_EREG_CB + 2);
 928    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3);
 929        
 930    /* Set scramble key */
 931    printk(KERN_DEBUG "Setting scramble key to 0x%x\n", scramble_key);
 932    wait_WOC(iobase);
 933    writeb(NETWAVE_CMD_SSK, ramBase + NETWAVE_EREG_CB + 0);
 934    writeb(scramble_key & 0xff, ramBase + NETWAVE_EREG_CB + 1);
 935    writeb((scramble_key>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2);
 936    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3);
 937
 938    /* Enable interrupts, bit 4 high to keep unused
 939     * source from interrupting us, bit 2 high to 
 940     * set interrupt enable, 567 to enable TxDN, 
 941     * RxErr and RxRdy
 942     */
 943    wait_WOC(iobase);
 944    outb(imrConfIENA+imrConfRFU1, iobase + NETWAVE_REG_IMR);
 945
 946    /* Hent 4 bytes fra 0x170. Skal vaere 0a,29,88,36
 947     * waitWOC
 948     * skriv 80 til d000:3688
 949     * sjekk om det ble 80
 950     */
 951    
 952    /* Enable Receiver */
 953    wait_WOC(iobase);
 954    writeb(NETWAVE_CMD_ER, ramBase + NETWAVE_EREG_CB + 0);
 955    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1);
 956        
 957    /* Set the IENA bit in COR */
 958    wait_WOC(iobase);
 959    outb(corConfIENA + corConfLVLREQ, iobase + NETWAVE_REG_COR);
 960}
 961
 962/*
 963 * Function netwave_hw_xmit (data, len, dev)    
 964 */
 965static int netwave_hw_xmit(unsigned char* data, int len,
 966                           struct net_device* dev) {
 967    unsigned long flags;
 968    unsigned int TxFreeList,
 969                 curBuff,
 970                 MaxData, 
 971                 DataOffset;
 972    int tmpcount; 
 973        
 974    netwave_private *priv = netdev_priv(dev);
 975    u_char __iomem * ramBase = priv->ramBase;
 976    kio_addr_t iobase = dev->base_addr;
 977
 978    /* Disable interrupts & save flags */
 979    spin_lock_irqsave(&priv->spinlock, flags);
 980
 981    /* Check if there are transmit buffers available */
 982    wait_WOC(iobase);
 983    if ((inb(iobase+NETWAVE_REG_ASR) & NETWAVE_ASR_TXBA) == 0) {
 984        /* No buffers available */
 985        printk(KERN_DEBUG "netwave_hw_xmit: %s - no xmit buffers available.\n",
 986               dev->name);
 987        spin_unlock_irqrestore(&priv->spinlock, flags);
 988        return 1;
 989    }
 990
 991    priv->stats.tx_bytes += len;
 992
 993    DEBUG(3, "Transmitting with SPCQ %x SPU %x LIF %x ISPLQ %x\n",
 994          readb(ramBase + NETWAVE_EREG_SPCQ),
 995          readb(ramBase + NETWAVE_EREG_SPU),
 996          readb(ramBase + NETWAVE_EREG_LIF),
 997          readb(ramBase + NETWAVE_EREG_ISPLQ));
 998
 999    /* Now try to insert it into the adapters free memory */
1000    wait_WOC(iobase);
1001    TxFreeList = get_uint16(ramBase + NETWAVE_EREG_TDP);
1002    MaxData    = get_uint16(ramBase + NETWAVE_EREG_TDP+2);
1003    DataOffset = get_uint16(ramBase + NETWAVE_EREG_TDP+4);
1004        
1005    DEBUG(3, "TxFreeList %x, MaxData %x, DataOffset %x\n",
1006          TxFreeList, MaxData, DataOffset);
1007
1008    /* Copy packet to the adapter fragment buffers */
1009    curBuff = TxFreeList; 
1010    tmpcount = 0; 
1011    while (tmpcount < len) {
1012        int tmplen = len - tmpcount; 
1013        copy_to_pc(ramBase + curBuff + DataOffset, data + tmpcount, 
1014                   (tmplen < MaxData) ? tmplen : MaxData);
1015        tmpcount += MaxData;
1016                        
1017        /* Advance to next buffer */
1018        curBuff = get_uint16(ramBase + curBuff);
1019    }
1020    
1021    /* Now issue transmit list */
1022    wait_WOC(iobase);
1023    writeb(NETWAVE_CMD_TL, ramBase + NETWAVE_EREG_CB + 0);
1024    writeb(len & 0xff, ramBase + NETWAVE_EREG_CB + 1);
1025    writeb((len>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2);
1026    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3);
1027
1028    spin_unlock_irqrestore(&priv->spinlock, flags);
1029    return 0;
1030}
1031
1032static int netwave_start_xmit(struct sk_buff *skb, struct net_device *dev) {
1033        /* This flag indicate that the hardware can't perform a transmission.
1034         * Theoritically, NET3 check it before sending a packet to the driver,
1035         * but in fact it never do that and pool continuously.
1036         * As the watchdog will abort too long transmissions, we are quite safe...
1037         */
1038
1039    netif_stop_queue(dev);
1040
1041    {
1042        short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1043        unsigned char* buf = skb->data;
1044        
1045        if (netwave_hw_xmit( buf, length, dev) == 1) {
1046            /* Some error, let's make them call us another time? */
1047            netif_start_queue(dev);
1048        }
1049        dev->trans_start = jiffies;
1050    }
1051    dev_kfree_skb(skb);
1052    
1053    return 0;
1054} /* netwave_start_xmit */
1055
1056/*
1057 * Function netwave_interrupt (irq, dev_id)
1058 *
1059 *    This function is the interrupt handler for the Netwave card. This
1060 *    routine will be called whenever: 
1061 *        1. A packet is received.
1062 *        2. A packet has successfully been transferred and the unit is
1063 *           ready to transmit another packet.
1064 *        3. A command has completed execution.
1065 */
1066static irqreturn_t netwave_interrupt(int irq, void* dev_id)
1067{
1068    kio_addr_t iobase;
1069    u_char __iomem *ramBase;
1070    struct net_device *dev = (struct net_device *)dev_id;
1071    struct netwave_private *priv = netdev_priv(dev);
1072    struct pcmcia_device *link = priv->p_dev;
1073    int i;
1074    
1075    if (!netif_device_present(dev))
1076        return IRQ_NONE;
1077    
1078    iobase = dev->base_addr;
1079    ramBase = priv->ramBase;
1080        
1081    /* Now find what caused the interrupt, check while interrupts ready */
1082    for (i = 0; i < 10; i++) {
1083        u_char status;
1084                
1085        wait_WOC(iobase);       
1086        if (!(inb(iobase+NETWAVE_REG_CCSR) & 0x02))
1087            break; /* None of the interrupt sources asserted (normal exit) */
1088        
1089        status = inb(iobase + NETWAVE_REG_ASR);
1090                
1091        if (!pcmcia_dev_present(link)) {
1092            DEBUG(1, "netwave_interrupt: Interrupt with status 0x%x "
1093                  "from removed or suspended card!\n", status);
1094            break;
1095        }
1096                
1097        /* RxRdy */
1098        if (status & 0x80) {
1099            netwave_rx(dev);
1100            /* wait_WOC(iobase); */
1101            /* RxRdy cannot be reset directly by the host */
1102        }
1103        /* RxErr */
1104        if (status & 0x40) {
1105            u_char rser;
1106                        
1107            rser = readb(ramBase + NETWAVE_EREG_RSER);                  
1108            
1109            if (rser & 0x04) {
1110                ++priv->stats.rx_dropped; 
1111                ++priv->stats.rx_crc_errors;
1112            }
1113            if (rser & 0x02)
1114                ++priv->stats.rx_frame_errors;
1115                        
1116            /* Clear the RxErr bit in RSER. RSER+4 is the
1117             * write part. Also clear the RxCRC (0x04) and 
1118             * RxBig (0x02) bits if present */
1119            wait_WOC(iobase);
1120            writeb(0x40 | (rser & 0x06), ramBase + NETWAVE_EREG_RSER + 4);
1121
1122            /* Write bit 6 high to ASCC to clear RxErr in ASR,
1123             * WOC must be set first! 
1124             */
1125            wait_WOC(iobase);
1126            writeb(0x40, ramBase + NETWAVE_EREG_ASCC);
1127
1128            /* Remember to count up priv->stats on error packets */
1129            ++priv->stats.rx_errors;
1130        }
1131        /* TxDN */
1132        if (status & 0x20) {
1133            int txStatus;
1134
1135            txStatus = readb(ramBase + NETWAVE_EREG_TSER);
1136            DEBUG(3, "Transmit done. TSER = %x id %x\n", 
1137                  txStatus, readb(ramBase + NETWAVE_EREG_TSER + 1));
1138            
1139            if (txStatus & 0x20) {
1140                /* Transmitting was okay, clear bits */
1141                wait_WOC(iobase);
1142                writeb(0x2f, ramBase + NETWAVE_EREG_TSER + 4);
1143                ++priv->stats.tx_packets;
1144            }
1145                        
1146            if (txStatus & 0xd0) {
1147                if (txStatus & 0x80) {
1148                    ++priv->stats.collisions; /* Because of /proc/net/dev*/
1149                    /* ++priv->stats.tx_aborted_errors; */
1150                    /* printk("Collision. %ld\n", jiffies - dev->trans_start); */
1151                }
1152                if (txStatus & 0x40) 
1153                    ++priv->stats.tx_carrier_errors;
1154                /* 0x80 TxGU Transmit giveup - nine times and no luck
1155                 * 0x40 TxNOAP No access point. Discarded packet.
1156                 * 0x10 TxErr Transmit error. Always set when 
1157                 *      TxGU and TxNOAP is set. (Those are the only ones
1158                 *      to set TxErr).
1159                 */
1160                DEBUG(3, "netwave_interrupt: TxDN with error status %x\n", 
1161                      txStatus);
1162                
1163                /* Clear out TxGU, TxNOAP, TxErr and TxTrys */
1164                wait_WOC(iobase);
1165                writeb(0xdf & txStatus, ramBase+NETWAVE_EREG_TSER+4);
1166                ++priv->stats.tx_errors;
1167            }
1168            DEBUG(3, "New status is TSER %x ASR %x\n",
1169                  readb(ramBase + NETWAVE_EREG_TSER),
1170                  inb(iobase + NETWAVE_REG_ASR));
1171
1172            netif_wake_queue(dev);
1173        }
1174        /* TxBA, this would trigger on all error packets received */
1175        /* if (status & 0x01) {
1176           DEBUG(4, "Transmit buffers available, %x\n", status);
1177           }
1178           */
1179    }
1180    /* Handled if we looped at least one time - Jean II */
1181    return IRQ_RETVAL(i);
1182} /* netwave_interrupt */
1183
1184/*
1185 * Function netwave_watchdog (a)
1186 *
1187 *    Watchdog : when we start a transmission, we set a timer in the
1188 *    kernel.  If the transmission complete, this timer is disabled. If
1189 *    it expire, we reset the card.
1190 *
1191 */
1192static void netwave_watchdog(struct net_device *dev) {
1193
1194    DEBUG(1, "%s: netwave_watchdog: watchdog timer expired\n", dev->name);
1195    netwave_reset(dev);
1196    dev->trans_start = jiffies;
1197    netif_wake_queue(dev);
1198} /* netwave_watchdog */
1199
1200static struct net_device_stats *netwave_get_stats(struct net_device *dev) {
1201    netwave_private *priv = netdev_priv(dev);
1202
1203    update_stats(dev);
1204
1205    DEBUG(2, "netwave: SPCQ %x SPU %x LIF %x ISPLQ %x MHS %x rxtx %x"
1206          " %x tx %x %x %x %x\n", 
1207          readb(priv->ramBase + NETWAVE_EREG_SPCQ),
1208          readb(priv->ramBase + NETWAVE_EREG_SPU),
1209          readb(priv->ramBase + NETWAVE_EREG_LIF),
1210          readb(priv->ramBase + NETWAVE_EREG_ISPLQ),
1211          readb(priv->ramBase + NETWAVE_EREG_MHS),
1212          readb(priv->ramBase + NETWAVE_EREG_EC + 0xe),
1213          readb(priv->ramBase + NETWAVE_EREG_EC + 0xf),
1214          readb(priv->ramBase + NETWAVE_EREG_EC + 0x18),
1215          readb(priv->ramBase + NETWAVE_EREG_EC + 0x19),
1216          readb(priv->ramBase + NETWAVE_EREG_EC + 0x1a),
1217          readb(priv->ramBase + NETWAVE_EREG_EC + 0x1b));
1218
1219    return &priv->stats;
1220}
1221
1222static void update_stats(struct net_device *dev) {
1223    //unsigned long flags;
1224/*     netwave_private *priv = netdev_priv(dev); */
1225
1226    //spin_lock_irqsave(&priv->spinlock, flags);
1227
1228/*    priv->stats.rx_packets = readb(priv->ramBase + 0x18e); 
1229    priv->stats.tx_packets = readb(priv->ramBase + 0x18f); */
1230
1231    //spin_unlock_irqrestore(&priv->spinlock, flags);
1232}
1233
1234static int netwave_rx(struct net_device *dev)
1235{
1236    netwave_private *priv = netdev_priv(dev);
1237    u_char __iomem *ramBase = priv->ramBase;
1238    kio_addr_t iobase = dev->base_addr;
1239    u_char rxStatus;
1240    struct sk_buff *skb = NULL;
1241    unsigned int curBuffer,
1242                rcvList;
1243    int rcvLen;
1244    int tmpcount = 0;
1245    int dataCount, dataOffset;
1246    int i;
1247    u_char *ptr;
1248        
1249    DEBUG(3, "xinw_rx: Receiving ... \n");
1250
1251    /* Receive max 10 packets for now. */
1252    for (i = 0; i < 10; i++) {
1253        /* Any packets? */
1254        wait_WOC(iobase);
1255        rxStatus = readb(ramBase + NETWAVE_EREG_RSER);          
1256        if ( !( rxStatus & 0x80)) /* No more packets */
1257            break;
1258                
1259        /* Check if multicast/broadcast or other */
1260        /* multicast = (rxStatus & 0x20);  */
1261                
1262        /* The receive list pointer and length of the packet */
1263        wait_WOC(iobase);
1264        rcvLen  = get_int16( ramBase + NETWAVE_EREG_RDP);
1265        rcvList = get_uint16( ramBase + NETWAVE_EREG_RDP + 2);
1266                
1267        if (rcvLen < 0) {
1268            printk(KERN_DEBUG "netwave_rx: Receive packet with len %d\n", 
1269                   rcvLen);
1270            return 0;
1271        }
1272                
1273        skb = dev_alloc_skb(rcvLen+5);
1274        if (skb == NULL) {
1275            DEBUG(1, "netwave_rx: Could not allocate an sk_buff of "
1276                  "length %d\n", rcvLen);
1277            ++priv->stats.rx_dropped; 
1278            /* Tell the adapter to skip the packet */
1279            wait_WOC(iobase);
1280            writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0);
1281            writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1);
1282            return 0;
1283        }
1284
1285        skb_reserve( skb, 2);  /* Align IP on 16 byte */
1286        skb_put( skb, rcvLen);
1287
1288        /* Copy packet fragments to the skb data area */
1289        ptr = (u_char*) skb->data;
1290        curBuffer = rcvList;
1291        tmpcount = 0; 
1292        while ( tmpcount < rcvLen) {
1293            /* Get length and offset of current buffer */
1294            dataCount  = get_uint16( ramBase+curBuffer+2);
1295            dataOffset = get_uint16( ramBase+curBuffer+4);
1296                
1297            copy_from_pc( ptr + tmpcount,
1298                          ramBase+curBuffer+dataOffset, dataCount);
1299
1300            tmpcount += dataCount;
1301                
1302            /* Point to next buffer */
1303            curBuffer = get_uint16(ramBase + curBuffer);
1304        }
1305        
1306        skb->protocol = eth_type_trans(skb,dev);
1307        /* Queue packet for network layer */
1308        netif_rx(skb);
1309
1310        dev->last_rx = jiffies;
1311        priv->stats.rx_packets++;
1312        priv->stats.rx_bytes += rcvLen;
1313
1314        /* Got the packet, tell the adapter to skip it */
1315        wait_WOC(iobase);
1316        writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0);
1317        writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1);
1318        DEBUG(3, "Packet reception ok\n");
1319    }
1320    return 0;
1321}
1322
1323static int netwave_open(struct net_device *dev) {
1324    netwave_private *priv = netdev_priv(dev);
1325    struct pcmcia_device *link = priv->p_dev;
1326
1327    DEBUG(1, "netwave_open: starting.\n");
1328    
1329    if (!pcmcia_dev_present(link))
1330        return -ENODEV;
1331
1332    link->open++;
1333
1334    netif_start_queue(dev);
1335    netwave_reset(dev);
1336        
1337    return 0;
1338}
1339
1340static int netwave_close(struct net_device *dev) {
1341    netwave_private *priv = netdev_priv(dev);
1342    struct pcmcia_device *link = priv->p_dev;
1343
1344    DEBUG(1, "netwave_close: finishing.\n");
1345
1346    link->open--;
1347    netif_stop_queue(dev);
1348
1349    return 0;
1350}
1351
1352static struct pcmcia_device_id netwave_ids[] = {
1353        PCMCIA_DEVICE_PROD_ID12("Xircom", "CreditCard Netwave", 0x2e3ee845, 0x54e28a28),
1354        PCMCIA_DEVICE_NULL,
1355};
1356MODULE_DEVICE_TABLE(pcmcia, netwave_ids);
1357
1358static struct pcmcia_driver netwave_driver = {
1359        .owner          = THIS_MODULE,
1360        .drv            = {
1361                .name   = "netwave_cs",
1362        },
1363        .probe          = netwave_probe,
1364        .remove         = netwave_detach,
1365        .id_table       = netwave_ids,
1366        .suspend        = netwave_suspend,
1367        .resume         = netwave_resume,
1368};
1369
1370static int __init init_netwave_cs(void)
1371{
1372        return pcmcia_register_driver(&netwave_driver);
1373}
1374
1375static void __exit exit_netwave_cs(void)
1376{
1377        pcmcia_unregister_driver(&netwave_driver);
1378}
1379
1380module_init(init_netwave_cs);
1381module_exit(exit_netwave_cs);
1382
1383/* Set or clear the multicast filter for this adaptor.
1384   num_addrs == -1      Promiscuous mode, receive all packets
1385   num_addrs == 0       Normal mode, clear multicast list
1386   num_addrs > 0        Multicast mode, receive normal and MC packets, and do
1387   best-effort filtering.
1388 */
1389static void set_multicast_list(struct net_device *dev)
1390{
1391    kio_addr_t iobase = dev->base_addr;
1392    netwave_private *priv = netdev_priv(dev);
1393    u_char __iomem * ramBase = priv->ramBase;
1394    u_char  rcvMode = 0;
1395   
1396#ifdef PCMCIA_DEBUG
1397    if (pc_debug > 2) {
1398        static int old;
1399        if (old != dev->mc_count) {
1400            old = dev->mc_count;
1401            DEBUG(0, "%s: setting Rx mode to %d addresses.\n",
1402                  dev->name, dev->mc_count);
1403        }
1404    }
1405#endif
1406        
1407    if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) {
1408        /* Multicast Mode */
1409        rcvMode = rxConfRxEna + rxConfAMP + rxConfBcast;
1410    } else if (dev->flags & IFF_PROMISC) {
1411        /* Promiscous mode */
1412        rcvMode = rxConfRxEna + rxConfPro + rxConfAMP + rxConfBcast;
1413    } else {
1414        /* Normal mode */
1415        rcvMode = rxConfRxEna + rxConfBcast;
1416    }
1417        
1418    /* printk("netwave set_multicast_list: rcvMode to %x\n", rcvMode);*/
1419    /* Now set receive mode */
1420    wait_WOC(iobase);
1421    writeb(NETWAVE_CMD_SRC, ramBase + NETWAVE_EREG_CB + 0);
1422    writeb(rcvMode, ramBase + NETWAVE_EREG_CB + 1);
1423    writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2);
1424}
1425MODULE_LICENSE("GPL");
1426