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