Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.33 226 lines 5.7 kB view raw
1/* orinoco.h 2 * 3 * Common definitions to all pieces of the various orinoco 4 * drivers 5 */ 6 7#ifndef _ORINOCO_H 8#define _ORINOCO_H 9 10#define DRIVER_VERSION "0.15" 11 12#include <linux/interrupt.h> 13#include <linux/suspend.h> 14#include <linux/netdevice.h> 15#include <linux/wireless.h> 16#include <net/iw_handler.h> 17#include <net/cfg80211.h> 18 19#include "hermes.h" 20 21/* To enable debug messages */ 22/*#define ORINOCO_DEBUG 3*/ 23 24#define WIRELESS_SPY /* enable iwspy support */ 25 26#define MAX_SCAN_LEN 4096 27 28#define ORINOCO_SEQ_LEN 8 29#define ORINOCO_MAX_KEY_SIZE 14 30#define ORINOCO_MAX_KEYS 4 31 32struct orinoco_key { 33 __le16 len; /* always stored as little-endian */ 34 char data[ORINOCO_MAX_KEY_SIZE]; 35} __attribute__ ((packed)); 36 37#define TKIP_KEYLEN 16 38#define MIC_KEYLEN 8 39 40struct orinoco_tkip_key { 41 u8 tkip[TKIP_KEYLEN]; 42 u8 tx_mic[MIC_KEYLEN]; 43 u8 rx_mic[MIC_KEYLEN]; 44}; 45 46enum orinoco_alg { 47 ORINOCO_ALG_NONE, 48 ORINOCO_ALG_WEP, 49 ORINOCO_ALG_TKIP 50}; 51 52typedef enum { 53 FIRMWARE_TYPE_AGERE, 54 FIRMWARE_TYPE_INTERSIL, 55 FIRMWARE_TYPE_SYMBOL 56} fwtype_t; 57 58struct firmware; 59 60struct orinoco_private { 61 void *card; /* Pointer to card dependent structure */ 62 struct device *dev; 63 int (*hard_reset)(struct orinoco_private *); 64 int (*stop_fw)(struct orinoco_private *, int); 65 66 struct ieee80211_supported_band band; 67 struct ieee80211_channel channels[14]; 68 u32 cipher_suites[3]; 69 70 /* Synchronisation stuff */ 71 spinlock_t lock; 72 int hw_unavailable; 73 struct work_struct reset_work; 74 75 /* Interrupt tasklets */ 76 struct tasklet_struct rx_tasklet; 77 struct list_head rx_list; 78 79 /* driver state */ 80 int open; 81 u16 last_linkstatus; 82 struct work_struct join_work; 83 struct work_struct wevent_work; 84 85 /* Net device stuff */ 86 struct net_device *ndev; 87 struct net_device_stats stats; 88 struct iw_statistics wstats; 89 90 /* Hardware control variables */ 91 hermes_t hw; 92 u16 txfid; 93 94 /* Capabilities of the hardware/firmware */ 95 fwtype_t firmware_type; 96 int ibss_port; 97 int nicbuf_size; 98 u16 channel_mask; 99 100 /* Boolean capabilities */ 101 unsigned int has_ibss:1; 102 unsigned int has_port3:1; 103 unsigned int has_wep:1; 104 unsigned int has_big_wep:1; 105 unsigned int has_mwo:1; 106 unsigned int has_pm:1; 107 unsigned int has_preamble:1; 108 unsigned int has_sensitivity:1; 109 unsigned int has_hostscan:1; 110 unsigned int has_alt_txcntl:1; 111 unsigned int has_ext_scan:1; 112 unsigned int has_wpa:1; 113 unsigned int do_fw_download:1; 114 unsigned int broken_disableport:1; 115 unsigned int broken_monitor:1; 116 unsigned int prefer_port3:1; 117 118 /* Configuration paramaters */ 119 enum nl80211_iftype iw_mode; 120 enum orinoco_alg encode_alg; 121 u16 wep_restrict, tx_key; 122 struct key_params keys[ORINOCO_MAX_KEYS]; 123 124 int bitratemode; 125 char nick[IW_ESSID_MAX_SIZE+1]; 126 char desired_essid[IW_ESSID_MAX_SIZE+1]; 127 char desired_bssid[ETH_ALEN]; 128 int bssid_fixed; 129 u16 frag_thresh, mwo_robust; 130 u16 channel; 131 u16 ap_density, rts_thresh; 132 u16 pm_on, pm_mcast, pm_period, pm_timeout; 133 u16 preamble; 134#ifdef WIRELESS_SPY 135 struct iw_spy_data spy_data; /* iwspy support */ 136 struct iw_public_data wireless_data; 137#endif 138 139 /* Configuration dependent variables */ 140 int port_type, createibss; 141 int promiscuous, mc_count; 142 143 /* Scanning support */ 144 struct cfg80211_scan_request *scan_request; 145 struct work_struct process_scan; 146 struct list_head scan_list; 147 spinlock_t scan_lock; /* protects the scan list */ 148 149 /* WPA support */ 150 u8 *wpa_ie; 151 int wpa_ie_len; 152 153 struct crypto_hash *rx_tfm_mic; 154 struct crypto_hash *tx_tfm_mic; 155 156 unsigned int wpa_enabled:1; 157 unsigned int tkip_cm_active:1; 158 unsigned int key_mgmt:3; 159 160#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP) 161 /* Cached in memory firmware to use during ->resume. */ 162 const struct firmware *cached_pri_fw; 163 const struct firmware *cached_fw; 164#endif 165 166 struct notifier_block pm_notifier; 167}; 168 169#ifdef ORINOCO_DEBUG 170extern int orinoco_debug; 171#define DEBUG(n, args...) do { \ 172 if (orinoco_debug > (n)) \ 173 printk(KERN_DEBUG args); \ 174} while (0) 175#else 176#define DEBUG(n, args...) do { } while (0) 177#endif /* ORINOCO_DEBUG */ 178 179/********************************************************************/ 180/* Exported prototypes */ 181/********************************************************************/ 182 183extern struct orinoco_private *alloc_orinocodev( 184 int sizeof_card, struct device *device, 185 int (*hard_reset)(struct orinoco_private *), 186 int (*stop_fw)(struct orinoco_private *, int)); 187extern void free_orinocodev(struct orinoco_private *priv); 188extern int orinoco_init(struct orinoco_private *priv); 189extern int orinoco_if_add(struct orinoco_private *priv, 190 unsigned long base_addr, 191 unsigned int irq); 192extern void orinoco_if_del(struct orinoco_private *priv); 193extern int orinoco_up(struct orinoco_private *priv); 194extern void orinoco_down(struct orinoco_private *priv); 195extern irqreturn_t orinoco_interrupt(int irq, void *dev_id); 196 197/********************************************************************/ 198/* Locking and synchronization functions */ 199/********************************************************************/ 200 201static inline int orinoco_lock(struct orinoco_private *priv, 202 unsigned long *flags) 203{ 204 spin_lock_irqsave(&priv->lock, *flags); 205 if (priv->hw_unavailable) { 206 DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n", 207 priv->ndev); 208 spin_unlock_irqrestore(&priv->lock, *flags); 209 return -EBUSY; 210 } 211 return 0; 212} 213 214static inline void orinoco_unlock(struct orinoco_private *priv, 215 unsigned long *flags) 216{ 217 spin_unlock_irqrestore(&priv->lock, *flags); 218} 219 220/*** Navigate from net_device to orinoco_private ***/ 221static inline struct orinoco_private *ndev_priv(struct net_device *dev) 222{ 223 struct wireless_dev *wdev = netdev_priv(dev); 224 return wdev_priv(wdev); 225} 226#endif /* _ORINOCO_H */