/* orinoco.h * * Common definitions to all pieces of the various orinoco * drivers */ #ifndef _ORINOCO_H #define _ORINOCO_H #define DRIVER_VERSION "0.15rc2HEAD" #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 25) #include #endif #include "hermes.h" #include "kcompat.h" /* To enable debug messages */ //#define ORINOCO_DEBUG 3 #if (! defined (WIRELESS_EXT)) || (WIRELESS_EXT < 11) #error "orinoco driver requires Wireless extensions v11 or later." #endif /* (! defined (WIRELESS_EXT)) || (WIRELESS_EXT < 11) */ #define WIRELESS_SPY // enable iwspy support #define MAX_SCAN_LEN 4096 #define ORINOCO_MAX_KEY_SIZE 14 #define ORINOCO_MAX_KEYS 4 struct orinoco_key { u16 len; /* always stored as little-endian */ char data[ORINOCO_MAX_KEY_SIZE]; } __attribute__ ((packed)); struct header_struct { /* 802.3 */ u8 dest[ETH_ALEN]; u8 src[ETH_ALEN]; u16 len; /* 802.2 */ u8 dsap; u8 ssap; u8 ctrl; /* SNAP */ u8 oui[3]; u16 ethertype; } __attribute__ ((packed)); /* 802.2 LLC/SNAP header used for Ethernet encapsulation over 802.11 */ #define encaps_hdr ((u8[]){0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}) #define ENCAPS_OVERHEAD (sizeof(encaps_hdr) + 2) typedef enum { FIRMWARE_TYPE_AGERE, FIRMWARE_TYPE_INTERSIL, FIRMWARE_TYPE_SYMBOL } fwtype_t; struct orinoco_private { void *card; /* Pointer to card dependent structure */ int (*hard_reset)(struct orinoco_private *); /* Synchronisation stuff */ spinlock_t lock; int hw_unavailable; struct work_struct reset_work; /* driver state */ int open; u16 last_linkstatus; struct work_struct join_work; #if WIRELESS_EXT > 13 struct work_struct wevent_work; #endif /* Net device stuff */ struct net_device *ndev; struct net_device_stats stats; struct iw_statistics wstats; /* Hardware control variables */ hermes_t hw; u16 txfid; /* Capabilities of the hardware/firmware */ fwtype_t firmware_type; char fw_name[32]; int ibss_port; int nicbuf_size; u16 channel_mask; /* Boolean capabilities */ unsigned int has_ibss:1; unsigned int has_port3:1; unsigned int has_wep:1; unsigned int has_big_wep:1; unsigned int has_mwo:1; unsigned int has_pm:1; unsigned int has_preamble:1; unsigned int has_sensitivity:1; unsigned int has_hostscan:1; unsigned int broken_disableport:1; unsigned int broken_monitor:1; unsigned int irq_no_disable:1; /* Configuration paramaters */ u32 iw_mode; int prefer_port3; u16 wep_on, wep_restrict, tx_key; struct orinoco_key keys[ORINOCO_MAX_KEYS]; int bitratemode; char nick[IW_ESSID_MAX_SIZE+1]; char desired_essid[IW_ESSID_MAX_SIZE+1]; char desired_bssid[ETH_ALEN]; int bssid_fixed; u16 frag_thresh, mwo_robust; u16 channel; u16 ap_density, rts_thresh; u16 pm_on, pm_mcast, pm_period, pm_timeout; u16 preamble; #ifdef WIRELESS_SPY int spy_number; u_char spy_address[IW_MAX_SPY][ETH_ALEN]; struct iw_quality spy_stat[IW_MAX_SPY]; #endif /* Configuration dependent variables */ int port_type, createibss; int promiscuous, mc_count; /* Scanning support */ int scan_inprogress; /* Scan pending... */ u32 scan_mode; /* Type of scan done */ char * scan_result; /* Result of previous scan */ int scan_len; /* Lenght of result */ }; #ifdef ORINOCO_DEBUG extern int orinoco_debug; #define DEBUG(n, args...) do { if (orinoco_debug>(n)) printk(KERN_DEBUG args); } while(0) #else #define DEBUG(n, args...) do { } while (0) #endif /* ORINOCO_DEBUG */ #define TRACE_ENTER(devname) DEBUG(2, "%s: -> %s()\n", devname, __FUNCTION__); #define TRACE_EXIT(devname) DEBUG(2, "%s: <- %s()\n", devname, __FUNCTION__); /********************************************************************/ /* Exported prototypes */ /********************************************************************/ extern struct net_device *alloc_orinocodev(int sizeof_card, int (*hard_reset)(struct orinoco_private *)); extern void free_orinocodev(struct net_device *dev); extern int __orinoco_up(struct net_device *dev); extern int __orinoco_down(struct net_device *dev); extern int orinoco_reinit_firmware(struct net_device *dev); extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs); extern void __orinoco_ev_info(struct net_device *dev, hermes_t *hw); extern void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw); /********************************************************************/ /* Locking and synchronization functions */ /********************************************************************/ /* These functions *must* be inline or they will break horribly on * SPARC, due to its weird semantics for save/restore flags. extern * inline should prevent the kernel from linking or module from * loading if they are not inlined. */ extern inline int orinoco_lock(struct orinoco_private *priv, unsigned long *flags) { if (priv->irq_no_disable) { *flags = 0; /* fix for gcc warning */ spin_lock_bh(&priv->lock); } else spin_lock_irqsave(&priv->lock, *flags); if (priv->hw_unavailable) { DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n", priv->ndev); if (priv->irq_no_disable) spin_unlock_bh(&priv->lock); else spin_unlock_irqrestore(&priv->lock, *flags); return -EBUSY; } return 0; } extern inline void orinoco_unlock(struct orinoco_private *priv, unsigned long *flags) { if (priv->irq_no_disable) spin_unlock_bh(&priv->lock); else spin_unlock_irqrestore(&priv->lock, *flags); } extern inline void orinoco_spin_lock(struct orinoco_private *priv) { if (priv->irq_no_disable) spin_lock_bh(&priv->lock); else spin_lock_irq(&priv->lock); } extern inline void orinoco_spin_unlock(struct orinoco_private *priv) { if (priv->irq_no_disable) spin_unlock_bh(&priv->lock); else spin_unlock_irq(&priv->lock); } #endif /* _ORINOCO_H */