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 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
171  extern 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  
184  struct 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));
187  void free_orinocodev(struct orinoco_private *priv);
188  int orinoco_init(struct orinoco_private *priv);
189  int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr,
190  		   unsigned int irq, const struct net_device_ops *ops);
191  void orinoco_if_del(struct orinoco_private *priv);
192  int orinoco_up(struct orinoco_private *priv);
193  void orinoco_down(struct orinoco_private *priv);
194  irqreturn_t orinoco_interrupt(int irq, void *dev_id);
195  
196  void __orinoco_ev_info(struct net_device *dev, struct hermes *hw);
197  void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw);
198  
199  int 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 */
206  int orinoco_open(struct net_device *dev);
207  int orinoco_stop(struct net_device *dev);
208  void orinoco_set_multicast_list(struct net_device *dev);
209  int orinoco_change_mtu(struct net_device *dev, int new_mtu);
210  void orinoco_tx_timeout(struct net_device *dev);
211  
212  /********************************************************************/
213  /* Locking and synchronization functions                            */
214  /********************************************************************/
215  
orinoco_lock(struct orinoco_private * priv,unsigned long * flags)216  static 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  
orinoco_unlock(struct orinoco_private * priv,unsigned long * flags)229  static inline void orinoco_unlock(struct orinoco_private *priv,
230  				  unsigned long *flags)
231  {
232  	priv->hw.ops->unlock_irqrestore(&priv->lock, flags);
233  }
234  
orinoco_lock_irq(struct orinoco_private * priv)235  static inline void orinoco_lock_irq(struct orinoco_private *priv)
236  {
237  	priv->hw.ops->lock_irq(&priv->lock);
238  }
239  
orinoco_unlock_irq(struct orinoco_private * priv)240  static 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 ***/
ndev_priv(struct net_device * dev)246  static 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 */
252