6  * Reorganisation and extension of the driver.
 
   8  * This file contains all definitions and declarations necessary for the
 
   9  * WaveLAN ISA driver.  This file is a private header, so it should
 
  10  * be included only in wavelan.c!
 
  16 /************************** DOCUMENTATION ***************************/
 
  18  * This driver provides a Linux interface to the WaveLAN ISA 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  * WaveLANs are also distributed by DEC (RoamAbout DS) and Digital Ocean.
 
  23  * To learn how to use this driver, read the NET3 HOWTO.
 
  24  * If you want to exploit the many other functionalities, read the comments
 
  27  * This driver is the result of the effort of many people (see below).
 
  30 /* ------------------------ SPECIFIC NOTES ------------------------ */
 
  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
 
  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
 
  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 ;-).
 
  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...
 
  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 SET_PSA_CRC, to have your card correctly recognised by
 
  62  *        an access point and the Point-to-Point diagnostic tool.
 
  63  *      o USE_PSA_CONFIG, to read configuration from the PSA (EEprom)
 
  64  *        (otherwise we always start afresh with some defaults)
 
  66  * wavelan.o is too darned big
 
  67  * ---------------------------
 
  68  *      That's true!  There is a very simple way to reduce the driver
 
  69  *      object by 33%!  Comment out the following line:
 
  70  *              #include <linux/wireless.h>
 
  71  *      Other compile options can also reduce the size of it...
 
  73  * MAC address and hardware detection:
 
  74  * -----------------------------------
 
  75  *      The detection code for the WaveLAN checks that the first three
 
  76  *      octets of the MAC address fit the company code.  This type of
 
  77  *      detection works well for AT&T cards (because the AT&T code is
 
  78  *      hardcoded in wavelan.h), but of course will fail for other
 
  81  *      If you are sure that your card is derived from the WaveLAN,
 
  82  *      here is the way to configure it:
 
  83  *      1) Get your MAC address
 
  84  *              a) With your card utilities (wfreqsel, instconf, etc.)
 
  86  *                      o compile the kernel with DEBUG_CONFIG_INFO enabled
 
  87  *                      o Boot and look the card messages
 
  88  *      2) Set your MAC code (3 octets) in MAC_ADDRESSES[][3] (wavelan.h)
 
  89  *      3) Compile and verify
 
  90  *      4) Send me the MAC code.  I will include it in the next version.
 
  94 /* --------------------- WIRELESS EXTENSIONS --------------------- */
 
  96  * This driver is the first to support "wireless extensions".
 
  97  * This set of extensions provides a standard way to control the wireless
 
  98  * characteristics of the hardware.  Applications such as mobile IP may
 
  99  * take advantage of it.
 
 101  * It might be a good idea as well to fetch the wireless tools to
 
 102  * configure the device and play a bit.
 
 105 /* ---------------------------- FILES ---------------------------- */
 
 107  * wavelan.c:           actual code for the driver:  C functions
 
 109  * wavelan.p.h:         private header:  local types and variables for driver
 
 111  * wavelan.h:           description of the hardware interface and structs
 
 113  * i82586.h:            description of the Ethernet controller
 
 116 /* --------------------------- HISTORY --------------------------- */
 
 118  * This is based on information in the drivers' headers. It may not be
 
 119  * accurate, and I guarantee only my best effort.
 
 121  * The history of the WaveLAN drivers is as complicated as the history of
 
 122  * the WaveLAN itself (NCR -> AT&T -> Lucent).
 
 124  * It all started with Anders Klemets <klemets@paul.rutgers.edu>
 
 125  * writing a WaveLAN ISA driver for the Mach microkernel.  Girish
 
 126  * Welling <welling@paul.rutgers.edu> had also worked on it.
 
 127  * Keith Moore modified this for the PCMCIA hardware.
 
 129  * Robert Morris <rtm@das.harvard.edu> ported these two drivers to BSDI
 
 130  * and added specific PCMCIA support (there is currently no equivalent
 
 131  * of the PCMCIA package under BSD).
 
 133  * Jim Binkley <jrb@cs.pdx.edu> ported both BSDI drivers to FreeBSD.
 
 135  * Bruce Janson <bruce@cs.usyd.edu.au> ported the BSDI ISA driver to Linux.
 
 137  * Anthony D. Joseph <adj@lcs.mit.edu> started to modify Bruce's driver
 
 138  * (with help of the BSDI PCMCIA driver) for PCMCIA.
 
 139  * Yunzhou Li <yunzhou@strat.iol.unh.edu> finished this work.
 
 140  * Joe Finney <joe@comp.lancs.ac.uk> patched the driver to start
 
 141  * 2.00 cards correctly (2.4 GHz with frequency selection).
 
 142  * David Hinds <dahinds@users.sourceforge.net> integrated the whole in his
 
 143  * PCMCIA package (and bug corrections).
 
 145  * I (Jean Tourrilhes - jt@hplb.hpl.hp.com) then started to make some
 
 146  * patches to the PCMCIA driver.  Later, I added code in the ISA driver
 
 147  * for Wireless Extensions and full support of frequency selection
 
 148  * cards.  Then, I did the same to the PCMCIA driver, and did some
 
 149  * reorganisation.  Finally, I came back to the ISA driver to
 
 150  * upgrade it at the same level as the PCMCIA one and reorganise
 
 152  * Loeke Brederveld <lbrederv@wavelan.com> from Lucent has given me
 
 153  * much needed information on the WaveLAN hardware.
 
 156 /* The original copyrights and literature mention others' names and
 
 157  * credits.  I don't know what their part in this development was.
 
 160 /* By the way, for the copyright and legal stuff:
 
 161  * almost everybody wrote code under the GNU or BSD license (or similar),
 
 162  * and want their original copyright to remain somewhere in the
 
 163  * code (for myself, I go with the GPL).
 
 164  * Nobody wants to take responsibility for anything, except the fame.
 
 167 /* --------------------------- CREDITS --------------------------- */
 
 169  * This software was developed as a component of the
 
 170  * Linux operating system.
 
 171  * It is based on other device drivers and information
 
 172  * either written or supplied by:
 
 173  *      Ajay Bakre <bakre@paul.rutgers.edu>,
 
 174  *      Donald Becker <becker@cesdis.gsfc.nasa.gov>,
 
 175  *      Loeke Brederveld <Loeke.Brederveld@Utrecht.NCR.com>,
 
 176  *      Brent Elphick <belphick@uwaterloo.ca>,
 
 177  *      Anders Klemets <klemets@it.kth.se>,
 
 178  *      Vladimir V. Kolpakov <w@stier.koenig.ru>,
 
 179  *      Marc Meertens <Marc.Meertens@Utrecht.NCR.com>,
 
 180  *      Pauline Middelink <middelin@polyware.iaf.nl>,
 
 181  *      Robert Morris <rtm@das.harvard.edu>,
 
 182  *      Jean Tourrilhes <jt@hpl.hp.com>,
 
 183  *      Girish Welling <welling@paul.rutgers.edu>,
 
 184  *      Clark Woodworth <clark@hiway1.exit109.com>
 
 185  *      Yongguang Zhang <ygz@isl.hrl.hac.com>
 
 188  *      James Ashton <jaa101@syseng.anu.edu.au>,
 
 189  *      Alan Cox <alan@redhat.com>,
 
 190  *      Allan Creighton <allanc@cs.usyd.edu.au>,
 
 191  *      Matthew Geier <matthew@cs.usyd.edu.au>,
 
 192  *      Remo di Giovanni <remo@cs.usyd.edu.au>,
 
 193  *      Eckhard Grah <grah@wrcs1.urz.uni-wuppertal.de>,
 
 194  *      Vipul Gupta <vgupta@cs.binghamton.edu>,
 
 195  *      Mark Hagan <mhagan@wtcpost.daytonoh.NCR.COM>,
 
 196  *      Tim Nicholson <tim@cs.usyd.edu.au>,
 
 197  *      Ian Parkin <ian@cs.usyd.edu.au>,
 
 198  *      John Rosenberg <johnr@cs.usyd.edu.au>,
 
 199  *      George Rossi <george@phm.gov.au>,
 
 200  *      Arthur Scott <arthur@cs.usyd.edu.au>,
 
 201  *      Stanislav Sinyagin <stas@isf.ru>
 
 202  *      and Peter Storey for their assistance and advice.
 
 204  * Additional Credits:
 
 206  *      My development has been done initially under Debian 1.1 (Linux 2.0.x)
 
 207  *      and now under Debian 2.2, initially with an HP Vectra XP/60, and now
 
 208  *      an HP Vectra XP/90.
 
 212 /* ------------------------- IMPROVEMENTS ------------------------- */
 
 216  * Changes made in first pre-release:
 
 217  * ----------------------------------
 
 218  *      - reorganisation of the code, function name change
 
 219  *      - creation of private header (wavelan.p.h)
 
 220  *      - reorganised debug messages
 
 221  *      - more comments, history, etc.
 
 222  *      - mmc_init:  configure the PSA if not done
 
 223  *      - mmc_init:  correct default value of level threshold for PCMCIA
 
 224  *      - mmc_init:  2.00 detection better code for 2.00 initialization
 
 225  *      - better info at startup
 
 226  *      - IRQ setting (note:  this setting is permanent)
 
 227  *      - watchdog:  change strategy (and solve module removal problems)
 
 228  *      - add wireless extensions (ioctl and get_wireless_stats)
 
 229  *        get/set nwid/frequency on fly, info for /proc/net/wireless
 
 230  *      - more wireless extensions:  SETSPY and GETSPY
 
 231  *      - make wireless extensions optional
 
 232  *      - private ioctl to set/get quality and level threshold, histogram
 
 233  *      - remove /proc/net/wavelan
 
 234  *      - suppress useless stuff from lp (net_local)
 
 235  *      - kernel 2.1 support (copy_to/from_user instead of memcpy_to/fromfs)
 
 236  *      - add message level (debug stuff in /var/adm/debug and errors not
 
 237  *        displayed at console and still in /var/adm/messages)
 
 238  *      - multi device support
 
 239  *      - start fixing the probe (init code)
 
 242  *      - many other minor details and cleanups
 
 244  * Changes made in second pre-release:
 
 245  * -----------------------------------
 
 246  *      - clean up init code (probe and module init)
 
 247  *      - better multiple device support (module)
 
 248  *      - name assignment (module)
 
 250  * Changes made in third pre-release:
 
 251  * ----------------------------------
 
 252  *      - be more conservative on timers
 
 253  *      - preliminary support for multicast (I still lack some details)
 
 255  * Changes made in fourth pre-release:
 
 256  * -----------------------------------
 
 257  *      - multicast (revisited and finished)
 
 258  *      - avoid reset in set_multicast_list (a really big hack)
 
 259  *        if somebody could apply this code for other i82586 based drivers
 
 260  *      - share onboard memory 75% RU and 25% CU (instead of 50/50)
 
 262  * Changes made for release in 2.1.15:
 
 263  * -----------------------------------
 
 264  *      - change the detection code for multi manufacturer code support
 
 266  * Changes made for release in 2.1.17:
 
 267  * -----------------------------------
 
 268  *      - update to wireless extensions changes
 
 269  *      - silly bug in card initial configuration (psa_conf_status)
 
 271  * Changes made for release in 2.1.27 & 2.0.30:
 
 272  * --------------------------------------------
 
 273  *      - small bug in debug code (probably not the last one...)
 
 274  *      - remove extern keyword for wavelan_probe()
 
 275  *      - level threshold is now a standard wireless extension (version 4 !)
 
 276  *      - modules parameters types (new module interface)
 
 278  * Changes made for release in 2.1.36:
 
 279  * -----------------------------------
 
 280  *      - byte count stats (courtesy of David Hinds)
 
 281  *      - remove dev_tint stuff (courtesy of David Hinds)
 
 282  *      - encryption setting from Brent Elphick (thanks a lot!)
 
 283  *      - 'ioaddr' to 'u_long' for the Alpha (thanks to Stanislav Sinyagin)
 
 285  * Other changes (not by me) :
 
 286  * -------------------------
 
 287  *      - Spelling and gramar "rectification".
 
 289  * Changes made for release in 2.0.37 & 2.2.2 :
 
 290  * ------------------------------------------
 
 291  *      - Correct status in /proc/net/wireless
 
 292  *      - Set PSA CRC to make PtP diagnostic tool happy (Bob Gray)
 
 293  *      - Module init code don't fail if we found at least one card in
 
 294  *        the address list (Karlis Peisenieks)
 
 295  *      - Missing parenthesis (Christopher Peterson)
 
 296  *      - Correct i82586 configuration parameters
 
 297  *      - Encryption initialisation bug (Robert McCormack)
 
 298  *      - New mac addresses detected in the probe
 
 299  *      - Increase watchdog for busy environments
 
 301  * Changes made for release in 2.0.38 & 2.2.7 :
 
 302  * ------------------------------------------
 
 303  *      - Correct the reception logic to better report errors and avoid
 
 304  *        sending bogus packet up the stack
 
 305  *      - Delay RU config to avoid corrupting first received packet
 
 306  *      - Change config completion code (to actually check something)
 
 307  *      - Avoid reading out of bound in skbuf to transmit
 
 308  *      - Rectify a lot of (useless) debugging code
 
 309  *      - Change the way to `#ifdef SET_PSA_CRC'
 
 311  * Changes made for release in 2.2.11 & 2.3.13 :
 
 312  * -------------------------------------------
 
 313  *      - Change e-mail and web page addresses
 
 314  *      - Watchdog timer is now correctly expressed in HZ, not in jiffies
 
 315  *      - Add channel number to the list of frequencies in range
 
 316  *      - Add the (short) list of bit-rates in range
 
 317  *      - Developp a new sensitivity... (sens.value & sens.fixed)
 
 319  * Changes made for release in 2.2.14 & 2.3.23 :
 
 320  * -------------------------------------------
 
 321  *      - Fix check for root permission (break instead of exit)
 
 322  *      - New nwid & encoding setting (Wireless Extension 9)
 
 324  * Changes made for release in 2.3.49 :
 
 325  * ----------------------------------
 
 326  *      - Indentation reformating (Alan)
 
 327  *      - Update to new network API (softnet - 2.3.43) :
 
 328  *              o replace dev->tbusy (Alan)
 
 329  *              o replace dev->tstart (Alan)
 
 330  *              o remove dev->interrupt (Alan)
 
 331  *              o add SMP locking via spinlock in splxx (me)
 
 332  *              o add spinlock in interrupt handler (me)
 
 333  *              o use kernel watchdog instead of ours (me)
 
 334  *              o increase watchdog timeout (kernel is more sensitive) (me)
 
 335  *              o verify that all the changes make sense and work (me)
 
 336  *      - Fixup a potential gotcha when reconfiguring and thighten a bit
 
 337  *              the interactions with Tx queue.
 
 339  * Changes made for release in 2.4.0 :
 
 340  * ---------------------------------
 
 341  *      - Fix spinlock stupid bugs that I left in. The driver is now SMP
 
 342  *              compliant and doesn't lockup at startup.
 
 344  * Changes made for release in 2.5.2 :
 
 345  * ---------------------------------
 
 346  *      - Use new driver API for Wireless Extensions :
 
 347  *              o got rid of wavelan_ioctl()
 
 348  *              o use a bunch of iw_handler instead
 
 350  * Changes made for release in 2.5.35 :
 
 351  * ----------------------------------
 
 352  *      - Set dev->trans_start to avoid filling the logs
 
 353  *      - Handle better spurious/bogus interrupt
 
 354  *      - Avoid deadlocks in mmc_out()/mmc_in()
 
 358  *      - roaming (see Pcmcia driver)
 
 361 /***************************** INCLUDES *****************************/
 
 363 #include        <linux/module.h>
 
 365 #include        <linux/kernel.h>
 
 366 #include        <linux/sched.h>
 
 367 #include        <linux/types.h>
 
 368 #include        <linux/fcntl.h>
 
 369 #include        <linux/interrupt.h>
 
 370 #include        <linux/stat.h>
 
 371 #include        <linux/ptrace.h>
 
 372 #include        <linux/ioport.h>
 
 373 #include        <linux/in.h>
 
 374 #include        <linux/string.h>
 
 375 #include        <linux/delay.h>
 
 376 #include        <linux/bitops.h>
 
 377 #include        <asm/system.h>
 
 380 #include        <asm/uaccess.h>
 
 381 #include        <linux/errno.h>
 
 382 #include        <linux/netdevice.h>
 
 383 #include        <linux/etherdevice.h>
 
 384 #include        <linux/skbuff.h>
 
 385 #include        <linux/slab.h>
 
 386 #include        <linux/timer.h>
 
 387 #include        <linux/init.h>
 
 389 #include <linux/wireless.h>             /* Wireless extensions */
 
 390 #include <net/iw_handler.h>             /* Wireless handlers */
 
 392 /* WaveLAN declarations */
 
 396 /************************** DRIVER OPTIONS **************************/
 
 398  * `#define' or `#undef' the following constant to change the behaviour
 
 401 #undef SET_PSA_CRC              /* Calculate and set the CRC on PSA (slower) */
 
 402 #define USE_PSA_CONFIG          /* Use info from the PSA. */
 
 403 #undef STRUCT_CHECK             /* Verify padding of structures. */
 
 404 #undef EEPROM_IS_PROTECTED      /* doesn't seem to be necessary */
 
 405 #define MULTICAST_AVOID         /* Avoid extra multicast (I'm sceptical). */
 
 406 #undef SET_MAC_ADDRESS          /* Experimental */
 
 408 /* Warning:  this stuff will slow down the driver. */
 
 409 #define WIRELESS_SPY            /* Enable spying addresses. */
 
 410 #undef HISTOGRAM                /* Enable histogram of signal level. */
 
 412 /****************************** DEBUG ******************************/
 
 414 #undef DEBUG_MODULE_TRACE       /* module insertion/removal */
 
 415 #undef DEBUG_CALLBACK_TRACE     /* calls made by Linux */
 
 416 #undef DEBUG_INTERRUPT_TRACE    /* calls to handler */
 
 417 #undef DEBUG_INTERRUPT_INFO     /* type of interrupt and so on */
 
 418 #define DEBUG_INTERRUPT_ERROR   /* problems */
 
 419 #undef DEBUG_CONFIG_TRACE       /* Trace the config functions. */
 
 420 #undef DEBUG_CONFIG_INFO        /* what's going on */
 
 421 #define DEBUG_CONFIG_ERROR      /* errors on configuration */
 
 422 #undef DEBUG_TX_TRACE           /* transmission calls */
 
 423 #undef DEBUG_TX_INFO            /* header of the transmitted packet */
 
 424 #undef DEBUG_TX_FAIL            /* Normal failure conditions */
 
 425 #define DEBUG_TX_ERROR          /* Unexpected conditions */
 
 426 #undef DEBUG_RX_TRACE           /* transmission calls */
 
 427 #undef DEBUG_RX_INFO            /* header of the received packet */
 
 428 #undef DEBUG_RX_FAIL            /* Normal failure conditions */
 
 429 #define DEBUG_RX_ERROR          /* Unexpected conditions */
 
 431 #undef DEBUG_PACKET_DUMP        /* Dump packet on the screen if defined to 32. */
 
 432 #undef DEBUG_IOCTL_TRACE        /* misc. call by Linux */
 
 433 #undef DEBUG_IOCTL_INFO         /* various debugging info */
 
 434 #define DEBUG_IOCTL_ERROR       /* what's going wrong */
 
 435 #define DEBUG_BASIC_SHOW        /* Show basic startup info. */
 
 436 #undef DEBUG_VERSION_SHOW       /* Print version info. */
 
 437 #undef DEBUG_PSA_SHOW           /* Dump PSA to screen. */
 
 438 #undef DEBUG_MMC_SHOW           /* Dump mmc to screen. */
 
 439 #undef DEBUG_SHOW_UNUSED        /* Show unused fields too. */
 
 440 #undef DEBUG_I82586_SHOW        /* Show i82586 status. */
 
 441 #undef DEBUG_DEVICE_SHOW        /* Show device parameters. */
 
 443 /************************ CONSTANTS & MACROS ************************/
 
 445 #ifdef DEBUG_VERSION_SHOW
 
 446 static const char       *version        = "wavelan.c : v24 (SMP + wireless extensions) 11/12/01\n";
 
 449 /* Watchdog temporisation */
 
 450 #define WATCHDOG_JIFFIES        (512*HZ/100)
 
 452 /* ------------------------ PRIVATE IOCTL ------------------------ */
 
 454 #define SIOCSIPQTHR     SIOCIWFIRSTPRIV         /* Set quality threshold */
 
 455 #define SIOCGIPQTHR     SIOCIWFIRSTPRIV + 1     /* Get quality threshold */
 
 457 #define SIOCSIPHISTO    SIOCIWFIRSTPRIV + 2     /* Set histogram ranges */
 
 458 #define SIOCGIPHISTO    SIOCIWFIRSTPRIV + 3     /* Get histogram values */
 
 460 /****************************** TYPES ******************************/
 
 463 typedef struct net_device_stats en_stats;
 
 464 typedef struct iw_statistics    iw_stats;
 
 465 typedef struct iw_quality       iw_qual;
 
 466 typedef struct iw_freq          iw_freq;
 
 467 typedef struct net_local        net_local;
 
 468 typedef struct timer_list       timer_list;
 
 471 typedef u_char          mac_addr[WAVELAN_ADDR_SIZE];    /* Hardware address */
 
 474  * Static specific data for the interface.
 
 476  * For each network interface, Linux keeps data in two structures:  "device"
 
 477  * keeps the generic data (same format for everybody) and "net_local" keeps
 
 478  * additional specific data.
 
 479  * Note that some of this specific data is in fact generic (en_stats, for
 
 484   net_local *   next;           /* linked list of the devices */
 
 485   struct net_device *   dev;            /* reverse link */
 
 486   spinlock_t    spinlock;       /* Serialize access to the hardware (SMP) */
 
 487   en_stats      stats;          /* Ethernet interface statistics */
 
 488   int           nresets;        /* number of hardware resets */
 
 489   u_char        reconfig_82586; /* We need to reconfigure the controller. */
 
 490   u_char        promiscuous;    /* promiscuous mode */
 
 491   int           mc_count;       /* number of multicast addresses */
 
 492   u_short       hacr;           /* current host interface state */
 
 497   u_short       tx_first_free;
 
 498   u_short       tx_first_in_use;
 
 500   iw_stats      wstats;         /* Wireless-specific statistics */
 
 502   struct iw_spy_data    spy_data;
 
 503   struct iw_public_data wireless_data;
 
 506   int           his_number;             /* number of intervals */
 
 507   u_char        his_range[16];          /* boundaries of interval ]n-1; n] */
 
 508   u_long        his_sum[16];            /* sum in interval */
 
 509 #endif  /* HISTOGRAM */
 
 512 /**************************** PROTOTYPES ****************************/
 
 514 /* ----------------------- MISC. SUBROUTINES ------------------------ */
 
 518         wv_psa_to_irq(u_char);
 
 519 /* ------------------- HOST ADAPTER SUBROUTINES ------------------- */
 
 520 static inline u_short           /* data */
 
 521         hasr_read(u_long);      /* Read the host interface:  base address */
 
 523         hacr_write(u_long,      /* Write to host interface:  base address */
 
 525         hacr_write_slow(u_long,
 
 527         set_chan_attn(u_long,   /* ioaddr */
 
 529         wv_hacr_reset(u_long),  /* ioaddr */
 
 530         wv_16_off(u_long,       /* ioaddr */
 
 532         wv_16_on(u_long,        /* ioaddr */
 
 534         wv_ints_off(struct net_device *),
 
 535         wv_ints_on(struct net_device *);
 
 536 /* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */
 
 538         psa_read(u_long,        /* Read the Parameter Storage Area. */
 
 540                  int,           /* offset in PSA */
 
 541                  u_char *,      /* buffer to fill */
 
 542                  int),          /* size to read */
 
 543         psa_write(u_long,       /* Write to the PSA. */
 
 545                   int,          /* offset in PSA */
 
 546                   u_char *,     /* buffer in memory */
 
 547                   int);         /* length of buffer */
 
 549         mmc_out(u_long,         /* Write 1 byte to the Modem Manag Control. */
 
 552         mmc_write(u_long,       /* Write n bytes to the MMC. */
 
 556 static inline u_char            /* Read 1 byte from the MMC. */
 
 560         mmc_read(u_long,        /* Read n bytes from the MMC. */
 
 564         fee_wait(u_long,        /* Wait for frequency EEPROM:  base address */
 
 565                  int,           /* base delay to wait for */
 
 566                  int);          /* time to wait */
 
 568         fee_read(u_long,        /* Read the frequency EEPROM:  base address */
 
 569                  u_short,       /* destination offset */
 
 570                  u_short *,     /* data buffer */
 
 571                  int);          /* number of registers */
 
 572 /* ---------------------- I82586 SUBROUTINES ----------------------- */
 
 573 static /*inline*/ void
 
 574         obram_read(u_long,      /* ioaddr */
 
 579         obram_write(u_long,     /* ioaddr */
 
 584         wv_ack(struct net_device *);
 
 586         wv_synchronous_cmd(struct net_device *,
 
 588         wv_config_complete(struct net_device *,
 
 592         wv_complete(struct net_device *,
 
 596         wv_82586_reconfig(struct net_device *);
 
 597 /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
 
 598 #ifdef DEBUG_I82586_SHOW
 
 600         wv_scb_show(unsigned short);
 
 603         wv_init_info(struct net_device *);      /* display startup info */
 
 604 /* ------------------- IOCTL, STATS & RECONFIG ------------------- */
 
 606         wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */
 
 608         wavelan_get_wireless_stats(struct net_device *);
 
 610         wavelan_set_multicast_list(struct net_device *);
 
 611 /* ----------------------- PACKET RECEPTION ----------------------- */
 
 613         wv_packet_read(struct net_device *,     /* Read a packet from a frame. */
 
 616         wv_receive(struct net_device *);        /* Read all packets waiting. */
 
 617 /* --------------------- PACKET TRANSMISSION --------------------- */
 
 619         wv_packet_write(struct net_device *,    /* Write a packet to the Tx buffer. */
 
 623         wavelan_packet_xmit(struct sk_buff *,   /* Send a packet. */
 
 624                             struct net_device *);
 
 625 /* -------------------- HARDWARE CONFIGURATION -------------------- */
 
 627         wv_mmc_init(struct net_device *),       /* Initialize the modem. */
 
 628         wv_ru_start(struct net_device *),       /* Start the i82586 receiver unit. */
 
 629         wv_cu_start(struct net_device *),       /* Start the i82586 command unit. */
 
 630         wv_82586_start(struct net_device *);    /* Start the i82586. */
 
 632         wv_82586_config(struct net_device *);   /* Configure the i82586. */
 
 634         wv_82586_stop(struct net_device *);
 
 636         wv_hw_reset(struct net_device *),       /* Reset the WaveLAN hardware. */
 
 637         wv_check_ioaddr(u_long,         /* ioaddr */
 
 638                         u_char *);      /* mac address (read) */
 
 639 /* ---------------------- INTERRUPT HANDLING ---------------------- */
 
 641         wavelan_interrupt(int,          /* interrupt handler */
 
 644         wavelan_watchdog(struct net_device *);  /* transmission watchdog */
 
 645 /* ------------------- CONFIGURATION CALLBACKS ------------------- */
 
 647         wavelan_open(struct net_device *),      /* Open the device. */
 
 648         wavelan_close(struct net_device *),     /* Close the device. */
 
 649         wavelan_config(struct net_device *, unsigned short);/* Configure one device. */
 
 650 extern struct net_device *wavelan_probe(int unit);      /* See Space.c. */
 
 652 /**************************** VARIABLES ****************************/
 
 655  * This is the root of the linked list of WaveLAN drivers
 
 656  * It is use to verify that we don't reuse the same base address
 
 657  * for two different drivers and to clean up when removing the module.
 
 659 static net_local *      wavelan_list    = (net_local *) NULL;
 
 662  * This table is used to translate the PSA value to IRQ number
 
 665 static u_char   irqvals[]       =
 
 674  * Table of the available I/O addresses (base addresses) for WaveLAN
 
 676 static unsigned short   iobase[]        =
 
 679   /* Leave out 0x3C0 for now -- seems to clash with some video
 
 681    * Leave out the others too -- we will always use 0x390 and leave
 
 682    * 0x300 for the Ethernet device.
 
 683    * Jean II:  0x3E0 is fine as well.
 
 685   0x300, 0x390, 0x3E0, 0x3C0
 
 691 /* Parameters set by insmod */
 
 694 static char     *name[4];
 
 695 module_param_array(io, int, NULL, 0);
 
 696 module_param_array(irq, int, NULL, 0);
 
 697 module_param_array(name, charp, NULL, 0);
 
 699 MODULE_PARM_DESC(io, "WaveLAN I/O base address(es),required");
 
 700 MODULE_PARM_DESC(irq, "WaveLAN IRQ number(s)");
 
 701 MODULE_PARM_DESC(name, "WaveLAN interface neme(s)");
 
 704 #endif  /* WAVELAN_P_H */