OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [wireless/] [wavelan_cs.p.h] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.