ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / net / wireless / wavelan_cs.p.h
1 /*
2  *      Wavelan Pcmcia driver
3  *
4  *              Jean II - HPLB '96
5  *
6  * Reorganisation and extension of the driver.
7  *
8  * This file contain all definition and declarations necessary for the
9  * wavelan pcmcia driver. This file is a private header, so it should
10  * be included only on wavelan_cs.c !!!
11  */
12
13 #ifndef WAVELAN_CS_P_H
14 #define WAVELAN_CS_P_H
15
16 /************************** DOCUMENTATION **************************/
17 /*
18  * This driver provide a Linux interface to the Wavelan Pcmcia hardware
19  * The Wavelan is a product of Lucent (http://www.wavelan.com/).
20  * This division was formerly part of NCR and then AT&T.
21  * Wavelan are also distributed by DEC (RoamAbout DS)...
22  *
23  * To know how to use this driver, read the PCMCIA HOWTO.
24  * If you want to exploit the many other fonctionalities, look comments
25  * in the code...
26  *
27  * This driver is the result of the effort of many peoples (see below).
28  */
29
30 /* ------------------------ SPECIFIC NOTES ------------------------ */
31 /*
32  * Web page
33  * --------
34  *      I try to maintain a web page with the Wireless LAN Howto at :
35  *          http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
36  *
37  * SMP
38  * ---
39  *      We now are SMP compliant (I eventually fixed the remaining bugs).
40  *      The driver has been tested on a dual P6-150 and survived my usual
41  *      set of torture tests.
42  *      Anyway, I spent enough time chasing interrupt re-entrancy during
43  *      errors or reconfigure, and I designed the locked/unlocked sections
44  *      of the driver with great care, and with the recent addition of
45  *      the spinlock (thanks to the new API), we should be quite close to
46  *      the truth.
47  *      The SMP/IRQ locking is quite coarse and conservative (i.e. not fast),
48  *      but better safe than sorry (especially at 2 Mb/s ;-).
49  *
50  *      I have also looked into disabling only our interrupt on the card
51  *      (via HACR) instead of all interrupts in the processor (via cli),
52  *      so that other driver are not impacted, and it look like it's
53  *      possible, but it's very tricky to do right (full of races). As
54  *      the gain would be mostly for SMP systems, it can wait...
55  *
56  * Debugging and options
57  * ---------------------
58  *      You will find below a set of '#define" allowing a very fine control
59  *      on the driver behaviour and the debug messages printed.
60  *      The main options are :
61  *      o WAVELAN_ROAMING, for the experimental roaming support.
62  *      o SET_PSA_CRC, to have your card correctly recognised by
63  *        an access point and the Point-to-Point diagnostic tool.
64  *      o USE_PSA_CONFIG, to read configuration from the PSA (EEprom)
65  *        (otherwise we always start afresh with some defaults)
66  *
67  * wavelan_cs.o is darn too big
68  * -------------------------
69  *      That's true ! There is a very simple way to reduce the driver
70  *      object by 33% (yes !). Comment out the following line :
71  *              #include <linux/wireless.h>
72  *      Other compile options can also reduce the size of it...
73  *
74  * MAC address and hardware detection :
75  * ----------------------------------
76  *      The detection code of the wavelan chech that the first 3
77  *      octets of the MAC address fit the company code. This type of
78  *      detection work well for AT&T cards (because the AT&T code is
79  *      hardcoded in wavelan_cs.h), but of course will fail for other
80  *      manufacturer.
81  *
82  *      If you are sure that your card is derived from the wavelan,
83  *      here is the way to configure it :
84  *      1) Get your MAC address
85  *              a) With your card utilities (wfreqsel, instconf, ...)
86  *              b) With the driver :
87  *                      o compile the kernel with DEBUG_CONFIG_INFO enabled
88  *                      o Boot and look the card messages
89  *      2) Set your MAC code (3 octets) in MAC_ADDRESSES[][3] (wavelan_cs.h)
90  *      3) Compile & verify
91  *      4) Send me the MAC code - I will include it in the next version...
92  *
93  */
94
95 /* --------------------- WIRELESS EXTENSIONS --------------------- */
96 /*
97  * This driver is the first one to support "wireless extensions".
98  * This set of extensions provide you some way to control the wireless
99  * caracteristics of the hardware in a standard way and support for
100  * applications for taking advantage of it (like Mobile IP).
101  *
102  * You will need to enable the CONFIG_NET_RADIO define in the kernel
103  * configuration to enable the wireless extensions (this is the one
104  * giving access to the radio network device choice).
105  *
106  * It might also be a good idea as well to fetch the wireless tools to
107  * configure the device and play a bit.
108  */
109
110 /* ---------------------------- FILES ---------------------------- */
111 /*
112  * wavelan_cs.c :       The actual code for the driver - C functions
113  *
114  * wavelan_cs.p.h :     Private header : local types / vars for the driver
115  *
116  * wavelan_cs.h :       Description of the hardware interface & structs
117  *
118  * i82593.h :           Description if the Ethernet controller
119  */
120
121 /* --------------------------- HISTORY --------------------------- */
122 /*
123  * The history of the Wavelan drivers is as complicated as history of
124  * the Wavelan itself (NCR -> AT&T -> Lucent).
125  *
126  * All started with Anders Klemets <klemets@paul.rutgers.edu>,
127  * writting a Wavelan ISA driver for the MACH microkernel. Girish
128  * Welling <welling@paul.rutgers.edu> had also worked on it.
129  * Keith Moore modify this for the Pcmcia hardware.
130  * 
131  * Robert Morris <rtm@das.harvard.edu> port these two drivers to BSDI
132  * and add specific Pcmcia support (there is currently no equivalent
133  * of the PCMCIA package under BSD...).
134  *
135  * Jim Binkley <jrb@cs.pdx.edu> port both BSDI drivers to FreeBSD.
136  *
137  * Bruce Janson <bruce@cs.usyd.edu.au> port the BSDI ISA driver to Linux.
138  *
139  * Anthony D. Joseph <adj@lcs.mit.edu> started modify Bruce driver
140  * (with help of the BSDI PCMCIA driver) for PCMCIA.
141  * Yunzhou Li <yunzhou@strat.iol.unh.edu> finished is work.
142  * Joe Finney <joe@comp.lancs.ac.uk> patched the driver to start
143  * correctly 2.00 cards (2.4 GHz with frequency selection).
144  * David Hinds <dahinds@users.sourceforge.net> integrated the whole in his
145  * Pcmcia package (+ bug corrections).
146  *
147  * I (Jean Tourrilhes - jt@hplb.hpl.hp.com) then started to make some
148  * patchs to the Pcmcia driver. After, I added code in the ISA driver
149  * for Wireless Extensions and full support of frequency selection
150  * cards. Now, I'm doing the same to the Pcmcia driver + some
151  * reorganisation.
152  * Loeke Brederveld <lbrederv@wavelan.com> from Lucent has given me
153  * much needed informations on the Wavelan hardware.
154  */
155
156 /* By the way : for the copyright & legal stuff :
157  * Almost everybody wrote code under GNU or BSD license (or alike),
158  * and want that their original copyright remain somewhere in the
159  * code (for myself, I go with the GPL).
160  * Nobody want to take responsibility for anything, except the fame...
161  */
162
163 /* --------------------------- CREDITS --------------------------- */
164 /*
165  * Credits:
166  *    Special thanks to Jan Hoogendoorn of AT&T GIS Utrecht and
167  *      Loeke Brederveld of Lucent for providing extremely useful
168  *      information about WaveLAN PCMCIA hardware
169  *
170  *    This driver is based upon several other drivers, in particular:
171  *      David Hinds' Linux driver for the PCMCIA 3c589 ethernet adapter
172  *      Bruce Janson's Linux driver for the AT-bus WaveLAN adapter
173  *      Anders Klemets' PCMCIA WaveLAN adapter driver
174  *      Robert Morris' BSDI driver for the PCMCIA WaveLAN adapter
175  *
176  * Additional Credits:
177  *
178  *    This software was originally developed under Linux 1.2.3
179  *      (Slackware 2.0 distribution).
180  *    And then under Linux 2.0.x (Debian 1.1 -> 2.2 - pcmcia 2.8.18+)
181  *      with an HP OmniBook 4000 and then a 5500.
182  *
183  *    It is based on other device drivers and information either written
184  *    or supplied by:
185  *      James Ashton (jaa101@syseng.anu.edu.au),
186  *      Ajay Bakre (bakre@paul.rutgers.edu),
187  *      Donald Becker (becker@super.org),
188  *      Jim Binkley <jrb@cs.pdx.edu>,
189  *      Loeke Brederveld <lbrederv@wavelan.com>,
190  *      Allan Creighton (allanc@cs.su.oz.au),
191  *      Brent Elphick <belphick@uwaterloo.ca>,
192  *      Joe Finney <joe@comp.lancs.ac.uk>,
193  *      Matthew Geier (matthew@cs.su.oz.au),
194  *      Remo di Giovanni (remo@cs.su.oz.au),
195  *      Mark Hagan (mhagan@wtcpost.daytonoh.NCR.COM),
196  *      David Hinds <dahinds@users.sourceforge.net>,
197  *      Jan Hoogendoorn (c/o marteijn@lucent.com),
198  *      Bruce Janson <bruce@cs.usyd.edu.au>,
199  *      Anthony D. Joseph <adj@lcs.mit.edu>,
200  *      Anders Klemets (klemets@paul.rutgers.edu),
201  *      Yunzhou Li <yunzhou@strat.iol.unh.edu>,
202  *      Marc Meertens (mmeertens@lucent.com),
203  *      Keith Moore,
204  *      Robert Morris (rtm@das.harvard.edu),
205  *      Ian Parkin (ian@cs.su.oz.au),
206  *      John Rosenberg (johnr@cs.su.oz.au),
207  *      George Rossi (george@phm.gov.au),
208  *      Arthur Scott (arthur@cs.su.oz.au),
209  *      Stanislav Sinyagin <stas@isf.ru>
210  *      Peter Storey,
211  *      Jean Tourrilhes <jt@hpl.hp.com>,
212  *      Girish Welling (welling@paul.rutgers.edu)
213  *      Clark Woodworth <clark@hiway1.exit109.com>
214  *      Yongguang Zhang <ygz@isl.hrl.hac.com>...
215  */
216
217 /* ------------------------- IMPROVEMENTS ------------------------- */
218 /*
219  * I proudly present :
220  *
221  * Changes made in 2.8.22 :
222  * ----------------------
223  *      - improved wv_set_multicast_list
224  *      - catch spurious interrupt
225  *      - correct release of the device
226  *
227  * Changes mades in release :
228  * ------------------------
229  *      - Reorganisation of the code, function name change
230  *      - Creation of private header (wavelan_cs.h)
231  *      - Reorganised debug messages
232  *      - More comments, history, ...
233  *      - Configure earlier (in "insert" instead of "open")
234  *        and do things only once
235  *      - mmc_init : configure the PSA if not done
236  *      - mmc_init : 2.00 detection better code for 2.00 init
237  *      - better info at startup
238  *      - Correct a HUGE bug (volatile & uncalibrated busy loop)
239  *        in wv_82593_cmd => config speedup
240  *      - Stop receiving & power down on close (and power up on open)
241  *        use "ifconfig down" & "ifconfig up ; route add -net ..."
242  *      - Send packets : add watchdog instead of pooling
243  *      - Receive : check frame wrap around & try to recover some frames
244  *      - wavelan_set_multicast_list : avoid reset
245  *      - add wireless extensions (ioctl & get_wireless_stats)
246  *        get/set nwid/frequency on fly, info for /proc/net/wireless
247  *      - Suppress useless stuff from lp (net_local), but add link
248  *      - More inlines
249  *      - Lot of others minor details & cleanups
250  *
251  * Changes made in second release :
252  * ------------------------------
253  *      - Optimise wv_85893_reconfig stuff, fix potential problems
254  *      - Change error values for ioctl
255  *      - Non blocking wv_ru_stop() + call wv_reset() in case of problems
256  *      - Remove development printk from wavelan_watchdog()
257  *      - Remove of the watchdog to wavelan_close instead of wavelan_release
258  *        fix potential problems...
259  *      - Start debugging suspend stuff (but it's still a bit weird)
260  *      - Debug & optimize dump header/packet in Rx & Tx (debug)
261  *      - Use "readb" and "writeb" to be kernel 2.1 compliant
262  *      - Better handling of bogus interrupts
263  *      - Wireless extension : SETSPY and GETSPY
264  *      - Remove old stuff (stats - for those needing it, just ask me...)
265  *      - Make wireless extensions optional
266  *
267  * Changes made in third release :
268  * -----------------------------
269  *      - cleanups & typos
270  *      - modif wireless ext (spy -> only one pointer)
271  *      - new private ioctl to set/get quality & level threshold
272  *      - Init : correct default value of level threshold for pcmcia
273  *      - kill watchdog in hw_reset
274  *      - more 2.1 support (copy_to/from_user instead of memcpy_to/fromfs)
275  *      - Add message level (debug stuff in /var/adm/debug & errors not
276  *        displayed at console and still in /var/adm/messages)
277  *
278  * Changes made in fourth release :
279  * ------------------------------
280  *      - multicast support (yes !) thanks to Yongguang Zhang.
281  *
282  * Changes made in fifth release (2.9.0) :
283  * -------------------------------------
284  *      - Revisited multicast code (it was mostly wrong).
285  *      - protect code in wv_82593_reconfig with dev->tbusy (oups !)
286  *
287  * Changes made in sixth release (2.9.1a) :
288  * --------------------------------------
289  *      - Change the detection code for multi manufacturer code support
290  *      - Correct bug (hang kernel) in init when we were "rejecting" a card 
291  *
292  * Changes made in seventh release (2.9.1b) :
293  * ----------------------------------------
294  *      - Update to wireless extensions changes
295  *      - Silly bug in card initial configuration (psa_conf_status)
296  *
297  * Changes made in eigth release :
298  * -----------------------------
299  *      - Small bug in debug code (probably not the last one...)
300  *      - 1.2.13 support (thanks to Clark Woodworth)
301  *
302  * Changes made for release in 2.9.2b :
303  * ----------------------------------
304  *      - Level threshold is now a standard wireless extension (version 4 !)
305  *      - modules parameters types for kernel > 2.1.17
306  *      - updated man page
307  *      - Others cleanup from David Hinds
308  *
309  * Changes made for release in 2.9.5 :
310  * ---------------------------------
311  *      - byte count stats (courtesy of David Hinds)
312  *      - Remove dev_tint stuff (courtesy of David Hinds)
313  *      - Others cleanup from David Hinds
314  *      - Encryption setting from Brent Elphick (thanks a lot !)
315  *      - 'base' to 'u_long' for the Alpha (thanks to Stanislav Sinyagin)
316  *
317  * Changes made for release in 2.9.6 :
318  * ---------------------------------
319  *      - fix bug : no longuer disable watchdog in case of bogus interrupt
320  *      - increase timeout in config code for picky hardware
321  *      - mask unused bits in status (Wireless Extensions)
322  *
323  * Changes integrated by Justin Seger <jseger@MIT.EDU> & David Hinds :
324  * -----------------------------------------------------------------
325  *      - Roaming "hack" from Joe Finney <joe@comp.lancs.ac.uk>
326  *      - PSA CRC code from Bob Gray <rgray@bald.cs.dartmouth.edu>
327  *      - Better initialisation of the i82593 controller
328  *        from Joseph K. O'Sullivan <josullvn+@cs.cmu.edu>
329  *
330  * Changes made for release in 3.0.10 :
331  * ----------------------------------
332  *      - Fix eject "hang" of the driver under 2.2.X :
333  *              o create wv_flush_stale_links()
334  *              o Rename wavelan_release to wv_pcmcia_release & move up
335  *              o move unregister_netdev to wavelan_detach()
336  *              o wavelan_release() no longer call wavelan_detach()
337  *              o Suppress "release" timer
338  *              o Other cleanups & fixes
339  *      - New MAC address in the probe
340  *      - Reorg PSA_CRC code (endian neutral & cleaner)
341  *      - Correct initialisation of the i82593 from Lucent manual
342  *      - Put back the watchdog, with larger timeout
343  *      - TRANSMIT_NO_CRC is a "normal" error, so recover from it
344  *        from Derrick J Brashear <shadow@dementia.org>
345  *      - Better handling of TX and RX normal failure conditions
346  *      - #ifdef out all the roaming code
347  *      - Add ESSID & "AP current address" ioctl stubs
348  *      - General cleanup of the code
349  *
350  * Changes made for release in 3.0.13 :
351  * ----------------------------------
352  *      - Re-enable compilation of roaming code by default, but with
353  *        do_roaming = 0
354  *      - Nuke `nwid=nwid^ntohs(beacon->domain_id)' in wl_roam_gather
355  *        at the demand of John Carol Langford <jcl@gs176.sp.cs.cmu.edu>
356  *      - Introduced WAVELAN_ROAMING_EXT for incomplete ESSID stuff.
357  *
358  * Changes made for release in 3.0.15 :
359  * ----------------------------------
360  *      - Change e-mail and web page addresses
361  *      - Watchdog timer is now correctly expressed in HZ, not in jiffies
362  *      - Add channel number to the list of frequencies in range
363  *      - Add the (short) list of bit-rates in range
364  *      - Developp a new sensitivity... (sens.value & sens.fixed)
365  *
366  * Changes made for release in 3.1.2 :
367  * ---------------------------------
368  *      - Fix check for root permission (break instead of exit)
369  *      - New nwid & encoding setting (Wireless Extension 9)
370  *
371  * Changes made for release in 3.1.12 :
372  * ----------------------------------
373  *      - reworked wv_82593_cmd to avoid using the IRQ handler and doing
374  *        ugly things with interrupts.
375  *      - Add IRQ protection in 82593_config/ru_start/ru_stop/watchdog
376  *      - Update to new network API (softnet - 2.3.43) :
377  *              o replace dev->tbusy (David + me)
378  *              o replace dev->tstart (David + me)
379  *              o remove dev->interrupt (David)
380  *              o add SMP locking via spinlock in splxx (me)
381  *              o add spinlock in interrupt handler (me)
382  *              o use kernel watchdog instead of ours (me)
383  *              o verify that all the changes make sense and work (me)
384  *      - Re-sync kernel/pcmcia versions (not much actually)
385  *      - A few other cleanups (David & me)...
386  *
387  * Changes made for release in 3.1.22 :
388  * ----------------------------------
389  *      - Check that SMP works, remove annoying log message
390  *
391  * Changes made for release in 3.1.24 :
392  * ----------------------------------
393  *      - Fix unfrequent card lockup when watchdog was reseting the hardware :
394  *              o control first busy loop in wv_82593_cmd()
395  *              o Extend spinlock protection in wv_hw_config()
396  *
397  * Changes made for release in 3.1.33 :
398  * ----------------------------------
399  *      - Optional use new driver API for Wireless Extensions :
400  *              o got rid of wavelan_ioctl()
401  *              o use a bunch of iw_handler instead
402  *
403  * Changes made for release in 3.2.1 :
404  * ---------------------------------
405  *      - Set dev->trans_start to avoid filling the logs
406  *              (and generating useless abort commands)
407  *      - Avoid deadlocks in mmc_out()/mmc_in()
408  *
409  * Wishes & dreams:
410  * ----------------
411  *      - Cleanup and integrate the roaming code
412  *        (std debug, set DomainID, decay avg and co...)
413  */
414
415 /***************************** INCLUDES *****************************/
416
417 /* Linux headers that we need */
418 #include <linux/config.h>
419 #include <linux/module.h>
420 #include <linux/kernel.h>
421 #include <linux/init.h>
422 #include <linux/sched.h>
423 #include <linux/ptrace.h>
424 #include <linux/slab.h>
425 #include <linux/string.h>
426 #include <linux/timer.h>
427 #include <linux/interrupt.h>
428 #include <linux/spinlock.h>
429 #include <linux/in.h>
430 #include <linux/delay.h>
431 #include <asm/uaccess.h>
432 #include <asm/io.h>
433 #include <asm/system.h>
434 #include <asm/bitops.h>
435
436 #include <linux/netdevice.h>
437 #include <linux/etherdevice.h>
438 #include <linux/skbuff.h>
439 #include <linux/if_arp.h>
440 #include <linux/ioport.h>
441 #include <linux/fcntl.h>
442 #include <linux/ethtool.h>
443
444 #ifdef CONFIG_NET_RADIO
445 #include <linux/wireless.h>             /* Wireless extensions */
446 #include <net/iw_handler.h>             /* New driver API */
447 #endif
448
449 /* Pcmcia headers that we need */
450 #include <pcmcia/cs_types.h>
451 #include <pcmcia/cs.h>
452 #include <pcmcia/cistpl.h>
453 #include <pcmcia/cisreg.h>
454 #include <pcmcia/ds.h>
455 #include <pcmcia/version.h>
456
457 /* Wavelan declarations */
458 #include "i82593.h"     /* Definitions for the Intel chip */
459
460 #include "wavelan_cs.h" /* Others bits of the hardware */
461
462 /************************** DRIVER OPTIONS **************************/
463 /*
464  * `#define' or `#undef' the following constant to change the behaviour
465  * of the driver...
466  */
467 #define WAVELAN_ROAMING         /* Include experimental roaming code */
468 #undef WAVELAN_ROAMING_EXT      /* Enable roaming wireless extensions */
469 #undef SET_PSA_CRC              /* Set the CRC in PSA (slower) */
470 #define USE_PSA_CONFIG          /* Use info from the PSA */
471 #undef STRUCT_CHECK             /* Verify padding of structures */
472 #undef EEPROM_IS_PROTECTED      /* Doesn't seem to be necessary */
473 #define MULTICAST_AVOID         /* Avoid extra multicast (I'm sceptical) */
474 #undef SET_MAC_ADDRESS          /* Experimental */
475
476 #ifdef WIRELESS_EXT     /* If wireless extension exist in the kernel */
477 /* Warning : these stuff will slow down the driver... */
478 #define WIRELESS_SPY            /* Enable spying addresses */
479 #undef HISTOGRAM                /* Enable histogram of sig level... */
480 #endif
481
482 /****************************** DEBUG ******************************/
483
484 #undef DEBUG_MODULE_TRACE       /* Module insertion/removal */
485 #undef DEBUG_CALLBACK_TRACE     /* Calls made by Linux */
486 #undef DEBUG_INTERRUPT_TRACE    /* Calls to handler */
487 #undef DEBUG_INTERRUPT_INFO     /* type of interrupt & so on */
488 #define DEBUG_INTERRUPT_ERROR   /* problems */
489 #undef DEBUG_CONFIG_TRACE       /* Trace the config functions */
490 #undef DEBUG_CONFIG_INFO        /* What's going on... */
491 #define DEBUG_CONFIG_ERRORS     /* Errors on configuration */
492 #undef DEBUG_TX_TRACE           /* Transmission calls */
493 #undef DEBUG_TX_INFO            /* Header of the transmitted packet */
494 #undef DEBUG_TX_FAIL            /* Normal failure conditions */
495 #define DEBUG_TX_ERROR          /* Unexpected conditions */
496 #undef DEBUG_RX_TRACE           /* Transmission calls */
497 #undef DEBUG_RX_INFO            /* Header of the transmitted packet */
498 #undef DEBUG_RX_FAIL            /* Normal failure conditions */
499 #define DEBUG_RX_ERROR          /* Unexpected conditions */
500 #undef DEBUG_PACKET_DUMP        /* Dump packet on the screen */
501 #undef DEBUG_IOCTL_TRACE        /* Misc call by Linux */
502 #undef DEBUG_IOCTL_INFO         /* Various debug info */
503 #define DEBUG_IOCTL_ERROR       /* What's going wrong */
504 #define DEBUG_BASIC_SHOW        /* Show basic startup info */
505 #undef DEBUG_VERSION_SHOW       /* Print version info */
506 #undef DEBUG_PSA_SHOW           /* Dump psa to screen */
507 #undef DEBUG_MMC_SHOW           /* Dump mmc to screen */
508 #undef DEBUG_SHOW_UNUSED        /* Show also unused fields */
509 #undef DEBUG_I82593_SHOW        /* Show i82593 status */
510 #undef DEBUG_DEVICE_SHOW        /* Show device parameters */
511
512 /************************ CONSTANTS & MACROS ************************/
513
514 #ifdef DEBUG_VERSION_SHOW
515 static const char *version = "wavelan_cs.c : v24 (SMP + wireless extensions) 11/1/02\n";
516 #endif
517
518 /* Watchdog temporisation */
519 #define WATCHDOG_JIFFIES        (256*HZ/100)
520
521 /* Fix a bug in some old wireless extension definitions */
522 #ifndef IW_ESSID_MAX_SIZE
523 #define IW_ESSID_MAX_SIZE       32
524 #endif
525
526 /* ------------------------ PRIVATE IOCTL ------------------------ */
527
528 #define SIOCSIPQTHR     SIOCIWFIRSTPRIV         /* Set quality threshold */
529 #define SIOCGIPQTHR     SIOCIWFIRSTPRIV + 1     /* Get quality threshold */
530 #define SIOCSIPROAM     SIOCIWFIRSTPRIV + 2     /* Set roaming state */
531 #define SIOCGIPROAM     SIOCIWFIRSTPRIV + 3     /* Get roaming state */
532
533 #define SIOCSIPHISTO    SIOCIWFIRSTPRIV + 4     /* Set histogram ranges */
534 #define SIOCGIPHISTO    SIOCIWFIRSTPRIV + 5     /* Get histogram values */
535
536 /*************************** WaveLAN Roaming  **************************/
537 #ifdef WAVELAN_ROAMING          /* Conditional compile, see above in options */
538
539 #define WAVELAN_ROAMING_DEBUG    0      /* 1 = Trace of handover decisions */
540                                         /* 2 = Info on each beacon rcvd... */
541 #define MAX_WAVEPOINTS          7       /* Max visible at one time */
542 #define WAVEPOINT_HISTORY       5       /* SNR sample history slow search */
543 #define WAVEPOINT_FAST_HISTORY  2       /* SNR sample history fast search */
544 #define SEARCH_THRESH_LOW       10      /* SNR to enter cell search */
545 #define SEARCH_THRESH_HIGH      13      /* SNR to leave cell search */
546 #define WAVELAN_ROAMING_DELTA   1       /* Hysteresis value (+/- SNR) */
547 #define CELL_TIMEOUT            2*HZ    /* in jiffies */
548
549 #define FAST_CELL_SEARCH        1       /* Boolean values... */
550 #define NWID_PROMISC            1       /* for code clarity. */
551
552 typedef struct wavepoint_beacon
553 {
554   unsigned char         dsap,           /* Unused */
555                         ssap,           /* Unused */
556                         ctrl,           /* Unused */
557                         O,U,I,          /* Unused */
558                         spec_id1,       /* Unused */
559                         spec_id2,       /* Unused */
560                         pdu_type,       /* Unused */
561                         seq;            /* WavePoint beacon sequence number */
562   unsigned short        domain_id,      /* WavePoint Domain ID */
563                         nwid;           /* WavePoint NWID */
564 } wavepoint_beacon;
565
566 typedef struct wavepoint_history
567 {
568   unsigned short        nwid;           /* WavePoint's NWID */
569   int                   average_slow;   /* SNR running average */
570   int                   average_fast;   /* SNR running average */
571   unsigned char   sigqual[WAVEPOINT_HISTORY]; /* Ringbuffer of recent SNR's */
572   unsigned char         qualptr;        /* Index into ringbuffer */
573   unsigned char         last_seq;       /* Last seq. no seen for WavePoint */
574   struct wavepoint_history *next;       /* Next WavePoint in table */
575   struct wavepoint_history *prev;       /* Previous WavePoint in table */
576   unsigned long         last_seen;      /* Time of last beacon recvd, jiffies */
577 } wavepoint_history;
578
579 struct wavepoint_table
580 {
581   wavepoint_history     *head;          /* Start of ringbuffer */
582   int                   num_wavepoints; /* No. of WavePoints visible */
583   unsigned char         locked;         /* Table lock */
584 };
585
586 #endif  /* WAVELAN_ROAMING */
587
588 /****************************** TYPES ******************************/
589
590 /* Shortcuts */
591 typedef struct net_device_stats en_stats;
592 typedef struct iw_statistics    iw_stats;
593 typedef struct iw_quality       iw_qual;
594 typedef struct iw_freq          iw_freq;
595 typedef struct net_local        net_local;
596 typedef struct timer_list       timer_list;
597
598 /* Basic types */
599 typedef u_char          mac_addr[WAVELAN_ADDR_SIZE];    /* Hardware address */
600
601 /*
602  * Static specific data for the interface.
603  *
604  * For each network interface, Linux keep data in two structure. "device"
605  * keep the generic data (same format for everybody) and "net_local" keep
606  * the additional specific data.
607  * Note that some of this specific data is in fact generic (en_stats, for
608  * example).
609  */
610 struct net_local
611 {
612   dev_node_t    node;           /* ???? What is this stuff ???? */
613   struct net_device *   dev;            /* Reverse link... */
614   spinlock_t    spinlock;       /* Serialize access to the hardware (SMP) */
615   dev_link_t *  link;           /* pcmcia structure */
616   en_stats      stats;          /* Ethernet interface statistics */
617   int           nresets;        /* Number of hw resets */
618   u_char        configured;     /* If it is configured */
619   u_char        reconfig_82593; /* Need to reconfigure the controller */
620   u_char        promiscuous;    /* Promiscuous mode */
621   u_char        allmulticast;   /* All Multicast mode */
622   int           mc_count;       /* Number of multicast addresses */
623
624   int           stop;           /* Current i82593 Stop Hit Register */
625   int           rfp;            /* Last DMA machine receive pointer */
626   int           overrunning;    /* Receiver overrun flag */
627
628 #ifdef WIRELESS_EXT
629   iw_stats      wstats;         /* Wireless specific stats */
630
631   struct iw_spy_data    spy_data;
632 #endif
633
634 #ifdef HISTOGRAM
635   int           his_number;             /* Number of intervals */
636   u_char        his_range[16];          /* Boundaries of interval ]n-1; n] */
637   u_long        his_sum[16];            /* Sum in interval */
638 #endif  /* HISTOGRAM */
639 #ifdef WAVELAN_ROAMING
640   u_long        domain_id;      /* Domain ID we lock on for roaming */
641   int           filter_domains; /* Check Domain ID of beacon found */
642  struct wavepoint_table wavepoint_table;        /* Table of visible WavePoints*/
643   wavepoint_history *   curr_point;             /* Current wavepoint */
644   int                   cell_search;            /* Searching for new cell? */
645   struct timer_list     cell_timer;             /* Garbage collection */
646 #endif  /* WAVELAN_ROAMING */
647 };
648
649 /**************************** PROTOTYPES ****************************/
650
651 #ifdef WAVELAN_ROAMING
652 /* ---------------------- ROAMING SUBROUTINES -----------------------*/
653
654 wavepoint_history *wl_roam_check(unsigned short nwid, net_local *lp);
655 wavepoint_history *wl_new_wavepoint(unsigned short nwid, unsigned char seq, net_local *lp);
656 void wl_del_wavepoint(wavepoint_history *wavepoint, net_local *lp);
657 void wl_cell_expiry(unsigned long data);
658 wavepoint_history *wl_best_sigqual(int fast_search, net_local *lp);
659 void wl_update_history(wavepoint_history *wavepoint, unsigned char sigqual, unsigned char seq);
660 void wv_roam_handover(wavepoint_history *wavepoint, net_local *lp);
661 void wv_nwid_filter(unsigned char mode, net_local *lp);
662 void wv_roam_init(struct net_device *dev);
663 void wv_roam_cleanup(struct net_device *dev);
664 #endif  /* WAVELAN_ROAMING */
665
666 /* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */
667 static inline u_char            /* data */
668         hasr_read(u_long);      /* Read the host interface : base address */
669 static inline void
670         hacr_write(u_long,      /* Write to host interface : base address */
671                    u_char),     /* data */
672         hacr_write_slow(u_long,
673                    u_char);
674 static void
675         psa_read(struct net_device *,   /* Read the Parameter Storage Area */
676                  int,           /* offset in PSA */
677                  u_char *,      /* buffer to fill */
678                  int),          /* size to read */
679         psa_write(struct net_device *,  /* Write to the PSA */
680                   int,          /* Offset in psa */
681                   u_char *,     /* Buffer in memory */
682                   int);         /* Length of buffer */
683 static inline void
684         mmc_out(u_long,         /* Write 1 byte to the Modem Manag Control */
685                 u_short,
686                 u_char),
687         mmc_write(u_long,       /* Write n bytes to the MMC */
688                   u_char,
689                   u_char *,
690                   int);
691 static inline u_char            /* Read 1 byte from the MMC */
692         mmc_in(u_long,
693                u_short);
694 static inline void
695         mmc_read(u_long,        /* Read n bytes from the MMC */
696                  u_char,
697                  u_char *,
698                  int),
699         fee_wait(u_long,        /* Wait for frequency EEprom : base address */
700                  int,           /* Base delay to wait for */
701                  int);          /* Number of time to wait */
702 static void
703         fee_read(u_long,        /* Read the frequency EEprom : base address */
704                  u_short,       /* destination offset */
705                  u_short *,     /* data buffer */
706                  int);          /* number of registers */
707 /* ---------------------- I82593 SUBROUTINES ----------------------- */
708 static int
709         wv_82593_cmd(struct net_device *,       /* synchronously send a command to i82593 */ 
710                      char *,
711                      int,
712                      int);
713 static inline int
714         wv_diag(struct net_device *);   /* Diagnostique the i82593 */
715 static int
716         read_ringbuf(struct net_device *,       /* Read a receive buffer */
717                      int,
718                      char *,
719                      int);
720 static inline void
721         wv_82593_reconfig(struct net_device *); /* Reconfigure the controller */
722 /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
723 static inline void
724         wv_init_info(struct net_device *);      /* display startup info */
725 /* ------------------- IOCTL, STATS & RECONFIG ------------------- */
726 static en_stats *
727         wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */
728 /* ----------------------- PACKET RECEPTION ----------------------- */
729 static inline int
730         wv_start_of_frame(struct net_device *,  /* Seek beggining of current frame */
731                           int,  /* end of frame */
732                           int); /* start of buffer */
733 static inline void
734         wv_packet_read(struct net_device *,     /* Read a packet from a frame */
735                        int,
736                        int),
737         wv_packet_rcv(struct net_device *);     /* Read all packets waiting */
738 /* --------------------- PACKET TRANSMISSION --------------------- */
739 static inline void
740         wv_packet_write(struct net_device *,    /* Write a packet to the Tx buffer */
741                         void *,
742                         short);
743 static int
744         wavelan_packet_xmit(struct sk_buff *,   /* Send a packet */
745                             struct net_device *);
746 /* -------------------- HARDWARE CONFIGURATION -------------------- */
747 static inline int
748         wv_mmc_init(struct net_device *);       /* Initialize the modem */
749 static int
750         wv_ru_stop(struct net_device *),        /* Stop the i82593 receiver unit */
751         wv_ru_start(struct net_device *);       /* Start the i82593 receiver unit */
752 static int
753         wv_82593_config(struct net_device *);   /* Configure the i82593 */
754 static inline int
755         wv_pcmcia_reset(struct net_device *);   /* Reset the pcmcia interface */
756 static int
757         wv_hw_config(struct net_device *);      /* Reset & configure the whole hardware */
758 static inline void
759         wv_hw_reset(struct net_device *);       /* Same, + start receiver unit */
760 static inline int
761         wv_pcmcia_config(dev_link_t *); /* Configure the pcmcia interface */
762 static void
763         wv_pcmcia_release(dev_link_t *);/* Remove a device */
764 /* ---------------------- INTERRUPT HANDLING ---------------------- */
765 static irqreturn_t
766         wavelan_interrupt(int,  /* Interrupt handler */
767                           void *,
768                           struct pt_regs *);
769 static void
770         wavelan_watchdog(struct net_device *);  /* Transmission watchdog */
771 /* ------------------- CONFIGURATION CALLBACKS ------------------- */
772 static int
773         wavelan_open(struct net_device *),              /* Open the device */
774         wavelan_close(struct net_device *);     /* Close the device */
775 static dev_link_t *
776         wavelan_attach(void);           /* Create a new device */
777 static void
778         wavelan_detach(dev_link_t *);   /* Destroy a removed device */
779 static int
780         wavelan_event(event_t,          /* Manage pcmcia events */
781                       int,
782                       event_callback_args_t *);
783
784 /**************************** VARIABLES ****************************/
785
786 static dev_info_t dev_info = "wavelan_cs";
787 static dev_link_t *dev_list = NULL;     /* Linked list of devices */
788
789 /*
790  * Parameters that can be set with 'insmod'
791  * The exact syntax is 'insmod wavelan_cs.o <var>=<value>'
792  */
793
794 /* Bit map of interrupts to choose from */
795 /* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4 and 3 */
796 static int      irq_mask = 0xdeb8;
797 static int      irq_list[4] = { -1 };
798
799 /* Shared memory speed, in ns */
800 static int      mem_speed = 0;
801
802 /* New module interface */
803 MODULE_PARM(irq_mask, "i");
804 MODULE_PARM(irq_list, "1-4i");
805 MODULE_PARM(mem_speed, "i");
806
807 #ifdef WAVELAN_ROAMING          /* Conditional compile, see above in options */
808 /* Enable roaming mode ? No ! Please keep this to 0 */
809 static int      do_roaming = 0;
810 MODULE_PARM(do_roaming, "i");
811 #endif  /* WAVELAN_ROAMING */
812
813 MODULE_LICENSE("GPL");
814
815 #endif  /* WAVELAN_CS_P_H */
816