1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Driver for KeyStream IEEE802.11 b/g wireless LAN cards. |
4 | * |
5 | * Copyright (C) 2006-2008 KeyStream Corp. |
6 | * Copyright (C) 2009 Renesas Technology Corp. |
7 | */ |
8 | |
9 | #ifndef _KS_WLAN_H |
10 | #define _KS_WLAN_H |
11 | |
12 | #include <linux/atomic.h> |
13 | #include <linux/circ_buf.h> |
14 | #include <linux/completion.h> |
15 | #include <linux/netdevice.h> |
16 | #include <linux/sched.h> |
17 | #include <linux/spinlock.h> |
18 | #include <linux/wireless.h> |
19 | |
20 | struct ks_wlan_parameter { |
21 | u8 operation_mode; |
22 | u8 channel; |
23 | u8 tx_rate; |
24 | struct { |
25 | u8 size; |
26 | u8 body[16]; |
27 | } rate_set; |
28 | u8 bssid[ETH_ALEN]; |
29 | struct { |
30 | u8 size; |
31 | u8 body[32 + 1]; |
32 | } ssid; |
33 | u8 preamble; |
34 | u8 power_mgmt; |
35 | u32 scan_type; |
36 | #define BEACON_LOST_COUNT_MAX 65535 |
37 | u32 beacon_lost_count; |
38 | u32 rts; |
39 | u32 fragment; |
40 | u32 privacy_invoked; |
41 | u32 wep_index; |
42 | struct { |
43 | u8 size; |
44 | u8 val[13 * 2 + 1]; |
45 | } wep_key[4]; |
46 | u16 authenticate_type; |
47 | u16 phy_type; |
48 | u16 cts_mode; |
49 | u16 phy_info_timer; |
50 | }; |
51 | |
52 | enum { |
53 | DEVICE_STATE_OFF = 0, /* this means hw_unavailable is != 0 */ |
54 | DEVICE_STATE_PREBOOT, /* we are in a pre-boot state (empty RAM) */ |
55 | DEVICE_STATE_BOOT, /* boot state (fw upload, run fw) */ |
56 | DEVICE_STATE_PREINIT, /* pre-init state */ |
57 | DEVICE_STATE_INIT, /* init state (restore MIB backup to device) */ |
58 | DEVICE_STATE_READY, /* driver&device are in operational state */ |
59 | DEVICE_STATE_SLEEP /* device in sleep mode */ |
60 | }; |
61 | |
62 | /* SME flag */ |
63 | #define SME_MODE_SET BIT(0) |
64 | #define SME_RTS BIT(1) |
65 | #define SME_FRAG BIT(2) |
66 | #define SME_WEP_FLAG BIT(3) |
67 | #define SME_WEP_INDEX BIT(4) |
68 | #define SME_WEP_VAL1 BIT(5) |
69 | #define SME_WEP_VAL2 BIT(6) |
70 | #define SME_WEP_VAL3 BIT(7) |
71 | #define SME_WEP_VAL4 BIT(8) |
72 | #define SME_WEP_VAL_MASK GENMASK(8, 5) |
73 | #define SME_RSN BIT(9) |
74 | #define SME_RSN_MULTICAST BIT(10) |
75 | #define SME_RSN_UNICAST BIT(11) |
76 | #define SME_RSN_AUTH BIT(12) |
77 | |
78 | #define SME_AP_SCAN BIT(13) |
79 | #define SME_MULTICAST BIT(14) |
80 | |
81 | /* SME Event */ |
82 | enum { |
83 | SME_START, |
84 | |
85 | SME_MULTICAST_REQUEST, |
86 | SME_MACADDRESS_SET_REQUEST, |
87 | SME_BSS_SCAN_REQUEST, |
88 | SME_SET_FLAG, |
89 | SME_SET_TXKEY, |
90 | SME_SET_KEY1, |
91 | SME_SET_KEY2, |
92 | SME_SET_KEY3, |
93 | SME_SET_KEY4, |
94 | SME_SET_PMK_TSC, |
95 | SME_SET_GMK1_TSC, |
96 | SME_SET_GMK2_TSC, |
97 | SME_SET_GMK3_TSC, |
98 | SME_SET_PMKSA, |
99 | SME_POW_MNGMT_REQUEST, |
100 | SME_PHY_INFO_REQUEST, |
101 | SME_MIC_FAILURE_REQUEST, |
102 | SME_GET_MAC_ADDRESS, |
103 | SME_GET_PRODUCT_VERSION, |
104 | SME_STOP_REQUEST, |
105 | SME_RTS_THRESHOLD_REQUEST, |
106 | SME_FRAGMENTATION_THRESHOLD_REQUEST, |
107 | SME_WEP_INDEX_REQUEST, |
108 | SME_WEP_KEY1_REQUEST, |
109 | SME_WEP_KEY2_REQUEST, |
110 | SME_WEP_KEY3_REQUEST, |
111 | SME_WEP_KEY4_REQUEST, |
112 | SME_WEP_FLAG_REQUEST, |
113 | SME_RSN_UCAST_REQUEST, |
114 | SME_RSN_MCAST_REQUEST, |
115 | SME_RSN_AUTH_REQUEST, |
116 | SME_RSN_ENABLED_REQUEST, |
117 | SME_RSN_MODE_REQUEST, |
118 | SME_WPS_ENABLE_REQUEST, |
119 | SME_WPS_PROBE_REQUEST, |
120 | SME_SET_GAIN, |
121 | SME_GET_GAIN, |
122 | SME_SLEEP_REQUEST, |
123 | SME_SET_REGION, |
124 | SME_MODE_SET_REQUEST, |
125 | SME_START_REQUEST, |
126 | SME_GET_EEPROM_CKSUM, |
127 | |
128 | SME_MIC_FAILURE_CONFIRM, |
129 | SME_START_CONFIRM, |
130 | |
131 | SME_MULTICAST_CONFIRM, |
132 | SME_BSS_SCAN_CONFIRM, |
133 | SME_GET_CURRENT_AP, |
134 | SME_POW_MNGMT_CONFIRM, |
135 | SME_PHY_INFO_CONFIRM, |
136 | SME_STOP_CONFIRM, |
137 | SME_RTS_THRESHOLD_CONFIRM, |
138 | SME_FRAGMENTATION_THRESHOLD_CONFIRM, |
139 | SME_WEP_INDEX_CONFIRM, |
140 | SME_WEP_KEY1_CONFIRM, |
141 | SME_WEP_KEY2_CONFIRM, |
142 | SME_WEP_KEY3_CONFIRM, |
143 | SME_WEP_KEY4_CONFIRM, |
144 | SME_WEP_FLAG_CONFIRM, |
145 | SME_RSN_UCAST_CONFIRM, |
146 | SME_RSN_MCAST_CONFIRM, |
147 | SME_RSN_AUTH_CONFIRM, |
148 | SME_RSN_ENABLED_CONFIRM, |
149 | SME_RSN_MODE_CONFIRM, |
150 | SME_MODE_SET_CONFIRM, |
151 | SME_SLEEP_CONFIRM, |
152 | |
153 | SME_RSN_SET_CONFIRM, |
154 | SME_WEP_SET_CONFIRM, |
155 | SME_TERMINATE, |
156 | |
157 | SME_EVENT_SIZE |
158 | }; |
159 | |
160 | /* SME Status */ |
161 | enum { |
162 | SME_IDLE, |
163 | SME_SETUP, |
164 | SME_DISCONNECT, |
165 | SME_CONNECT |
166 | }; |
167 | |
168 | #define SME_EVENT_BUFF_SIZE 128 |
169 | |
170 | struct sme_info { |
171 | int sme_status; |
172 | int event_buff[SME_EVENT_BUFF_SIZE]; |
173 | unsigned int qhead; |
174 | unsigned int qtail; |
175 | spinlock_t sme_spin; |
176 | unsigned long sme_flag; |
177 | }; |
178 | |
179 | struct hostt { |
180 | int buff[SME_EVENT_BUFF_SIZE]; |
181 | unsigned int qhead; |
182 | unsigned int qtail; |
183 | }; |
184 | |
185 | #define RSN_IE_BODY_MAX 64 |
186 | struct rsn_ie { |
187 | u8 id; /* 0xdd = WPA or 0x30 = RSN */ |
188 | u8 size; /* max ? 255 ? */ |
189 | u8 body[RSN_IE_BODY_MAX]; |
190 | } __packed; |
191 | |
192 | #define WPA_INFO_ELEM_ID 0xdd |
193 | #define RSN_INFO_ELEM_ID 0x30 |
194 | |
195 | #define WPS_IE_BODY_MAX 255 |
196 | struct wps_ie { |
197 | u8 id; /* 221 'dd <len> 00 50 F2 04' */ |
198 | u8 size; /* max ? 255 ? */ |
199 | u8 body[WPS_IE_BODY_MAX]; |
200 | } __packed; |
201 | |
202 | struct local_ap { |
203 | u8 bssid[6]; |
204 | u8 ; |
205 | u8 sq; |
206 | struct { |
207 | u8 size; |
208 | u8 body[32]; |
209 | u8 ssid_pad; |
210 | } ssid; |
211 | struct { |
212 | u8 size; |
213 | u8 body[16]; |
214 | u8 rate_pad; |
215 | } rate_set; |
216 | u16 capability; |
217 | u8 channel; |
218 | u8 noise; |
219 | struct rsn_ie wpa_ie; |
220 | struct rsn_ie rsn_ie; |
221 | struct wps_ie wps_ie; |
222 | }; |
223 | |
224 | #define LOCAL_APLIST_MAX 31 |
225 | #define LOCAL_CURRENT_AP LOCAL_APLIST_MAX |
226 | struct local_aplist { |
227 | int size; |
228 | struct local_ap ap[LOCAL_APLIST_MAX + 1]; |
229 | }; |
230 | |
231 | struct local_gain { |
232 | u8 tx_mode; |
233 | u8 rx_mode; |
234 | u8 tx_gain; |
235 | u8 rx_gain; |
236 | }; |
237 | |
238 | struct local_eeprom_sum { |
239 | u8 type; |
240 | u8 result; |
241 | }; |
242 | |
243 | enum { |
244 | EEPROM_OK, |
245 | EEPROM_CHECKSUM_NONE, |
246 | EEPROM_FW_NOT_SUPPORT, |
247 | EEPROM_NG, |
248 | }; |
249 | |
250 | /* Power Save Status */ |
251 | enum { |
252 | PS_NONE, |
253 | PS_ACTIVE_SET, |
254 | PS_SAVE_SET, |
255 | PS_CONF_WAIT, |
256 | PS_SNOOZE, |
257 | PS_WAKEUP |
258 | }; |
259 | |
260 | struct power_save_status { |
261 | atomic_t status; /* initialvalue 0 */ |
262 | struct completion wakeup_wait; |
263 | atomic_t confirm_wait; |
264 | atomic_t snooze_guard; |
265 | }; |
266 | |
267 | struct sleep_status { |
268 | atomic_t status; /* initialvalue 0 */ |
269 | atomic_t doze_request; |
270 | atomic_t wakeup_request; |
271 | }; |
272 | |
273 | /* WPA */ |
274 | struct scan_ext { |
275 | unsigned int flag; |
276 | char ssid[IW_ESSID_MAX_SIZE + 1]; |
277 | }; |
278 | |
279 | #define CIPHER_ID_WPA_NONE "\x00\x50\xf2\x00" |
280 | #define CIPHER_ID_WPA_WEP40 "\x00\x50\xf2\x01" |
281 | #define CIPHER_ID_WPA_TKIP "\x00\x50\xf2\x02" |
282 | #define CIPHER_ID_WPA_CCMP "\x00\x50\xf2\x04" |
283 | #define CIPHER_ID_WPA_WEP104 "\x00\x50\xf2\x05" |
284 | |
285 | #define CIPHER_ID_WPA2_NONE "\x00\x0f\xac\x00" |
286 | #define CIPHER_ID_WPA2_WEP40 "\x00\x0f\xac\x01" |
287 | #define CIPHER_ID_WPA2_TKIP "\x00\x0f\xac\x02" |
288 | #define CIPHER_ID_WPA2_CCMP "\x00\x0f\xac\x04" |
289 | #define CIPHER_ID_WPA2_WEP104 "\x00\x0f\xac\x05" |
290 | |
291 | #define CIPHER_ID_LEN 4 |
292 | |
293 | enum { |
294 | KEY_MGMT_802_1X, |
295 | KEY_MGMT_PSK, |
296 | KEY_MGMT_WPANONE, |
297 | }; |
298 | |
299 | #define KEY_MGMT_ID_WPA_NONE "\x00\x50\xf2\x00" |
300 | #define KEY_MGMT_ID_WPA_1X "\x00\x50\xf2\x01" |
301 | #define KEY_MGMT_ID_WPA_PSK "\x00\x50\xf2\x02" |
302 | #define KEY_MGMT_ID_WPA_WPANONE "\x00\x50\xf2\xff" |
303 | |
304 | #define KEY_MGMT_ID_WPA2_NONE "\x00\x0f\xac\x00" |
305 | #define KEY_MGMT_ID_WPA2_1X "\x00\x0f\xac\x01" |
306 | #define KEY_MGMT_ID_WPA2_PSK "\x00\x0f\xac\x02" |
307 | #define KEY_MGMT_ID_WPA2_WPANONE "\x00\x0f\xac\xff" |
308 | |
309 | #define KEY_MGMT_ID_LEN 4 |
310 | |
311 | #define MIC_KEY_SIZE 8 |
312 | |
313 | struct wpa_key { |
314 | u32 ext_flags; /* IW_ENCODE_EXT_xxx */ |
315 | u8 tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ |
316 | u8 rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ |
317 | struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast |
318 | * (group) keys or unicast address for |
319 | * individual keys |
320 | */ |
321 | u16 alg; |
322 | u16 key_len; /* WEP: 5 or 13, TKIP: 32, CCMP: 16 */ |
323 | u8 key_val[IW_ENCODING_TOKEN_MAX]; |
324 | u8 tx_mic_key[MIC_KEY_SIZE]; |
325 | u8 rx_mic_key[MIC_KEY_SIZE]; |
326 | }; |
327 | |
328 | #define WPA_KEY_INDEX_MAX 4 |
329 | #define WPA_RX_SEQ_LEN 6 |
330 | |
331 | struct mic_failure { |
332 | u16 failure; /* MIC Failure counter 0 or 1 or 2 */ |
333 | u16 counter; /* 1sec counter 0-60 */ |
334 | u32 last_failure_time; |
335 | int stop; |
336 | }; |
337 | |
338 | struct wpa_status { |
339 | int wpa_enabled; |
340 | bool rsn_enabled; |
341 | int version; |
342 | int pairwise_suite; /* unicast cipher */ |
343 | int group_suite; /* multicast cipher */ |
344 | int key_mgmt_suite; |
345 | int auth_alg; |
346 | int txkey; |
347 | struct wpa_key key[WPA_KEY_INDEX_MAX]; |
348 | struct scan_ext scan_ext; |
349 | struct mic_failure mic_failure; |
350 | }; |
351 | |
352 | #include <linux/list.h> |
353 | #define PMK_LIST_MAX 8 |
354 | struct pmk_list { |
355 | u16 size; |
356 | struct list_head head; |
357 | struct pmk { |
358 | struct list_head list; |
359 | u8 bssid[ETH_ALEN]; |
360 | u8 pmkid[IW_PMKID_LEN]; |
361 | } pmk[PMK_LIST_MAX]; |
362 | }; |
363 | |
364 | struct wps_status { |
365 | int wps_enabled; |
366 | int ielen; |
367 | u8 ie[255]; |
368 | }; |
369 | |
370 | /* Tx Device struct */ |
371 | #define TX_DEVICE_BUFF_SIZE 1024 |
372 | |
373 | struct ks_wlan_private; |
374 | |
375 | /** |
376 | * struct tx_device_buffer - Queue item for the tx queue. |
377 | * @sendp: Pointer to the send request data. |
378 | * @size: Size of @sendp data. |
379 | * @complete_handler: Function called once data write to device is complete. |
380 | * @arg1: First argument to @complete_handler. |
381 | * @arg2: Second argument to @complete_handler. |
382 | */ |
383 | struct tx_device_buffer { |
384 | unsigned char *sendp; |
385 | unsigned int size; |
386 | void (*complete_handler)(struct ks_wlan_private *priv, |
387 | struct sk_buff *skb); |
388 | struct sk_buff *skb; |
389 | }; |
390 | |
391 | /** |
392 | * struct tx_device - Tx buffer queue. |
393 | * @tx_device_buffer: Queue buffer. |
394 | * @qhead: Head of tx queue. |
395 | * @qtail: Tail of tx queue. |
396 | * @tx_dev_lock: Queue lock. |
397 | */ |
398 | struct tx_device { |
399 | struct tx_device_buffer tx_dev_buff[TX_DEVICE_BUFF_SIZE]; |
400 | unsigned int qhead; |
401 | unsigned int qtail; |
402 | spinlock_t tx_dev_lock; /* protect access to the queue */ |
403 | }; |
404 | |
405 | /* Rx Device struct */ |
406 | #define RX_DATA_SIZE (2 + 2 + 2347 + 1) |
407 | #define RX_DEVICE_BUFF_SIZE 32 |
408 | |
409 | /** |
410 | * struct rx_device_buffer - Queue item for the rx queue. |
411 | * @data: rx data. |
412 | * @size: Size of @data. |
413 | */ |
414 | struct rx_device_buffer { |
415 | unsigned char data[RX_DATA_SIZE]; |
416 | unsigned int size; |
417 | }; |
418 | |
419 | /** |
420 | * struct rx_device - Rx buffer queue. |
421 | * @rx_device_buffer: Queue buffer. |
422 | * @qhead: Head of rx queue. |
423 | * @qtail: Tail of rx queue. |
424 | * @rx_dev_lock: Queue lock. |
425 | */ |
426 | struct rx_device { |
427 | struct rx_device_buffer rx_dev_buff[RX_DEVICE_BUFF_SIZE]; |
428 | unsigned int qhead; |
429 | unsigned int qtail; |
430 | spinlock_t rx_dev_lock; /* protect access to the queue */ |
431 | }; |
432 | |
433 | struct ks_wlan_private { |
434 | /* hardware information */ |
435 | void *if_hw; |
436 | struct workqueue_struct *wq; |
437 | struct delayed_work rw_dwork; |
438 | struct tasklet_struct rx_bh_task; |
439 | |
440 | struct net_device *net_dev; |
441 | struct net_device_stats nstats; |
442 | struct iw_statistics wstats; |
443 | |
444 | struct completion confirm_wait; |
445 | |
446 | /* trx device & sme */ |
447 | struct tx_device tx_dev; |
448 | struct rx_device rx_dev; |
449 | struct sme_info sme_i; |
450 | u8 *rxp; |
451 | unsigned int rx_size; |
452 | struct work_struct sme_work; |
453 | struct work_struct wakeup_work; |
454 | int scan_ind_count; |
455 | |
456 | unsigned char eth_addr[ETH_ALEN]; |
457 | |
458 | struct local_aplist aplist; |
459 | struct local_ap current_ap; |
460 | struct power_save_status psstatus; |
461 | struct sleep_status sleepstatus; |
462 | struct wpa_status wpa; |
463 | struct pmk_list pmklist; |
464 | /* wireless parameter */ |
465 | struct ks_wlan_parameter reg; |
466 | u8 current_rate; |
467 | |
468 | char nick[IW_ESSID_MAX_SIZE + 1]; |
469 | |
470 | spinlock_t multicast_spin; |
471 | |
472 | spinlock_t dev_read_lock; |
473 | wait_queue_head_t devread_wait; |
474 | |
475 | unsigned int need_commit; /* for ioctl */ |
476 | |
477 | /* DeviceIoControl */ |
478 | bool is_device_open; |
479 | atomic_t event_count; |
480 | atomic_t rec_count; |
481 | int dev_count; |
482 | #define DEVICE_STOCK_COUNT 20 |
483 | unsigned char *dev_data[DEVICE_STOCK_COUNT]; |
484 | int dev_size[DEVICE_STOCK_COUNT]; |
485 | |
486 | /* ioctl : IOCTL_FIRMWARE_VERSION */ |
487 | unsigned char firmware_version[128 + 1]; |
488 | int version_size; |
489 | |
490 | bool mac_address_valid; |
491 | |
492 | int dev_state; |
493 | |
494 | struct sk_buff *skb; |
495 | unsigned int cur_rx; /* Index into the Rx buffer of next Rx pkt. */ |
496 | #define FORCE_DISCONNECT 0x80000000 |
497 | #define CONNECT_STATUS_MASK 0x7FFFFFFF |
498 | u32 connect_status; |
499 | int infra_status; |
500 | u8 scan_ssid_len; |
501 | u8 scan_ssid[IW_ESSID_MAX_SIZE + 1]; |
502 | struct local_gain gain; |
503 | struct wps_status wps; |
504 | u8 sleep_mode; |
505 | |
506 | u8 region; |
507 | struct local_eeprom_sum eeprom_sum; |
508 | u8 eeprom_checksum; |
509 | |
510 | struct hostt hostt; |
511 | |
512 | unsigned long last_doze; |
513 | unsigned long last_wakeup; |
514 | |
515 | unsigned int wakeup_count; /* for detect wakeup loop */ |
516 | }; |
517 | |
518 | static inline void inc_txqhead(struct ks_wlan_private *priv) |
519 | { |
520 | priv->tx_dev.qhead = (priv->tx_dev.qhead + 1) % TX_DEVICE_BUFF_SIZE; |
521 | } |
522 | |
523 | static inline void inc_txqtail(struct ks_wlan_private *priv) |
524 | { |
525 | priv->tx_dev.qtail = (priv->tx_dev.qtail + 1) % TX_DEVICE_BUFF_SIZE; |
526 | } |
527 | |
528 | static inline bool txq_has_space(struct ks_wlan_private *priv) |
529 | { |
530 | return (CIRC_SPACE(priv->tx_dev.qhead, priv->tx_dev.qtail, |
531 | TX_DEVICE_BUFF_SIZE) > 0); |
532 | } |
533 | |
534 | static inline void inc_rxqhead(struct ks_wlan_private *priv) |
535 | { |
536 | priv->rx_dev.qhead = (priv->rx_dev.qhead + 1) % RX_DEVICE_BUFF_SIZE; |
537 | } |
538 | |
539 | static inline void inc_rxqtail(struct ks_wlan_private *priv) |
540 | { |
541 | priv->rx_dev.qtail = (priv->rx_dev.qtail + 1) % RX_DEVICE_BUFF_SIZE; |
542 | } |
543 | |
544 | static inline bool rxq_has_space(struct ks_wlan_private *priv) |
545 | { |
546 | return (CIRC_SPACE(priv->rx_dev.qhead, priv->rx_dev.qtail, |
547 | RX_DEVICE_BUFF_SIZE) > 0); |
548 | } |
549 | |
550 | static inline unsigned int txq_count(struct ks_wlan_private *priv) |
551 | { |
552 | return CIRC_CNT_TO_END(priv->tx_dev.qhead, priv->tx_dev.qtail, |
553 | TX_DEVICE_BUFF_SIZE); |
554 | } |
555 | |
556 | static inline unsigned int rxq_count(struct ks_wlan_private *priv) |
557 | { |
558 | return CIRC_CNT_TO_END(priv->rx_dev.qhead, priv->rx_dev.qtail, |
559 | RX_DEVICE_BUFF_SIZE); |
560 | } |
561 | |
562 | int ks_wlan_net_start(struct net_device *dev); |
563 | int ks_wlan_net_stop(struct net_device *dev); |
564 | bool is_connect_status(u32 status); |
565 | bool is_disconnect_status(u32 status); |
566 | |
567 | #endif /* _KS_WLAN_H */ |
568 | |