blob: 30ae5bf81611a4df1f2bc7a7ffab6ace44364ba0 [file] [log] [blame]
Kalle Valo5e3dd152013-06-12 20:52:10 +03001/*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#ifndef _CORE_H_
19#define _CORE_H_
20
21#include <linux/completion.h>
22#include <linux/if_ether.h>
23#include <linux/types.h>
24#include <linux/pci.h>
Ben Greear384914b2014-08-25 08:37:32 +030025#include <linux/uuid.h>
26#include <linux/time.h>
Kalle Valo5e3dd152013-06-12 20:52:10 +030027
Michal Kazioredb82362013-07-05 16:15:14 +030028#include "htt.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030029#include "htc.h"
30#include "hw.h"
31#include "targaddrs.h"
32#include "wmi.h"
33#include "../ath.h"
34#include "../regd.h"
Janusz Dziedzic9702c682013-11-20 09:59:41 +020035#include "../dfs_pattern_detector.h"
Simon Wunderlich855aed12014-08-02 09:12:54 +030036#include "spectral.h"
Rajkumar Manoharanfe6f36d2014-12-17 12:22:07 +020037#include "thermal.h"
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +020038#include "wow.h"
Vasanthakumar Thiagarajandcb02db2015-06-18 12:31:09 +053039#include "swap.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030040
41#define MS(_v, _f) (((_v) & _f##_MASK) >> _f##_LSB)
42#define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
43#define WO(_f) ((_f##_OFFSET) >> 2)
44
45#define ATH10K_SCAN_ID 0
46#define WMI_READY_TIMEOUT (5 * HZ)
Kalle Valo14e105c2016-04-13 14:13:21 +030047#define ATH10K_FLUSH_TIMEOUT_HZ (5 * HZ)
48#define ATH10K_CONNECTION_LOSS_HZ (3 * HZ)
Michal Kaziorc94aa7e2015-03-24 12:38:11 +000049#define ATH10K_NUM_CHANS 39
Kalle Valo5e3dd152013-06-12 20:52:10 +030050
51/* Antenna noise floor */
52#define ATH10K_DEFAULT_NOISE_FLOOR -95
53
Bartosz Markowski71098612013-11-14 09:01:15 +010054#define ATH10K_MAX_NUM_MGMT_PENDING 128
Bartosz Markowski5e00d312013-09-26 17:47:12 +020055
Rajkumar Manoharan4705e342015-03-19 16:03:29 +020056/* number of failed packets (20 packets with 16 sw reties each) */
57#define ATH10K_KICKOUT_THRESHOLD (20 * 16)
Kalle Valo5a13e762014-01-20 11:01:46 +020058
59/*
60 * Use insanely high numbers to make sure that the firmware implementation
61 * won't start, we have the same functionality already in hostapd. Unit
62 * is seconds.
63 */
64#define ATH10K_KEEPALIVE_MIN_IDLE 3747
65#define ATH10K_KEEPALIVE_MAX_IDLE 3895
66#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
67
Kalle Valo5e3dd152013-06-12 20:52:10 +030068struct ath10k;
69
Kalle Valoe07db352014-10-13 09:40:47 +030070enum ath10k_bus {
71 ATH10K_BUS_PCI,
Raja Mani0b523ce2016-01-27 15:24:25 +053072 ATH10K_BUS_AHB,
Kalle Valoe07db352014-10-13 09:40:47 +030073};
74
75static inline const char *ath10k_bus_str(enum ath10k_bus bus)
76{
77 switch (bus) {
78 case ATH10K_BUS_PCI:
79 return "pci";
Raja Mani0b523ce2016-01-27 15:24:25 +053080 case ATH10K_BUS_AHB:
81 return "ahb";
Kalle Valoe07db352014-10-13 09:40:47 +030082 }
83
84 return "unknown";
85}
86
Michal Kazior66b8a012015-11-18 06:59:20 +010087enum ath10k_skb_flags {
88 ATH10K_SKB_F_NO_HWCRYPT = BIT(0),
89 ATH10K_SKB_F_DTIM_ZERO = BIT(1),
90 ATH10K_SKB_F_DELIVER_CAB = BIT(2),
Michal Kaziord668dba2015-11-18 06:59:21 +010091 ATH10K_SKB_F_MGMT = BIT(3),
Michal Kazior609db222015-11-18 06:59:22 +010092 ATH10K_SKB_F_QOS = BIT(4),
Michal Kazior66b8a012015-11-18 06:59:20 +010093};
94
Kalle Valo5e3dd152013-06-12 20:52:10 +030095struct ath10k_skb_cb {
96 dma_addr_t paddr;
Michal Kazior66b8a012015-11-18 06:59:20 +010097 u8 flags;
Michal Kaziord84a5122014-11-27 11:09:37 +010098 u8 eid;
Michal Kazioraca146a2015-11-18 06:59:23 +010099 u16 msdu_id;
Michal Kazior609db222015-11-18 06:59:22 +0100100 struct ieee80211_vif *vif;
Michal Kaziordd4717b2016-03-06 16:14:39 +0200101 struct ieee80211_txq *txq;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300102} __packed;
103
Michal Kazior8582bf32015-01-24 12:14:47 +0200104struct ath10k_skb_rxcb {
105 dma_addr_t paddr;
Michal Kaziorc5450702015-01-24 12:14:48 +0200106 struct hlist_node hlist;
Michal Kazior8582bf32015-01-24 12:14:47 +0200107};
108
Kalle Valo5e3dd152013-06-12 20:52:10 +0300109static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb)
110{
111 BUILD_BUG_ON(sizeof(struct ath10k_skb_cb) >
112 IEEE80211_TX_INFO_DRIVER_DATA_SIZE);
113 return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data;
114}
115
Michal Kazior8582bf32015-01-24 12:14:47 +0200116static inline struct ath10k_skb_rxcb *ATH10K_SKB_RXCB(struct sk_buff *skb)
117{
118 BUILD_BUG_ON(sizeof(struct ath10k_skb_rxcb) > sizeof(skb->cb));
119 return (struct ath10k_skb_rxcb *)skb->cb;
120}
121
Michal Kaziorc5450702015-01-24 12:14:48 +0200122#define ATH10K_RXCB_SKB(rxcb) \
123 container_of((void *)rxcb, struct sk_buff, cb)
124
Kalle Valo5e3dd152013-06-12 20:52:10 +0300125static inline u32 host_interest_item_address(u32 item_offset)
126{
127 return QCA988X_HOST_INTEREST_ADDRESS + item_offset;
128}
129
130struct ath10k_bmi {
131 bool done_sent;
132};
133
Bartosz Markowskib3effe62013-09-26 17:47:11 +0200134struct ath10k_mem_chunk {
135 void *vaddr;
136 dma_addr_t paddr;
137 u32 len;
138 u32 req_id;
139};
140
Kalle Valo5e3dd152013-06-12 20:52:10 +0300141struct ath10k_wmi {
142 enum ath10k_htc_ep_id eid;
143 struct completion service_ready;
144 struct completion unified_ready;
Michal Kaziorbe8b3942013-09-13 14:16:54 +0200145 wait_queue_head_t tx_credits_wq;
Michal Kazioracfe7ec2014-11-27 10:11:17 +0100146 DECLARE_BITMAP(svc_map, WMI_SERVICE_MAX);
Bartosz Markowskice428702013-09-26 17:47:05 +0200147 struct wmi_cmd_map *cmd;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200148 struct wmi_vdev_param_map *vdev_param;
Bartosz Markowski226a3392013-09-26 17:47:16 +0200149 struct wmi_pdev_param_map *pdev_param;
Michal Kaziord7579d12014-12-03 10:10:54 +0200150 const struct wmi_ops *ops;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +0200151 const struct wmi_peer_flags_map *peer_flags;
Bartosz Markowskib3effe62013-09-26 17:47:11 +0200152
153 u32 num_mem_chunks;
David Liuccec9032015-07-24 20:25:32 +0300154 u32 rx_decap_mode;
Michal Kazior5c01aa3d2014-09-18 15:21:24 +0200155 struct ath10k_mem_chunk mem_chunks[WMI_MAX_MEM_REQS];
Kalle Valo5e3dd152013-06-12 20:52:10 +0300156};
157
Michal Kazior60ef4012014-09-25 12:33:48 +0200158struct ath10k_fw_stats_peer {
Michal Kazior53268492014-09-25 12:33:50 +0200159 struct list_head list;
160
Kalle Valo5e3dd152013-06-12 20:52:10 +0300161 u8 peer_macaddr[ETH_ALEN];
162 u32 peer_rssi;
163 u32 peer_tx_rate;
Ben Greear23c3aae2014-03-28 14:35:15 +0200164 u32 peer_rx_rate; /* 10x only */
Mohammed Shafi Shajakhande46c012016-01-13 21:16:28 +0530165 u32 rx_duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300166};
167
Mohammed Shafi Shajakhan4a49ae92016-06-30 15:23:47 +0300168struct ath10k_fw_extd_stats_peer {
169 struct list_head list;
170
171 u8 peer_macaddr[ETH_ALEN];
172 u32 rx_duration;
173};
174
Michal Kazior7b6b1532015-02-15 16:50:40 +0200175struct ath10k_fw_stats_vdev {
176 struct list_head list;
177
178 u32 vdev_id;
179 u32 beacon_snr;
180 u32 data_snr;
181 u32 num_tx_frames[4];
182 u32 num_rx_frames;
183 u32 num_tx_frames_retries[4];
184 u32 num_tx_frames_failures[4];
185 u32 num_rts_fail;
186 u32 num_rts_success;
187 u32 num_rx_err;
188 u32 num_rx_discard;
189 u32 num_tx_not_acked;
190 u32 tx_rate_history[10];
191 u32 beacon_rssi_history[10];
192};
193
Michal Kazior53268492014-09-25 12:33:50 +0200194struct ath10k_fw_stats_pdev {
195 struct list_head list;
196
Kalle Valo5e3dd152013-06-12 20:52:10 +0300197 /* PDEV stats */
198 s32 ch_noise_floor;
199 u32 tx_frame_count;
200 u32 rx_frame_count;
201 u32 rx_clear_count;
202 u32 cycle_count;
203 u32 phy_err_count;
204 u32 chan_tx_power;
Chun-Yeow Yeoh52e346d2014-03-28 14:35:16 +0200205 u32 ack_rx_bad;
206 u32 rts_bad;
207 u32 rts_good;
208 u32 fcs_bad;
209 u32 no_beacons;
210 u32 mib_int_count;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300211
212 /* PDEV TX stats */
213 s32 comp_queued;
214 s32 comp_delivered;
215 s32 msdu_enqued;
216 s32 mpdu_enqued;
217 s32 wmm_drop;
218 s32 local_enqued;
219 s32 local_freed;
220 s32 hw_queued;
221 s32 hw_reaped;
222 s32 underrun;
Manikanta Pubbisetty98dd2b92015-10-28 21:38:33 +0200223 u32 hw_paused;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300224 s32 tx_abort;
225 s32 mpdus_requed;
226 u32 tx_ko;
227 u32 data_rc;
228 u32 self_triggers;
229 u32 sw_retry_failure;
230 u32 illgl_rate_phy_err;
231 u32 pdev_cont_xretry;
232 u32 pdev_tx_timeout;
233 u32 pdev_resets;
234 u32 phy_underrun;
235 u32 txop_ovf;
Manikanta Pubbisetty98dd2b92015-10-28 21:38:33 +0200236 u32 seq_posted;
237 u32 seq_failed_queueing;
238 u32 seq_completed;
239 u32 seq_restarted;
240 u32 mu_seq_posted;
241 u32 mpdus_sw_flush;
242 u32 mpdus_hw_filter;
243 u32 mpdus_truncated;
244 u32 mpdus_ack_failed;
245 u32 mpdus_expired;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300246
247 /* PDEV RX stats */
248 s32 mid_ppdu_route_change;
249 s32 status_rcvd;
250 s32 r0_frags;
251 s32 r1_frags;
252 s32 r2_frags;
253 s32 r3_frags;
254 s32 htt_msdus;
255 s32 htt_mpdus;
256 s32 loc_msdus;
257 s32 loc_mpdus;
258 s32 oversize_amsdu;
259 s32 phy_errs;
260 s32 phy_err_drop;
261 s32 mpdu_errs;
Manikanta Pubbisetty98dd2b92015-10-28 21:38:33 +0200262 s32 rx_ovfl_errs;
Michal Kazior53268492014-09-25 12:33:50 +0200263};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300264
Michal Kazior53268492014-09-25 12:33:50 +0200265struct ath10k_fw_stats {
Mohammed Shafi Shajakhan4a49ae92016-06-30 15:23:47 +0300266 bool extended;
Michal Kazior53268492014-09-25 12:33:50 +0200267 struct list_head pdevs;
Michal Kazior7b6b1532015-02-15 16:50:40 +0200268 struct list_head vdevs;
Michal Kazior53268492014-09-25 12:33:50 +0200269 struct list_head peers;
Mohammed Shafi Shajakhan4a49ae92016-06-30 15:23:47 +0300270 struct list_head peers_extd;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300271};
272
Maharaja Kennadyrajan29542662015-10-05 17:56:38 +0300273#define ATH10K_TPC_TABLE_TYPE_FLAG 1
274#define ATH10K_TPC_PREAM_TABLE_END 0xFFFF
275
276struct ath10k_tpc_table {
277 u32 pream_idx[WMI_TPC_RATE_MAX];
278 u8 rate_code[WMI_TPC_RATE_MAX];
279 char tpc_value[WMI_TPC_RATE_MAX][WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
280};
281
282struct ath10k_tpc_stats {
283 u32 reg_domain;
284 u32 chan_freq;
285 u32 phy_mode;
286 u32 twice_antenna_reduction;
287 u32 twice_max_rd_power;
288 s32 twice_antenna_gain;
289 u32 power_limit;
290 u32 num_tx_chain;
291 u32 ctl;
292 u32 rate_max;
293 u8 flag[WMI_TPC_FLAG];
294 struct ath10k_tpc_table tpc_table[WMI_TPC_FLAG];
295};
296
Janusz Dziedzic9702c682013-11-20 09:59:41 +0200297struct ath10k_dfs_stats {
298 u32 phy_errors;
299 u32 pulses_total;
300 u32 pulses_detected;
301 u32 pulses_discarded;
302 u32 radar_detected;
303};
304
Kalle Valo5e3dd152013-06-12 20:52:10 +0300305#define ATH10K_MAX_NUM_PEER_IDS (1 << 11) /* htt rx_desc limit */
306
307struct ath10k_peer {
308 struct list_head list;
Michal Kazior69427262016-03-06 16:14:30 +0200309 struct ieee80211_vif *vif;
310 struct ieee80211_sta *sta;
311
Kalle Valo5e3dd152013-06-12 20:52:10 +0300312 int vdev_id;
313 u8 addr[ETH_ALEN];
314 DECLARE_BITMAP(peer_ids, ATH10K_MAX_NUM_PEER_IDS);
Sujith Manoharanae167132014-11-25 11:46:59 +0530315
316 /* protected by ar->data_lock */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300317 struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
318};
319
Michal Kazior29946872016-03-06 16:14:34 +0200320struct ath10k_txq {
321 struct list_head list;
Michal Kazior3cc0fef2016-03-06 16:14:41 +0200322 unsigned long num_fw_queued;
Michal Kazior426e10e2016-03-06 16:14:43 +0200323 unsigned long num_push_allowed;
Michal Kazior29946872016-03-06 16:14:34 +0200324};
325
Michal Kazior9797feb2014-02-14 14:49:48 +0100326struct ath10k_sta {
327 struct ath10k_vif *arvif;
328
329 /* the following are protected by ar->data_lock */
330 u32 changed; /* IEEE80211_RC_* */
331 u32 bw;
332 u32 nss;
333 u32 smps;
Michal Kaziorbb8f0c62016-03-06 16:14:27 +0200334 u16 peer_id;
Michal Kazior9797feb2014-02-14 14:49:48 +0100335
336 struct work_struct update_wk;
Rajkumar Manoharanf5045982015-01-12 14:07:27 +0200337
338#ifdef CONFIG_MAC80211_DEBUGFS
339 /* protected by conf_mutex */
340 bool aggr_mode;
Mohammed Shafi Shajakhan856e7c32016-01-13 21:16:34 +0530341 u64 rx_duration;
Rajkumar Manoharanf5045982015-01-12 14:07:27 +0200342#endif
Michal Kazior9797feb2014-02-14 14:49:48 +0100343};
344
Kalle Valo14e105c2016-04-13 14:13:21 +0300345#define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5 * HZ)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300346
Michal Kazioraf213192015-01-29 14:29:52 +0200347enum ath10k_beacon_state {
348 ATH10K_BEACON_SCHEDULED = 0,
349 ATH10K_BEACON_SENDING,
350 ATH10K_BEACON_SENT,
351};
352
Kalle Valo5e3dd152013-06-12 20:52:10 +0300353struct ath10k_vif {
Michal Kazior05791192013-10-16 15:44:45 +0300354 struct list_head list;
355
Kalle Valo5e3dd152013-06-12 20:52:10 +0300356 u32 vdev_id;
Michal Kaziorbb8f0c62016-03-06 16:14:27 +0200357 u16 peer_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300358 enum wmi_vdev_type vdev_type;
359 enum wmi_vdev_subtype vdev_subtype;
360 u32 beacon_interval;
361 u32 dtim_period;
Michal Kaziored543882013-09-13 14:16:56 +0200362 struct sk_buff *beacon;
Michal Kazior748afc42014-01-23 12:48:21 +0100363 /* protected by data_lock */
Michal Kazioraf213192015-01-29 14:29:52 +0200364 enum ath10k_beacon_state beacon_state;
Michal Kazior64badcb2014-09-18 11:18:02 +0300365 void *beacon_buf;
366 dma_addr_t beacon_paddr;
Michal Kazior96d828d2015-03-31 10:26:23 +0000367 unsigned long tx_paused; /* arbitrary values defined by target */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300368
369 struct ath10k *ar;
370 struct ieee80211_vif *vif;
371
Michal Kaziorc930f742014-01-23 11:38:25 +0100372 bool is_started;
373 bool is_up;
Simon Wunderlich855aed12014-08-02 09:12:54 +0300374 bool spectral_enabled;
Michal Kaziorcffb41f2015-02-13 13:30:16 +0100375 bool ps;
Michal Kaziorc930f742014-01-23 11:38:25 +0100376 u32 aid;
377 u8 bssid[ETH_ALEN];
378
Kalle Valo5e3dd152013-06-12 20:52:10 +0300379 struct ieee80211_key_conf *wep_keys[WMI_MAX_KEY_INDEX + 1];
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200380 s8 def_wep_key_idx;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300381
382 u16 tx_seq_no;
383
384 union {
385 struct {
Kalle Valo5e3dd152013-06-12 20:52:10 +0300386 u32 uapsd;
387 } sta;
388 struct {
Raja Mani3cec3be2015-06-22 20:22:21 +0530389 /* 512 stations */
390 u8 tim_bitmap[64];
Kalle Valo5e3dd152013-06-12 20:52:10 +0300391 u8 tim_len;
392 u32 ssid_len;
393 u8 ssid[IEEE80211_MAX_SSID_LEN];
394 bool hidden_ssid;
395 /* P2P_IE with NoA attribute for P2P_GO case */
396 u32 noa_len;
397 u8 *noa_data;
398 } ap;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300399 } u;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +0100400
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200401 bool use_cts_prot;
David Liuccec9032015-07-24 20:25:32 +0300402 bool nohwcrypt;
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200403 int num_legacy_stations;
Michal Kazior7d9d5582014-10-21 10:40:15 +0300404 int txpower;
Michal Kazior5e752e42015-01-19 09:53:41 +0100405 struct wmi_wmm_params_all_arg wmm_params;
Michal Kazior81a9a172015-03-05 16:02:17 +0200406 struct work_struct ap_csa_work;
Michal Kaziorcc9904e2015-03-10 16:22:01 +0200407 struct delayed_work connection_loss_work;
Michal Kazior45c9abc2015-04-21 20:42:58 +0300408 struct cfg80211_bitrate_mask bitrate_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300409};
410
411struct ath10k_vif_iter {
412 u32 vdev_id;
413 struct ath10k_vif *arvif;
414};
415
Ben Greear384914b2014-08-25 08:37:32 +0300416/* used for crash-dump storage, protected by data-lock */
417struct ath10k_fw_crash_data {
418 bool crashed_since_read;
419
420 uuid_le uuid;
421 struct timespec timestamp;
422 __le32 registers[REG_DUMP_COUNT_QCA988X];
423};
424
Kalle Valo5e3dd152013-06-12 20:52:10 +0300425struct ath10k_debug {
426 struct dentry *debugfs_phy;
427
Michal Kazior60ef4012014-09-25 12:33:48 +0200428 struct ath10k_fw_stats fw_stats;
429 struct completion fw_stats_complete;
Michal Kazior53268492014-09-25 12:33:50 +0200430 bool fw_stats_done;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300431
Kalle Valoa3d135e2013-09-03 11:44:10 +0300432 unsigned long htt_stats_mask;
433 struct delayed_work htt_stats_dwork;
Janusz Dziedzic9702c682013-11-20 09:59:41 +0200434 struct ath10k_dfs_stats dfs_stats;
435 struct ath_dfs_pool_stats dfs_pool_stats;
Kalle Valof118a3e2014-01-03 12:59:31 +0200436
Maharaja Kennadyrajan29542662015-10-05 17:56:38 +0300437 /* used for tpc-dump storage, protected by data-lock */
438 struct ath10k_tpc_stats *tpc_stats;
439
440 struct completion tpc_complete;
441
Rajkumar Manoharan90174452014-10-03 08:02:33 +0300442 /* protected by conf_mutex */
Kalle Valof118a3e2014-01-03 12:59:31 +0200443 u32 fw_dbglog_mask;
SenthilKumar Jegadeesan467210a2015-01-29 14:36:52 +0530444 u32 fw_dbglog_level;
Rajkumar Manoharan90174452014-10-03 08:02:33 +0300445 u32 pktlog_filter;
Yanbo Li077a3802014-11-25 12:24:33 +0200446 u32 reg_addr;
Peter Oha7bd3e92014-12-02 13:07:14 +0200447 u32 nf_cal_period;
Janusz Dziedzicd3856232014-06-02 21:19:46 +0300448
Ben Greear384914b2014-08-25 08:37:32 +0300449 struct ath10k_fw_crash_data *fw_crash_data;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300450};
451
Michal Kaziorf7843d72013-07-16 09:38:52 +0200452enum ath10k_state {
453 ATH10K_STATE_OFF = 0,
454 ATH10K_STATE_ON,
Michal Kazioraffd3212013-07-16 09:54:35 +0200455
456 /* When doing firmware recovery the device is first powered down.
457 * mac80211 is supposed to call in to start() hook later on. It is
458 * however possible that driver unloading and firmware crash overlap.
459 * mac80211 can wait on conf_mutex in stop() while the device is
460 * stopped in ath10k_core_restart() work holding conf_mutex. The state
461 * RESTARTED means that the device is up and mac80211 has started hw
462 * reconfiguration. Once mac80211 is done with the reconfiguration we
Eliad Pellercf2c92d2014-11-04 11:43:54 +0200463 * set the state to STATE_ON in reconfig_complete(). */
Michal Kazioraffd3212013-07-16 09:54:35 +0200464 ATH10K_STATE_RESTARTING,
465 ATH10K_STATE_RESTARTED,
466
467 /* The device has crashed while restarting hw. This state is like ON
468 * but commands are blocked in HTC and -ECOMM response is given. This
469 * prevents completion timeouts and makes the driver more responsive to
470 * userspace commands. This is also prevents recursive recovery. */
471 ATH10K_STATE_WEDGED,
Kalle Valo43d2a302014-09-10 18:23:30 +0300472
473 /* factory tests */
474 ATH10K_STATE_UTF,
475};
476
477enum ath10k_firmware_mode {
478 /* the default mode, standard 802.11 functionality */
479 ATH10K_FIRMWARE_MODE_NORMAL,
480
481 /* factory tests etc */
482 ATH10K_FIRMWARE_MODE_UTF,
Michal Kaziorf7843d72013-07-16 09:38:52 +0200483};
484
Michal Kazior0d9b0432013-08-09 10:13:33 +0200485enum ath10k_fw_features {
486 /* wmi_mgmt_rx_hdr contains extra RSSI information */
487 ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
488
Kalle Valo202e86e2014-12-03 10:10:08 +0200489 /* Firmware from 10X branch. Deprecated, don't use in new code. */
Bartosz Markowskice428702013-09-26 17:47:05 +0200490 ATH10K_FW_FEATURE_WMI_10X = 1,
491
Bartosz Markowski5e00d312013-09-26 17:47:12 +0200492 /* firmware support tx frame management over WMI, otherwise it's HTT */
493 ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2,
494
Bartosz Markowskid3541812013-12-10 16:20:40 +0100495 /* Firmware does not support P2P */
496 ATH10K_FW_FEATURE_NO_P2P = 3,
497
Kalle Valo202e86e2014-12-03 10:10:08 +0200498 /* Firmware 10.2 feature bit. The ATH10K_FW_FEATURE_WMI_10X feature
499 * bit is required to be set as well. Deprecated, don't use in new
500 * code.
Michal Kazior24c88f72014-07-25 13:32:17 +0200501 */
502 ATH10K_FW_FEATURE_WMI_10_2 = 4,
503
Michal Kaziorcffb41f2015-02-13 13:30:16 +0100504 /* Some firmware revisions lack proper multi-interface client powersave
505 * implementation. Enabling PS could result in connection drops,
506 * traffic stalls, etc.
507 */
508 ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT = 5,
509
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +0200510 /* Some firmware revisions have an incomplete WoWLAN implementation
511 * despite WMI service bit being advertised. This feature flag is used
512 * to distinguish whether WoWLAN is really supported or not.
513 */
514 ATH10K_FW_FEATURE_WOWLAN_SUPPORT = 6,
515
Kalle Valod9153542015-04-28 20:19:30 +0300516 /* Don't trust error code from otp.bin */
David Liuccec9032015-07-24 20:25:32 +0300517 ATH10K_FW_FEATURE_IGNORE_OTP_RESULT = 7,
Kalle Valod9153542015-04-28 20:19:30 +0300518
Michal Kazior48f4ca32015-05-19 14:09:34 +0200519 /* Some firmware revisions pad 4th hw address to 4 byte boundary making
520 * it 8 bytes long in Native Wifi Rx decap.
521 */
David Liuccec9032015-07-24 20:25:32 +0300522 ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING = 8,
Michal Kazior48f4ca32015-05-19 14:09:34 +0200523
Rajkumar Manoharan163f5262015-05-29 17:51:53 +0300524 /* Firmware supports bypassing PLL setting on init. */
525 ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT = 9,
526
David Liuccec9032015-07-24 20:25:32 +0300527 /* Raw mode support. If supported, FW supports receiving and trasmitting
528 * frames in raw mode.
529 */
530 ATH10K_FW_FEATURE_RAW_MODE_SUPPORT = 10,
531
Maharaja62f77f02015-10-21 11:49:18 +0300532 /* Firmware Supports Adaptive CCA*/
533 ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA = 11,
534
Tamizh chelvam90eceb32015-10-29 14:27:42 +0200535 /* Firmware supports management frame protection */
536 ATH10K_FW_FEATURE_MFP_SUPPORT = 12,
537
Michal Kazior9b783762016-01-21 14:13:25 +0100538 /* Firmware supports pull-push model where host shares it's software
539 * queue state with firmware and firmware generates fetch requests
540 * telling host which queues to dequeue tx from.
541 *
542 * Primary function of this is improved MU-MIMO performance with
543 * multiple clients.
544 */
545 ATH10K_FW_FEATURE_PEER_FLOW_CONTROL = 13,
546
Rajkumar Manoharan64e001f2016-05-27 20:15:58 +0530547 /* Firmware supports BT-Coex without reloading firmware via pdev param.
548 * To support Bluetooth coexistence pdev param, WMI_COEX_GPIO_SUPPORT of
549 * extended resource config should be enabled always. This firmware IE
550 * is used to configure WMI_COEX_GPIO_SUPPORT.
551 */
552 ATH10K_FW_FEATURE_BTCOEX_PARAM = 14,
553
Michal Kazior0d9b0432013-08-09 10:13:33 +0200554 /* keep last */
555 ATH10K_FW_FEATURE_COUNT,
556};
557
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200558enum ath10k_dev_flags {
559 /* Indicates that ath10k device is during CAC phase of DFS */
560 ATH10K_CAC_RUNNING,
Michal Kazior6782cb62014-05-23 12:28:47 +0200561 ATH10K_FLAG_CORE_REGISTERED,
Michal Kazior7962b0d2014-10-28 10:34:38 +0100562
563 /* Device has crashed and needs to restart. This indicates any pending
564 * waiters should immediately cancel instead of waiting for a time out.
565 */
566 ATH10K_FLAG_CRASH_FLUSH,
David Liuccec9032015-07-24 20:25:32 +0300567
568 /* Use Raw mode instead of native WiFi Tx/Rx encap mode.
569 * Raw mode supports both hardware and software crypto. Native WiFi only
570 * supports hardware crypto.
571 */
572 ATH10K_FLAG_RAW_MODE,
573
574 /* Disable HW crypto engine */
575 ATH10K_FLAG_HW_CRYPTO_DISABLED,
Yanbo Li844fa572015-10-31 11:07:21 +0200576
577 /* Bluetooth coexistance enabled */
578 ATH10K_FLAG_BTCOEX,
Mohammed Shafi Shajakhancc61a1b2016-03-16 18:13:32 +0530579
580 /* Per Station statistics service */
581 ATH10K_FLAG_PEER_STATS,
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200582};
583
Kalle Valoa58227e2014-10-13 09:40:59 +0300584enum ath10k_cal_mode {
585 ATH10K_CAL_MODE_FILE,
586 ATH10K_CAL_MODE_OTP,
Toshi Kikuchi5aabff02014-12-02 10:55:54 +0200587 ATH10K_CAL_MODE_DT,
Raja Mani3d9195e2016-03-18 11:44:22 +0200588 ATH10K_PRE_CAL_MODE_FILE,
589 ATH10K_PRE_CAL_MODE_DT,
Sven Eckelmann6847f962016-06-02 17:59:50 +0300590 ATH10K_CAL_MODE_EEPROM,
Kalle Valoa58227e2014-10-13 09:40:59 +0300591};
592
David Liuccec9032015-07-24 20:25:32 +0300593enum ath10k_crypt_mode {
594 /* Only use hardware crypto engine */
595 ATH10K_CRYPT_MODE_HW,
596 /* Only use software crypto engine */
597 ATH10K_CRYPT_MODE_SW,
598};
599
Kalle Valoa58227e2014-10-13 09:40:59 +0300600static inline const char *ath10k_cal_mode_str(enum ath10k_cal_mode mode)
601{
602 switch (mode) {
603 case ATH10K_CAL_MODE_FILE:
604 return "file";
605 case ATH10K_CAL_MODE_OTP:
606 return "otp";
Toshi Kikuchi5aabff02014-12-02 10:55:54 +0200607 case ATH10K_CAL_MODE_DT:
608 return "dt";
Raja Mani3d9195e2016-03-18 11:44:22 +0200609 case ATH10K_PRE_CAL_MODE_FILE:
610 return "pre-cal-file";
611 case ATH10K_PRE_CAL_MODE_DT:
612 return "pre-cal-dt";
Sven Eckelmann6847f962016-06-02 17:59:50 +0300613 case ATH10K_CAL_MODE_EEPROM:
614 return "eeprom";
Kalle Valoa58227e2014-10-13 09:40:59 +0300615 }
616
617 return "unknown";
618}
619
Michal Kazior5c81c7f2014-08-05 14:54:44 +0200620enum ath10k_scan_state {
621 ATH10K_SCAN_IDLE,
622 ATH10K_SCAN_STARTING,
623 ATH10K_SCAN_RUNNING,
624 ATH10K_SCAN_ABORTING,
625};
626
627static inline const char *ath10k_scan_state_str(enum ath10k_scan_state state)
628{
629 switch (state) {
630 case ATH10K_SCAN_IDLE:
631 return "idle";
632 case ATH10K_SCAN_STARTING:
633 return "starting";
634 case ATH10K_SCAN_RUNNING:
635 return "running";
636 case ATH10K_SCAN_ABORTING:
637 return "aborting";
638 }
639
640 return "unknown";
641}
642
Michal Kazior96d828d2015-03-31 10:26:23 +0000643enum ath10k_tx_pause_reason {
644 ATH10K_TX_PAUSE_Q_FULL,
645 ATH10K_TX_PAUSE_MAX,
646};
647
Kalle Valo7ebf7212016-04-20 19:44:51 +0300648struct ath10k_fw_file {
649 const struct firmware *firmware;
650
Kalle Valo45317352016-04-20 19:45:05 +0300651 char fw_version[ETHTOOL_FWVERS_LEN];
652
Kalle Valoc4cdf752016-04-20 19:45:18 +0300653 DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT);
654
Kalle Valobf3c13a2016-04-20 19:45:33 +0300655 enum ath10k_fw_wmi_op_version wmi_op_version;
Kalle Valo77561f92016-04-20 19:45:47 +0300656 enum ath10k_fw_htt_op_version htt_op_version;
Kalle Valobf3c13a2016-04-20 19:45:33 +0300657
Kalle Valo7ebf7212016-04-20 19:44:51 +0300658 const void *firmware_data;
659 size_t firmware_len;
660
661 const void *otp_data;
662 size_t otp_len;
663
664 const void *codeswap_data;
665 size_t codeswap_len;
666};
667
668struct ath10k_fw_components {
669 const struct firmware *board;
670 const void *board_data;
671 size_t board_len;
672
673 struct ath10k_fw_file fw_file;
674};
675
Kalle Valo5e3dd152013-06-12 20:52:10 +0300676struct ath10k {
677 struct ath_common ath_common;
678 struct ieee80211_hw *hw;
Michal Kazior4ca18072016-07-18 23:22:18 +0300679 struct ieee80211_ops *ops;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300680 struct device *dev;
681 u8 mac_addr[ETH_ALEN];
682
Michal Kaziord63955b2015-01-24 12:14:49 +0200683 enum ath10k_hw_rev hw_rev;
Michal Kazior36582e52015-08-13 14:32:26 +0200684 u16 dev_id;
Kalle Valoe01ae682013-09-01 11:22:14 +0300685 u32 chip_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300686 u32 target_version;
687 u8 fw_version_major;
688 u32 fw_version_minor;
689 u16 fw_version_release;
690 u16 fw_version_build;
Yanbo Li6274cd42015-04-01 22:53:21 +0300691 u32 fw_stats_req_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300692 u32 phy_capability;
693 u32 hw_min_tx_power;
694 u32 hw_max_tx_power;
695 u32 ht_cap_info;
696 u32 vht_cap_info;
Michal Kazior8865bee42013-07-24 12:36:46 +0200697 u32 num_rf_chains;
Raja Mani5c8726e2015-06-22 20:22:26 +0530698 u32 max_spatial_stream;
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +0530699 /* protected by conf_mutex */
700 bool ani_enabled;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300701
Kalle Valo5e3dd152013-06-12 20:52:10 +0300702 bool p2p;
703
704 struct {
Kalle Valoe07db352014-10-13 09:40:47 +0300705 enum ath10k_bus bus;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300706 const struct ath10k_hif_ops *ops;
707 } hif;
708
Marek Puzyniak9042e172014-02-10 17:14:23 +0100709 struct completion target_suspend;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300710
Michal Kaziord63955b2015-01-24 12:14:49 +0200711 const struct ath10k_hw_regs *regs;
Vasanthakumar Thiagarajan2f2cfc42015-06-18 12:31:01 +0530712 const struct ath10k_hw_values *hw_values;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300713 struct ath10k_bmi bmi;
Michal Kazioredb82362013-07-05 16:15:14 +0300714 struct ath10k_wmi wmi;
Michal Kaziorcd003fa2013-07-05 16:15:13 +0300715 struct ath10k_htc htc;
Michal Kazioredb82362013-07-05 16:15:14 +0300716 struct ath10k_htt htt;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300717
718 struct ath10k_hw_params {
719 u32 id;
Bartosz Markowski079a0492015-11-05 09:50:42 +0100720 u16 dev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300721 const char *name;
722 u32 patch_load_addr;
Michal Kazior3a8200b2014-12-02 10:55:55 +0200723 int uart_pin;
Vasanthakumar Thiagarajand7727032015-06-18 12:31:10 +0530724 u32 otp_exe_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300725
Vasanthakumar Thiagarajan26c19762016-06-07 15:47:05 +0300726 /* Type of hw cycle counter wraparound logic, for more info
727 * refer enum ath10k_hw_cc_wraparound_type.
Michal Kazior587f7032015-05-25 14:06:18 +0200728 */
Vasanthakumar Thiagarajan26c19762016-06-07 15:47:05 +0300729 enum ath10k_hw_cc_wraparound_type cc_wraparound_type;
Michal Kazior587f7032015-05-25 14:06:18 +0200730
Raja Manid9156b52015-06-22 20:22:27 +0530731 /* Some of chip expects fragment descriptor to be continuous
732 * memory for any TX operation. Set continuous_frag_desc flag
733 * for the hardware which have such requirement.
734 */
735 bool continuous_frag_desc;
736
Mohammed Shafi Shajakhan5269c652016-06-07 15:47:04 +0300737 /* CCK hardware rate table mapping for the newer chipsets
738 * like QCA99X0, QCA4019 got revised. The CCK h/w rate values
739 * are in a proper order with respect to the rate/preamble
740 */
741 bool cck_rate_map_rev2;
742
Vasanthakumar Thiagarajan9c8fb542015-08-12 16:24:05 +0530743 u32 channel_counters_freq_hz;
744
Vivek Natarajan7b7da0a2015-08-31 16:34:55 +0530745 /* Mgmt tx descriptors threshold for limiting probe response
746 * frames.
747 */
748 u32 max_probe_resp_desc_thres;
749
Yanbo Lib8d55fc2015-11-16 22:22:02 +0200750 /* The padding bytes's location is different on various chips */
751 enum ath10k_hw_4addr_pad hw_4addr_pad;
752
Raja Mani5699a6f2016-01-29 16:35:12 +0530753 u32 tx_chain_mask;
754 u32 rx_chain_mask;
755 u32 max_spatial_stream;
Raja Mani0b8e3c42016-03-18 11:44:22 +0200756 u32 cal_data_len;
Raja Mani5699a6f2016-01-29 16:35:12 +0530757
Kalle Valo5e3dd152013-06-12 20:52:10 +0300758 struct ath10k_hw_params_fw {
759 const char *dir;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300760 const char *board;
Michal Kazior9764a2a2014-12-02 10:55:54 +0200761 size_t board_size;
762 size_t board_ext_size;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300763 } fw;
764 } hw_params;
765
Kalle Valo7ebf7212016-04-20 19:44:51 +0300766 /* contains the firmware images used with ATH10K_FIRMWARE_MODE_NORMAL */
767 struct ath10k_fw_components normal_mode_fw;
Kalle Valo958df3a2013-09-27 19:55:01 +0300768
Kalle Valo7ebf7212016-04-20 19:44:51 +0300769 /* READ-ONLY images of the running firmware, which can be either
770 * normal or UTF. Do not modify, release etc!
771 */
772 const struct ath10k_fw_components *running_fw;
Michal Kazior29385052013-07-16 09:38:58 +0200773
Rajkumar Manoharanb1311292016-04-07 12:07:29 +0530774 const struct firmware *pre_cal_file;
775 const struct firmware *cal_file;
Kalle Valoa58227e2014-10-13 09:40:59 +0300776
Vasanthakumar Thiagarajandcb02db2015-06-18 12:31:09 +0530777 struct {
Vasanthakumar Thiagarajandcb02db2015-06-18 12:31:09 +0530778 struct ath10k_swap_code_seg_info *firmware_swap_code_seg_info;
779 } swap;
780
Manikanta Pubbisetty0a51b342015-10-09 11:55:58 +0300781 struct {
782 u32 vendor;
783 u32 device;
784 u32 subsystem_vendor;
785 u32 subsystem_device;
Manikanta Pubbisettydb0984e2015-10-09 11:55:59 +0300786
787 bool bmi_ids_valid;
788 u8 bmi_board_id;
789 u8 bmi_chip_id;
Manikanta Pubbisetty0a51b342015-10-09 11:55:58 +0300790 } id;
Michal Kaziorde57e2c2015-04-17 09:19:17 +0000791
Kalle Valo1a222432013-09-27 19:55:07 +0300792 int fw_api;
Manikanta Pubbisetty0a51b342015-10-09 11:55:58 +0300793 int bd_api;
Kalle Valoa58227e2014-10-13 09:40:59 +0300794 enum ath10k_cal_mode cal_mode;
Kalle Valo1a222432013-09-27 19:55:07 +0300795
Kalle Valo5e3dd152013-06-12 20:52:10 +0300796 struct {
797 struct completion started;
798 struct completion completed;
799 struct completion on_channel;
Michal Kazior5c81c7f2014-08-05 14:54:44 +0200800 struct delayed_work timeout;
801 enum ath10k_scan_state state;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300802 bool is_roc;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300803 int vdev_id;
804 int roc_freq;
Michal Kaziord710e752015-07-09 13:08:36 +0200805 bool roc_notify;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300806 } scan;
807
808 struct {
Johannes Berg57fbcce2016-04-12 15:56:15 +0200809 struct ieee80211_supported_band sbands[NUM_NL80211_BANDS];
Kalle Valo5e3dd152013-06-12 20:52:10 +0300810 } mac;
811
812 /* should never be NULL; needed for regular htt rx */
813 struct ieee80211_channel *rx_channel;
814
815 /* valid during scan; needed for mgmt rx during scan */
816 struct ieee80211_channel *scan_channel;
817
Michal Kaziorc930f742014-01-23 11:38:25 +0100818 /* current operating channel definition */
819 struct cfg80211_chan_def chandef;
820
Rajkumar Manoharan2ce9b252016-03-08 22:57:23 +0530821 /* currently configured operating channel in firmware */
822 struct ieee80211_channel *tgt_oper_chan;
823
Ben Greear16c11172014-09-23 14:17:16 -0700824 unsigned long long free_vdev_map;
Michal Kazior500ff9f2015-03-31 10:26:21 +0000825 struct ath10k_vif *monitor_arvif;
Michal Kazior1bbc0972014-04-08 09:45:47 +0300826 bool monitor;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300827 int monitor_vdev_id;
Michal Kazior1bbc0972014-04-08 09:45:47 +0300828 bool monitor_started;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300829 unsigned int filter_flags;
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200830 unsigned long dev_flags;
Viresh Kumar621a5f72015-09-26 15:04:07 -0700831 bool dfs_block_radar_events;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300832
Michal Kaziord6500972014-04-08 09:56:09 +0300833 /* protected by conf_mutex */
834 bool radar_enabled;
835 int num_started_vdevs;
836
Ben Greear46acf7b2014-05-16 17:15:38 +0300837 /* Protected by conf-mutex */
Ben Greear46acf7b2014-05-16 17:15:38 +0300838 u8 cfg_tx_chainmask;
839 u8 cfg_rx_chainmask;
840
Kalle Valo5e3dd152013-06-12 20:52:10 +0300841 struct completion install_key_done;
842
843 struct completion vdev_setup_done;
844
845 struct workqueue_struct *workqueue;
Raja Manic8ecfc12015-07-29 11:40:38 +0300846 /* Auxiliary workqueue */
847 struct workqueue_struct *workqueue_aux;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300848
849 /* prevents concurrent FW reconfiguration */
850 struct mutex conf_mutex;
851
852 /* protects shared structure data */
853 spinlock_t data_lock;
Michal Kazior29946872016-03-06 16:14:34 +0200854 /* protects: ar->txqs, artxq->list */
855 spinlock_t txqs_lock;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300856
Michal Kazior29946872016-03-06 16:14:34 +0200857 struct list_head txqs;
Michal Kazior05791192013-10-16 15:44:45 +0300858 struct list_head arvifs;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300859 struct list_head peers;
Michal Kazior69427262016-03-06 16:14:30 +0200860 struct ath10k_peer *peer_map[ATH10K_MAX_NUM_PEER_IDS];
Kalle Valo5e3dd152013-06-12 20:52:10 +0300861 wait_queue_head_t peer_mapping_wq;
862
Michal Kazior292a7532014-11-25 15:16:04 +0100863 /* protected by conf_mutex */
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100864 int num_peers;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100865 int num_stations;
866
867 int max_num_peers;
868 int max_num_stations;
Kalle Valo30c78162014-12-17 12:20:45 +0200869 int max_num_vdevs;
Marek Puzyniak8cca3d62015-03-30 09:51:52 +0300870 int max_num_tdls_vdevs;
Raja Manid1e52a82015-06-22 20:10:15 +0530871 int num_active_peers;
872 int num_tids;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100873
Raja Manic8ecfc12015-07-29 11:40:38 +0300874 struct work_struct svc_rdy_work;
875 struct sk_buff *svc_rdy_skb;
876
Kalle Valo5e3dd152013-06-12 20:52:10 +0300877 struct work_struct offchan_tx_work;
878 struct sk_buff_head offchan_tx_queue;
879 struct completion offchan_tx_completed;
880 struct sk_buff *offchan_tx_skb;
881
Bartosz Markowski5e00d312013-09-26 17:47:12 +0200882 struct work_struct wmi_mgmt_tx_work;
883 struct sk_buff_head wmi_mgmt_tx_queue;
884
Michal Kaziorf7843d72013-07-16 09:38:52 +0200885 enum ath10k_state state;
886
Michal Kazior6782cb62014-05-23 12:28:47 +0200887 struct work_struct register_work;
Michal Kazioraffd3212013-07-16 09:54:35 +0200888 struct work_struct restart_work;
889
Michal Kazior2e1dea42013-07-31 10:32:40 +0200890 /* cycle count is reported twice for each visited channel during scan.
891 * access protected by data_lock */
892 u32 survey_last_rx_clear_count;
893 u32 survey_last_cycle_count;
894 struct survey_info survey[ATH10K_NUM_CHANS];
895
Michal Kazior44b7d482015-05-25 14:06:19 +0200896 /* Channel info events are expected to come in pairs without and with
897 * COMPLETE flag set respectively for each channel visit during scan.
898 *
899 * However there are deviations from this rule. This flag is used to
900 * avoid reporting garbage data.
901 */
902 bool ch_info_can_report_survey;
Rajkumar Manoharanfa7937e2016-04-27 16:23:22 +0530903 struct completion bss_survey_done;
Michal Kazior44b7d482015-05-25 14:06:19 +0200904
Janusz Dziedzic9702c682013-11-20 09:59:41 +0200905 struct dfs_pattern_detector *dfs_detector;
906
Michal Kazior96d828d2015-03-31 10:26:23 +0000907 unsigned long tx_paused; /* see ATH10K_TX_PAUSE_ */
908
Kalle Valo5e3dd152013-06-12 20:52:10 +0300909#ifdef CONFIG_ATH10K_DEBUGFS
910 struct ath10k_debug debug;
Simon Wunderlich855aed12014-08-02 09:12:54 +0300911 struct {
912 /* relay(fs) channel for spectral scan */
913 struct rchan *rfs_chan_spec_scan;
914
915 /* spectral_mode and spec_config are protected by conf_mutex */
916 enum ath10k_spectral_mode mode;
917 struct ath10k_spec_scan config;
918 } spectral;
Mohammed Shafi Shajakhande46d162016-04-26 20:54:36 +0530919#endif
Michal Kaziore7b54192014-08-07 11:03:27 +0200920
Kalle Valo43d2a302014-09-10 18:23:30 +0300921 struct {
922 /* protected by conf_mutex */
Kalle Valo7ebf7212016-04-20 19:44:51 +0300923 struct ath10k_fw_components utf_mode_fw;
Kalle Valo7ebf7212016-04-20 19:44:51 +0300924
Kalle Valo43d2a302014-09-10 18:23:30 +0300925 /* protected by data_lock */
926 bool utf_monitor;
927 } testmode;
928
Ben Greearf51dbe72014-09-29 14:41:46 +0300929 struct {
930 /* protected by data_lock */
931 u32 fw_crash_counter;
932 u32 fw_warm_reset_counter;
933 u32 fw_cold_reset_counter;
934 } stats;
935
Rajkumar Manoharanfe6f36d2014-12-17 12:22:07 +0200936 struct ath10k_thermal thermal;
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +0200937 struct ath10k_wow wow;
Rajkumar Manoharanfe6f36d2014-12-17 12:22:07 +0200938
Michal Kaziore7b54192014-08-07 11:03:27 +0200939 /* must be last */
940 u8 drv_priv[0] __aligned(sizeof(void *));
Kalle Valo5e3dd152013-06-12 20:52:10 +0300941};
942
Mohammed Shafi Shajakhancc61a1b2016-03-16 18:13:32 +0530943static inline bool ath10k_peer_stats_enabled(struct ath10k *ar)
944{
945 if (test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags) &&
946 test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
947 return true;
948
949 return false;
950}
951
Michal Kaziore7b54192014-08-07 11:03:27 +0200952struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
Kalle Valoe07db352014-10-13 09:40:47 +0300953 enum ath10k_bus bus,
Michal Kaziord63955b2015-01-24 12:14:49 +0200954 enum ath10k_hw_rev hw_rev,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955 const struct ath10k_hif_ops *hif_ops);
956void ath10k_core_destroy(struct ath10k *ar);
Michal Kaziorb27bc5a2015-06-15 14:46:40 +0300957void ath10k_core_get_fw_features_str(struct ath10k *ar,
958 char *buf,
959 size_t max_len);
Kalle Valo9dfe2402016-04-20 19:46:01 +0300960int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
961 struct ath10k_fw_file *fw_file);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300962
Kalle Valo7ebf7212016-04-20 19:44:51 +0300963int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
964 const struct ath10k_fw_components *fw_components);
Marek Puzyniak00f54822014-02-10 17:14:24 +0100965int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);
Michal Kaziordd30a362013-07-16 09:38:51 +0200966void ath10k_core_stop(struct ath10k *ar);
Kalle Valoe01ae682013-09-01 11:22:14 +0300967int ath10k_core_register(struct ath10k *ar, u32 chip_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300968void ath10k_core_unregister(struct ath10k *ar);
969
Kalle Valo5e3dd152013-06-12 20:52:10 +0300970#endif /* _CORE_H_ */