orinoco.h (6616B)
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} __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 52enum fwtype { 53 FIRMWARE_TYPE_AGERE, 54 FIRMWARE_TYPE_INTERSIL, 55 FIRMWARE_TYPE_SYMBOL 56}; 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 iw_statistics wstats; 88 89 /* Hardware control variables */ 90 struct hermes hw; 91 u16 txfid; 92 93 /* Capabilities of the hardware/firmware */ 94 enum fwtype firmware_type; 95 int ibss_port; 96 int nicbuf_size; 97 u16 channel_mask; 98 99 /* Boolean capabilities */ 100 unsigned int has_ibss:1; 101 unsigned int has_port3:1; 102 unsigned int has_wep:1; 103 unsigned int has_big_wep:1; 104 unsigned int has_mwo:1; 105 unsigned int has_pm:1; 106 unsigned int has_preamble:1; 107 unsigned int has_sensitivity:1; 108 unsigned int has_hostscan:1; 109 unsigned int has_alt_txcntl:1; 110 unsigned int has_ext_scan:1; 111 unsigned int has_wpa:1; 112 unsigned int do_fw_download:1; 113 unsigned int broken_disableport:1; 114 unsigned int broken_monitor:1; 115 unsigned int prefer_port3:1; 116 117 /* Configuration paramaters */ 118 enum nl80211_iftype iw_mode; 119 enum orinoco_alg encode_alg; 120 u16 wep_restrict, tx_key; 121 struct key_params keys[ORINOCO_MAX_KEYS]; 122 123 int bitratemode; 124 char nick[IW_ESSID_MAX_SIZE + 1]; 125 char desired_essid[IW_ESSID_MAX_SIZE + 1]; 126 char desired_bssid[ETH_ALEN]; 127 int bssid_fixed; 128 u16 frag_thresh, mwo_robust; 129 u16 channel; 130 u16 ap_density, rts_thresh; 131 u16 pm_on, pm_mcast, pm_period, pm_timeout; 132 u16 preamble; 133 u16 short_retry_limit, long_retry_limit; 134 u16 retry_lifetime; 135#ifdef WIRELESS_SPY 136 struct iw_spy_data spy_data; /* iwspy support */ 137 struct iw_public_data wireless_data; 138#endif 139 140 /* Configuration dependent variables */ 141 int port_type, createibss; 142 int promiscuous, mc_count; 143 144 /* Scanning support */ 145 struct cfg80211_scan_request *scan_request; 146 struct work_struct process_scan; 147 struct list_head scan_list; 148 spinlock_t scan_lock; /* protects the scan list */ 149 150 /* WPA support */ 151 u8 *wpa_ie; 152 int wpa_ie_len; 153 154 struct crypto_shash *rx_tfm_mic; 155 struct crypto_shash *tx_tfm_mic; 156 157 unsigned int wpa_enabled:1; 158 unsigned int tkip_cm_active:1; 159 unsigned int key_mgmt:3; 160 161#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP) 162 /* Cached in memory firmware to use during ->resume. */ 163 const struct firmware *cached_pri_fw; 164 const struct firmware *cached_fw; 165#endif 166 167 struct notifier_block pm_notifier; 168}; 169 170#ifdef ORINOCO_DEBUG 171extern int orinoco_debug; 172#define DEBUG(n, args...) do { \ 173 if (orinoco_debug > (n)) \ 174 printk(KERN_DEBUG args); \ 175} while (0) 176#else 177#define DEBUG(n, args...) do { } while (0) 178#endif /* ORINOCO_DEBUG */ 179 180/********************************************************************/ 181/* Exported prototypes */ 182/********************************************************************/ 183 184struct orinoco_private *alloc_orinocodev(int sizeof_card, struct device *device, 185 int (*hard_reset)(struct orinoco_private *), 186 int (*stop_fw)(struct orinoco_private *, int)); 187void free_orinocodev(struct orinoco_private *priv); 188int orinoco_init(struct orinoco_private *priv); 189int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr, 190 unsigned int irq, const struct net_device_ops *ops); 191void orinoco_if_del(struct orinoco_private *priv); 192int orinoco_up(struct orinoco_private *priv); 193void orinoco_down(struct orinoco_private *priv); 194irqreturn_t orinoco_interrupt(int irq, void *dev_id); 195 196void __orinoco_ev_info(struct net_device *dev, struct hermes *hw); 197void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw); 198 199int orinoco_process_xmit_skb(struct sk_buff *skb, 200 struct net_device *dev, 201 struct orinoco_private *priv, 202 int *tx_control, 203 u8 *mic); 204 205/* Common ndo functions exported for reuse by orinoco_usb */ 206int orinoco_open(struct net_device *dev); 207int orinoco_stop(struct net_device *dev); 208void orinoco_set_multicast_list(struct net_device *dev); 209int orinoco_change_mtu(struct net_device *dev, int new_mtu); 210void orinoco_tx_timeout(struct net_device *dev, unsigned int txqueue); 211 212/********************************************************************/ 213/* Locking and synchronization functions */ 214/********************************************************************/ 215 216static inline int orinoco_lock(struct orinoco_private *priv, 217 unsigned long *flags) 218{ 219 priv->hw.ops->lock_irqsave(&priv->lock, flags); 220 if (priv->hw_unavailable) { 221 DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n", 222 priv->ndev); 223 priv->hw.ops->unlock_irqrestore(&priv->lock, flags); 224 return -EBUSY; 225 } 226 return 0; 227} 228 229static inline void orinoco_unlock(struct orinoco_private *priv, 230 unsigned long *flags) 231{ 232 priv->hw.ops->unlock_irqrestore(&priv->lock, flags); 233} 234 235static inline void orinoco_lock_irq(struct orinoco_private *priv) 236{ 237 priv->hw.ops->lock_irq(&priv->lock); 238} 239 240static inline void orinoco_unlock_irq(struct orinoco_private *priv) 241{ 242 priv->hw.ops->unlock_irq(&priv->lock); 243} 244 245/*** Navigate from net_device to orinoco_private ***/ 246static inline struct orinoco_private *ndev_priv(struct net_device *dev) 247{ 248 struct wireless_dev *wdev = netdev_priv(dev); 249 return wdev_priv(wdev); 250} 251#endif /* _ORINOCO_H */