xref: /linux/drivers/staging/ks7010/ks_wlan.h (revision fcc8487d477a3452a1d0ccbdd4c5e0e1e3cb8bed)
1 /*
2  *   Driver for KeyStream IEEE802.11 b/g wireless LAN cards.
3  *
4  *   Copyright (C) 2006-2008 KeyStream Corp.
5  *   Copyright (C) 2009 Renesas Technology Corp.
6  *
7  *   This program is free software; you can redistribute it and/or modify
8  *   it under the terms of the GNU General Public License version 2 as
9  *   published by the Free Software Foundation.
10  */
11 
12 #ifndef _KS_WLAN_H
13 #define _KS_WLAN_H
14 
15 #define WPS
16 
17 #include <linux/interrupt.h>
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 
21 #include <linux/spinlock.h>	/* spinlock_t */
22 #include <linux/sched.h>	/* wait_queue_head_t */
23 #include <linux/types.h>	/* pid_t */
24 #include <linux/netdevice.h>	/* struct net_device_stats,  struct sk_buff */
25 #include <linux/etherdevice.h>
26 #include <linux/wireless.h>
27 #include <linux/atomic.h>	/* struct atomic_t */
28 #include <linux/timer.h>	/* struct timer_list */
29 #include <linux/string.h>
30 #include <linux/completion.h>	/* struct completion */
31 #include <linux/workqueue.h>
32 
33 #include <linux/io.h>
34 
35 #include "ks7010_sdio.h"
36 
37 #ifdef KS_WLAN_DEBUG
38 #define DPRINTK(n, fmt, args...) \
39 	do { \
40 		if (KS_WLAN_DEBUG > (n)) \
41 			pr_notice("%s: "fmt, __func__, ## args); \
42 	} while (0)
43 #else
44 #define DPRINTK(n, fmt, args...)
45 #endif
46 
47 struct ks_wlan_parameter {
48 	u8 operation_mode;	/* Operation Mode */
49 	u8 channel;	/*  Channel */
50 	u8 tx_rate;	/*  Transmit Rate */
51 	struct {
52 		u8 size;
53 		u8 body[16];
54 	} rate_set;
55 	u8 bssid[ETH_ALEN];	/* BSSID */
56 	struct {
57 		u8 size;
58 		u8 body[32 + 1];
59 	} ssid;	/*  SSID */
60 	u8 preamble;	/*  Preamble */
61 	u8 power_mgmt;
62 	u32 scan_type;	/*  AP List Scan Type */
63 #define BEACON_LOST_COUNT_MIN 0
64 #define BEACON_LOST_COUNT_MAX 65535
65 	u32 beacon_lost_count;	/*  Beacon Lost Count */
66 	u32 rts;	/*  RTS Threashold */
67 	u32 fragment;	/*  Fragmentation Threashold */
68 	u32 privacy_invoked;
69 	u32 wep_index;
70 	struct {
71 		u8 size;
72 		u8 val[13 * 2 + 1];
73 	} wep_key[4];
74 	u16 authenticate_type;
75 	u16 phy_type;	/* 11b/11g/11bg mode type */
76 	u16 cts_mode;	/* for 11g/11bg mode cts mode */
77 	u16 phy_info_timer;	/* phy information timer */
78 };
79 
80 enum {
81 	DEVICE_STATE_OFF = 0,	/* this means hw_unavailable is != 0 */
82 	DEVICE_STATE_PREBOOT,	/* we are in a pre-boot state (empty RAM) */
83 	DEVICE_STATE_BOOT,	/* boot state (fw upload, run fw) */
84 	DEVICE_STATE_PREINIT,	/* pre-init state */
85 	DEVICE_STATE_INIT,	/* init state (restore MIB backup to device) */
86 	DEVICE_STATE_READY,	/* driver&device are in operational state */
87 	DEVICE_STATE_SLEEP	/* device in sleep mode */
88 };
89 
90 /* SME flag */
91 #define SME_MODE_SET	    BIT(0)
92 #define SME_RTS             BIT(1)
93 #define SME_FRAG            BIT(2)
94 #define SME_WEP_FLAG        BIT(3)
95 #define SME_WEP_INDEX       BIT(4)
96 #define SME_WEP_VAL1        BIT(5)
97 #define SME_WEP_VAL2        BIT(6)
98 #define SME_WEP_VAL3        BIT(7)
99 #define SME_WEP_VAL4        BIT(8)
100 #define SME_WEP_VAL_MASK    (SME_WEP_VAL1 | SME_WEP_VAL2 | SME_WEP_VAL3 | SME_WEP_VAL4)
101 #define SME_RSN             BIT(9)
102 #define SME_RSN_MULTICAST   BIT(10)
103 #define SME_RSN_UNICAST	    BIT(11)
104 #define SME_RSN_AUTH	    BIT(12)
105 
106 #define SME_AP_SCAN         BIT(13)
107 #define SME_MULTICAST       BIT(14)
108 
109 /* SME Event */
110 enum {
111 	SME_START,
112 
113 	SME_MULTICAST_REQUEST,
114 	SME_MACADDRESS_SET_REQUEST,
115 	SME_BSS_SCAN_REQUEST,
116 	SME_SET_FLAG,
117 	SME_SET_TXKEY,
118 	SME_SET_KEY1,
119 	SME_SET_KEY2,
120 	SME_SET_KEY3,
121 	SME_SET_KEY4,
122 	SME_SET_PMK_TSC,
123 	SME_SET_GMK1_TSC,
124 	SME_SET_GMK2_TSC,
125 	SME_SET_GMK3_TSC,
126 	SME_SET_PMKSA,
127 	SME_POW_MNGMT_REQUEST,
128 	SME_PHY_INFO_REQUEST,
129 	SME_MIC_FAILURE_REQUEST,
130 	SME_GET_MAC_ADDRESS,
131 	SME_GET_PRODUCT_VERSION,
132 	SME_STOP_REQUEST,
133 	SME_RTS_THRESHOLD_REQUEST,
134 	SME_FRAGMENTATION_THRESHOLD_REQUEST,
135 	SME_WEP_INDEX_REQUEST,
136 	SME_WEP_KEY1_REQUEST,
137 	SME_WEP_KEY2_REQUEST,
138 	SME_WEP_KEY3_REQUEST,
139 	SME_WEP_KEY4_REQUEST,
140 	SME_WEP_FLAG_REQUEST,
141 	SME_RSN_UCAST_REQUEST,
142 	SME_RSN_MCAST_REQUEST,
143 	SME_RSN_AUTH_REQUEST,
144 	SME_RSN_ENABLED_REQUEST,
145 	SME_RSN_MODE_REQUEST,
146 #ifdef WPS
147 	SME_WPS_ENABLE_REQUEST,
148 	SME_WPS_PROBE_REQUEST,
149 #endif
150 	SME_SET_GAIN,
151 	SME_GET_GAIN,
152 	SME_SLEEP_REQUEST,
153 	SME_SET_REGION,
154 	SME_MODE_SET_REQUEST,
155 	SME_START_REQUEST,
156 	SME_GET_EEPROM_CKSUM,
157 
158 	SME_MIC_FAILURE_CONFIRM,
159 	SME_START_CONFIRM,
160 
161 	SME_MULTICAST_CONFIRM,
162 	SME_BSS_SCAN_CONFIRM,
163 	SME_GET_CURRENT_AP,
164 	SME_POW_MNGMT_CONFIRM,
165 	SME_PHY_INFO_CONFIRM,
166 	SME_STOP_CONFIRM,
167 	SME_RTS_THRESHOLD_CONFIRM,
168 	SME_FRAGMENTATION_THRESHOLD_CONFIRM,
169 	SME_WEP_INDEX_CONFIRM,
170 	SME_WEP_KEY1_CONFIRM,
171 	SME_WEP_KEY2_CONFIRM,
172 	SME_WEP_KEY3_CONFIRM,
173 	SME_WEP_KEY4_CONFIRM,
174 	SME_WEP_FLAG_CONFIRM,
175 	SME_RSN_UCAST_CONFIRM,
176 	SME_RSN_MCAST_CONFIRM,
177 	SME_RSN_AUTH_CONFIRM,
178 	SME_RSN_ENABLED_CONFIRM,
179 	SME_RSN_MODE_CONFIRM,
180 	SME_MODE_SET_CONFIRM,
181 	SME_SLEEP_CONFIRM,
182 
183 	SME_RSN_SET_CONFIRM,
184 	SME_WEP_SET_CONFIRM,
185 	SME_TERMINATE,
186 
187 	SME_EVENT_SIZE	/* end */
188 };
189 
190 /* SME Status */
191 enum {
192 	SME_IDLE,
193 	SME_SETUP,
194 	SME_DISCONNECT,
195 	SME_CONNECT
196 };
197 
198 #define	SME_EVENT_BUFF_SIZE	128
199 
200 struct sme_info {
201 	int sme_status;
202 	int event_buff[SME_EVENT_BUFF_SIZE];
203 	unsigned int qhead;
204 	unsigned int qtail;
205 #ifdef KS_WLAN_DEBUG
206 	/* for debug */
207 	unsigned int max_event_count;
208 #endif
209 	spinlock_t sme_spin;
210 	unsigned long sme_flag;
211 };
212 
213 struct hostt_t {
214 	int buff[SME_EVENT_BUFF_SIZE];
215 	unsigned int qhead;
216 	unsigned int qtail;
217 };
218 
219 #define RSN_IE_BODY_MAX 64
220 struct rsn_ie_t {
221 	u8 id;	/* 0xdd = WPA or 0x30 = RSN */
222 	u8 size;	/* max ? 255 ? */
223 	u8 body[RSN_IE_BODY_MAX];
224 } __packed;
225 
226 #ifdef WPS
227 #define WPS_IE_BODY_MAX 255
228 struct wps_ie_t {
229 	u8 id;	/* 221 'dd <len> 00 50 F2 04' */
230 	u8 size;	/* max ? 255 ? */
231 	u8 body[WPS_IE_BODY_MAX];
232 } __packed;
233 #endif /* WPS */
234 
235 struct local_ap_t {
236 	u8 bssid[6];
237 	u8 rssi;
238 	u8 sq;
239 	struct {
240 		u8 size;
241 		u8 body[32];
242 		u8 ssid_pad;
243 	} ssid;
244 	struct {
245 		u8 size;
246 		u8 body[16];
247 		u8 rate_pad;
248 	} rate_set;
249 	u16 capability;
250 	u8 channel;
251 	u8 noise;
252 	struct rsn_ie_t wpa_ie;
253 	struct rsn_ie_t rsn_ie;
254 #ifdef WPS
255 	struct wps_ie_t wps_ie;
256 #endif /* WPS */
257 };
258 
259 #define LOCAL_APLIST_MAX 31
260 #define LOCAL_CURRENT_AP LOCAL_APLIST_MAX
261 struct local_aplist_t {
262 	int size;
263 	struct local_ap_t ap[LOCAL_APLIST_MAX + 1];
264 };
265 
266 struct local_gain_t {
267 	u8 TxMode;
268 	u8 RxMode;
269 	u8 TxGain;
270 	u8 RxGain;
271 };
272 
273 struct local_eeprom_sum_t {
274 	u8 type;
275 	u8 result;
276 };
277 
278 enum {
279 	EEPROM_OK,
280 	EEPROM_CHECKSUM_NONE,
281 	EEPROM_FW_NOT_SUPPORT,
282 	EEPROM_NG,
283 };
284 
285 /* Power Save Status */
286 enum {
287 	PS_NONE,
288 	PS_ACTIVE_SET,
289 	PS_SAVE_SET,
290 	PS_CONF_WAIT,
291 	PS_SNOOZE,
292 	PS_WAKEUP
293 };
294 
295 struct power_save_status_t {
296 	atomic_t status;	/* initialvalue 0 */
297 	struct completion wakeup_wait;
298 	atomic_t confirm_wait;
299 	atomic_t snooze_guard;
300 };
301 
302 struct sleep_status_t {
303 	atomic_t status;	/* initialvalue 0 */
304 	atomic_t doze_request;
305 	atomic_t wakeup_request;
306 };
307 
308 /* WPA */
309 struct scan_ext_t {
310 	unsigned int flag;
311 	char ssid[IW_ESSID_MAX_SIZE + 1];
312 };
313 
314 enum {
315 	CIPHER_NONE,
316 	CIPHER_WEP40,
317 	CIPHER_TKIP,
318 	CIPHER_CCMP,
319 	CIPHER_WEP104
320 };
321 
322 #define CIPHER_ID_WPA_NONE    "\x00\x50\xf2\x00"
323 #define CIPHER_ID_WPA_WEP40   "\x00\x50\xf2\x01"
324 #define CIPHER_ID_WPA_TKIP    "\x00\x50\xf2\x02"
325 #define CIPHER_ID_WPA_CCMP    "\x00\x50\xf2\x04"
326 #define CIPHER_ID_WPA_WEP104  "\x00\x50\xf2\x05"
327 
328 #define CIPHER_ID_WPA2_NONE   "\x00\x0f\xac\x00"
329 #define CIPHER_ID_WPA2_WEP40  "\x00\x0f\xac\x01"
330 #define CIPHER_ID_WPA2_TKIP   "\x00\x0f\xac\x02"
331 #define CIPHER_ID_WPA2_CCMP   "\x00\x0f\xac\x04"
332 #define CIPHER_ID_WPA2_WEP104 "\x00\x0f\xac\x05"
333 
334 #define CIPHER_ID_LEN    4
335 
336 enum {
337 	KEY_MGMT_802_1X,
338 	KEY_MGMT_PSK,
339 	KEY_MGMT_WPANONE,
340 };
341 
342 #define KEY_MGMT_ID_WPA_NONE     "\x00\x50\xf2\x00"
343 #define KEY_MGMT_ID_WPA_1X       "\x00\x50\xf2\x01"
344 #define KEY_MGMT_ID_WPA_PSK      "\x00\x50\xf2\x02"
345 #define KEY_MGMT_ID_WPA_WPANONE  "\x00\x50\xf2\xff"
346 
347 #define KEY_MGMT_ID_WPA2_NONE    "\x00\x0f\xac\x00"
348 #define KEY_MGMT_ID_WPA2_1X      "\x00\x0f\xac\x01"
349 #define KEY_MGMT_ID_WPA2_PSK     "\x00\x0f\xac\x02"
350 #define KEY_MGMT_ID_WPA2_WPANONE "\x00\x0f\xac\xff"
351 
352 #define KEY_MGMT_ID_LEN  4
353 
354 #define MIC_KEY_SIZE 8
355 
356 struct wpa_key_t {
357 	u32 ext_flags;	/* IW_ENCODE_EXT_xxx */
358 	u8 tx_seq[IW_ENCODE_SEQ_MAX_SIZE];	/* LSB first */
359 	u8 rx_seq[IW_ENCODE_SEQ_MAX_SIZE];	/* LSB first */
360 	struct sockaddr addr;	/* ff:ff:ff:ff:ff:ff for broadcast/multicast
361 				 * (group) keys or unicast address for
362 				 * individual keys
363 				 */
364 	u16 alg;
365 	u16 key_len;	/* WEP: 5 or 13, TKIP: 32, CCMP: 16 */
366 	u8 key_val[IW_ENCODING_TOKEN_MAX];
367 	u8 tx_mic_key[MIC_KEY_SIZE];
368 	u8 rx_mic_key[MIC_KEY_SIZE];
369 };
370 
371 #define WPA_KEY_INDEX_MAX 4
372 #define WPA_RX_SEQ_LEN 6
373 
374 struct mic_failure_t {
375 	u16 failure;	/* MIC Failure counter 0 or 1 or 2 */
376 	u16 counter;	/* 1sec counter 0-60 */
377 	u32 last_failure_time;
378 	int stop;	/* stop flag */
379 };
380 
381 struct wpa_status_t {
382 	int wpa_enabled;
383 	unsigned int rsn_enabled;
384 	int version;
385 	int pairwise_suite;	/* unicast cipher */
386 	int group_suite;	/* multicast cipher */
387 	int key_mgmt_suite;	/* authentication key management suite */
388 	int auth_alg;
389 	int txkey;
390 	struct wpa_key_t key[WPA_KEY_INDEX_MAX];
391 	struct scan_ext_t scan_ext;
392 	struct mic_failure_t mic_failure;
393 };
394 
395 #include <linux/list.h>
396 #define PMK_LIST_MAX 8
397 struct pmk_list_t {
398 	u16 size;
399 	struct list_head head;
400 	struct pmk_t {
401 		struct list_head list;
402 		u8 bssid[ETH_ALEN];
403 		u8 pmkid[IW_PMKID_LEN];
404 	} pmk[PMK_LIST_MAX];
405 };
406 
407 #ifdef WPS
408 struct wps_status_t {
409 	int wps_enabled;
410 	int ielen;
411 	u8 ie[255];
412 };
413 #endif /* WPS */
414 
415 struct ks_wlan_private {
416 	/* hardware information */
417 	struct ks_sdio_card *ks_sdio_card;
418 	struct workqueue_struct *wq;
419 	struct delayed_work rw_dwork;
420 	struct tasklet_struct rx_bh_task;
421 
422 	struct net_device *net_dev;
423 	int reg_net;	/* register_netdev */
424 	struct net_device_stats nstats;
425 	struct iw_statistics wstats;
426 
427 	struct completion confirm_wait;
428 
429 	/* trx device & sme */
430 	struct tx_device tx_dev;
431 	struct rx_device rx_dev;
432 	struct sme_info sme_i;
433 	u8 *rxp;
434 	unsigned int rx_size;
435 	struct tasklet_struct sme_task;
436 	struct work_struct wakeup_work;
437 	int scan_ind_count;
438 
439 	unsigned char eth_addr[ETH_ALEN];
440 
441 	struct local_aplist_t aplist;
442 	struct local_ap_t current_ap;
443 	struct power_save_status_t psstatus;
444 	struct sleep_status_t sleepstatus;
445 	struct wpa_status_t wpa;
446 	struct pmk_list_t pmklist;
447 	/* wireless parameter */
448 	struct ks_wlan_parameter reg;
449 	u8 current_rate;
450 
451 	char nick[IW_ESSID_MAX_SIZE + 1];
452 
453 	spinlock_t multicast_spin;
454 
455 	spinlock_t dev_read_lock;
456 	wait_queue_head_t devread_wait;
457 
458 	unsigned int need_commit;	/* for ioctl */
459 
460 	/* DeviceIoControl */
461 	int device_open_status;
462 	atomic_t event_count;
463 	atomic_t rec_count;
464 	int dev_count;
465 #define DEVICE_STOCK_COUNT 20
466 	unsigned char *dev_data[DEVICE_STOCK_COUNT];
467 	int dev_size[DEVICE_STOCK_COUNT];
468 
469 	/* ioctl : IOCTL_FIRMWARE_VERSION */
470 	unsigned char firmware_version[128 + 1];
471 	int version_size;
472 
473 	int mac_address_valid;	/* Mac Address Status */
474 
475 	int dev_state;
476 
477 	struct sk_buff *skb;
478 	unsigned int cur_rx;	/* Index into the Rx buffer of next Rx pkt. */
479 	/* spinlock_t lock; */
480 #define FORCE_DISCONNECT    0x80000000
481 #define CONNECT_STATUS_MASK 0x7FFFFFFF
482 	u32 connect_status;	/* connect status */
483 	int infra_status;	/* Infractructure status */
484 
485 	u8 data_buff[0x1000];
486 
487 	u8 scan_ssid_len;
488 	u8 scan_ssid[IW_ESSID_MAX_SIZE + 1];
489 	struct local_gain_t gain;
490 #ifdef WPS
491 	struct net_device *l2_dev;
492 	int l2_fd;
493 	struct wps_status_t wps;
494 #endif /* WPS */
495 	u8 sleep_mode;
496 
497 	u8 region;
498 	struct local_eeprom_sum_t eeprom_sum;
499 	u8 eeprom_checksum;
500 
501 	struct hostt_t hostt;
502 
503 	unsigned long last_doze;
504 	unsigned long last_wakeup;
505 
506 	uint wakeup_count;	/* for detect wakeup loop */
507 };
508 
509 int ks_wlan_net_start(struct net_device *dev);
510 int ks_wlan_net_stop(struct net_device *dev);
511 bool is_connect_status(u32 status);
512 bool is_disconnect_status(u32 status);
513 
514 #endif /* _KS_WLAN_H */
515