2005-04-17 02:20:36 +04:00
/*
* WaveLAN ISA driver
*
* Jean II - HPLB ' 96
*
* Reorganisation and extension of the driver .
*
* This file contains all definitions and declarations necessary for the
* WaveLAN ISA driver . This file is a private header , so it should
* be included only in wavelan . c !
*/
# ifndef WAVELAN_P_H
# define WAVELAN_P_H
/************************** DOCUMENTATION ***************************/
/*
* This driver provides a Linux interface to the WaveLAN ISA hardware .
* The WaveLAN is a product of Lucent ( http : //www.wavelan.com/).
* This division was formerly part of NCR and then AT & T .
* WaveLANs are also distributed by DEC ( RoamAbout DS ) and Digital Ocean .
*
* To learn how to use this driver , read the NET3 HOWTO .
* If you want to exploit the many other functionalities , read the comments
* in the code .
*
* This driver is the result of the effort of many people ( see below ) .
*/
/* ------------------------ SPECIFIC NOTES ------------------------ */
/*
* Web page
* - - - - - - - -
* I try to maintain a web page with the Wireless LAN Howto at :
* http : //www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
*
* SMP
* - - -
* We now are SMP compliant ( I eventually fixed the remaining bugs ) .
* The driver has been tested on a dual P6 - 150 and survived my usual
* set of torture tests .
* Anyway , I spent enough time chasing interrupt re - entrancy during
* errors or reconfigure , and I designed the locked / unlocked sections
* of the driver with great care , and with the recent addition of
* the spinlock ( thanks to the new API ) , we should be quite close to
* the truth .
* The SMP / IRQ locking is quite coarse and conservative ( i . e . not fast ) ,
* but better safe than sorry ( especially at 2 Mb / s ; - ) .
*
* I have also looked into disabling only our interrupt on the card
* ( via HACR ) instead of all interrupts in the processor ( via cli ) ,
* so that other driver are not impacted , and it look like it ' s
* possible , but it ' s very tricky to do right ( full of races ) . As
* the gain would be mostly for SMP systems , it can wait . . .
*
* Debugging and options
* - - - - - - - - - - - - - - - - - - - - -
* You will find below a set of ' # define " allowing a very fine control
* on the driver behaviour and the debug messages printed .
* The main options are :
* o SET_PSA_CRC , to have your card correctly recognised by
* an access point and the Point - to - Point diagnostic tool .
* o USE_PSA_CONFIG , to read configuration from the PSA ( EEprom )
* ( otherwise we always start afresh with some defaults )
*
* wavelan . o is too darned big
* - - - - - - - - - - - - - - - - - - - - - - - - - - -
* That ' s true ! There is a very simple way to reduce the driver
* object by 33 % ! Comment out the following line :
* # include < linux / wireless . h >
* Other compile options can also reduce the size of it . . .
*
* MAC address and hardware detection :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* The detection code for the WaveLAN checks that the first three
* octets of the MAC address fit the company code . This type of
* detection works well for AT & T cards ( because the AT & T code is
* hardcoded in wavelan . h ) , but of course will fail for other
* manufacturers .
*
* If you are sure that your card is derived from the WaveLAN ,
* here is the way to configure it :
* 1 ) Get your MAC address
* a ) With your card utilities ( wfreqsel , instconf , etc . )
* b ) With the driver :
* o compile the kernel with DEBUG_CONFIG_INFO enabled
* o Boot and look the card messages
* 2 ) Set your MAC code ( 3 octets ) in MAC_ADDRESSES [ ] [ 3 ] ( wavelan . h )
* 3 ) Compile and verify
* 4 ) Send me the MAC code . I will include it in the next version .
*
*/
/* --------------------- WIRELESS EXTENSIONS --------------------- */
/*
* This driver is the first to support " wireless extensions " .
* This set of extensions provides a standard way to control the wireless
* characteristics of the hardware . Applications such as mobile IP may
* take advantage of it .
*
2006-01-21 02:46:55 +03:00
* It might be a good idea as well to fetch the wireless tools to
2005-04-17 02:20:36 +04:00
* configure the device and play a bit .
*/
/* ---------------------------- FILES ---------------------------- */
/*
* wavelan . c : actual code for the driver : C functions
*
* wavelan . p . h : private header : local types and variables for driver
*
* wavelan . h : description of the hardware interface and structs
*
* i82586 . h : description of the Ethernet controller
*/
/* --------------------------- HISTORY --------------------------- */
/*
* This is based on information in the drivers ' headers . It may not be
* accurate , and I guarantee only my best effort .
*
* The history of the WaveLAN drivers is as complicated as the history of
* the WaveLAN itself ( NCR - > AT & T - > Lucent ) .
*
* It all started with Anders Klemets < klemets @ paul . rutgers . edu >
* writing a WaveLAN ISA driver for the Mach microkernel . Girish
* Welling < welling @ paul . rutgers . edu > had also worked on it .
* Keith Moore modified this for the PCMCIA hardware .
*
* Robert Morris < rtm @ das . harvard . edu > ported these two drivers to BSDI
* and added specific PCMCIA support ( there is currently no equivalent
* of the PCMCIA package under BSD ) .
*
* Jim Binkley < jrb @ cs . pdx . edu > ported both BSDI drivers to FreeBSD .
*
* Bruce Janson < bruce @ cs . usyd . edu . au > ported the BSDI ISA driver to Linux .
*
* Anthony D . Joseph < adj @ lcs . mit . edu > started to modify Bruce ' s driver
* ( with help of the BSDI PCMCIA driver ) for PCMCIA .
* Yunzhou Li < yunzhou @ strat . iol . unh . edu > finished this work .
* Joe Finney < joe @ comp . lancs . ac . uk > patched the driver to start
* 2.00 cards correctly ( 2.4 GHz with frequency selection ) .
* David Hinds < dahinds @ users . sourceforge . net > integrated the whole in his
* PCMCIA package ( and bug corrections ) .
*
* I ( Jean Tourrilhes - jt @ hplb . hpl . hp . com ) then started to make some
* patches to the PCMCIA driver . Later , I added code in the ISA driver
* for Wireless Extensions and full support of frequency selection
* cards . Then , I did the same to the PCMCIA driver , and did some
* reorganisation . Finally , I came back to the ISA driver to
* upgrade it at the same level as the PCMCIA one and reorganise
* the code .
* Loeke Brederveld < lbrederv @ wavelan . com > from Lucent has given me
* much needed information on the WaveLAN hardware .
*/
/* The original copyrights and literature mention others' names and
* credits . I don ' t know what their part in this development was .
*/
/* By the way, for the copyright and legal stuff:
* almost everybody wrote code under the GNU or BSD license ( or similar ) ,
* and want their original copyright to remain somewhere in the
* code ( for myself , I go with the GPL ) .
* Nobody wants to take responsibility for anything , except the fame .
*/
/* --------------------------- CREDITS --------------------------- */
/*
* This software was developed as a component of the
* Linux operating system .
* It is based on other device drivers and information
* either written or supplied by :
* Ajay Bakre < bakre @ paul . rutgers . edu > ,
* Donald Becker < becker @ cesdis . gsfc . nasa . gov > ,
* Loeke Brederveld < Loeke . Brederveld @ Utrecht . NCR . com > ,
* Brent Elphick < belphick @ uwaterloo . ca > ,
* Anders Klemets < klemets @ it . kth . se > ,
* Vladimir V . Kolpakov < w @ stier . koenig . ru > ,
* Marc Meertens < Marc . Meertens @ Utrecht . NCR . com > ,
* Pauline Middelink < middelin @ polyware . iaf . nl > ,
* Robert Morris < rtm @ das . harvard . edu > ,
* Jean Tourrilhes < jt @ hpl . hp . com > ,
* Girish Welling < welling @ paul . rutgers . edu > ,
* Clark Woodworth < clark @ hiway1 . exit109 . com >
* Yongguang Zhang < ygz @ isl . hrl . hac . com >
*
* Thanks go also to :
* James Ashton < jaa101 @ syseng . anu . edu . au > ,
* Alan Cox < alan @ redhat . com > ,
* Allan Creighton < allanc @ cs . usyd . edu . au > ,
* Matthew Geier < matthew @ cs . usyd . edu . au > ,
* Remo di Giovanni < remo @ cs . usyd . edu . au > ,
* Eckhard Grah < grah @ wrcs1 . urz . uni - wuppertal . de > ,
* Vipul Gupta < vgupta @ cs . binghamton . edu > ,
* Mark Hagan < mhagan @ wtcpost . daytonoh . NCR . COM > ,
* Tim Nicholson < tim @ cs . usyd . edu . au > ,
* Ian Parkin < ian @ cs . usyd . edu . au > ,
* John Rosenberg < johnr @ cs . usyd . edu . au > ,
* George Rossi < george @ phm . gov . au > ,
* Arthur Scott < arthur @ cs . usyd . edu . au > ,
* Stanislav Sinyagin < stas @ isf . ru >
* and Peter Storey for their assistance and advice .
*
* Additional Credits :
*
* My development has been done initially under Debian 1.1 ( Linux 2.0 . x )
* and now under Debian 2.2 , initially with an HP Vectra XP / 60 , and now
* an HP Vectra XP / 90.
*
*/
/* ------------------------- IMPROVEMENTS ------------------------- */
/*
* I proudly present :
*
* Changes made in first pre - release :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - reorganisation of the code , function name change
* - creation of private header ( wavelan . p . h )
* - reorganised debug messages
* - more comments , history , etc .
* - mmc_init : configure the PSA if not done
* - mmc_init : correct default value of level threshold for PCMCIA
* - mmc_init : 2.00 detection better code for 2.00 initialization
* - better info at startup
* - IRQ setting ( note : this setting is permanent )
* - watchdog : change strategy ( and solve module removal problems )
* - add wireless extensions ( ioctl and get_wireless_stats )
* get / set nwid / frequency on fly , info for / proc / net / wireless
* - more wireless extensions : SETSPY and GETSPY
* - make wireless extensions optional
* - private ioctl to set / get quality and level threshold , histogram
* - remove / proc / net / wavelan
* - suppress useless stuff from lp ( net_local )
* - kernel 2.1 support ( copy_to / from_user instead of memcpy_to / fromfs )
* - add message level ( debug stuff in / var / adm / debug and errors not
* displayed at console and still in / var / adm / messages )
* - multi device support
* - start fixing the probe ( init code )
* - more inlines
* - man page
* - many other minor details and cleanups
*
* Changes made in second pre - release :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - clean up init code ( probe and module init )
* - better multiple device support ( module )
* - name assignment ( module )
*
* Changes made in third pre - release :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - be more conservative on timers
* - preliminary support for multicast ( I still lack some details )
*
* Changes made in fourth pre - release :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - multicast ( revisited and finished )
* - avoid reset in set_multicast_list ( a really big hack )
* if somebody could apply this code for other i82586 based drivers
* - share onboard memory 75 % RU and 25 % CU ( instead of 50 / 50 )
*
* Changes made for release in 2.1 .15 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - change the detection code for multi manufacturer code support
*
* Changes made for release in 2.1 .17 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - update to wireless extensions changes
* - silly bug in card initial configuration ( psa_conf_status )
*
* Changes made for release in 2.1 .27 & 2.0 .30 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - small bug in debug code ( probably not the last one . . . )
* - remove extern keyword for wavelan_probe ( )
* - level threshold is now a standard wireless extension ( version 4 ! )
* - modules parameters types ( new module interface )
*
* Changes made for release in 2.1 .36 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - byte count stats ( courtesy of David Hinds )
* - remove dev_tint stuff ( courtesy of David Hinds )
* - encryption setting from Brent Elphick ( thanks a lot ! )
* - ' ioaddr ' to ' u_long ' for the Alpha ( thanks to Stanislav Sinyagin )
*
* Other changes ( not by me ) :
* - - - - - - - - - - - - - - - - - - - - - - - - -
* - Spelling and gramar " rectification " .
*
* Changes made for release in 2.0 .37 & 2.2 .2 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Correct status in / proc / net / wireless
* - Set PSA CRC to make PtP diagnostic tool happy ( Bob Gray )
* - Module init code don ' t fail if we found at least one card in
* the address list ( Karlis Peisenieks )
* - Missing parenthesis ( Christopher Peterson )
* - Correct i82586 configuration parameters
* - Encryption initialisation bug ( Robert McCormack )
* - New mac addresses detected in the probe
* - Increase watchdog for busy environments
*
* Changes made for release in 2.0 .38 & 2.2 .7 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Correct the reception logic to better report errors and avoid
* sending bogus packet up the stack
* - Delay RU config to avoid corrupting first received packet
* - Change config completion code ( to actually check something )
* - Avoid reading out of bound in skbuf to transmit
* - Rectify a lot of ( useless ) debugging code
* - Change the way to ` # ifdef SET_PSA_CRC '
*
* Changes made for release in 2.2 .11 & 2.3 .13 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Change e - mail and web page addresses
* - Watchdog timer is now correctly expressed in HZ , not in jiffies
* - Add channel number to the list of frequencies in range
* - Add the ( short ) list of bit - rates in range
* - Developp a new sensitivity . . . ( sens . value & sens . fixed )
*
* Changes made for release in 2.2 .14 & 2.3 .23 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Fix check for root permission ( break instead of exit )
* - New nwid & encoding setting ( Wireless Extension 9 )
*
* Changes made for release in 2.3 .49 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Indentation reformating ( Alan )
* - Update to new network API ( softnet - 2.3 .43 ) :
* o replace dev - > tbusy ( Alan )
* o replace dev - > tstart ( Alan )
* o remove dev - > interrupt ( Alan )
* o add SMP locking via spinlock in splxx ( me )
* o add spinlock in interrupt handler ( me )
* o use kernel watchdog instead of ours ( me )
* o increase watchdog timeout ( kernel is more sensitive ) ( me )
* o verify that all the changes make sense and work ( me )
* - Fixup a potential gotcha when reconfiguring and thighten a bit
* the interactions with Tx queue .
*
* Changes made for release in 2.4 .0 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Fix spinlock stupid bugs that I left in . The driver is now SMP
* compliant and doesn ' t lockup at startup .
*
* Changes made for release in 2.5 .2 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Use new driver API for Wireless Extensions :
* o got rid of wavelan_ioctl ( )
* o use a bunch of iw_handler instead
*
* Changes made for release in 2.5 .35 :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - Set dev - > trans_start to avoid filling the logs
* - Handle better spurious / bogus interrupt
* - Avoid deadlocks in mmc_out ( ) / mmc_in ( )
*
* Wishes & dreams :
* - - - - - - - - - - - - - - - -
* - roaming ( see Pcmcia driver )
*/
/***************************** INCLUDES *****************************/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/types.h>
# include <linux/fcntl.h>
# include <linux/interrupt.h>
# include <linux/stat.h>
# include <linux/ptrace.h>
# include <linux/ioport.h>
# include <linux/in.h>
# include <linux/string.h>
# include <linux/delay.h>
# include <linux/bitops.h>
# include <asm/system.h>
# include <asm/io.h>
# include <asm/dma.h>
# include <asm/uaccess.h>
# include <linux/errno.h>
# include <linux/netdevice.h>
# include <linux/etherdevice.h>
# include <linux/skbuff.h>
# include <linux/slab.h>
# include <linux/timer.h>
# include <linux/init.h>
# include <linux/wireless.h> /* Wireless extensions */
# include <net/iw_handler.h> /* Wireless handlers */
/* WaveLAN declarations */
# include "i82586.h"
# include "wavelan.h"
/************************** DRIVER OPTIONS **************************/
/*
* ` # define ' or ` # undef ' the following constant to change the behaviour
* of the driver . . .
*/
# undef SET_PSA_CRC /* Calculate and set the CRC on PSA (slower) */
# define USE_PSA_CONFIG /* Use info from the PSA. */
# undef STRUCT_CHECK /* Verify padding of structures. */
# undef EEPROM_IS_PROTECTED /* doesn't seem to be necessary */
# define MULTICAST_AVOID /* Avoid extra multicast (I'm sceptical). */
# undef SET_MAC_ADDRESS /* Experimental */
/* Warning: this stuff will slow down the driver. */
# define WIRELESS_SPY /* Enable spying addresses. */
# undef HISTOGRAM /* Enable histogram of signal level. */
/****************************** DEBUG ******************************/
# undef DEBUG_MODULE_TRACE /* module insertion/removal */
# undef DEBUG_CALLBACK_TRACE /* calls made by Linux */
# undef DEBUG_INTERRUPT_TRACE /* calls to handler */
# undef DEBUG_INTERRUPT_INFO /* type of interrupt and so on */
# define DEBUG_INTERRUPT_ERROR /* problems */
# undef DEBUG_CONFIG_TRACE /* Trace the config functions. */
# undef DEBUG_CONFIG_INFO /* what's going on */
# define DEBUG_CONFIG_ERROR /* errors on configuration */
# undef DEBUG_TX_TRACE /* transmission calls */
# undef DEBUG_TX_INFO /* header of the transmitted packet */
# undef DEBUG_TX_FAIL /* Normal failure conditions */
# define DEBUG_TX_ERROR /* Unexpected conditions */
# undef DEBUG_RX_TRACE /* transmission calls */
# undef DEBUG_RX_INFO /* header of the received packet */
# undef DEBUG_RX_FAIL /* Normal failure conditions */
# define DEBUG_RX_ERROR /* Unexpected conditions */
# undef DEBUG_PACKET_DUMP /* Dump packet on the screen if defined to 32. */
# undef DEBUG_IOCTL_TRACE /* misc. call by Linux */
# undef DEBUG_IOCTL_INFO /* various debugging info */
# define DEBUG_IOCTL_ERROR /* what's going wrong */
# define DEBUG_BASIC_SHOW /* Show basic startup info. */
# undef DEBUG_VERSION_SHOW /* Print version info. */
# undef DEBUG_PSA_SHOW /* Dump PSA to screen. */
# undef DEBUG_MMC_SHOW /* Dump mmc to screen. */
# undef DEBUG_SHOW_UNUSED /* Show unused fields too. */
# undef DEBUG_I82586_SHOW /* Show i82586 status. */
# undef DEBUG_DEVICE_SHOW /* Show device parameters. */
/************************ CONSTANTS & MACROS ************************/
# ifdef DEBUG_VERSION_SHOW
static const char * version = " wavelan.c : v24 (SMP + wireless extensions) 11/12/01 \n " ;
# endif
/* Watchdog temporisation */
# define WATCHDOG_JIFFIES (512*HZ / 100)
/* Macro to get the number of elements in an array */
# define NELS(a) (sizeof(a) / sizeof(a[0]))
/* ------------------------ PRIVATE IOCTL ------------------------ */
# define SIOCSIPQTHR SIOCIWFIRSTPRIV /* Set quality threshold */
# define SIOCGIPQTHR SIOCIWFIRSTPRIV + 1 /* Get quality threshold */
# define SIOCSIPHISTO SIOCIWFIRSTPRIV + 2 /* Set histogram ranges */
# define SIOCGIPHISTO SIOCIWFIRSTPRIV + 3 /* Get histogram values */
/****************************** TYPES ******************************/
/* Shortcuts */
typedef struct net_device_stats en_stats ;
typedef struct iw_statistics iw_stats ;
typedef struct iw_quality iw_qual ;
typedef struct iw_freq iw_freq ;
typedef struct net_local net_local ;
typedef struct timer_list timer_list ;
/* Basic types */
typedef u_char mac_addr [ WAVELAN_ADDR_SIZE ] ; /* Hardware address */
/*
* Static specific data for the interface .
*
* For each network interface , Linux keeps data in two structures : " device "
* keeps the generic data ( same format for everybody ) and " net_local " keeps
* additional specific data .
* Note that some of this specific data is in fact generic ( en_stats , for
* example ) .
*/
struct net_local
{
net_local * next ; /* linked list of the devices */
struct net_device * dev ; /* reverse link */
spinlock_t spinlock ; /* Serialize access to the hardware (SMP) */
en_stats stats ; /* Ethernet interface statistics */
int nresets ; /* number of hardware resets */
u_char reconfig_82586 ; /* We need to reconfigure the controller. */
u_char promiscuous ; /* promiscuous mode */
int mc_count ; /* number of multicast addresses */
u_short hacr ; /* current host interface state */
int tx_n_in_use ;
u_short rx_head ;
u_short rx_last ;
u_short tx_first_free ;
u_short tx_first_in_use ;
iw_stats wstats ; /* Wireless-specific statistics */
struct iw_spy_data spy_data ;
struct iw_public_data wireless_data ;
# ifdef HISTOGRAM
int his_number ; /* number of intervals */
u_char his_range [ 16 ] ; /* boundaries of interval ]n-1; n] */
u_long his_sum [ 16 ] ; /* sum in interval */
# endif /* HISTOGRAM */
} ;
/**************************** PROTOTYPES ****************************/
/* ----------------------- MISC. SUBROUTINES ------------------------ */
static u_char
wv_irq_to_psa ( int ) ;
static int
wv_psa_to_irq ( u_char ) ;
/* ------------------- HOST ADAPTER SUBROUTINES ------------------- */
static inline u_short /* data */
hasr_read ( u_long ) ; /* Read the host interface: base address */
static inline void
hacr_write ( u_long , /* Write to host interface: base address */
u_short ) , /* data */
hacr_write_slow ( u_long ,
u_short ) ,
set_chan_attn ( u_long , /* ioaddr */
u_short ) , /* hacr */
wv_hacr_reset ( u_long ) , /* ioaddr */
wv_16_off ( u_long , /* ioaddr */
u_short ) , /* hacr */
wv_16_on ( u_long , /* ioaddr */
u_short ) , /* hacr */
wv_ints_off ( struct net_device * ) ,
wv_ints_on ( struct net_device * ) ;
/* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */
static void
psa_read ( u_long , /* Read the Parameter Storage Area. */
u_short , /* hacr */
int , /* offset in PSA */
u_char * , /* buffer to fill */
int ) , /* size to read */
psa_write ( u_long , /* Write to the PSA. */
u_short , /* hacr */
int , /* offset in PSA */
u_char * , /* buffer in memory */
int ) ; /* length of buffer */
static inline void
mmc_out ( u_long , /* Write 1 byte to the Modem Manag Control. */
u_short ,
u_char ) ,
mmc_write ( u_long , /* Write n bytes to the MMC. */
u_char ,
u_char * ,
int ) ;
static inline u_char /* Read 1 byte from the MMC. */
mmc_in ( u_long ,
u_short ) ;
static inline void
mmc_read ( u_long , /* Read n bytes from the MMC. */
u_char ,
u_char * ,
int ) ,
fee_wait ( u_long , /* Wait for frequency EEPROM: base address */
int , /* base delay to wait for */
int ) ; /* time to wait */
static void
fee_read ( u_long , /* Read the frequency EEPROM: base address */
u_short , /* destination offset */
u_short * , /* data buffer */
int ) ; /* number of registers */
/* ---------------------- I82586 SUBROUTINES ----------------------- */
static /*inline*/ void
obram_read ( u_long , /* ioaddr */
u_short , /* o */
u_char * , /* b */
int ) ; /* n */
static inline void
obram_write ( u_long , /* ioaddr */
u_short , /* o */
u_char * , /* b */
int ) ; /* n */
static void
wv_ack ( struct net_device * ) ;
static inline int
wv_synchronous_cmd ( struct net_device * ,
const char * ) ,
wv_config_complete ( struct net_device * ,
u_long ,
net_local * ) ;
static int
wv_complete ( struct net_device * ,
u_long ,
net_local * ) ;
static inline void
wv_82586_reconfig ( struct net_device * ) ;
/* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
# ifdef DEBUG_I82586_SHOW
static void
wv_scb_show ( unsigned short ) ;
# endif
static inline void
wv_init_info ( struct net_device * ) ; /* display startup info */
/* ------------------- IOCTL, STATS & RECONFIG ------------------- */
static en_stats *
wavelan_get_stats ( struct net_device * ) ; /* Give stats /proc/net/dev */
static iw_stats *
wavelan_get_wireless_stats ( struct net_device * ) ;
static void
wavelan_set_multicast_list ( struct net_device * ) ;
/* ----------------------- PACKET RECEPTION ----------------------- */
static inline void
wv_packet_read ( struct net_device * , /* Read a packet from a frame. */
u_short ,
int ) ,
wv_receive ( struct net_device * ) ; /* Read all packets waiting. */
/* --------------------- PACKET TRANSMISSION --------------------- */
static inline int
wv_packet_write ( struct net_device * , /* Write a packet to the Tx buffer. */
void * ,
short ) ;
static int
wavelan_packet_xmit ( struct sk_buff * , /* Send a packet. */
struct net_device * ) ;
/* -------------------- HARDWARE CONFIGURATION -------------------- */
static inline int
wv_mmc_init ( struct net_device * ) , /* Initialize the modem. */
wv_ru_start ( struct net_device * ) , /* Start the i82586 receiver unit. */
wv_cu_start ( struct net_device * ) , /* Start the i82586 command unit. */
wv_82586_start ( struct net_device * ) ; /* Start the i82586. */
static void
wv_82586_config ( struct net_device * ) ; /* Configure the i82586. */
static inline void
wv_82586_stop ( struct net_device * ) ;
static int
wv_hw_reset ( struct net_device * ) , /* Reset the WaveLAN hardware. */
wv_check_ioaddr ( u_long , /* ioaddr */
u_char * ) ; /* mac address (read) */
/* ---------------------- INTERRUPT HANDLING ---------------------- */
static irqreturn_t
wavelan_interrupt ( int , /* interrupt handler */
void * ,
struct pt_regs * ) ;
static void
wavelan_watchdog ( struct net_device * ) ; /* transmission watchdog */
/* ------------------- CONFIGURATION CALLBACKS ------------------- */
static int
wavelan_open ( struct net_device * ) , /* Open the device. */
wavelan_close ( struct net_device * ) , /* Close the device. */
wavelan_config ( struct net_device * , unsigned short ) ; /* Configure one device. */
extern struct net_device * wavelan_probe ( int unit ) ; /* See Space.c. */
/**************************** VARIABLES ****************************/
/*
* This is the root of the linked list of WaveLAN drivers
* It is use to verify that we don ' t reuse the same base address
* for two different drivers and to clean up when removing the module .
*/
static net_local * wavelan_list = ( net_local * ) NULL ;
/*
* This table is used to translate the PSA value to IRQ number
* and vice versa .
*/
static u_char irqvals [ ] =
{
0 , 0 , 0 , 0x01 ,
0x02 , 0x04 , 0 , 0x08 ,
0 , 0 , 0x10 , 0x20 ,
0x40 , 0 , 0 , 0x80 ,
} ;
/*
* Table of the available I / O addresses ( base addresses ) for WaveLAN
*/
static unsigned short iobase [ ] =
{
#if 0
/* Leave out 0x3C0 for now -- seems to clash with some video
* controllers .
* Leave out the others too - - we will always use 0x390 and leave
* 0x300 for the Ethernet device .
* Jean II : 0x3E0 is fine as well .
*/
0x300 , 0x390 , 0x3E0 , 0x3C0
# endif /* 0 */
0x390 , 0x3E0
} ;
# ifdef MODULE
/* Parameters set by insmod */
static int io [ 4 ] ;
static int irq [ 4 ] ;
static char * name [ 4 ] ;
module_param_array ( io , int , NULL , 0 ) ;
module_param_array ( irq , int , NULL , 0 ) ;
module_param_array ( name , charp , NULL , 0 ) ;
MODULE_PARM_DESC ( io , " WaveLAN I/O base address(es),required " ) ;
MODULE_PARM_DESC ( irq , " WaveLAN IRQ number(s) " ) ;
MODULE_PARM_DESC ( name , " WaveLAN interface neme(s) " ) ;
# endif /* MODULE */
# endif /* WAVELAN_P_H */