ath6kl: Implement mgmt_tx
[pandora-kernel.git] / drivers / net / wireless / ath / ath6kl / core.h
1 /*
2  * Copyright (c) 2010-2011 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #ifndef CORE_H
18 #define CORE_H
19
20 #include <linux/etherdevice.h>
21 #include <linux/rtnetlink.h>
22 #include <linux/firmware.h>
23 #include <linux/sched.h>
24 #include <net/cfg80211.h>
25 #include "htc.h"
26 #include "wmi.h"
27 #include "bmi.h"
28
29 #define MAX_ATH6KL                        1
30 #define ATH6KL_MAX_RX_BUFFERS             16
31 #define ATH6KL_BUFFER_SIZE                1664
32 #define ATH6KL_MAX_AMSDU_RX_BUFFERS       4
33 #define ATH6KL_AMSDU_REFILL_THRESHOLD     3
34 #define ATH6KL_AMSDU_BUFFER_SIZE     (WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH + 128)
35 #define MAX_MSDU_SUBFRAME_PAYLOAD_LEN   1508
36 #define MIN_MSDU_SUBFRAME_PAYLOAD_LEN   46
37
38 #define USER_SAVEDKEYS_STAT_INIT     0
39 #define USER_SAVEDKEYS_STAT_RUN      1
40
41 #define ATH6KL_TX_TIMEOUT      10
42 #define ATH6KL_MAX_ENDPOINTS   4
43 #define MAX_NODE_NUM           15
44
45 /* Extra bytes for htc header alignment */
46 #define ATH6KL_HTC_ALIGN_BYTES 3
47
48 /* MAX_HI_COOKIE_NUM are reserved for high priority traffic */
49 #define MAX_DEF_COOKIE_NUM                180
50 #define MAX_HI_COOKIE_NUM                 18    /* 10% of MAX_COOKIE_NUM */
51 #define MAX_COOKIE_NUM                 (MAX_DEF_COOKIE_NUM + MAX_HI_COOKIE_NUM)
52
53 #define MAX_DEFAULT_SEND_QUEUE_DEPTH      (MAX_DEF_COOKIE_NUM / WMM_NUM_AC)
54
55 #define DISCON_TIMER_INTVAL               10000  /* in msec */
56 #define A_DEFAULT_LISTEN_INTERVAL         100
57 #define A_MAX_WOW_LISTEN_INTERVAL         1000
58
59 /* AR6003 1.0 definitions */
60 #define AR6003_REV1_VERSION                 0x300002ba
61
62 /* AR6003 2.0 definitions */
63 #define AR6003_REV2_VERSION                 0x30000384
64 #define AR6003_REV2_PATCH_DOWNLOAD_ADDRESS  0x57e910
65 #define AR6003_REV2_OTP_FILE                "ath6k/AR6003/hw2.0/otp.bin.z77"
66 #define AR6003_REV2_FIRMWARE_FILE           "ath6k/AR6003/hw2.0/athwlan.bin.z77"
67 #define AR6003_REV2_PATCH_FILE              "ath6k/AR6003/hw2.0/data.patch.bin"
68 #define AR6003_REV2_BOARD_DATA_FILE         "ath6k/AR6003/hw2.0/bdata.bin"
69 #define AR6003_REV2_DEFAULT_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.SD31.bin"
70
71 /* AR6003 3.0 definitions */
72 #define AR6003_REV3_VERSION                 0x30000582
73 #define AR6003_REV3_OTP_FILE                "ath6k/AR6003/hw2.1.1/otp.bin"
74 #define AR6003_REV3_FIRMWARE_FILE           "ath6k/AR6003/hw2.1.1/athwlan.bin"
75 #define AR6003_REV3_PATCH_FILE            "ath6k/AR6003/hw2.1.1/data.patch.bin"
76 #define AR6003_REV3_BOARD_DATA_FILE       "ath6k/AR6003/hw2.1.1/bdata.bin"
77 #define AR6003_REV3_DEFAULT_BOARD_DATA_FILE     \
78         "ath6k/AR6003/hw2.1.1/bdata.SD31.bin"
79
80 /* AR6004 1.0 definitions */
81 #define AR6004_REV1_VERSION                 0x30000623
82 #define AR6004_REV1_FIRMWARE_FILE           "ath6k/AR6004/hw6.1/fw.ram.bin"
83 #define AR6004_REV1_BOARD_DATA_FILE         "ath6k/AR6004/hw6.1/bdata.bin"
84 #define AR6004_REV1_DEFAULT_BOARD_DATA_FILE "ath6k/AR6004/hw6.1/bdata.DB132.bin"
85 #define AR6004_REV1_EPPING_FIRMWARE_FILE "ath6k/AR6004/hw6.1/endpointping.bin"
86
87 /* Per STA data, used in AP mode */
88 #define STA_PS_AWAKE            BIT(0)
89 #define STA_PS_SLEEP            BIT(1)
90 #define STA_PS_POLLED           BIT(2)
91
92 /* HTC TX packet tagging definitions */
93 #define ATH6KL_CONTROL_PKT_TAG    HTC_TX_PACKET_TAG_USER_DEFINED
94 #define ATH6KL_DATA_PKT_TAG       (ATH6KL_CONTROL_PKT_TAG + 1)
95
96 #define AR6003_CUST_DATA_SIZE 16
97
98 #define AGGR_WIN_IDX(x, y)          ((x) % (y))
99 #define AGGR_INCR_IDX(x, y)         AGGR_WIN_IDX(((x) + 1), (y))
100 #define AGGR_DCRM_IDX(x, y)         AGGR_WIN_IDX(((x) - 1), (y))
101 #define ATH6KL_MAX_SEQ_NO               0xFFF
102 #define ATH6KL_NEXT_SEQ_NO(x)           (((x) + 1) & ATH6KL_MAX_SEQ_NO)
103
104 #define NUM_OF_TIDS         8
105 #define AGGR_SZ_DEFAULT     8
106
107 #define AGGR_WIN_SZ_MIN     2
108 #define AGGR_WIN_SZ_MAX     8
109
110 #define TID_WINDOW_SZ(_x)   ((_x) << 1)
111
112 #define AGGR_NUM_OF_FREE_NETBUFS    16
113
114 #define AGGR_RX_TIMEOUT     400 /* in ms */
115
116 #define WMI_TIMEOUT (2 * HZ)
117
118 #define MBOX_YIELD_LIMIT 99
119
120 /* configuration lags */
121 /*
122  * ATH6KL_CONF_IGNORE_ERP_BARKER: Ignore the barker premable in
123  * ERP IE of beacon to determine the short premable support when
124  * sending (Re)Assoc req.
125  * ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN: Don't send the power
126  * module state transition failure events which happen during
127  * scan, to the host.
128  */
129 #define ATH6KL_CONF_IGNORE_ERP_BARKER           BIT(0)
130 #define ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN  BIT(1)
131 #define ATH6KL_CONF_ENABLE_11N                  BIT(2)
132 #define ATH6KL_CONF_ENABLE_TX_BURST             BIT(3)
133
134 enum wlan_low_pwr_state {
135         WLAN_POWER_STATE_ON,
136         WLAN_POWER_STATE_CUT_PWR,
137         WLAN_POWER_STATE_DEEP_SLEEP,
138         WLAN_POWER_STATE_WOW
139 };
140
141 enum sme_state {
142         SME_DISCONNECTED,
143         SME_CONNECTING,
144         SME_CONNECTED
145 };
146
147 struct skb_hold_q {
148         struct sk_buff *skb;
149         bool is_amsdu;
150         u16 seq_no;
151 };
152
153 struct rxtid {
154         bool aggr;
155         bool progress;
156         bool timer_mon;
157         u16 win_sz;
158         u16 seq_next;
159         u32 hold_q_sz;
160         struct skb_hold_q *hold_q;
161         struct sk_buff_head q;
162         spinlock_t lock;
163 };
164
165 struct rxtid_stats {
166         u32 num_into_aggr;
167         u32 num_dups;
168         u32 num_oow;
169         u32 num_mpdu;
170         u32 num_amsdu;
171         u32 num_delivered;
172         u32 num_timeouts;
173         u32 num_hole;
174         u32 num_bar;
175 };
176
177 struct aggr_info {
178         u8 aggr_sz;
179         u8 timer_scheduled;
180         struct timer_list timer;
181         struct net_device *dev;
182         struct rxtid rx_tid[NUM_OF_TIDS];
183         struct sk_buff_head free_q;
184         struct rxtid_stats stat[NUM_OF_TIDS];
185 };
186
187 struct ath6kl_wep_key {
188         u8 key_index;
189         u8 key_len;
190         u8 key[64];
191 };
192
193 #define ATH6KL_KEY_SEQ_LEN 8
194
195 struct ath6kl_key {
196         u8 key[WLAN_MAX_KEY_LEN];
197         u8 key_len;
198         u8 seq[ATH6KL_KEY_SEQ_LEN];
199         u8 seq_len;
200         u32 cipher;
201 };
202
203 struct ath6kl_node_mapping {
204         u8 mac_addr[ETH_ALEN];
205         u8 ep_id;
206         u8 tx_pend;
207 };
208
209 struct ath6kl_cookie {
210         struct sk_buff *skb;
211         u32 map_no;
212         struct htc_packet htc_pkt;
213         struct ath6kl_cookie *arc_list_next;
214 };
215
216 struct ath6kl_sta {
217         u16 sta_flags;
218         u8 mac[ETH_ALEN];
219         u8 aid;
220         u8 keymgmt;
221         u8 ucipher;
222         u8 auth;
223         u8 wpa_ie[ATH6KL_MAX_IE];
224         struct sk_buff_head psq;
225         spinlock_t psq_lock;
226 };
227
228 struct ath6kl_version {
229         u32 target_ver;
230         u32 wlan_ver;
231         u32 abi_ver;
232 };
233
234 struct ath6kl_bmi {
235         u32 cmd_credits;
236         bool done_sent;
237         u8 *cmd_buf;
238 };
239
240 struct target_stats {
241         u64 tx_pkt;
242         u64 tx_byte;
243         u64 tx_ucast_pkt;
244         u64 tx_ucast_byte;
245         u64 tx_mcast_pkt;
246         u64 tx_mcast_byte;
247         u64 tx_bcast_pkt;
248         u64 tx_bcast_byte;
249         u64 tx_rts_success_cnt;
250         u64 tx_pkt_per_ac[4];
251
252         u64 tx_err;
253         u64 tx_fail_cnt;
254         u64 tx_retry_cnt;
255         u64 tx_mult_retry_cnt;
256         u64 tx_rts_fail_cnt;
257
258         u64 rx_pkt;
259         u64 rx_byte;
260         u64 rx_ucast_pkt;
261         u64 rx_ucast_byte;
262         u64 rx_mcast_pkt;
263         u64 rx_mcast_byte;
264         u64 rx_bcast_pkt;
265         u64 rx_bcast_byte;
266         u64 rx_frgment_pkt;
267
268         u64 rx_err;
269         u64 rx_crc_err;
270         u64 rx_key_cache_miss;
271         u64 rx_decrypt_err;
272         u64 rx_dupl_frame;
273
274         u64 tkip_local_mic_fail;
275         u64 tkip_cnter_measures_invoked;
276         u64 tkip_replays;
277         u64 tkip_fmt_err;
278         u64 ccmp_fmt_err;
279         u64 ccmp_replays;
280
281         u64 pwr_save_fail_cnt;
282
283         u64 cs_bmiss_cnt;
284         u64 cs_low_rssi_cnt;
285         u64 cs_connect_cnt;
286         u64 cs_discon_cnt;
287
288         s32 tx_ucast_rate;
289         s32 rx_ucast_rate;
290
291         u32 lq_val;
292
293         u32 wow_pkt_dropped;
294         u16 wow_evt_discarded;
295
296         s16 noise_floor_calib;
297         s16 cs_rssi;
298         s16 cs_ave_beacon_rssi;
299         u8 cs_ave_beacon_snr;
300         u8 cs_last_roam_msec;
301         u8 cs_snr;
302
303         u8 wow_host_pkt_wakeups;
304         u8 wow_host_evt_wakeups;
305
306         u32 arp_received;
307         u32 arp_matched;
308         u32 arp_replied;
309 };
310
311 struct ath6kl_mbox_info {
312         u32 htc_addr;
313         u32 htc_ext_addr;
314         u32 htc_ext_sz;
315
316         u32 block_size;
317
318         u32 gmbox_addr;
319
320         u32 gmbox_sz;
321 };
322
323 /*
324  * 802.11i defines an extended IV for use with non-WEP ciphers.
325  * When the EXTIV bit is set in the key id byte an additional
326  * 4 bytes immediately follow the IV for TKIP.  For CCMP the
327  * EXTIV bit is likewise set but the 8 bytes represent the
328  * CCMP header rather than IV+extended-IV.
329  */
330
331 #define ATH6KL_KEYBUF_SIZE 16
332 #define ATH6KL_MICBUF_SIZE (8+8)        /* space for both tx and rx */
333
334 #define ATH6KL_KEY_XMIT  0x01
335 #define ATH6KL_KEY_RECV  0x02
336 #define ATH6KL_KEY_DEFAULT   0x80       /* default xmit key */
337
338 /* Initial group key for AP mode */
339 struct ath6kl_req_key {
340         bool valid;
341         u8 key_index;
342         int key_type;
343         u8 key[WLAN_MAX_KEY_LEN];
344         u8 key_len;
345 };
346
347 /* Flag info */
348 #define WMI_ENABLED     0
349 #define WMI_READY       1
350 #define CONNECTED       2
351 #define STATS_UPDATE_PEND 3
352 #define CONNECT_PEND      4
353 #define WMM_ENABLED       5
354 #define NETQ_STOPPED      6
355 #define WMI_CTRL_EP_FULL  7
356 #define DTIM_EXPIRED      8
357 #define DESTROY_IN_PROGRESS  9
358 #define NETDEV_REGISTERED    10
359 #define SKIP_SCAN            11
360 #define WLAN_ENABLED         12
361
362 struct ath6kl {
363         struct device *dev;
364         struct net_device *net_dev;
365         struct ath6kl_bmi bmi;
366         const struct ath6kl_hif_ops *hif_ops;
367         struct wmi *wmi;
368         int tx_pending[ENDPOINT_MAX];
369         int total_tx_data_pend;
370         struct htc_target *htc_target;
371         void *hif_priv;
372         spinlock_t lock;
373         struct semaphore sem;
374         int ssid_len;
375         u8 ssid[IEEE80211_MAX_SSID_LEN];
376         u8 next_mode;
377         u8 nw_type;
378         u8 dot11_auth_mode;
379         u8 auth_mode;
380         u8 prwise_crypto;
381         u8 prwise_crypto_len;
382         u8 grp_crypto;
383         u8 grp_crpto_len;
384         u8 def_txkey_index;
385         struct ath6kl_wep_key wep_key_list[WMI_MAX_KEY_INDEX + 1];
386         u8 bssid[ETH_ALEN];
387         u8 req_bssid[ETH_ALEN];
388         u16 ch_hint;
389         u16 bss_ch;
390         u16 listen_intvl_b;
391         u16 listen_intvl_t;
392         struct ath6kl_version version;
393         u32 target_type;
394         u8 tx_pwr;
395         struct net_device_stats net_stats;
396         struct target_stats target_stats;
397         struct ath6kl_node_mapping node_map[MAX_NODE_NUM];
398         u8 ibss_ps_enable;
399         u8 node_num;
400         u8 next_ep_id;
401         struct ath6kl_cookie *cookie_list;
402         u32 cookie_count;
403         enum htc_endpoint_id ac2ep_map[WMM_NUM_AC];
404         bool ac_stream_active[WMM_NUM_AC];
405         u8 ac_stream_pri_map[WMM_NUM_AC];
406         u8 hiac_stream_active_pri;
407         u8 ep2ac_map[ENDPOINT_MAX];
408         enum htc_endpoint_id ctrl_ep;
409         struct htc_credit_state_info credit_state_info;
410         u32 connect_ctrl_flags;
411         u32 user_key_ctrl;
412         u8 usr_bss_filter;
413         struct ath6kl_sta sta_list[AP_MAX_NUM_STA];
414         u8 sta_list_index;
415         struct ath6kl_req_key ap_mode_bkey;
416         struct sk_buff_head mcastpsq;
417         spinlock_t mcastpsq_lock;
418         u8 intra_bss;
419         struct aggr_info *aggr_cntxt;
420         struct wmi_ap_mode_stat ap_stats;
421         u8 ap_country_code[3];
422         struct list_head amsdu_rx_buffer_queue;
423         struct timer_list disconnect_timer;
424         u8 rx_meta_ver;
425         struct wireless_dev *wdev;
426         struct cfg80211_scan_request *scan_req;
427         struct ath6kl_key keys[WMI_MAX_KEY_INDEX + 1];
428         enum sme_state sme_state;
429         enum wlan_low_pwr_state wlan_pwr_state;
430         struct wmi_scan_params_cmd sc_params;
431 #define AR_MCAST_FILTER_MAC_ADDR_SIZE  4
432         u8 auto_auth_stage;
433
434         u16 conf_flags;
435         wait_queue_head_t event_wq;
436         struct ath6kl_mbox_info mbox_info;
437
438         struct ath6kl_cookie cookie_mem[MAX_COOKIE_NUM];
439         int reconnect_flag;
440         unsigned long flag;
441
442         u8 *fw_board;
443         size_t fw_board_len;
444
445         u8 *fw_otp;
446         size_t fw_otp_len;
447
448         u8 *fw;
449         size_t fw_len;
450
451         u8 *fw_patch;
452         size_t fw_patch_len;
453
454         struct workqueue_struct *ath6kl_wq;
455
456         struct ath6kl_node_table scan_table;
457         struct dentry *debugfs_phy;
458
459         u32 send_action_id;
460         u16 next_chan;
461 };
462
463 static inline void *ath6kl_priv(struct net_device *dev)
464 {
465         return wdev_priv(dev->ieee80211_ptr);
466 }
467
468 static inline void ath6kl_deposit_credit_to_ep(struct htc_credit_state_info
469                                                *cred_info,
470                                                struct htc_endpoint_credit_dist
471                                                *ep_dist, int credits)
472 {
473         ep_dist->credits += credits;
474         ep_dist->cred_assngd += credits;
475         cred_info->cur_free_credits -= credits;
476 }
477
478 void ath6kl_destroy(struct net_device *dev, unsigned int unregister);
479 int ath6kl_configure_target(struct ath6kl *ar);
480 void ath6kl_detect_error(unsigned long ptr);
481 void disconnect_timer_handler(unsigned long ptr);
482 void init_netdev(struct net_device *dev);
483 void ath6kl_cookie_init(struct ath6kl *ar);
484 void ath6kl_cookie_cleanup(struct ath6kl *ar);
485 void ath6kl_rx(struct htc_target *target, struct htc_packet *packet);
486 void ath6kl_tx_complete(void *context, struct list_head *packet_queue);
487 enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
488                                                struct htc_packet *packet);
489 void ath6kl_stop_txrx(struct ath6kl *ar);
490 void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar);
491 int ath6kl_access_datadiag(struct ath6kl *ar, u32 address,
492                            u8 *data, u32 length, bool read);
493 int ath6kl_read_reg_diag(struct ath6kl *ar, u32 *address, u32 *data);
494 void ath6kl_init_profile_info(struct ath6kl *ar);
495 void ath6kl_tx_data_cleanup(struct ath6kl *ar);
496 void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile,
497                           bool get_dbglogs);
498
499 struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar);
500 void ath6kl_free_cookie(struct ath6kl *ar, struct ath6kl_cookie *cookie);
501 int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev);
502
503 struct aggr_info *aggr_init(struct net_device *dev);
504 void ath6kl_rx_refill(struct htc_target *target,
505                       enum htc_endpoint_id endpoint);
506 void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count);
507 struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target,
508                                             enum htc_endpoint_id endpoint,
509                                             int len);
510 void aggr_module_destroy(struct aggr_info *aggr_info);
511 void aggr_reset_state(struct aggr_info *aggr_info);
512
513 struct ath6kl_sta *ath6kl_find_sta(struct ath6kl *ar, u8 * node_addr);
514 struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid);
515
516 void ath6kl_ready_event(void *devt, u8 * datap, u32 sw_ver, u32 abi_ver);
517 int ath6kl_control_tx(void *devt, struct sk_buff *skb,
518                       enum htc_endpoint_id eid);
519 void ath6kl_connect_event(struct ath6kl *ar, u16 channel,
520                           u8 *bssid, u16 listen_int,
521                           u16 beacon_int, enum network_type net_type,
522                           u8 beacon_ie_len, u8 assoc_req_len,
523                           u8 assoc_resp_len, u8 *assoc_info);
524 void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason,
525                              u8 *bssid, u8 assoc_resp_len,
526                              u8 *assoc_info, u16 prot_reason_status);
527 void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast);
528 void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr);
529 void ath6kl_scan_complete_evt(struct ath6kl *ar, int status);
530 void ath6kl_tgt_stats_event(struct ath6kl *ar, u8 *ptr, u32 len);
531 void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active);
532 enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac);
533
534 void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid);
535
536 void ath6kl_dtimexpiry_event(struct ath6kl *ar);
537 void ath6kl_disconnect(struct ath6kl *ar);
538 void ath6kl_deep_sleep_enable(struct ath6kl *ar);
539 void aggr_recv_delba_req_evt(struct ath6kl *ar, u8 tid);
540 void aggr_recv_addba_req_evt(struct ath6kl *ar, u8 tid, u16 seq_no,
541                              u8 win_sz);
542 void ath6kl_wakeup_event(void *dev);
543 void ath6kl_target_failure(struct ath6kl *ar);
544
545 void ath6kl_cfg80211_scan_node(struct wiphy *wiphy, struct bss *ni);
546 #endif /* CORE_H */