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 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_hash *rx_tfm_mic; 156 struct crypto_hash *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 172extern 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 185struct 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)); 188void free_orinocodev(struct orinoco_private *priv); 189int orinoco_init(struct orinoco_private *priv); 190int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr, 191 unsigned int irq, const struct net_device_ops *ops); 192void orinoco_if_del(struct orinoco_private *priv); 193int orinoco_up(struct orinoco_private *priv); 194void orinoco_down(struct orinoco_private *priv); 195irqreturn_t orinoco_interrupt(int irq, void *dev_id); 196 197void __orinoco_ev_info(struct net_device *dev, struct hermes *hw); 198void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw); 199 200int 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 */ 207int orinoco_open(struct net_device *dev); 208int orinoco_stop(struct net_device *dev); 209struct net_device_stats *orinoco_get_stats(struct net_device *dev); 210void orinoco_set_multicast_list(struct net_device *dev); 211int orinoco_change_mtu(struct net_device *dev, int new_mtu); 212void orinoco_tx_timeout(struct net_device *dev); 213 214/********************************************************************/ 215/* Locking and synchronization functions */ 216/********************************************************************/ 217 218static 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 231static inline void orinoco_unlock(struct orinoco_private *priv, 232 unsigned long *flags) 233{ 234 priv->hw.ops->unlock_irqrestore(&priv->lock, flags); 235} 236 237static inline void orinoco_lock_irq(struct orinoco_private *priv) 238{ 239 priv->hw.ops->lock_irq(&priv->lock); 240} 241 242static 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 ***/ 248static 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