1fb9987d0f748c983bb795a86f47522313f701a08Sujith/*
25b68138e5659cbfd5df2879d17f9ba0b66477fecSujith Manoharan * Copyright (c) 2010-2011 Atheros Communications Inc.
3fb9987d0f748c983bb795a86f47522313f701a08Sujith *
4fb9987d0f748c983bb795a86f47522313f701a08Sujith * Permission to use, copy, modify, and/or distribute this software for any
5fb9987d0f748c983bb795a86f47522313f701a08Sujith * purpose with or without fee is hereby granted, provided that the above
6fb9987d0f748c983bb795a86f47522313f701a08Sujith * copyright notice and this permission notice appear in all copies.
7fb9987d0f748c983bb795a86f47522313f701a08Sujith *
8fb9987d0f748c983bb795a86f47522313f701a08Sujith * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9fb9987d0f748c983bb795a86f47522313f701a08Sujith * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10fb9987d0f748c983bb795a86f47522313f701a08Sujith * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11fb9987d0f748c983bb795a86f47522313f701a08Sujith * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12fb9987d0f748c983bb795a86f47522313f701a08Sujith * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13fb9987d0f748c983bb795a86f47522313f701a08Sujith * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14fb9987d0f748c983bb795a86f47522313f701a08Sujith * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15fb9987d0f748c983bb795a86f47522313f701a08Sujith */
16fb9987d0f748c983bb795a86f47522313f701a08Sujith
17fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifndef HTC_H
18fb9987d0f748c983bb795a86f47522313f701a08Sujith#define HTC_H
19fb9987d0f748c983bb795a86f47522313f701a08Sujith
20fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/module.h>
21fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/usb.h>
22fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/firmware.h>
23fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/skbuff.h>
24fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/netdevice.h>
25fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <linux/leds.h>
26617f3d0d71e2eae4d8d475cefe9363b140e52083Tejun Heo#include <linux/slab.h>
27fb9987d0f748c983bb795a86f47522313f701a08Sujith#include <net/mac80211.h>
28fb9987d0f748c983bb795a86f47522313f701a08Sujith
29fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "common.h"
30fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "htc_hst.h"
31fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "hif_usb.h"
32fb9987d0f748c983bb795a86f47522313f701a08Sujith#include "wmi.h"
33fb9987d0f748c983bb795a86f47522313f701a08Sujith
34fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_STA_SHORT_CALINTERVAL 1000    /* 1 second */
35a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharan#define ATH_AP_SHORT_CALINTERVAL  100     /* 100 ms */
36fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_ANI_POLLINTERVAL      100     /* 100 ms */
37fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LONG_CALINTERVAL      30000   /* 30 seconds */
38fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_RESTART_CALINTERVAL   1200000 /* 20 minutes */
39fb9987d0f748c983bb795a86f47522313f701a08Sujith
40fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_DEFAULT_BMISS_LIMIT 10
41fb9987d0f748c983bb795a86f47522313f701a08Sujith#define IEEE80211_MS_TO_TU(x)   (((x) * 1000) / 1024)
42fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TSF_TO_TU(_h, _l) \
43fb9987d0f748c983bb795a86f47522313f701a08Sujith	((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
44fb9987d0f748c983bb795a86f47522313f701a08Sujith
45fb9987d0f748c983bb795a86f47522313f701a08Sujithextern struct ieee80211_ops ath9k_htc_ops;
46e1572c5eeca8ef87a250322364584458b2dadb35Sujithextern int htc_modparam_nohwcrypt;
47fb9987d0f748c983bb795a86f47522313f701a08Sujith
48fb9987d0f748c983bb795a86f47522313f701a08Sujithenum htc_phymode {
49c75197a779b6f5ee4c5b859423a0d5257475ebeeSujith Manoharan	HTC_MODE_11NA		= 0,
50c75197a779b6f5ee4c5b859423a0d5257475ebeeSujith Manoharan	HTC_MODE_11NG		= 1
51fb9987d0f748c983bb795a86f47522313f701a08Sujith};
52fb9987d0f748c983bb795a86f47522313f701a08Sujith
53fb9987d0f748c983bb795a86f47522313f701a08Sujithenum htc_opmode {
54fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_STA	= 1,
55fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_IBSS	= 0,
56fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_AHDEMO	= 3,
57fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_HOSTAP	= 6,
58fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_MONITOR	= 8,
59fb9987d0f748c983bb795a86f47522313f701a08Sujith	HTC_M_WDS	= 2
60fb9987d0f748c983bb795a86f47522313f701a08Sujith};
61fb9987d0f748c983bb795a86f47522313f701a08Sujith
6240dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_AMPDU  1
63fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_NORMAL 2
6440dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_BEACON 3
6540dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan#define ATH9K_HTC_MGMT   4
66fb9987d0f748c983bb795a86f47522313f701a08Sujith
67fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_TX_CTSONLY      0x1
68fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_TX_RTSCTS       0x2
69fb9987d0f748c983bb795a86f47522313f701a08Sujith
70fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_frame_hdr {
71fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 data_type;
72fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 node_idx;
73fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 vif_idx;
74fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 tidno;
75dc738cb6c5d5594de4bdf3b7839a250b032152e7Rajkumar Manoharan	__be32 flags; /* ATH9K_HTC_TX_* */
76fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 key_type;
77fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 keyix;
78e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan	u8 cookie;
79e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan	u8 pad;
80fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
81fb9987d0f748c983bb795a86f47522313f701a08Sujith
82fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_mgmt_hdr {
83fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 node_idx;
84fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 vif_idx;
85fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 tidno;
86fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 flags;
87fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 key_type;
88fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 keyix;
89e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan	u8 cookie;
90e8e3860765641d5e9d1607ec50191cb33c28371dSujith Manoharan	u8 pad;
91fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
92fb9987d0f748c983bb795a86f47522313f701a08Sujith
93fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct tx_beacon_header {
94fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 vif_index;
951c165c972b040f9ce199b8d8d3cc4f619872cba5Sujith Manoharan	u8 len_changed;
96fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 rev;
97fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
98fb9987d0f748c983bb795a86f47522313f701a08Sujith
993a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan#define MAX_TX_AMPDU_SUBFRAMES_9271 17
1003a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan#define MAX_TX_AMPDU_SUBFRAMES_7010 22
1013a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan
102fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_cap_target {
1033a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan	__be32 ampdu_limit;
104fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 ampdu_subframes;
1053a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan	u8 enable_coex;
106fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 tx_chainmask;
1070a8579f6b7c3f4332ad9eb6615c7631ef9cd4ed6Sujith Manoharan	u8 pad;
108fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
109fb9987d0f748c983bb795a86f47522313f701a08Sujith
110fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_vif {
111fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 index;
112e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan	u8 opmode;
113fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 myaddr[ETH_ALEN];
114fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 ath_cap;
115e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan	__be16 rtsthreshold;
116e4c62506fcfa7c1fa7c586ab518a172c3a65db0fSujith Manoharan	u8 pad;
117fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
118fb9987d0f748c983bb795a86f47522313f701a08Sujith
119fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_sta {
120fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 macaddr[ETH_ALEN];
121fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 bssid[ETH_ALEN];
122fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 sta_index;
123fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 vif_index;
124fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 is_vif_sta;
12584dfa7308ccba190ad7efe655c25ca80793c029eSujith Manoharan	__be16 flags;
126b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan	__be16 htcap;
127b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan	__be16 maxampdu;
128b97c57ff3f568b33ed91915f48431feae2dab288Sujith Manoharan	u8 pad;
129fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
130fb9987d0f748c983bb795a86f47522313f701a08Sujith
131fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_aggr {
132fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 sta_index;
133fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 tidno;
134fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 aggr_enable;
135fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 padding;
136fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
137fb9987d0f748c983bb795a86f47522313f701a08Sujith
138fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_HTC_RATE_MAX 30
139fb9987d0f748c983bb795a86f47522313f701a08Sujith
140fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_DS_FLAG  0x01
141fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_40_FLAG  0x02
142fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_SGI_FLAG 0x04
143fb9987d0f748c983bb795a86f47522313f701a08Sujith#define WLAN_RC_HT_FLAG  0x08
144fb9987d0f748c983bb795a86f47522313f701a08Sujith
145fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rateset {
146fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 rs_nrates;
147fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 rs_rates[ATH_HTC_RATE_MAX];
148fb9987d0f748c983bb795a86f47522313f701a08Sujith};
149fb9987d0f748c983bb795a86f47522313f701a08Sujith
150fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rate {
151fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath9k_htc_rateset legacy_rates;
152fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath9k_htc_rateset ht_rates;
153fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
154fb9987d0f748c983bb795a86f47522313f701a08Sujith
155fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_target_rate {
156fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 sta_index;
157fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 isnew;
1587f1f5a0060e377ff6a15903487b39223e12b8568Sujith	__be32 capflags;
159fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath9k_htc_rate rates;
160fb9987d0f748c983bb795a86f47522313f701a08Sujith};
161fb9987d0f748c983bb795a86f47522313f701a08Sujith
162a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharanstruct ath9k_htc_target_rate_mask {
163a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan	u8 vif_index;
164a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan	u8 band;
165a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan	__be32 mask;
166a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan	u16 pad;
167a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan} __packed;
168a55bb94aa37782fe9457751a3e508b1129fbbc7aSujith Manoharan
169fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_int_stats {
170fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 rx;
171fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 rxorn;
172fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 rxeol;
173fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 txurn;
174fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 txto;
175fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 cst;
176fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan} __packed;
177fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan
178fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_tx_stats {
179fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 xretries;
180fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 fifoerr;
181fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 filtered;
182fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 timer_exp;
183fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 shortretries;
184fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 longretries;
185fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 qnull;
186fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 encap_fail;
187fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 nobuf;
188fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan} __packed;
189fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan
190fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharanstruct ath9k_htc_target_rx_stats {
191fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 nobuf;
192fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 host_send;
193fbc29d6c3da58bc51416f65a50bdb419d4ea85b8Sujith Manoharan	__be32 host_done;
194fb9987d0f748c983bb795a86f47522313f701a08Sujith} __packed;
195fb9987d0f748c983bb795a86f47522313f701a08Sujith
196a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan#define ATH9K_HTC_MAX_VIF 2
197da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan#define ATH9K_HTC_MAX_BCN_VIF 2
198a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan
1990df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan#define INC_VIF(_priv, _type) do {		\
2000df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		switch (_type) {		\
2010df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		case NL80211_IFTYPE_STATION:	\
2020df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			_priv->num_sta_vif++;	\
2030df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
2040df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		case NL80211_IFTYPE_ADHOC:	\
2050df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			_priv->num_ibss_vif++;	\
2060df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
207da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan		case NL80211_IFTYPE_AP:		\
208da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan			_priv->num_ap_vif++;	\
209da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan			break;			\
2100df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		default:			\
2110df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
2120df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		}				\
2130df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan	} while (0)
2140df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan
2150df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan#define DEC_VIF(_priv, _type) do {		\
2160df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		switch (_type) {		\
2170df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		case NL80211_IFTYPE_STATION:	\
2180df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			_priv->num_sta_vif--;	\
2190df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
2200df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		case NL80211_IFTYPE_ADHOC:	\
2210df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			_priv->num_ibss_vif--;	\
2220df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
223da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan		case NL80211_IFTYPE_AP:		\
224da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan			_priv->num_ap_vif--;	\
225da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan			break;			\
2260df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		default:			\
2270df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan			break;			\
2280df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan		}				\
2290df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan	} while (0)
2300df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan
231fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_vif {
232fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 index;
2339a3d025be11a1da625f8a71636b55a3bd3718574Sujith Manoharan	u16 seq_no;
234e7a2a4f5e61ccfae03185384e06b852dbb1e3630Sujith Manoharan	bool beacon_configured;
235832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan	int bslot;
2369b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharan	__le64 tsfadjust;
237fb9987d0f748c983bb795a86f47522313f701a08Sujith};
238fb9987d0f748c983bb795a86f47522313f701a08Sujith
239585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharanstruct ath9k_vif_iter_data {
240585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan	const u8 *hw_macaddr;
241585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan	u8 mask[ETH_ALEN];
242585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan};
243585895cdfc683a067d803fead83267cee309ffd0Sujith Manoharan
244fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_MAX_STA 8
245fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_MAX_TID 8
246fb9987d0f748c983bb795a86f47522313f701a08Sujith
247fb9987d0f748c983bb795a86f47522313f701a08Sujithenum tid_aggr_state {
248fb9987d0f748c983bb795a86f47522313f701a08Sujith	AGGR_STOP = 0,
249fb9987d0f748c983bb795a86f47522313f701a08Sujith	AGGR_PROGRESS,
250fb9987d0f748c983bb795a86f47522313f701a08Sujith	AGGR_START,
251fb9987d0f748c983bb795a86f47522313f701a08Sujith	AGGR_OPERATIONAL
252fb9987d0f748c983bb795a86f47522313f701a08Sujith};
253fb9987d0f748c983bb795a86f47522313f701a08Sujith
254fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_sta {
255fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 index;
256fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum tid_aggr_state tid_state[ATH9K_HTC_MAX_TID];
257fb9987d0f748c983bb795a86f47522313f701a08Sujith};
258fb9987d0f748c983bb795a86f47522313f701a08Sujith
259fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH9K_HTC_RXBUF 256
260fb9987d0f748c983bb795a86f47522313f701a08Sujith#define HTC_RX_FRAME_HEADER_SIZE 40
261fb9987d0f748c983bb795a86f47522313f701a08Sujith
262fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rxbuf {
263fb9987d0f748c983bb795a86f47522313f701a08Sujith	bool in_process;
264fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct sk_buff *skb;
265fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath_htc_rx_status rxstatus;
266fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct list_head list;
267fb9987d0f748c983bb795a86f47522313f701a08Sujith};
268fb9987d0f748c983bb795a86f47522313f701a08Sujith
269fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_rx {
270fb9987d0f748c983bb795a86f47522313f701a08Sujith	int last_rssi; /* FIXME: per-STA */
271fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct list_head rxbuf;
272fb9987d0f748c983bb795a86f47522313f701a08Sujith	spinlock_t rxbuflock;
273fb9987d0f748c983bb795a86f47522313f701a08Sujith};
274fb9987d0f748c983bb795a86f47522313f701a08Sujith
275859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan#define ATH9K_HTC_TX_CLEANUP_INTERVAL 50 /* ms */
27689ea674565611908e11f92f57b15bf50d82f1f22Sujith Manoharan#define ATH9K_HTC_TX_TIMEOUT_INTERVAL 3000 /* ms */
277859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan#define ATH9K_HTC_TX_RESERVE 10
27889ea674565611908e11f92f57b15bf50d82f1f22Sujith Manoharan#define ATH9K_HTC_TX_TIMEOUT_COUNT 40
2798e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan#define ATH9K_HTC_TX_THRESHOLD (MAX_TX_BUF_NUM - ATH9K_HTC_TX_RESERVE)
2808e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan
2818e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan#define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0)
28227876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan#define ATH9K_HTC_OP_TX_DRAIN       BIT(1)
283658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan
2848e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanstruct ath9k_htc_tx {
2858e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan	u8 flags;
2868e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan	int queued_cnt;
28727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head mgmt_ep_queue;
28827876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head cab_ep_queue;
28927876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head data_be_queue;
29027876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head data_bk_queue;
29127876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head data_vi_queue;
29227876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct sk_buff_head data_vo_queue;
293b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan	struct sk_buff_head tx_failed;
2942c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharan	DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM);
295859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan	struct timer_list cleanup_timer;
2968e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharan	spinlock_t tx_lock;
297658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan};
298658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan
299fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_tx_ctl {
300fb9987d0f748c983bb795a86f47522313f701a08Sujith	u8 type; /* ATH9K_HTC_* */
301d67ee5339363608adce786ec8fd62a0fb2b66116Sujith Manoharan	u8 epid;
302729bd3ab460d3bb8236cc8f6fd0289201124112dSujith Manoharan	u8 txok;
30384c9e164468bd707e52b440e1c34bc3c85299332Sujith Manoharan	u8 sta_idx;
304859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharan	unsigned long timestamp;
305fb9987d0f748c983bb795a86f47522313f701a08Sujith};
306fb9987d0f748c983bb795a86f47522313f701a08Sujith
30740dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharanstatic inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb)
30840dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan{
30940dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
31040dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan
31140dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan	BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) >
31240dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan		     IEEE80211_TX_INFO_DRIVER_DATA_SIZE);
31340dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan	return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data;
31440dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan}
31540dc9e4b86963b77918f1b8fa02b98c1e420a7e1Sujith Manoharan
316fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS
317fb9987d0f748c983bb795a86f47522313f701a08Sujith
318fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++)
319fb9987d0f748c983bb795a86f47522313f701a08Sujith#define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++)
3207d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan#define CAB_STAT_INC   priv->debug.tx_stats.cab_queued++
321fb9987d0f748c983bb795a86f47522313f701a08Sujith
3222edb4583c6a581e1e48af259db2a2d467d11551dSujith#define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++)
3232edb4583c6a581e1e48af259db2a2d467d11551dSujith
324719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharanvoid ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
325719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan			   struct ath_htc_rx_status *rxs);
326719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan
327fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath_tx_stats {
328fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 buf_queued;
329fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 buf_completed;
330fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 skb_queued;
331b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan	u32 skb_success;
332b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharan	u32 skb_failed;
3337d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan	u32 cab_queued;
3342edb4583c6a581e1e48af259db2a2d467d11551dSujith	u32 queue_stats[WME_NUM_AC];
335fb9987d0f748c983bb795a86f47522313f701a08Sujith};
336fb9987d0f748c983bb795a86f47522313f701a08Sujith
337fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath_rx_stats {
338fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 skb_allocated;
339fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 skb_completed;
340fb9987d0f748c983bb795a86f47522313f701a08Sujith	u32 skb_dropped;
341719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_crc;
342719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_decrypt_crc;
343719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_mic;
344719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_pre_delim;
345719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_post_delim;
346719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_decrypt_busy;
347719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_phy;
348719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan	u32 err_phy_stats[ATH9K_PHYERR_MAX];
349fb9987d0f748c983bb795a86f47522313f701a08Sujith};
350fb9987d0f748c983bb795a86f47522313f701a08Sujith
351fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_debug {
352fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct dentry *debugfs_phy;
353fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath_tx_stats tx_stats;
354fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath_rx_stats rx_stats;
355fb9987d0f748c983bb795a86f47522313f701a08Sujith};
356fb9987d0f748c983bb795a86f47522313f701a08Sujith
357fb9987d0f748c983bb795a86f47522313f701a08Sujith#else
358fb9987d0f748c983bb795a86f47522313f701a08Sujith
359fb9987d0f748c983bb795a86f47522313f701a08Sujith#define TX_STAT_INC(c) do { } while (0)
360fb9987d0f748c983bb795a86f47522313f701a08Sujith#define RX_STAT_INC(c) do { } while (0)
3617d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharan#define CAB_STAT_INC   do { } while (0)
362fb9987d0f748c983bb795a86f47522313f701a08Sujith
363ed3305b4bb1fadff22e2f254bccfb3301e0b6b4fJohn W. Linville#define TX_QSTAT_INC(c) do { } while (0)
364ed3305b4bb1fadff22e2f254bccfb3301e0b6b4fJohn W. Linville
365719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharanstatic inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
366719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan					 struct ath_htc_rx_status *rxs)
367719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan{
368719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan}
369719c4cf6b1b113e9caf377c6607ae45758a85871Sujith Manoharan
370fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* CONFIG_ATH9K_HTC_DEBUGFS */
371fb9987d0f748c983bb795a86f47522313f701a08Sujith
372fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LED_PIN_DEF             1
3736d64ab7f9240e3201fde3fd16ce4227bd795d2abRajkumar Manoharan#define ATH_LED_PIN_9287            10
374fb9987d0f748c983bb795a86f47522313f701a08Sujith#define ATH_LED_PIN_9271            15
37588c1f4f6dffe66e2fed8e7e3276e091ee850bed0Sujith#define ATH_LED_PIN_7010            12
376fb9987d0f748c983bb795a86f47522313f701a08Sujith
377832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan#define BSTUCK_THRESHOLD 10
378832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan
379b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan/*
380b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan * Adjust these when the max. no of beaconing interfaces is
381b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan * increased.
382b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan */
383b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan#define DEFAULT_SWBA_RESPONSE 40 /* in TUs */
384b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan#define MIN_SWBA_RESPONSE     10 /* in TUs */
385b0a6ba983e3663bf256ca2e79d17bb846878cd9eSujith Manoharan
3861c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajanstruct htc_beacon_config {
387832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan	struct ieee80211_vif *bslot[ATH9K_HTC_MAX_BCN_VIF];
3881c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan	u16 beacon_interval;
3891c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan	u16 dtim_period;
3901c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan	u16 bmiss_timeout;
391832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan	u32 bmiss_cnt;
3921c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan};
3931c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan
39421cb987914cb5334af78378141efed77505ea987Vivek Natarajanstruct ath_btcoex {
39521cb987914cb5334af78378141efed77505ea987Vivek Natarajan	u32 bt_priority_cnt;
39621cb987914cb5334af78378141efed77505ea987Vivek Natarajan	unsigned long bt_priority_time;
39721cb987914cb5334af78378141efed77505ea987Vivek Natarajan	int bt_stomp_type; /* Types of BT stomping */
39821cb987914cb5334af78378141efed77505ea987Vivek Natarajan	u32 btcoex_no_stomp;
39921cb987914cb5334af78378141efed77505ea987Vivek Natarajan	u32 btcoex_period;
40021cb987914cb5334af78378141efed77505ea987Vivek Natarajan	u32 btscan_no_stomp;
40121cb987914cb5334af78378141efed77505ea987Vivek Natarajan};
40221cb987914cb5334af78378141efed77505ea987Vivek Natarajan
4039d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
404cee5341d47fcd1cb79bbb71e430f502285fef8dbSujith Manoharanvoid ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product);
405bf047fcdaca3481fd6ce7d54011d2a774b8b7900Sujith Manoharanvoid ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv);
406bf047fcdaca3481fd6ce7d54011d2a774b8b7900Sujith Manoharanvoid ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv);
4079d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#else
4089d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product)
4099d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{
4109d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan}
4119d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv)
4129d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{
4139d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan}
4149d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharanstatic inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv)
4159d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan{
4169d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan}
4179d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
41821cb987914cb5334af78378141efed77505ea987Vivek Natarajan
41921cb987914cb5334af78378141efed77505ea987Vivek Natarajan#define OP_INVALID		   BIT(0)
42021cb987914cb5334af78378141efed77505ea987Vivek Natarajan#define OP_SCANNING		   BIT(1)
421d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_ENABLE_BEACON           BIT(2)
422d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_BT_PRIORITY_DETECTED    BIT(3)
423d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_BT_SCAN                 BIT(4)
424d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_ANI_RUNNING             BIT(5)
425d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#define OP_TSF_RESET               BIT(6)
426fb9987d0f748c983bb795a86f47522313f701a08Sujith
427fb9987d0f748c983bb795a86f47522313f701a08Sujithstruct ath9k_htc_priv {
428fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct device *dev;
429fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ieee80211_hw *hw;
430fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath_hw *ah;
431fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct htc_target *htc;
432fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct wmi *wmi;
433fb9987d0f748c983bb795a86f47522313f701a08Sujith
43429bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan	u16 fw_version_major;
43529bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan	u16 fw_version_minor;
43629bbfb2491316f9a3888e74b0de7fccdbde67aaaSujith Manoharan
437fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id wmi_cmd_ep;
438fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id beacon_ep;
439fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id cab_ep;
440fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id uapsd_ep;
441fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id mgmt_ep;
442fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id data_be_ep;
443fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id data_bk_ep;
444fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id data_vi_ep;
445fb9987d0f748c983bb795a86f47522313f701a08Sujith	enum htc_endpoint_id data_vo_ep;
446fb9987d0f748c983bb795a86f47522313f701a08Sujith
447a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan	u8 vif_slot;
448a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan	u8 mon_vif_idx;
449a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan	u8 sta_slot;
450a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan	u8 vif_sta_pos[ATH9K_HTC_MAX_VIF];
4510df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan	u8 num_ibss_vif;
4520df8359a88f40ab3b0d38156a5f41ee856178aa3Sujith Manoharan	u8 num_sta_vif;
4530cd075d74b319b88bbaad666c2b9b911859a5b0eSujith Manoharan	u8 num_sta_assoc_vif;
454da8d9d937b34cf5d82e01420d015d8ee14f76467Sujith Manoharan	u8 num_ap_vif;
455a97b478c92c14255d375ed9ceb7a882083523593Sujith Manoharan
456fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 op_flags;
457fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 curtxpow;
458fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 txpowlimit;
459fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 nvifs;
460fb9987d0f748c983bb795a86f47522313f701a08Sujith	u16 nstations;
4617c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharan	bool rearm_ani;
4627c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharan	bool reconfig_beacon;
463658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan	unsigned int rxfilter;
464fb9987d0f748c983bb795a86f47522313f701a08Sujith
4654e3ae3873858f1e64afb19975360000bee15b502Rajkumar Manoharan	struct ath9k_hw_cal_data caldata;
466658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
46720bd2a0952d01ba82a99b3f22d46e3832c255529Felix Fietkau
468fb9987d0f748c983bb795a86f47522313f701a08Sujith	spinlock_t beacon_lock;
469658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan	struct htc_beacon_config cur_beacon_conf;
470fb9987d0f748c983bb795a86f47522313f701a08Sujith
471658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan	struct ath9k_htc_rx rx;
472658ef04fd42a587b17a379ad9208023473442dddSujith Manoharan	struct ath9k_htc_tx tx;
4737757dfed5809b03aa61c7d7f5ff8092f85df8583Sujith
47473908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan	struct tasklet_struct swba_tasklet;
475fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct tasklet_struct rx_tasklet;
476a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharan	struct delayed_work ani_work;
47727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharan	struct tasklet_struct tx_failed_tasklet;
478bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan	struct work_struct ps_work;
47973908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan	struct work_struct fatal_work;
480bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan
481bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan	struct mutex htc_pm_lock;
482bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan	unsigned long ps_usecount;
483bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan	bool ps_enabled;
4848a8572a821e5763525f5e4ac104bc28fd798fd5eVivek Natarajan	bool ps_idle;
485fb9987d0f748c983bb795a86f47522313f701a08Sujith
486d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#ifdef CONFIG_MAC80211_LEDS
487d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan	enum led_brightness brightness;
488d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan	bool led_registered;
489d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan	char led_name[32];
490d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan	struct led_classdev led_cdev;
491d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan	struct work_struct led_work;
492d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#endif
493ca74b83b66dbd289a395c6243695d746c76676ccSujith
494ca74b83b66dbd289a395c6243695d746c76676ccSujith	int beaconq;
495ca74b83b66dbd289a395c6243695d746c76676ccSujith	int cabq;
496e8c35a77e3408171852bde4914b650cf5b83e0d1Felix Fietkau	int hwq_map[WME_NUM_AC];
497fb9987d0f748c983bb795a86f47522313f701a08Sujith
4989d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
49921cb987914cb5334af78378141efed77505ea987Vivek Natarajan	struct ath_btcoex btcoex;
5009d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan#endif
5019d5b80fd36dd524d01a7819586b1d95312c0922fSujith Manoharan
50221cb987914cb5334af78378141efed77505ea987Vivek Natarajan	struct delayed_work coex_period_work;
50321cb987914cb5334af78378141efed77505ea987Vivek Natarajan	struct delayed_work duty_cycle_work;
504fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS
505fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct ath9k_debug debug;
506fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif
507fb9987d0f748c983bb795a86f47522313f701a08Sujith	struct mutex mutex;
508fb9987d0f748c983bb795a86f47522313f701a08Sujith};
509fb9987d0f748c983bb795a86f47522313f701a08Sujith
510fb9987d0f748c983bb795a86f47522313f701a08Sujithstatic inline void ath_read_cachesize(struct ath_common *common, int *csz)
511fb9987d0f748c983bb795a86f47522313f701a08Sujith{
512fb9987d0f748c983bb795a86f47522313f701a08Sujith	common->bus_ops->read_cachesize(common, csz);
513fb9987d0f748c983bb795a86f47522313f701a08Sujith}
514fb9987d0f748c983bb795a86f47522313f701a08Sujith
51573908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharanvoid ath9k_htc_reset(struct ath9k_htc_priv *priv);
51673908674c6957082e8ab57daed57d2bb97a1ebbaSujith Manoharan
517832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharanvoid ath9k_htc_assign_bslot(struct ath9k_htc_priv *priv,
518832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan			    struct ieee80211_vif *vif);
519832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharanvoid ath9k_htc_remove_bslot(struct ath9k_htc_priv *priv,
520832f6a18fc2aead14954c081ece03b7a5b425f81Sujith Manoharan			    struct ieee80211_vif *vif);
5219b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharanvoid ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv,
5229b674a0207c9b75ddcdcdb07e46843fac8267507Sujith Manoharan			     struct ieee80211_vif *vif);
523764580f577a46adce6ad6717a9b34aa8e3a09159Sujithvoid ath9k_htc_beaconq_config(struct ath9k_htc_priv *priv);
524fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_beacon_config(struct ath9k_htc_priv *priv,
5251c3652a5732879263aeebe606ca7af9e66fe0b2fVivek Natarajan			     struct ieee80211_vif *vif);
5267c277349ecbd66e19fad3d949fa6ef6c131a3b62Sujith Manoharanvoid ath9k_htc_beacon_reconfig(struct ath9k_htc_priv *priv);
527f4c88991f51e097b6541f998fd23d477999e5886Sujith Manoharanvoid ath9k_htc_swba(struct ath9k_htc_priv *priv,
528f4c88991f51e097b6541f998fd23d477999e5886Sujith Manoharan		    struct wmi_event_swba *swba);
529fb9987d0f748c983bb795a86f47522313f701a08Sujith
530fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_rxep(void *priv, struct sk_buff *skb,
531fb9987d0f748c983bb795a86f47522313f701a08Sujith		    enum htc_endpoint_id ep_id);
532fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id,
533fb9987d0f748c983bb795a86f47522313f701a08Sujith		    bool txok);
5349c6dda4e2dfea970a7105e3805f0195bc3079f2fSujithvoid ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb,
5359c6dda4e2dfea970a7105e3805f0195bc3079f2fSujith			enum htc_endpoint_id ep_id, bool txok);
536fb9987d0f748c983bb795a86f47522313f701a08Sujith
5373a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharanint ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv,
5383a0593efd191c7eb13c79179c4c5ddbc519b2510Sujith Manoharan				u8 enable_coex);
539a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_ani_work(struct work_struct *work);
540a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_start_ani(struct ath9k_htc_priv *priv);
541a236254c35f04a4d47c701ed3ec4a0b5dcb097b0Sujith Manoharanvoid ath9k_htc_stop_ani(struct ath9k_htc_priv *priv);
542fb9987d0f748c983bb795a86f47522313f701a08Sujith
543fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_tx_init(struct ath9k_htc_priv *priv);
5447d547eb4bb664c5a6b7c8790c2ecb0aec5d15385Sujith Manoharanint ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
5452c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharan		       struct sk_buff *skb, u8 slot, bool is_cab);
546fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_tx_cleanup(struct ath9k_htc_priv *priv);
547e8c35a77e3408171852bde4914b650cf5b83e0d1Felix Fietkaubool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype);
548ca74b83b66dbd289a395c6243695d746c76676ccSujithint ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv);
549fb9987d0f748c983bb795a86f47522313f701a08Sujithint get_hw_qnum(u16 queue, int *hwq_map);
550e1572c5eeca8ef87a250322364584458b2dadb35Sujithint ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum,
551e1572c5eeca8ef87a250322364584458b2dadb35Sujith		       struct ath9k_tx_queue_info *qinfo);
5528e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanvoid ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv);
5538e86a54715c4102a8ed697939de9ebd9715dc59cSujith Manoharanvoid ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv);
5542c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharanint ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv);
5552c5d57f004673a9c8658e20b1fa3f992b5a10f70Sujith Manoharanvoid ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot);
556b587fc81a80b9656f64e89fe0a106ffa4b35abcaSujith Manoharanvoid ath9k_htc_tx_drain(struct ath9k_htc_priv *priv);
55727876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharanvoid ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event);
55827876a29de221186c9d5883e5fe5f6da18ef9a45Sujith Manoharanvoid ath9k_tx_failed_tasklet(unsigned long data);
559859c3ca1e4608615788dc6cbc199210fe4b5efa2Sujith Manoharanvoid ath9k_htc_tx_cleanup_timer(unsigned long data);
560fb9987d0f748c983bb795a86f47522313f701a08Sujith
561fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_rx_init(struct ath9k_htc_priv *priv);
562fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_rx_cleanup(struct ath9k_htc_priv *priv);
563fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_host_rx_init(struct ath9k_htc_priv *priv);
564fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_rx_tasklet(unsigned long data);
5650995d110118b35c0dc5195e3ddddcc0dec263830Sujithu32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv);
566fb9987d0f748c983bb795a86f47522313f701a08Sujith
567bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv);
568bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_htc_ps_restore(struct ath9k_htc_priv *priv);
569bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajanvoid ath9k_ps_work(struct work_struct *work);
570f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharanbool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
571f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharan			enum ath9k_power_mode mode);
572bde748a40d4d5a9915def6772e208848c105e616Vivek Natarajan
573fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
5741e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw);
5751e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_radio_enable(struct ieee80211_hw *hw);
5761e1f4ad25fab29ca48b1166e74a81e9c89ddf0fbSujith Manoharanvoid ath9k_htc_radio_disable(struct ieee80211_hw *hw);
577d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan
578d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#ifdef CONFIG_MAC80211_LEDS
579fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_init_leds(struct ath9k_htc_priv *priv);
580fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_deinit_leds(struct ath9k_htc_priv *priv);
581d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanvoid ath9k_led_work(struct work_struct *work);
582d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#else
583d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_init_leds(struct ath9k_htc_priv *priv)
584d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{
585d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan}
586d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan
587d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_deinit_leds(struct ath9k_htc_priv *priv)
588d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{
589d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan}
590d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan
591d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharanstatic inline void ath9k_led_work(struct work_struct *work)
592d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan{
593d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan}
594d244f21e79162b829c9af09845421d9b4fac4253Sujith Manoharan#endif
595fb9987d0f748c983bb795a86f47522313f701a08Sujith
596fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
597fa6e15e0b5952fd2cd99fc6d4f4473f6b9da18dfRajkumar Manoharan			   u16 devid, char *product, u32 drv_info);
598fb9987d0f748c983bb795a86f47522313f701a08Sujithvoid ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
599fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_PM
600f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4Sujith Manoharanvoid ath9k_htc_suspend(struct htc_target *htc_handle);
601fb9987d0f748c983bb795a86f47522313f701a08Sujithint ath9k_htc_resume(struct htc_target *htc_handle);
602fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif
603fb9987d0f748c983bb795a86f47522313f701a08Sujith#ifdef CONFIG_ATH9K_HTC_DEBUGFS
604e1572c5eeca8ef87a250322364584458b2dadb35Sujithint ath9k_htc_init_debug(struct ath_hw *ah);
605fb9987d0f748c983bb795a86f47522313f701a08Sujith#else
606e1572c5eeca8ef87a250322364584458b2dadb35Sujithstatic inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; };
607fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* CONFIG_ATH9K_HTC_DEBUGFS */
608fb9987d0f748c983bb795a86f47522313f701a08Sujith
609fb9987d0f748c983bb795a86f47522313f701a08Sujith#endif /* HTC_H */
610