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 32 struct orinoco_key { 33 __le16 len; /* always stored as little-endian */ 34 char data[ORINOCO_MAX_KEY_SIZE]; 35 } __packed; 36 37 #define TKIP_KEYLEN 16 38 #define MIC_KEYLEN 8 39 40 struct orinoco_tkip_key { 41 u8 tkip[TKIP_KEYLEN]; 42 u8 tx_mic[MIC_KEYLEN]; 43 u8 rx_mic[MIC_KEYLEN]; 44 }; 45 46 enum orinoco_alg { 47 ORINOCO_ALG_NONE, 48 ORINOCO_ALG_WEP, 49 ORINOCO_ALG_TKIP 50 }; 51 52 enum fwtype { 53 FIRMWARE_TYPE_AGERE, 54 FIRMWARE_TYPE_INTERSIL, 55 FIRMWARE_TYPE_SYMBOL 56 }; 57 58 struct firmware; 59 60 struct 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 struct hermes hw; 92 u16 txfid; 93 94 /* Capabilities of the hardware/firmware */ 95 enum fwtype 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 u16 short_retry_limit, long_retry_limit; 135 u16 retry_lifetime; 136 #ifdef WIRELESS_SPY 137 struct iw_spy_data spy_data; /* iwspy support */ 138 struct iw_public_data wireless_data; 139 #endif 140 141 /* Configuration dependent variables */ 142 int port_type, createibss; 143 int promiscuous, mc_count; 144 145 /* Scanning support */ 146 struct cfg80211_scan_request *scan_request; 147 struct work_struct process_scan; 148 struct list_head scan_list; 149 spinlock_t scan_lock; /* protects the scan list */ 150 151 /* WPA support */ 152 u8 *wpa_ie; 153 int wpa_ie_len; 154 155 struct crypto_shash *rx_tfm_mic; 156 struct crypto_shash *tx_tfm_mic; 157 158 unsigned int wpa_enabled:1; 159 unsigned int tkip_cm_active:1; 160 unsigned int key_mgmt:3; 161 162 #if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP) 163 /* Cached in memory firmware to use during ->resume. */ 164 const struct firmware *cached_pri_fw; 165 const struct firmware *cached_fw; 166 #endif 167 168 struct notifier_block pm_notifier; 169 }; 170 171 #ifdef ORINOCO_DEBUG 172 extern int orinoco_debug; 173 #define DEBUG(n, args...) do { \ 174 if (orinoco_debug > (n)) \ 175 printk(KERN_DEBUG args); \ 176 } while (0) 177 #else 178 #define DEBUG(n, args...) do { } while (0) 179 #endif /* ORINOCO_DEBUG */ 180 181 /********************************************************************/ 182 /* Exported prototypes */ 183 /********************************************************************/ 184 185 struct orinoco_private *alloc_orinocodev(int sizeof_card, struct device *device, 186 int (*hard_reset)(struct orinoco_private *), 187 int (*stop_fw)(struct orinoco_private *, int)); 188 void free_orinocodev(struct orinoco_private *priv); 189 int orinoco_init(struct orinoco_private *priv); 190 int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr, 191 unsigned int irq, const struct net_device_ops *ops); 192 void orinoco_if_del(struct orinoco_private *priv); 193 int orinoco_up(struct orinoco_private *priv); 194 void orinoco_down(struct orinoco_private *priv); 195 irqreturn_t orinoco_interrupt(int irq, void *dev_id); 196 197 void __orinoco_ev_info(struct net_device *dev, struct hermes *hw); 198 void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw); 199 200 int orinoco_process_xmit_skb(struct sk_buff *skb, 201 struct net_device *dev, 202 struct orinoco_private *priv, 203 int *tx_control, 204 u8 *mic); 205 206 /* Common ndo functions exported for reuse by orinoco_usb */ 207 int orinoco_open(struct net_device *dev); 208 int orinoco_stop(struct net_device *dev); 209 struct net_device_stats *orinoco_get_stats(struct net_device *dev); 210 void orinoco_set_multicast_list(struct net_device *dev); 211 int orinoco_change_mtu(struct net_device *dev, int new_mtu); 212 void orinoco_tx_timeout(struct net_device *dev); 213 214 /********************************************************************/ 215 /* Locking and synchronization functions */ 216 /********************************************************************/ 217 218 static inline int orinoco_lock(struct orinoco_private *priv, 219 unsigned long *flags) 220 { 221 priv->hw.ops->lock_irqsave(&priv->lock, flags); 222 if (priv->hw_unavailable) { 223 DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n", 224 priv->ndev); 225 priv->hw.ops->unlock_irqrestore(&priv->lock, flags); 226 return -EBUSY; 227 } 228 return 0; 229 } 230 231 static inline void orinoco_unlock(struct orinoco_private *priv, 232 unsigned long *flags) 233 { 234 priv->hw.ops->unlock_irqrestore(&priv->lock, flags); 235 } 236 237 static inline void orinoco_lock_irq(struct orinoco_private *priv) 238 { 239 priv->hw.ops->lock_irq(&priv->lock); 240 } 241 242 static inline void orinoco_unlock_irq(struct orinoco_private *priv) 243 { 244 priv->hw.ops->unlock_irq(&priv->lock); 245 } 246 247 /*** Navigate from net_device to orinoco_private ***/ 248 static inline struct orinoco_private *ndev_priv(struct net_device *dev) 249 { 250 struct wireless_dev *wdev = netdev_priv(dev); 251 return wdev_priv(wdev); 252 } 253 #endif /* _ORINOCO_H */ 254