xref: /openbmc/linux/drivers/net/wireless/ath/ath10k/mac.c (revision 0c874100)
1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
4  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include "mac.h"
20 
21 #include <net/cfg80211.h>
22 #include <net/mac80211.h>
23 #include <linux/etherdevice.h>
24 #include <linux/acpi.h>
25 
26 #include "hif.h"
27 #include "core.h"
28 #include "debug.h"
29 #include "wmi.h"
30 #include "htt.h"
31 #include "txrx.h"
32 #include "testmode.h"
33 #include "wmi-tlv.h"
34 #include "wmi-ops.h"
35 #include "wow.h"
36 
37 /*********/
38 /* Rates */
39 /*********/
40 
41 static struct ieee80211_rate ath10k_rates[] = {
42 	{ .bitrate = 10,
43 	  .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
44 	{ .bitrate = 20,
45 	  .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
46 	  .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
47 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
48 	{ .bitrate = 55,
49 	  .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
50 	  .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
51 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
52 	{ .bitrate = 110,
53 	  .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
54 	  .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
55 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
56 
57 	{ .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
58 	{ .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
59 	{ .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
60 	{ .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
61 	{ .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
62 	{ .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
63 	{ .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
64 	{ .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
65 };
66 
67 static struct ieee80211_rate ath10k_rates_rev2[] = {
68 	{ .bitrate = 10,
69 	  .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_1M },
70 	{ .bitrate = 20,
71 	  .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_2M,
72 	  .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_2M,
73 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
74 	{ .bitrate = 55,
75 	  .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_5_5M,
76 	  .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_5_5M,
77 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
78 	{ .bitrate = 110,
79 	  .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_11M,
80 	  .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_11M,
81 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
82 
83 	{ .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
84 	{ .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
85 	{ .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
86 	{ .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
87 	{ .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
88 	{ .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
89 	{ .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
90 	{ .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
91 };
92 
93 #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
94 
95 #define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
96 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
97 			     ATH10K_MAC_FIRST_OFDM_RATE_IDX)
98 #define ath10k_g_rates (ath10k_rates + 0)
99 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
100 
101 #define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
102 #define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
103 
104 #define ath10k_wmi_legacy_rates ath10k_rates
105 
106 static bool ath10k_mac_bitrate_is_cck(int bitrate)
107 {
108 	switch (bitrate) {
109 	case 10:
110 	case 20:
111 	case 55:
112 	case 110:
113 		return true;
114 	}
115 
116 	return false;
117 }
118 
119 static u8 ath10k_mac_bitrate_to_rate(int bitrate)
120 {
121 	return DIV_ROUND_UP(bitrate, 5) |
122 	       (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
123 }
124 
125 u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
126 			     u8 hw_rate, bool cck)
127 {
128 	const struct ieee80211_rate *rate;
129 	int i;
130 
131 	for (i = 0; i < sband->n_bitrates; i++) {
132 		rate = &sband->bitrates[i];
133 
134 		if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
135 			continue;
136 
137 		if (rate->hw_value == hw_rate)
138 			return i;
139 		else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
140 			 rate->hw_value_short == hw_rate)
141 			return i;
142 	}
143 
144 	return 0;
145 }
146 
147 u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
148 			     u32 bitrate)
149 {
150 	int i;
151 
152 	for (i = 0; i < sband->n_bitrates; i++)
153 		if (sband->bitrates[i].bitrate == bitrate)
154 			return i;
155 
156 	return 0;
157 }
158 
159 static int ath10k_mac_get_rate_hw_value(int bitrate)
160 {
161 	int i;
162 	u8 hw_value_prefix = 0;
163 
164 	if (ath10k_mac_bitrate_is_cck(bitrate))
165 		hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
166 
167 	for (i = 0; i < ARRAY_SIZE(ath10k_rates); i++) {
168 		if (ath10k_rates[i].bitrate == bitrate)
169 			return hw_value_prefix | ath10k_rates[i].hw_value;
170 	}
171 
172 	return -EINVAL;
173 }
174 
175 static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
176 {
177 	switch ((mcs_map >> (2 * nss)) & 0x3) {
178 	case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
179 	case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
180 	case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
181 	}
182 	return 0;
183 }
184 
185 static u32
186 ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
187 {
188 	int nss;
189 
190 	for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
191 		if (ht_mcs_mask[nss])
192 			return nss + 1;
193 
194 	return 1;
195 }
196 
197 static u32
198 ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
199 {
200 	int nss;
201 
202 	for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
203 		if (vht_mcs_mask[nss])
204 			return nss + 1;
205 
206 	return 1;
207 }
208 
209 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)
210 {
211 	enum wmi_host_platform_type platform_type;
212 	int ret;
213 
214 	if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map))
215 		platform_type = WMI_HOST_PLATFORM_LOW_PERF;
216 	else
217 		platform_type = WMI_HOST_PLATFORM_HIGH_PERF;
218 
219 	ret = ath10k_wmi_ext_resource_config(ar, platform_type, val);
220 
221 	if (ret && ret != -EOPNOTSUPP) {
222 		ath10k_warn(ar, "failed to configure ext resource: %d\n", ret);
223 		return ret;
224 	}
225 
226 	return 0;
227 }
228 
229 /**********/
230 /* Crypto */
231 /**********/
232 
233 static int ath10k_send_key(struct ath10k_vif *arvif,
234 			   struct ieee80211_key_conf *key,
235 			   enum set_key_cmd cmd,
236 			   const u8 *macaddr, u32 flags)
237 {
238 	struct ath10k *ar = arvif->ar;
239 	struct wmi_vdev_install_key_arg arg = {
240 		.vdev_id = arvif->vdev_id,
241 		.key_idx = key->keyidx,
242 		.key_len = key->keylen,
243 		.key_data = key->key,
244 		.key_flags = flags,
245 		.macaddr = macaddr,
246 	};
247 
248 	lockdep_assert_held(&arvif->ar->conf_mutex);
249 
250 	switch (key->cipher) {
251 	case WLAN_CIPHER_SUITE_CCMP:
252 		arg.key_cipher = WMI_CIPHER_AES_CCM;
253 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
254 		break;
255 	case WLAN_CIPHER_SUITE_TKIP:
256 		arg.key_cipher = WMI_CIPHER_TKIP;
257 		arg.key_txmic_len = 8;
258 		arg.key_rxmic_len = 8;
259 		break;
260 	case WLAN_CIPHER_SUITE_WEP40:
261 	case WLAN_CIPHER_SUITE_WEP104:
262 		arg.key_cipher = WMI_CIPHER_WEP;
263 		break;
264 	case WLAN_CIPHER_SUITE_CCMP_256:
265 		arg.key_cipher = WMI_CIPHER_AES_CCM;
266 		break;
267 	case WLAN_CIPHER_SUITE_GCMP:
268 	case WLAN_CIPHER_SUITE_GCMP_256:
269 		arg.key_cipher = WMI_CIPHER_AES_GCM;
270 		break;
271 	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
272 	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
273 	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
274 	case WLAN_CIPHER_SUITE_AES_CMAC:
275 		WARN_ON(1);
276 		return -EINVAL;
277 	default:
278 		ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
279 		return -EOPNOTSUPP;
280 	}
281 
282 	if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
283 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
284 
285 	if (cmd == DISABLE_KEY) {
286 		arg.key_cipher = WMI_CIPHER_NONE;
287 		arg.key_data = NULL;
288 	}
289 
290 	return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
291 }
292 
293 static int ath10k_install_key(struct ath10k_vif *arvif,
294 			      struct ieee80211_key_conf *key,
295 			      enum set_key_cmd cmd,
296 			      const u8 *macaddr, u32 flags)
297 {
298 	struct ath10k *ar = arvif->ar;
299 	int ret;
300 	unsigned long time_left;
301 
302 	lockdep_assert_held(&ar->conf_mutex);
303 
304 	reinit_completion(&ar->install_key_done);
305 
306 	if (arvif->nohwcrypt)
307 		return 1;
308 
309 	ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
310 	if (ret)
311 		return ret;
312 
313 	time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
314 	if (time_left == 0)
315 		return -ETIMEDOUT;
316 
317 	return 0;
318 }
319 
320 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
321 					const u8 *addr)
322 {
323 	struct ath10k *ar = arvif->ar;
324 	struct ath10k_peer *peer;
325 	int ret;
326 	int i;
327 	u32 flags;
328 
329 	lockdep_assert_held(&ar->conf_mutex);
330 
331 	if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
332 		    arvif->vif->type != NL80211_IFTYPE_ADHOC &&
333 		    arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
334 		return -EINVAL;
335 
336 	spin_lock_bh(&ar->data_lock);
337 	peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
338 	spin_unlock_bh(&ar->data_lock);
339 
340 	if (!peer)
341 		return -ENOENT;
342 
343 	for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
344 		if (arvif->wep_keys[i] == NULL)
345 			continue;
346 
347 		switch (arvif->vif->type) {
348 		case NL80211_IFTYPE_AP:
349 			flags = WMI_KEY_PAIRWISE;
350 
351 			if (arvif->def_wep_key_idx == i)
352 				flags |= WMI_KEY_TX_USAGE;
353 
354 			ret = ath10k_install_key(arvif, arvif->wep_keys[i],
355 						 SET_KEY, addr, flags);
356 			if (ret < 0)
357 				return ret;
358 			break;
359 		case NL80211_IFTYPE_ADHOC:
360 			ret = ath10k_install_key(arvif, arvif->wep_keys[i],
361 						 SET_KEY, addr,
362 						 WMI_KEY_PAIRWISE);
363 			if (ret < 0)
364 				return ret;
365 
366 			ret = ath10k_install_key(arvif, arvif->wep_keys[i],
367 						 SET_KEY, addr, WMI_KEY_GROUP);
368 			if (ret < 0)
369 				return ret;
370 			break;
371 		default:
372 			WARN_ON(1);
373 			return -EINVAL;
374 		}
375 
376 		spin_lock_bh(&ar->data_lock);
377 		peer->keys[i] = arvif->wep_keys[i];
378 		spin_unlock_bh(&ar->data_lock);
379 	}
380 
381 	/* In some cases (notably with static WEP IBSS with multiple keys)
382 	 * multicast Tx becomes broken. Both pairwise and groupwise keys are
383 	 * installed already. Using WMI_KEY_TX_USAGE in different combinations
384 	 * didn't seem help. Using def_keyid vdev parameter seems to be
385 	 * effective so use that.
386 	 *
387 	 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
388 	 */
389 	if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
390 		return 0;
391 
392 	if (arvif->def_wep_key_idx == -1)
393 		return 0;
394 
395 	ret = ath10k_wmi_vdev_set_param(arvif->ar,
396 					arvif->vdev_id,
397 					arvif->ar->wmi.vdev_param->def_keyid,
398 					arvif->def_wep_key_idx);
399 	if (ret) {
400 		ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
401 			    arvif->vdev_id, ret);
402 		return ret;
403 	}
404 
405 	return 0;
406 }
407 
408 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
409 				  const u8 *addr)
410 {
411 	struct ath10k *ar = arvif->ar;
412 	struct ath10k_peer *peer;
413 	int first_errno = 0;
414 	int ret;
415 	int i;
416 	u32 flags = 0;
417 
418 	lockdep_assert_held(&ar->conf_mutex);
419 
420 	spin_lock_bh(&ar->data_lock);
421 	peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
422 	spin_unlock_bh(&ar->data_lock);
423 
424 	if (!peer)
425 		return -ENOENT;
426 
427 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
428 		if (peer->keys[i] == NULL)
429 			continue;
430 
431 		/* key flags are not required to delete the key */
432 		ret = ath10k_install_key(arvif, peer->keys[i],
433 					 DISABLE_KEY, addr, flags);
434 		if (ret < 0 && first_errno == 0)
435 			first_errno = ret;
436 
437 		if (ret < 0)
438 			ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
439 				    i, ret);
440 
441 		spin_lock_bh(&ar->data_lock);
442 		peer->keys[i] = NULL;
443 		spin_unlock_bh(&ar->data_lock);
444 	}
445 
446 	return first_errno;
447 }
448 
449 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
450 				    u8 keyidx)
451 {
452 	struct ath10k_peer *peer;
453 	int i;
454 
455 	lockdep_assert_held(&ar->data_lock);
456 
457 	/* We don't know which vdev this peer belongs to,
458 	 * since WMI doesn't give us that information.
459 	 *
460 	 * FIXME: multi-bss needs to be handled.
461 	 */
462 	peer = ath10k_peer_find(ar, 0, addr);
463 	if (!peer)
464 		return false;
465 
466 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
467 		if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
468 			return true;
469 	}
470 
471 	return false;
472 }
473 
474 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
475 				 struct ieee80211_key_conf *key)
476 {
477 	struct ath10k *ar = arvif->ar;
478 	struct ath10k_peer *peer;
479 	u8 addr[ETH_ALEN];
480 	int first_errno = 0;
481 	int ret;
482 	int i;
483 	u32 flags = 0;
484 
485 	lockdep_assert_held(&ar->conf_mutex);
486 
487 	for (;;) {
488 		/* since ath10k_install_key we can't hold data_lock all the
489 		 * time, so we try to remove the keys incrementally
490 		 */
491 		spin_lock_bh(&ar->data_lock);
492 		i = 0;
493 		list_for_each_entry(peer, &ar->peers, list) {
494 			for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
495 				if (peer->keys[i] == key) {
496 					ether_addr_copy(addr, peer->addr);
497 					peer->keys[i] = NULL;
498 					break;
499 				}
500 			}
501 
502 			if (i < ARRAY_SIZE(peer->keys))
503 				break;
504 		}
505 		spin_unlock_bh(&ar->data_lock);
506 
507 		if (i == ARRAY_SIZE(peer->keys))
508 			break;
509 		/* key flags are not required to delete the key */
510 		ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
511 		if (ret < 0 && first_errno == 0)
512 			first_errno = ret;
513 
514 		if (ret)
515 			ath10k_warn(ar, "failed to remove key for %pM: %d\n",
516 				    addr, ret);
517 	}
518 
519 	return first_errno;
520 }
521 
522 static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
523 					 struct ieee80211_key_conf *key)
524 {
525 	struct ath10k *ar = arvif->ar;
526 	struct ath10k_peer *peer;
527 	int ret;
528 
529 	lockdep_assert_held(&ar->conf_mutex);
530 
531 	list_for_each_entry(peer, &ar->peers, list) {
532 		if (ether_addr_equal(peer->addr, arvif->vif->addr))
533 			continue;
534 
535 		if (ether_addr_equal(peer->addr, arvif->bssid))
536 			continue;
537 
538 		if (peer->keys[key->keyidx] == key)
539 			continue;
540 
541 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
542 			   arvif->vdev_id, key->keyidx);
543 
544 		ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
545 		if (ret) {
546 			ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
547 				    arvif->vdev_id, peer->addr, ret);
548 			return ret;
549 		}
550 	}
551 
552 	return 0;
553 }
554 
555 /*********************/
556 /* General utilities */
557 /*********************/
558 
559 static inline enum wmi_phy_mode
560 chan_to_phymode(const struct cfg80211_chan_def *chandef)
561 {
562 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
563 
564 	switch (chandef->chan->band) {
565 	case NL80211_BAND_2GHZ:
566 		switch (chandef->width) {
567 		case NL80211_CHAN_WIDTH_20_NOHT:
568 			if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
569 				phymode = MODE_11B;
570 			else
571 				phymode = MODE_11G;
572 			break;
573 		case NL80211_CHAN_WIDTH_20:
574 			phymode = MODE_11NG_HT20;
575 			break;
576 		case NL80211_CHAN_WIDTH_40:
577 			phymode = MODE_11NG_HT40;
578 			break;
579 		case NL80211_CHAN_WIDTH_5:
580 		case NL80211_CHAN_WIDTH_10:
581 		case NL80211_CHAN_WIDTH_80:
582 		case NL80211_CHAN_WIDTH_80P80:
583 		case NL80211_CHAN_WIDTH_160:
584 			phymode = MODE_UNKNOWN;
585 			break;
586 		}
587 		break;
588 	case NL80211_BAND_5GHZ:
589 		switch (chandef->width) {
590 		case NL80211_CHAN_WIDTH_20_NOHT:
591 			phymode = MODE_11A;
592 			break;
593 		case NL80211_CHAN_WIDTH_20:
594 			phymode = MODE_11NA_HT20;
595 			break;
596 		case NL80211_CHAN_WIDTH_40:
597 			phymode = MODE_11NA_HT40;
598 			break;
599 		case NL80211_CHAN_WIDTH_80:
600 			phymode = MODE_11AC_VHT80;
601 			break;
602 		case NL80211_CHAN_WIDTH_160:
603 			phymode = MODE_11AC_VHT160;
604 			break;
605 		case NL80211_CHAN_WIDTH_80P80:
606 			phymode = MODE_11AC_VHT80_80;
607 			break;
608 		case NL80211_CHAN_WIDTH_5:
609 		case NL80211_CHAN_WIDTH_10:
610 			phymode = MODE_UNKNOWN;
611 			break;
612 		}
613 		break;
614 	default:
615 		break;
616 	}
617 
618 	WARN_ON(phymode == MODE_UNKNOWN);
619 	return phymode;
620 }
621 
622 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
623 {
624 /*
625  * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
626  *   0 for no restriction
627  *   1 for 1/4 us
628  *   2 for 1/2 us
629  *   3 for 1 us
630  *   4 for 2 us
631  *   5 for 4 us
632  *   6 for 8 us
633  *   7 for 16 us
634  */
635 	switch (mpdudensity) {
636 	case 0:
637 		return 0;
638 	case 1:
639 	case 2:
640 	case 3:
641 	/* Our lower layer calculations limit our precision to
642 	 * 1 microsecond
643 	 */
644 		return 1;
645 	case 4:
646 		return 2;
647 	case 5:
648 		return 4;
649 	case 6:
650 		return 8;
651 	case 7:
652 		return 16;
653 	default:
654 		return 0;
655 	}
656 }
657 
658 int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
659 			struct cfg80211_chan_def *def)
660 {
661 	struct ieee80211_chanctx_conf *conf;
662 
663 	rcu_read_lock();
664 	conf = rcu_dereference(vif->chanctx_conf);
665 	if (!conf) {
666 		rcu_read_unlock();
667 		return -ENOENT;
668 	}
669 
670 	*def = conf->def;
671 	rcu_read_unlock();
672 
673 	return 0;
674 }
675 
676 static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
677 					 struct ieee80211_chanctx_conf *conf,
678 					 void *data)
679 {
680 	int *num = data;
681 
682 	(*num)++;
683 }
684 
685 static int ath10k_mac_num_chanctxs(struct ath10k *ar)
686 {
687 	int num = 0;
688 
689 	ieee80211_iter_chan_contexts_atomic(ar->hw,
690 					    ath10k_mac_num_chanctxs_iter,
691 					    &num);
692 
693 	return num;
694 }
695 
696 static void
697 ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
698 				struct ieee80211_chanctx_conf *conf,
699 				void *data)
700 {
701 	struct cfg80211_chan_def **def = data;
702 
703 	*def = &conf->def;
704 }
705 
706 static int ath10k_peer_create(struct ath10k *ar,
707 			      struct ieee80211_vif *vif,
708 			      struct ieee80211_sta *sta,
709 			      u32 vdev_id,
710 			      const u8 *addr,
711 			      enum wmi_peer_type peer_type)
712 {
713 	struct ath10k_vif *arvif;
714 	struct ath10k_peer *peer;
715 	int num_peers = 0;
716 	int ret;
717 
718 	lockdep_assert_held(&ar->conf_mutex);
719 
720 	num_peers = ar->num_peers;
721 
722 	/* Each vdev consumes a peer entry as well */
723 	list_for_each_entry(arvif, &ar->arvifs, list)
724 		num_peers++;
725 
726 	if (num_peers >= ar->max_num_peers)
727 		return -ENOBUFS;
728 
729 	ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
730 	if (ret) {
731 		ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
732 			    addr, vdev_id, ret);
733 		return ret;
734 	}
735 
736 	ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
737 	if (ret) {
738 		ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
739 			    addr, vdev_id, ret);
740 		return ret;
741 	}
742 
743 	spin_lock_bh(&ar->data_lock);
744 
745 	peer = ath10k_peer_find(ar, vdev_id, addr);
746 	if (!peer) {
747 		spin_unlock_bh(&ar->data_lock);
748 		ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n",
749 			    addr, vdev_id);
750 		ath10k_wmi_peer_delete(ar, vdev_id, addr);
751 		return -ENOENT;
752 	}
753 
754 	peer->vif = vif;
755 	peer->sta = sta;
756 
757 	spin_unlock_bh(&ar->data_lock);
758 
759 	ar->num_peers++;
760 
761 	return 0;
762 }
763 
764 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
765 {
766 	struct ath10k *ar = arvif->ar;
767 	u32 param;
768 	int ret;
769 
770 	param = ar->wmi.pdev_param->sta_kickout_th;
771 	ret = ath10k_wmi_pdev_set_param(ar, param,
772 					ATH10K_KICKOUT_THRESHOLD);
773 	if (ret) {
774 		ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
775 			    arvif->vdev_id, ret);
776 		return ret;
777 	}
778 
779 	param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
780 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
781 					ATH10K_KEEPALIVE_MIN_IDLE);
782 	if (ret) {
783 		ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
784 			    arvif->vdev_id, ret);
785 		return ret;
786 	}
787 
788 	param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
789 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
790 					ATH10K_KEEPALIVE_MAX_IDLE);
791 	if (ret) {
792 		ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
793 			    arvif->vdev_id, ret);
794 		return ret;
795 	}
796 
797 	param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
798 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
799 					ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
800 	if (ret) {
801 		ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
802 			    arvif->vdev_id, ret);
803 		return ret;
804 	}
805 
806 	return 0;
807 }
808 
809 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
810 {
811 	struct ath10k *ar = arvif->ar;
812 	u32 vdev_param;
813 
814 	vdev_param = ar->wmi.vdev_param->rts_threshold;
815 	return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
816 }
817 
818 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
819 {
820 	int ret;
821 
822 	lockdep_assert_held(&ar->conf_mutex);
823 
824 	ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
825 	if (ret)
826 		return ret;
827 
828 	ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
829 	if (ret)
830 		return ret;
831 
832 	ar->num_peers--;
833 
834 	return 0;
835 }
836 
837 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
838 {
839 	struct ath10k_peer *peer, *tmp;
840 	int peer_id;
841 	int i;
842 
843 	lockdep_assert_held(&ar->conf_mutex);
844 
845 	spin_lock_bh(&ar->data_lock);
846 	list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
847 		if (peer->vdev_id != vdev_id)
848 			continue;
849 
850 		ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
851 			    peer->addr, vdev_id);
852 
853 		for_each_set_bit(peer_id, peer->peer_ids,
854 				 ATH10K_MAX_NUM_PEER_IDS) {
855 			ar->peer_map[peer_id] = NULL;
856 		}
857 
858 		/* Double check that peer is properly un-referenced from
859 		 * the peer_map
860 		 */
861 		for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
862 			if (ar->peer_map[i] == peer) {
863 				ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
864 					    peer->addr, peer, i);
865 				ar->peer_map[i] = NULL;
866 			}
867 		}
868 
869 		list_del(&peer->list);
870 		kfree(peer);
871 		ar->num_peers--;
872 	}
873 	spin_unlock_bh(&ar->data_lock);
874 }
875 
876 static void ath10k_peer_cleanup_all(struct ath10k *ar)
877 {
878 	struct ath10k_peer *peer, *tmp;
879 	int i;
880 
881 	lockdep_assert_held(&ar->conf_mutex);
882 
883 	spin_lock_bh(&ar->data_lock);
884 	list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
885 		list_del(&peer->list);
886 		kfree(peer);
887 	}
888 
889 	for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++)
890 		ar->peer_map[i] = NULL;
891 
892 	spin_unlock_bh(&ar->data_lock);
893 
894 	ar->num_peers = 0;
895 	ar->num_stations = 0;
896 }
897 
898 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
899 				       struct ieee80211_sta *sta,
900 				       enum wmi_tdls_peer_state state)
901 {
902 	int ret;
903 	struct wmi_tdls_peer_update_cmd_arg arg = {};
904 	struct wmi_tdls_peer_capab_arg cap = {};
905 	struct wmi_channel_arg chan_arg = {};
906 
907 	lockdep_assert_held(&ar->conf_mutex);
908 
909 	arg.vdev_id = vdev_id;
910 	arg.peer_state = state;
911 	ether_addr_copy(arg.addr, sta->addr);
912 
913 	cap.peer_max_sp = sta->max_sp;
914 	cap.peer_uapsd_queues = sta->uapsd_queues;
915 
916 	if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
917 	    !sta->tdls_initiator)
918 		cap.is_peer_responder = 1;
919 
920 	ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
921 	if (ret) {
922 		ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
923 			    arg.addr, vdev_id, ret);
924 		return ret;
925 	}
926 
927 	return 0;
928 }
929 
930 /************************/
931 /* Interface management */
932 /************************/
933 
934 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
935 {
936 	struct ath10k *ar = arvif->ar;
937 
938 	lockdep_assert_held(&ar->data_lock);
939 
940 	if (!arvif->beacon)
941 		return;
942 
943 	if (!arvif->beacon_buf)
944 		dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
945 				 arvif->beacon->len, DMA_TO_DEVICE);
946 
947 	if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
948 		    arvif->beacon_state != ATH10K_BEACON_SENT))
949 		return;
950 
951 	dev_kfree_skb_any(arvif->beacon);
952 
953 	arvif->beacon = NULL;
954 	arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
955 }
956 
957 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
958 {
959 	struct ath10k *ar = arvif->ar;
960 
961 	lockdep_assert_held(&ar->data_lock);
962 
963 	ath10k_mac_vif_beacon_free(arvif);
964 
965 	if (arvif->beacon_buf) {
966 		dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
967 				  arvif->beacon_buf, arvif->beacon_paddr);
968 		arvif->beacon_buf = NULL;
969 	}
970 }
971 
972 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
973 {
974 	unsigned long time_left;
975 
976 	lockdep_assert_held(&ar->conf_mutex);
977 
978 	if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
979 		return -ESHUTDOWN;
980 
981 	time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
982 						ATH10K_VDEV_SETUP_TIMEOUT_HZ);
983 	if (time_left == 0)
984 		return -ETIMEDOUT;
985 
986 	return ar->last_wmi_vdev_start_status;
987 }
988 
989 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
990 {
991 	struct cfg80211_chan_def *chandef = NULL;
992 	struct ieee80211_channel *channel = NULL;
993 	struct wmi_vdev_start_request_arg arg = {};
994 	int ret = 0;
995 
996 	lockdep_assert_held(&ar->conf_mutex);
997 
998 	ieee80211_iter_chan_contexts_atomic(ar->hw,
999 					    ath10k_mac_get_any_chandef_iter,
1000 					    &chandef);
1001 	if (WARN_ON_ONCE(!chandef))
1002 		return -ENOENT;
1003 
1004 	channel = chandef->chan;
1005 
1006 	arg.vdev_id = vdev_id;
1007 	arg.channel.freq = channel->center_freq;
1008 	arg.channel.band_center_freq1 = chandef->center_freq1;
1009 	arg.channel.band_center_freq2 = chandef->center_freq2;
1010 
1011 	/* TODO setup this dynamically, what in case we
1012 	 * don't have any vifs?
1013 	 */
1014 	arg.channel.mode = chan_to_phymode(chandef);
1015 	arg.channel.chan_radar =
1016 			!!(channel->flags & IEEE80211_CHAN_RADAR);
1017 
1018 	arg.channel.min_power = 0;
1019 	arg.channel.max_power = channel->max_power * 2;
1020 	arg.channel.max_reg_power = channel->max_reg_power * 2;
1021 	arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
1022 
1023 	reinit_completion(&ar->vdev_setup_done);
1024 
1025 	ret = ath10k_wmi_vdev_start(ar, &arg);
1026 	if (ret) {
1027 		ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
1028 			    vdev_id, ret);
1029 		return ret;
1030 	}
1031 
1032 	ret = ath10k_vdev_setup_sync(ar);
1033 	if (ret) {
1034 		ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
1035 			    vdev_id, ret);
1036 		return ret;
1037 	}
1038 
1039 	ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
1040 	if (ret) {
1041 		ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
1042 			    vdev_id, ret);
1043 		goto vdev_stop;
1044 	}
1045 
1046 	ar->monitor_vdev_id = vdev_id;
1047 
1048 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
1049 		   ar->monitor_vdev_id);
1050 	return 0;
1051 
1052 vdev_stop:
1053 	ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1054 	if (ret)
1055 		ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
1056 			    ar->monitor_vdev_id, ret);
1057 
1058 	return ret;
1059 }
1060 
1061 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
1062 {
1063 	int ret = 0;
1064 
1065 	lockdep_assert_held(&ar->conf_mutex);
1066 
1067 	ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1068 	if (ret)
1069 		ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
1070 			    ar->monitor_vdev_id, ret);
1071 
1072 	reinit_completion(&ar->vdev_setup_done);
1073 
1074 	ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1075 	if (ret)
1076 		ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
1077 			    ar->monitor_vdev_id, ret);
1078 
1079 	ret = ath10k_vdev_setup_sync(ar);
1080 	if (ret)
1081 		ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
1082 			    ar->monitor_vdev_id, ret);
1083 
1084 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
1085 		   ar->monitor_vdev_id);
1086 	return ret;
1087 }
1088 
1089 static int ath10k_monitor_vdev_create(struct ath10k *ar)
1090 {
1091 	int bit, ret = 0;
1092 
1093 	lockdep_assert_held(&ar->conf_mutex);
1094 
1095 	if (ar->free_vdev_map == 0) {
1096 		ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
1097 		return -ENOMEM;
1098 	}
1099 
1100 	bit = __ffs64(ar->free_vdev_map);
1101 
1102 	ar->monitor_vdev_id = bit;
1103 
1104 	ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
1105 				     WMI_VDEV_TYPE_MONITOR,
1106 				     0, ar->mac_addr);
1107 	if (ret) {
1108 		ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
1109 			    ar->monitor_vdev_id, ret);
1110 		return ret;
1111 	}
1112 
1113 	ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1114 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
1115 		   ar->monitor_vdev_id);
1116 
1117 	return 0;
1118 }
1119 
1120 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
1121 {
1122 	int ret = 0;
1123 
1124 	lockdep_assert_held(&ar->conf_mutex);
1125 
1126 	ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1127 	if (ret) {
1128 		ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
1129 			    ar->monitor_vdev_id, ret);
1130 		return ret;
1131 	}
1132 
1133 	ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1134 
1135 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1136 		   ar->monitor_vdev_id);
1137 	return ret;
1138 }
1139 
1140 static int ath10k_monitor_start(struct ath10k *ar)
1141 {
1142 	int ret;
1143 
1144 	lockdep_assert_held(&ar->conf_mutex);
1145 
1146 	ret = ath10k_monitor_vdev_create(ar);
1147 	if (ret) {
1148 		ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1149 		return ret;
1150 	}
1151 
1152 	ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1153 	if (ret) {
1154 		ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1155 		ath10k_monitor_vdev_delete(ar);
1156 		return ret;
1157 	}
1158 
1159 	ar->monitor_started = true;
1160 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1161 
1162 	return 0;
1163 }
1164 
1165 static int ath10k_monitor_stop(struct ath10k *ar)
1166 {
1167 	int ret;
1168 
1169 	lockdep_assert_held(&ar->conf_mutex);
1170 
1171 	ret = ath10k_monitor_vdev_stop(ar);
1172 	if (ret) {
1173 		ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1174 		return ret;
1175 	}
1176 
1177 	ret = ath10k_monitor_vdev_delete(ar);
1178 	if (ret) {
1179 		ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1180 		return ret;
1181 	}
1182 
1183 	ar->monitor_started = false;
1184 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1185 
1186 	return 0;
1187 }
1188 
1189 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1190 {
1191 	int num_ctx;
1192 
1193 	/* At least one chanctx is required to derive a channel to start
1194 	 * monitor vdev on.
1195 	 */
1196 	num_ctx = ath10k_mac_num_chanctxs(ar);
1197 	if (num_ctx == 0)
1198 		return false;
1199 
1200 	/* If there's already an existing special monitor interface then don't
1201 	 * bother creating another monitor vdev.
1202 	 */
1203 	if (ar->monitor_arvif)
1204 		return false;
1205 
1206 	return ar->monitor ||
1207 	       (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
1208 			  ar->running_fw->fw_file.fw_features) &&
1209 		(ar->filter_flags & FIF_OTHER_BSS)) ||
1210 	       test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1211 }
1212 
1213 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1214 {
1215 	int num_ctx;
1216 
1217 	num_ctx = ath10k_mac_num_chanctxs(ar);
1218 
1219 	/* FIXME: Current interface combinations and cfg80211/mac80211 code
1220 	 * shouldn't allow this but make sure to prevent handling the following
1221 	 * case anyway since multi-channel DFS hasn't been tested at all.
1222 	 */
1223 	if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1224 		return false;
1225 
1226 	return true;
1227 }
1228 
1229 static int ath10k_monitor_recalc(struct ath10k *ar)
1230 {
1231 	bool needed;
1232 	bool allowed;
1233 	int ret;
1234 
1235 	lockdep_assert_held(&ar->conf_mutex);
1236 
1237 	needed = ath10k_mac_monitor_vdev_is_needed(ar);
1238 	allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1239 
1240 	ath10k_dbg(ar, ATH10K_DBG_MAC,
1241 		   "mac monitor recalc started? %d needed? %d allowed? %d\n",
1242 		   ar->monitor_started, needed, allowed);
1243 
1244 	if (WARN_ON(needed && !allowed)) {
1245 		if (ar->monitor_started) {
1246 			ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1247 
1248 			ret = ath10k_monitor_stop(ar);
1249 			if (ret)
1250 				ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1251 					    ret);
1252 				/* not serious */
1253 		}
1254 
1255 		return -EPERM;
1256 	}
1257 
1258 	if (needed == ar->monitor_started)
1259 		return 0;
1260 
1261 	if (needed)
1262 		return ath10k_monitor_start(ar);
1263 	else
1264 		return ath10k_monitor_stop(ar);
1265 }
1266 
1267 static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif *arvif)
1268 {
1269 	struct ath10k *ar = arvif->ar;
1270 
1271 	lockdep_assert_held(&ar->conf_mutex);
1272 
1273 	if (!arvif->is_started) {
1274 		ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n");
1275 		return false;
1276 	}
1277 
1278 	return true;
1279 }
1280 
1281 static int ath10k_mac_set_cts_prot(struct ath10k_vif *arvif)
1282 {
1283 	struct ath10k *ar = arvif->ar;
1284 	u32 vdev_param;
1285 
1286 	lockdep_assert_held(&ar->conf_mutex);
1287 
1288 	vdev_param = ar->wmi.vdev_param->protection_mode;
1289 
1290 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n",
1291 		   arvif->vdev_id, arvif->use_cts_prot);
1292 
1293 	return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1294 					 arvif->use_cts_prot ? 1 : 0);
1295 }
1296 
1297 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1298 {
1299 	struct ath10k *ar = arvif->ar;
1300 	u32 vdev_param, rts_cts = 0;
1301 
1302 	lockdep_assert_held(&ar->conf_mutex);
1303 
1304 	vdev_param = ar->wmi.vdev_param->enable_rtscts;
1305 
1306 	rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1307 
1308 	if (arvif->num_legacy_stations > 0)
1309 		rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1310 			      WMI_RTSCTS_PROFILE);
1311 	else
1312 		rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1313 			      WMI_RTSCTS_PROFILE);
1314 
1315 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1316 		   arvif->vdev_id, rts_cts);
1317 
1318 	return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1319 					 rts_cts);
1320 }
1321 
1322 static int ath10k_start_cac(struct ath10k *ar)
1323 {
1324 	int ret;
1325 
1326 	lockdep_assert_held(&ar->conf_mutex);
1327 
1328 	set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1329 
1330 	ret = ath10k_monitor_recalc(ar);
1331 	if (ret) {
1332 		ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1333 		clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1334 		return ret;
1335 	}
1336 
1337 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1338 		   ar->monitor_vdev_id);
1339 
1340 	return 0;
1341 }
1342 
1343 static int ath10k_stop_cac(struct ath10k *ar)
1344 {
1345 	lockdep_assert_held(&ar->conf_mutex);
1346 
1347 	/* CAC is not running - do nothing */
1348 	if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1349 		return 0;
1350 
1351 	clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1352 	ath10k_monitor_stop(ar);
1353 
1354 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1355 
1356 	return 0;
1357 }
1358 
1359 static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1360 				      struct ieee80211_chanctx_conf *conf,
1361 				      void *data)
1362 {
1363 	bool *ret = data;
1364 
1365 	if (!*ret && conf->radar_enabled)
1366 		*ret = true;
1367 }
1368 
1369 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1370 {
1371 	bool has_radar = false;
1372 
1373 	ieee80211_iter_chan_contexts_atomic(ar->hw,
1374 					    ath10k_mac_has_radar_iter,
1375 					    &has_radar);
1376 
1377 	return has_radar;
1378 }
1379 
1380 static void ath10k_recalc_radar_detection(struct ath10k *ar)
1381 {
1382 	int ret;
1383 
1384 	lockdep_assert_held(&ar->conf_mutex);
1385 
1386 	ath10k_stop_cac(ar);
1387 
1388 	if (!ath10k_mac_has_radar_enabled(ar))
1389 		return;
1390 
1391 	if (ar->num_started_vdevs > 0)
1392 		return;
1393 
1394 	ret = ath10k_start_cac(ar);
1395 	if (ret) {
1396 		/*
1397 		 * Not possible to start CAC on current channel so starting
1398 		 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1399 		 * by indicating that radar was detected.
1400 		 */
1401 		ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1402 		ieee80211_radar_detected(ar->hw);
1403 	}
1404 }
1405 
1406 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1407 {
1408 	struct ath10k *ar = arvif->ar;
1409 	int ret;
1410 
1411 	lockdep_assert_held(&ar->conf_mutex);
1412 
1413 	reinit_completion(&ar->vdev_setup_done);
1414 
1415 	ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1416 	if (ret) {
1417 		ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1418 			    arvif->vdev_id, ret);
1419 		return ret;
1420 	}
1421 
1422 	ret = ath10k_vdev_setup_sync(ar);
1423 	if (ret) {
1424 		ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n",
1425 			    arvif->vdev_id, ret);
1426 		return ret;
1427 	}
1428 
1429 	WARN_ON(ar->num_started_vdevs == 0);
1430 
1431 	if (ar->num_started_vdevs != 0) {
1432 		ar->num_started_vdevs--;
1433 		ath10k_recalc_radar_detection(ar);
1434 	}
1435 
1436 	return ret;
1437 }
1438 
1439 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1440 				     const struct cfg80211_chan_def *chandef,
1441 				     bool restart)
1442 {
1443 	struct ath10k *ar = arvif->ar;
1444 	struct wmi_vdev_start_request_arg arg = {};
1445 	int ret = 0;
1446 
1447 	lockdep_assert_held(&ar->conf_mutex);
1448 
1449 	reinit_completion(&ar->vdev_setup_done);
1450 
1451 	arg.vdev_id = arvif->vdev_id;
1452 	arg.dtim_period = arvif->dtim_period;
1453 	arg.bcn_intval = arvif->beacon_interval;
1454 
1455 	arg.channel.freq = chandef->chan->center_freq;
1456 	arg.channel.band_center_freq1 = chandef->center_freq1;
1457 	arg.channel.band_center_freq2 = chandef->center_freq2;
1458 	arg.channel.mode = chan_to_phymode(chandef);
1459 
1460 	arg.channel.min_power = 0;
1461 	arg.channel.max_power = chandef->chan->max_power * 2;
1462 	arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1463 	arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1464 
1465 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1466 		arg.ssid = arvif->u.ap.ssid;
1467 		arg.ssid_len = arvif->u.ap.ssid_len;
1468 		arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1469 
1470 		/* For now allow DFS for AP mode */
1471 		arg.channel.chan_radar =
1472 			!!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1473 	} else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1474 		arg.ssid = arvif->vif->bss_conf.ssid;
1475 		arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1476 	}
1477 
1478 	ath10k_dbg(ar, ATH10K_DBG_MAC,
1479 		   "mac vdev %d start center_freq %d phymode %s\n",
1480 		   arg.vdev_id, arg.channel.freq,
1481 		   ath10k_wmi_phymode_str(arg.channel.mode));
1482 
1483 	if (restart)
1484 		ret = ath10k_wmi_vdev_restart(ar, &arg);
1485 	else
1486 		ret = ath10k_wmi_vdev_start(ar, &arg);
1487 
1488 	if (ret) {
1489 		ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1490 			    arg.vdev_id, ret);
1491 		return ret;
1492 	}
1493 
1494 	ret = ath10k_vdev_setup_sync(ar);
1495 	if (ret) {
1496 		ath10k_warn(ar,
1497 			    "failed to synchronize setup for vdev %i restart %d: %d\n",
1498 			    arg.vdev_id, restart, ret);
1499 		return ret;
1500 	}
1501 
1502 	ar->num_started_vdevs++;
1503 	ath10k_recalc_radar_detection(ar);
1504 
1505 	return ret;
1506 }
1507 
1508 static int ath10k_vdev_start(struct ath10k_vif *arvif,
1509 			     const struct cfg80211_chan_def *def)
1510 {
1511 	return ath10k_vdev_start_restart(arvif, def, false);
1512 }
1513 
1514 static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1515 			       const struct cfg80211_chan_def *def)
1516 {
1517 	return ath10k_vdev_start_restart(arvif, def, true);
1518 }
1519 
1520 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1521 				       struct sk_buff *bcn)
1522 {
1523 	struct ath10k *ar = arvif->ar;
1524 	struct ieee80211_mgmt *mgmt;
1525 	const u8 *p2p_ie;
1526 	int ret;
1527 
1528 	if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p)
1529 		return 0;
1530 
1531 	mgmt = (void *)bcn->data;
1532 	p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1533 					 mgmt->u.beacon.variable,
1534 					 bcn->len - (mgmt->u.beacon.variable -
1535 						     bcn->data));
1536 	if (!p2p_ie)
1537 		return -ENOENT;
1538 
1539 	ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1540 	if (ret) {
1541 		ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1542 			    arvif->vdev_id, ret);
1543 		return ret;
1544 	}
1545 
1546 	return 0;
1547 }
1548 
1549 static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1550 				       u8 oui_type, size_t ie_offset)
1551 {
1552 	size_t len;
1553 	const u8 *next;
1554 	const u8 *end;
1555 	u8 *ie;
1556 
1557 	if (WARN_ON(skb->len < ie_offset))
1558 		return -EINVAL;
1559 
1560 	ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1561 					   skb->data + ie_offset,
1562 					   skb->len - ie_offset);
1563 	if (!ie)
1564 		return -ENOENT;
1565 
1566 	len = ie[1] + 2;
1567 	end = skb->data + skb->len;
1568 	next = ie + len;
1569 
1570 	if (WARN_ON(next > end))
1571 		return -EINVAL;
1572 
1573 	memmove(ie, next, end - next);
1574 	skb_trim(skb, skb->len - len);
1575 
1576 	return 0;
1577 }
1578 
1579 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1580 {
1581 	struct ath10k *ar = arvif->ar;
1582 	struct ieee80211_hw *hw = ar->hw;
1583 	struct ieee80211_vif *vif = arvif->vif;
1584 	struct ieee80211_mutable_offsets offs = {};
1585 	struct sk_buff *bcn;
1586 	int ret;
1587 
1588 	if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1589 		return 0;
1590 
1591 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1592 	    arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1593 		return 0;
1594 
1595 	bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1596 	if (!bcn) {
1597 		ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1598 		return -EPERM;
1599 	}
1600 
1601 	ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1602 	if (ret) {
1603 		ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1604 		kfree_skb(bcn);
1605 		return ret;
1606 	}
1607 
1608 	/* P2P IE is inserted by firmware automatically (as configured above)
1609 	 * so remove it from the base beacon template to avoid duplicate P2P
1610 	 * IEs in beacon frames.
1611 	 */
1612 	ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1613 				    offsetof(struct ieee80211_mgmt,
1614 					     u.beacon.variable));
1615 
1616 	ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1617 				  0, NULL, 0);
1618 	kfree_skb(bcn);
1619 
1620 	if (ret) {
1621 		ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1622 			    ret);
1623 		return ret;
1624 	}
1625 
1626 	return 0;
1627 }
1628 
1629 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1630 {
1631 	struct ath10k *ar = arvif->ar;
1632 	struct ieee80211_hw *hw = ar->hw;
1633 	struct ieee80211_vif *vif = arvif->vif;
1634 	struct sk_buff *prb;
1635 	int ret;
1636 
1637 	if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1638 		return 0;
1639 
1640 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1641 		return 0;
1642 
1643 	prb = ieee80211_proberesp_get(hw, vif);
1644 	if (!prb) {
1645 		ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1646 		return -EPERM;
1647 	}
1648 
1649 	ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1650 	kfree_skb(prb);
1651 
1652 	if (ret) {
1653 		ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1654 			    ret);
1655 		return ret;
1656 	}
1657 
1658 	return 0;
1659 }
1660 
1661 static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1662 {
1663 	struct ath10k *ar = arvif->ar;
1664 	struct cfg80211_chan_def def;
1665 	int ret;
1666 
1667 	/* When originally vdev is started during assign_vif_chanctx() some
1668 	 * information is missing, notably SSID. Firmware revisions with beacon
1669 	 * offloading require the SSID to be provided during vdev (re)start to
1670 	 * handle hidden SSID properly.
1671 	 *
1672 	 * Vdev restart must be done after vdev has been both started and
1673 	 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1674 	 * deliver vdev restart response event causing timeouts during vdev
1675 	 * syncing in ath10k.
1676 	 *
1677 	 * Note: The vdev down/up and template reinstallation could be skipped
1678 	 * since only wmi-tlv firmware are known to have beacon offload and
1679 	 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1680 	 * response delivery. It's probably more robust to keep it as is.
1681 	 */
1682 	if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1683 		return 0;
1684 
1685 	if (WARN_ON(!arvif->is_started))
1686 		return -EINVAL;
1687 
1688 	if (WARN_ON(!arvif->is_up))
1689 		return -EINVAL;
1690 
1691 	if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1692 		return -EINVAL;
1693 
1694 	ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1695 	if (ret) {
1696 		ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1697 			    arvif->vdev_id, ret);
1698 		return ret;
1699 	}
1700 
1701 	/* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1702 	 * firmware will crash upon vdev up.
1703 	 */
1704 
1705 	ret = ath10k_mac_setup_bcn_tmpl(arvif);
1706 	if (ret) {
1707 		ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1708 		return ret;
1709 	}
1710 
1711 	ret = ath10k_mac_setup_prb_tmpl(arvif);
1712 	if (ret) {
1713 		ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1714 		return ret;
1715 	}
1716 
1717 	ret = ath10k_vdev_restart(arvif, &def);
1718 	if (ret) {
1719 		ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1720 			    arvif->vdev_id, ret);
1721 		return ret;
1722 	}
1723 
1724 	ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1725 				 arvif->bssid);
1726 	if (ret) {
1727 		ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1728 			    arvif->vdev_id, ret);
1729 		return ret;
1730 	}
1731 
1732 	return 0;
1733 }
1734 
1735 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1736 				     struct ieee80211_bss_conf *info)
1737 {
1738 	struct ath10k *ar = arvif->ar;
1739 	int ret = 0;
1740 
1741 	lockdep_assert_held(&arvif->ar->conf_mutex);
1742 
1743 	if (!info->enable_beacon) {
1744 		ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1745 		if (ret)
1746 			ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1747 				    arvif->vdev_id, ret);
1748 
1749 		arvif->is_up = false;
1750 
1751 		spin_lock_bh(&arvif->ar->data_lock);
1752 		ath10k_mac_vif_beacon_free(arvif);
1753 		spin_unlock_bh(&arvif->ar->data_lock);
1754 
1755 		return;
1756 	}
1757 
1758 	arvif->tx_seq_no = 0x1000;
1759 
1760 	arvif->aid = 0;
1761 	ether_addr_copy(arvif->bssid, info->bssid);
1762 
1763 	ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1764 				 arvif->bssid);
1765 	if (ret) {
1766 		ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1767 			    arvif->vdev_id, ret);
1768 		return;
1769 	}
1770 
1771 	arvif->is_up = true;
1772 
1773 	ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1774 	if (ret) {
1775 		ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1776 			    arvif->vdev_id, ret);
1777 		return;
1778 	}
1779 
1780 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1781 }
1782 
1783 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1784 				struct ieee80211_bss_conf *info,
1785 				const u8 self_peer[ETH_ALEN])
1786 {
1787 	struct ath10k *ar = arvif->ar;
1788 	u32 vdev_param;
1789 	int ret = 0;
1790 
1791 	lockdep_assert_held(&arvif->ar->conf_mutex);
1792 
1793 	if (!info->ibss_joined) {
1794 		if (is_zero_ether_addr(arvif->bssid))
1795 			return;
1796 
1797 		eth_zero_addr(arvif->bssid);
1798 
1799 		return;
1800 	}
1801 
1802 	vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1803 	ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1804 					ATH10K_DEFAULT_ATIM);
1805 	if (ret)
1806 		ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1807 			    arvif->vdev_id, ret);
1808 }
1809 
1810 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1811 {
1812 	struct ath10k *ar = arvif->ar;
1813 	u32 param;
1814 	u32 value;
1815 	int ret;
1816 
1817 	lockdep_assert_held(&arvif->ar->conf_mutex);
1818 
1819 	if (arvif->u.sta.uapsd)
1820 		value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1821 	else
1822 		value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1823 
1824 	param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1825 	ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1826 	if (ret) {
1827 		ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1828 			    value, arvif->vdev_id, ret);
1829 		return ret;
1830 	}
1831 
1832 	return 0;
1833 }
1834 
1835 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1836 {
1837 	struct ath10k *ar = arvif->ar;
1838 	u32 param;
1839 	u32 value;
1840 	int ret;
1841 
1842 	lockdep_assert_held(&arvif->ar->conf_mutex);
1843 
1844 	if (arvif->u.sta.uapsd)
1845 		value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1846 	else
1847 		value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1848 
1849 	param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1850 	ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1851 					  param, value);
1852 	if (ret) {
1853 		ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1854 			    value, arvif->vdev_id, ret);
1855 		return ret;
1856 	}
1857 
1858 	return 0;
1859 }
1860 
1861 static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1862 {
1863 	struct ath10k_vif *arvif;
1864 	int num = 0;
1865 
1866 	lockdep_assert_held(&ar->conf_mutex);
1867 
1868 	list_for_each_entry(arvif, &ar->arvifs, list)
1869 		if (arvif->is_started)
1870 			num++;
1871 
1872 	return num;
1873 }
1874 
1875 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1876 {
1877 	struct ath10k *ar = arvif->ar;
1878 	struct ieee80211_vif *vif = arvif->vif;
1879 	struct ieee80211_conf *conf = &ar->hw->conf;
1880 	enum wmi_sta_powersave_param param;
1881 	enum wmi_sta_ps_mode psmode;
1882 	int ret;
1883 	int ps_timeout;
1884 	bool enable_ps;
1885 
1886 	lockdep_assert_held(&arvif->ar->conf_mutex);
1887 
1888 	if (arvif->vif->type != NL80211_IFTYPE_STATION)
1889 		return 0;
1890 
1891 	enable_ps = arvif->ps;
1892 
1893 	if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1894 	    !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1895 		      ar->running_fw->fw_file.fw_features)) {
1896 		ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1897 			    arvif->vdev_id);
1898 		enable_ps = false;
1899 	}
1900 
1901 	if (!arvif->is_started) {
1902 		/* mac80211 can update vif powersave state while disconnected.
1903 		 * Firmware doesn't behave nicely and consumes more power than
1904 		 * necessary if PS is disabled on a non-started vdev. Hence
1905 		 * force-enable PS for non-running vdevs.
1906 		 */
1907 		psmode = WMI_STA_PS_MODE_ENABLED;
1908 	} else if (enable_ps) {
1909 		psmode = WMI_STA_PS_MODE_ENABLED;
1910 		param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1911 
1912 		ps_timeout = conf->dynamic_ps_timeout;
1913 		if (ps_timeout == 0) {
1914 			/* Firmware doesn't like 0 */
1915 			ps_timeout = ieee80211_tu_to_usec(
1916 				vif->bss_conf.beacon_int) / 1000;
1917 		}
1918 
1919 		ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1920 						  ps_timeout);
1921 		if (ret) {
1922 			ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1923 				    arvif->vdev_id, ret);
1924 			return ret;
1925 		}
1926 	} else {
1927 		psmode = WMI_STA_PS_MODE_DISABLED;
1928 	}
1929 
1930 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1931 		   arvif->vdev_id, psmode ? "enable" : "disable");
1932 
1933 	ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1934 	if (ret) {
1935 		ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1936 			    psmode, arvif->vdev_id, ret);
1937 		return ret;
1938 	}
1939 
1940 	return 0;
1941 }
1942 
1943 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1944 {
1945 	struct ath10k *ar = arvif->ar;
1946 	struct wmi_sta_keepalive_arg arg = {};
1947 	int ret;
1948 
1949 	lockdep_assert_held(&arvif->ar->conf_mutex);
1950 
1951 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1952 		return 0;
1953 
1954 	if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1955 		return 0;
1956 
1957 	/* Some firmware revisions have a bug and ignore the `enabled` field.
1958 	 * Instead use the interval to disable the keepalive.
1959 	 */
1960 	arg.vdev_id = arvif->vdev_id;
1961 	arg.enabled = 1;
1962 	arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1963 	arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1964 
1965 	ret = ath10k_wmi_sta_keepalive(ar, &arg);
1966 	if (ret) {
1967 		ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1968 			    arvif->vdev_id, ret);
1969 		return ret;
1970 	}
1971 
1972 	return 0;
1973 }
1974 
1975 static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1976 {
1977 	struct ath10k *ar = arvif->ar;
1978 	struct ieee80211_vif *vif = arvif->vif;
1979 	int ret;
1980 
1981 	lockdep_assert_held(&arvif->ar->conf_mutex);
1982 
1983 	if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1984 		return;
1985 
1986 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1987 		return;
1988 
1989 	if (!vif->csa_active)
1990 		return;
1991 
1992 	if (!arvif->is_up)
1993 		return;
1994 
1995 	if (!ieee80211_csa_is_complete(vif)) {
1996 		ieee80211_csa_update_counter(vif);
1997 
1998 		ret = ath10k_mac_setup_bcn_tmpl(arvif);
1999 		if (ret)
2000 			ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
2001 				    ret);
2002 
2003 		ret = ath10k_mac_setup_prb_tmpl(arvif);
2004 		if (ret)
2005 			ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
2006 				    ret);
2007 	} else {
2008 		ieee80211_csa_finish(vif);
2009 	}
2010 }
2011 
2012 static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
2013 {
2014 	struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2015 						ap_csa_work);
2016 	struct ath10k *ar = arvif->ar;
2017 
2018 	mutex_lock(&ar->conf_mutex);
2019 	ath10k_mac_vif_ap_csa_count_down(arvif);
2020 	mutex_unlock(&ar->conf_mutex);
2021 }
2022 
2023 static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
2024 					  struct ieee80211_vif *vif)
2025 {
2026 	struct sk_buff *skb = data;
2027 	struct ieee80211_mgmt *mgmt = (void *)skb->data;
2028 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2029 
2030 	if (vif->type != NL80211_IFTYPE_STATION)
2031 		return;
2032 
2033 	if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
2034 		return;
2035 
2036 	cancel_delayed_work(&arvif->connection_loss_work);
2037 }
2038 
2039 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
2040 {
2041 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
2042 						   IEEE80211_IFACE_ITER_NORMAL,
2043 						   ath10k_mac_handle_beacon_iter,
2044 						   skb);
2045 }
2046 
2047 static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
2048 					       struct ieee80211_vif *vif)
2049 {
2050 	u32 *vdev_id = data;
2051 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2052 	struct ath10k *ar = arvif->ar;
2053 	struct ieee80211_hw *hw = ar->hw;
2054 
2055 	if (arvif->vdev_id != *vdev_id)
2056 		return;
2057 
2058 	if (!arvif->is_up)
2059 		return;
2060 
2061 	ieee80211_beacon_loss(vif);
2062 
2063 	/* Firmware doesn't report beacon loss events repeatedly. If AP probe
2064 	 * (done by mac80211) succeeds but beacons do not resume then it
2065 	 * doesn't make sense to continue operation. Queue connection loss work
2066 	 * which can be cancelled when beacon is received.
2067 	 */
2068 	ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
2069 				     ATH10K_CONNECTION_LOSS_HZ);
2070 }
2071 
2072 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
2073 {
2074 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
2075 						   IEEE80211_IFACE_ITER_NORMAL,
2076 						   ath10k_mac_handle_beacon_miss_iter,
2077 						   &vdev_id);
2078 }
2079 
2080 static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
2081 {
2082 	struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2083 						connection_loss_work.work);
2084 	struct ieee80211_vif *vif = arvif->vif;
2085 
2086 	if (!arvif->is_up)
2087 		return;
2088 
2089 	ieee80211_connection_loss(vif);
2090 }
2091 
2092 /**********************/
2093 /* Station management */
2094 /**********************/
2095 
2096 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
2097 					     struct ieee80211_vif *vif)
2098 {
2099 	/* Some firmware revisions have unstable STA powersave when listen
2100 	 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2101 	 * generate NullFunc frames properly even if buffered frames have been
2102 	 * indicated in Beacon TIM. Firmware would seldom wake up to pull
2103 	 * buffered frames. Often pinging the device from AP would simply fail.
2104 	 *
2105 	 * As a workaround set it to 1.
2106 	 */
2107 	if (vif->type == NL80211_IFTYPE_STATION)
2108 		return 1;
2109 
2110 	return ar->hw->conf.listen_interval;
2111 }
2112 
2113 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
2114 				      struct ieee80211_vif *vif,
2115 				      struct ieee80211_sta *sta,
2116 				      struct wmi_peer_assoc_complete_arg *arg)
2117 {
2118 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2119 	u32 aid;
2120 
2121 	lockdep_assert_held(&ar->conf_mutex);
2122 
2123 	if (vif->type == NL80211_IFTYPE_STATION)
2124 		aid = vif->bss_conf.aid;
2125 	else
2126 		aid = sta->aid;
2127 
2128 	ether_addr_copy(arg->addr, sta->addr);
2129 	arg->vdev_id = arvif->vdev_id;
2130 	arg->peer_aid = aid;
2131 	arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
2132 	arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
2133 	arg->peer_num_spatial_streams = 1;
2134 	arg->peer_caps = vif->bss_conf.assoc_capability;
2135 }
2136 
2137 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
2138 				       struct ieee80211_vif *vif,
2139 				       struct ieee80211_sta *sta,
2140 				       struct wmi_peer_assoc_complete_arg *arg)
2141 {
2142 	struct ieee80211_bss_conf *info = &vif->bss_conf;
2143 	struct cfg80211_chan_def def;
2144 	struct cfg80211_bss *bss;
2145 	const u8 *rsnie = NULL;
2146 	const u8 *wpaie = NULL;
2147 
2148 	lockdep_assert_held(&ar->conf_mutex);
2149 
2150 	if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2151 		return;
2152 
2153 	bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
2154 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
2155 	if (bss) {
2156 		const struct cfg80211_bss_ies *ies;
2157 
2158 		rcu_read_lock();
2159 		rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
2160 
2161 		ies = rcu_dereference(bss->ies);
2162 
2163 		wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
2164 						WLAN_OUI_TYPE_MICROSOFT_WPA,
2165 						ies->data,
2166 						ies->len);
2167 		rcu_read_unlock();
2168 		cfg80211_put_bss(ar->hw->wiphy, bss);
2169 	}
2170 
2171 	/* FIXME: base on RSN IE/WPA IE is a correct idea? */
2172 	if (rsnie || wpaie) {
2173 		ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2174 		arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
2175 	}
2176 
2177 	if (wpaie) {
2178 		ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2179 		arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
2180 	}
2181 
2182 	if (sta->mfp &&
2183 	    test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT,
2184 		     ar->running_fw->fw_file.fw_features)) {
2185 		arg->peer_flags |= ar->wmi.peer_flags->pmf;
2186 	}
2187 }
2188 
2189 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2190 				      struct ieee80211_vif *vif,
2191 				      struct ieee80211_sta *sta,
2192 				      struct wmi_peer_assoc_complete_arg *arg)
2193 {
2194 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2195 	struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2196 	struct cfg80211_chan_def def;
2197 	const struct ieee80211_supported_band *sband;
2198 	const struct ieee80211_rate *rates;
2199 	enum nl80211_band band;
2200 	u32 ratemask;
2201 	u8 rate;
2202 	int i;
2203 
2204 	lockdep_assert_held(&ar->conf_mutex);
2205 
2206 	if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2207 		return;
2208 
2209 	band = def.chan->band;
2210 	sband = ar->hw->wiphy->bands[band];
2211 	ratemask = sta->supp_rates[band];
2212 	ratemask &= arvif->bitrate_mask.control[band].legacy;
2213 	rates = sband->bitrates;
2214 
2215 	rateset->num_rates = 0;
2216 
2217 	for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2218 		if (!(ratemask & 1))
2219 			continue;
2220 
2221 		rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2222 		rateset->rates[rateset->num_rates] = rate;
2223 		rateset->num_rates++;
2224 	}
2225 }
2226 
2227 static bool
2228 ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2229 {
2230 	int nss;
2231 
2232 	for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2233 		if (ht_mcs_mask[nss])
2234 			return false;
2235 
2236 	return true;
2237 }
2238 
2239 static bool
2240 ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2241 {
2242 	int nss;
2243 
2244 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2245 		if (vht_mcs_mask[nss])
2246 			return false;
2247 
2248 	return true;
2249 }
2250 
2251 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2252 				   struct ieee80211_vif *vif,
2253 				   struct ieee80211_sta *sta,
2254 				   struct wmi_peer_assoc_complete_arg *arg)
2255 {
2256 	const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2257 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2258 	struct cfg80211_chan_def def;
2259 	enum nl80211_band band;
2260 	const u8 *ht_mcs_mask;
2261 	const u16 *vht_mcs_mask;
2262 	int i, n;
2263 	u8 max_nss;
2264 	u32 stbc;
2265 
2266 	lockdep_assert_held(&ar->conf_mutex);
2267 
2268 	if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2269 		return;
2270 
2271 	if (!ht_cap->ht_supported)
2272 		return;
2273 
2274 	band = def.chan->band;
2275 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2276 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2277 
2278 	if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2279 	    ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2280 		return;
2281 
2282 	arg->peer_flags |= ar->wmi.peer_flags->ht;
2283 	arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2284 				    ht_cap->ampdu_factor)) - 1;
2285 
2286 	arg->peer_mpdu_density =
2287 		ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2288 
2289 	arg->peer_ht_caps = ht_cap->cap;
2290 	arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2291 
2292 	if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2293 		arg->peer_flags |= ar->wmi.peer_flags->ldbc;
2294 
2295 	if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2296 		arg->peer_flags |= ar->wmi.peer_flags->bw40;
2297 		arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2298 	}
2299 
2300 	if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2301 		if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2302 			arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2303 
2304 		if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2305 			arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2306 	}
2307 
2308 	if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2309 		arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2310 		arg->peer_flags |= ar->wmi.peer_flags->stbc;
2311 	}
2312 
2313 	if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2314 		stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2315 		stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2316 		stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2317 		arg->peer_rate_caps |= stbc;
2318 		arg->peer_flags |= ar->wmi.peer_flags->stbc;
2319 	}
2320 
2321 	if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2322 		arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2323 	else if (ht_cap->mcs.rx_mask[1])
2324 		arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2325 
2326 	for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2327 		if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2328 		    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2329 			max_nss = (i / 8) + 1;
2330 			arg->peer_ht_rates.rates[n++] = i;
2331 		}
2332 
2333 	/*
2334 	 * This is a workaround for HT-enabled STAs which break the spec
2335 	 * and have no HT capabilities RX mask (no HT RX MCS map).
2336 	 *
2337 	 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2338 	 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2339 	 *
2340 	 * Firmware asserts if such situation occurs.
2341 	 */
2342 	if (n == 0) {
2343 		arg->peer_ht_rates.num_rates = 8;
2344 		for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2345 			arg->peer_ht_rates.rates[i] = i;
2346 	} else {
2347 		arg->peer_ht_rates.num_rates = n;
2348 		arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2349 	}
2350 
2351 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2352 		   arg->addr,
2353 		   arg->peer_ht_rates.num_rates,
2354 		   arg->peer_num_spatial_streams);
2355 }
2356 
2357 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2358 				    struct ath10k_vif *arvif,
2359 				    struct ieee80211_sta *sta)
2360 {
2361 	u32 uapsd = 0;
2362 	u32 max_sp = 0;
2363 	int ret = 0;
2364 
2365 	lockdep_assert_held(&ar->conf_mutex);
2366 
2367 	if (sta->wme && sta->uapsd_queues) {
2368 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2369 			   sta->uapsd_queues, sta->max_sp);
2370 
2371 		if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2372 			uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2373 				 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2374 		if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2375 			uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2376 				 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2377 		if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2378 			uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2379 				 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2380 		if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2381 			uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2382 				 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2383 
2384 		if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2385 			max_sp = sta->max_sp;
2386 
2387 		ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2388 						 sta->addr,
2389 						 WMI_AP_PS_PEER_PARAM_UAPSD,
2390 						 uapsd);
2391 		if (ret) {
2392 			ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2393 				    arvif->vdev_id, ret);
2394 			return ret;
2395 		}
2396 
2397 		ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2398 						 sta->addr,
2399 						 WMI_AP_PS_PEER_PARAM_MAX_SP,
2400 						 max_sp);
2401 		if (ret) {
2402 			ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2403 				    arvif->vdev_id, ret);
2404 			return ret;
2405 		}
2406 
2407 		/* TODO setup this based on STA listen interval and
2408 		 * beacon interval. Currently we don't know
2409 		 * sta->listen_interval - mac80211 patch required.
2410 		 * Currently use 10 seconds
2411 		 */
2412 		ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2413 						 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2414 						 10);
2415 		if (ret) {
2416 			ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2417 				    arvif->vdev_id, ret);
2418 			return ret;
2419 		}
2420 	}
2421 
2422 	return 0;
2423 }
2424 
2425 static u16
2426 ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2427 			      const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2428 {
2429 	int idx_limit;
2430 	int nss;
2431 	u16 mcs_map;
2432 	u16 mcs;
2433 
2434 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2435 		mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2436 			  vht_mcs_limit[nss];
2437 
2438 		if (mcs_map)
2439 			idx_limit = fls(mcs_map) - 1;
2440 		else
2441 			idx_limit = -1;
2442 
2443 		switch (idx_limit) {
2444 		case 0: /* fall through */
2445 		case 1: /* fall through */
2446 		case 2: /* fall through */
2447 		case 3: /* fall through */
2448 		case 4: /* fall through */
2449 		case 5: /* fall through */
2450 		case 6: /* fall through */
2451 		default:
2452 			/* see ath10k_mac_can_set_bitrate_mask() */
2453 			WARN_ON(1);
2454 			/* fall through */
2455 		case -1:
2456 			mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2457 			break;
2458 		case 7:
2459 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2460 			break;
2461 		case 8:
2462 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2463 			break;
2464 		case 9:
2465 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2466 			break;
2467 		}
2468 
2469 		tx_mcs_set &= ~(0x3 << (nss * 2));
2470 		tx_mcs_set |= mcs << (nss * 2);
2471 	}
2472 
2473 	return tx_mcs_set;
2474 }
2475 
2476 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2477 				    struct ieee80211_vif *vif,
2478 				    struct ieee80211_sta *sta,
2479 				    struct wmi_peer_assoc_complete_arg *arg)
2480 {
2481 	const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2482 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2483 	struct cfg80211_chan_def def;
2484 	enum nl80211_band band;
2485 	const u16 *vht_mcs_mask;
2486 	u8 ampdu_factor;
2487 	u8 max_nss, vht_mcs;
2488 	int i;
2489 
2490 	if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2491 		return;
2492 
2493 	if (!vht_cap->vht_supported)
2494 		return;
2495 
2496 	band = def.chan->band;
2497 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2498 
2499 	if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2500 		return;
2501 
2502 	arg->peer_flags |= ar->wmi.peer_flags->vht;
2503 
2504 	if (def.chan->band == NL80211_BAND_2GHZ)
2505 		arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2506 
2507 	arg->peer_vht_caps = vht_cap->cap;
2508 
2509 	ampdu_factor = (vht_cap->cap &
2510 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2511 		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2512 
2513 	/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2514 	 * zero in VHT IE. Using it would result in degraded throughput.
2515 	 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2516 	 * it if VHT max_mpdu is smaller.
2517 	 */
2518 	arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2519 				 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2520 					ampdu_factor)) - 1);
2521 
2522 	if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2523 		arg->peer_flags |= ar->wmi.peer_flags->bw80;
2524 
2525 	if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2526 		arg->peer_flags |= ar->wmi.peer_flags->bw160;
2527 
2528 	/* Calculate peer NSS capability from VHT capabilities if STA
2529 	 * supports VHT.
2530 	 */
2531 	for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2532 		vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2533 			  (2 * i) & 3;
2534 
2535 		if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
2536 		    vht_mcs_mask[i])
2537 			max_nss = i + 1;
2538 	}
2539 	arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2540 	arg->peer_vht_rates.rx_max_rate =
2541 		__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2542 	arg->peer_vht_rates.rx_mcs_set =
2543 		__le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2544 	arg->peer_vht_rates.tx_max_rate =
2545 		__le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2546 	arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2547 		__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2548 
2549 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2550 		   sta->addr, arg->peer_max_mpdu, arg->peer_flags);
2551 
2552 	if (arg->peer_vht_rates.rx_max_rate &&
2553 	    (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK)) {
2554 		switch (arg->peer_vht_rates.rx_max_rate) {
2555 		case 1560:
2556 			/* Must be 2x2 at 160Mhz is all it can do. */
2557 			arg->peer_bw_rxnss_override = 2;
2558 			break;
2559 		case 780:
2560 			/* Can only do 1x1 at 160Mhz (Long Guard Interval) */
2561 			arg->peer_bw_rxnss_override = 1;
2562 			break;
2563 		}
2564 	}
2565 }
2566 
2567 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2568 				    struct ieee80211_vif *vif,
2569 				    struct ieee80211_sta *sta,
2570 				    struct wmi_peer_assoc_complete_arg *arg)
2571 {
2572 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2573 
2574 	switch (arvif->vdev_type) {
2575 	case WMI_VDEV_TYPE_AP:
2576 		if (sta->wme)
2577 			arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2578 
2579 		if (sta->wme && sta->uapsd_queues) {
2580 			arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
2581 			arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2582 		}
2583 		break;
2584 	case WMI_VDEV_TYPE_STA:
2585 		if (sta->wme)
2586 			arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2587 		break;
2588 	case WMI_VDEV_TYPE_IBSS:
2589 		if (sta->wme)
2590 			arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2591 		break;
2592 	default:
2593 		break;
2594 	}
2595 
2596 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2597 		   sta->addr, !!(arg->peer_flags &
2598 		   arvif->ar->wmi.peer_flags->qos));
2599 }
2600 
2601 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2602 {
2603 	return sta->supp_rates[NL80211_BAND_2GHZ] >>
2604 	       ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2605 }
2606 
2607 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
2608 						    struct ieee80211_sta *sta)
2609 {
2610 	if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2611 		switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2612 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2613 			return MODE_11AC_VHT160;
2614 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2615 			return MODE_11AC_VHT80_80;
2616 		default:
2617 			/* not sure if this is a valid case? */
2618 			return MODE_11AC_VHT160;
2619 		}
2620 	}
2621 
2622 	if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2623 		return MODE_11AC_VHT80;
2624 
2625 	if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2626 		return MODE_11AC_VHT40;
2627 
2628 	if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2629 		return MODE_11AC_VHT20;
2630 
2631 	return MODE_UNKNOWN;
2632 }
2633 
2634 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2635 					struct ieee80211_vif *vif,
2636 					struct ieee80211_sta *sta,
2637 					struct wmi_peer_assoc_complete_arg *arg)
2638 {
2639 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2640 	struct cfg80211_chan_def def;
2641 	enum nl80211_band band;
2642 	const u8 *ht_mcs_mask;
2643 	const u16 *vht_mcs_mask;
2644 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
2645 
2646 	if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2647 		return;
2648 
2649 	band = def.chan->band;
2650 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2651 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2652 
2653 	switch (band) {
2654 	case NL80211_BAND_2GHZ:
2655 		if (sta->vht_cap.vht_supported &&
2656 		    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2657 			if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2658 				phymode = MODE_11AC_VHT40;
2659 			else
2660 				phymode = MODE_11AC_VHT20;
2661 		} else if (sta->ht_cap.ht_supported &&
2662 			   !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2663 			if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2664 				phymode = MODE_11NG_HT40;
2665 			else
2666 				phymode = MODE_11NG_HT20;
2667 		} else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2668 			phymode = MODE_11G;
2669 		} else {
2670 			phymode = MODE_11B;
2671 		}
2672 
2673 		break;
2674 	case NL80211_BAND_5GHZ:
2675 		/*
2676 		 * Check VHT first.
2677 		 */
2678 		if (sta->vht_cap.vht_supported &&
2679 		    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2680 			phymode = ath10k_mac_get_phymode_vht(ar, sta);
2681 		} else if (sta->ht_cap.ht_supported &&
2682 			   !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2683 			if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2684 				phymode = MODE_11NA_HT40;
2685 			else
2686 				phymode = MODE_11NA_HT20;
2687 		} else {
2688 			phymode = MODE_11A;
2689 		}
2690 
2691 		break;
2692 	default:
2693 		break;
2694 	}
2695 
2696 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2697 		   sta->addr, ath10k_wmi_phymode_str(phymode));
2698 
2699 	arg->peer_phymode = phymode;
2700 	WARN_ON(phymode == MODE_UNKNOWN);
2701 }
2702 
2703 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2704 				     struct ieee80211_vif *vif,
2705 				     struct ieee80211_sta *sta,
2706 				     struct wmi_peer_assoc_complete_arg *arg)
2707 {
2708 	lockdep_assert_held(&ar->conf_mutex);
2709 
2710 	memset(arg, 0, sizeof(*arg));
2711 
2712 	ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2713 	ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
2714 	ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2715 	ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2716 	ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2717 	ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2718 	ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2719 
2720 	return 0;
2721 }
2722 
2723 static const u32 ath10k_smps_map[] = {
2724 	[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2725 	[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2726 	[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2727 	[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2728 };
2729 
2730 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2731 				  const u8 *addr,
2732 				  const struct ieee80211_sta_ht_cap *ht_cap)
2733 {
2734 	int smps;
2735 
2736 	if (!ht_cap->ht_supported)
2737 		return 0;
2738 
2739 	smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2740 	smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2741 
2742 	if (smps >= ARRAY_SIZE(ath10k_smps_map))
2743 		return -EINVAL;
2744 
2745 	return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2746 					 WMI_PEER_SMPS_STATE,
2747 					 ath10k_smps_map[smps]);
2748 }
2749 
2750 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2751 				      struct ieee80211_vif *vif,
2752 				      struct ieee80211_sta_vht_cap vht_cap)
2753 {
2754 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2755 	int ret;
2756 	u32 param;
2757 	u32 value;
2758 
2759 	if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2760 		return 0;
2761 
2762 	if (!(ar->vht_cap_info &
2763 	      (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2764 	       IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2765 	       IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2766 	       IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2767 		return 0;
2768 
2769 	param = ar->wmi.vdev_param->txbf;
2770 	value = 0;
2771 
2772 	if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2773 		return 0;
2774 
2775 	/* The following logic is correct. If a remote STA advertises support
2776 	 * for being a beamformer then we should enable us being a beamformee.
2777 	 */
2778 
2779 	if (ar->vht_cap_info &
2780 	    (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2781 	     IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2782 		if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2783 			value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2784 
2785 		if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2786 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2787 	}
2788 
2789 	if (ar->vht_cap_info &
2790 	    (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2791 	     IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2792 		if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2793 			value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2794 
2795 		if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2796 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2797 	}
2798 
2799 	if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2800 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2801 
2802 	if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2803 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2804 
2805 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2806 	if (ret) {
2807 		ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2808 			    value, ret);
2809 		return ret;
2810 	}
2811 
2812 	return 0;
2813 }
2814 
2815 /* can be called only in mac80211 callbacks due to `key_count` usage */
2816 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2817 			     struct ieee80211_vif *vif,
2818 			     struct ieee80211_bss_conf *bss_conf)
2819 {
2820 	struct ath10k *ar = hw->priv;
2821 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2822 	struct ieee80211_sta_ht_cap ht_cap;
2823 	struct ieee80211_sta_vht_cap vht_cap;
2824 	struct wmi_peer_assoc_complete_arg peer_arg;
2825 	struct ieee80211_sta *ap_sta;
2826 	int ret;
2827 
2828 	lockdep_assert_held(&ar->conf_mutex);
2829 
2830 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2831 		   arvif->vdev_id, arvif->bssid, arvif->aid);
2832 
2833 	rcu_read_lock();
2834 
2835 	ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2836 	if (!ap_sta) {
2837 		ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
2838 			    bss_conf->bssid, arvif->vdev_id);
2839 		rcu_read_unlock();
2840 		return;
2841 	}
2842 
2843 	/* ap_sta must be accessed only within rcu section which must be left
2844 	 * before calling ath10k_setup_peer_smps() which might sleep.
2845 	 */
2846 	ht_cap = ap_sta->ht_cap;
2847 	vht_cap = ap_sta->vht_cap;
2848 
2849 	ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
2850 	if (ret) {
2851 		ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2852 			    bss_conf->bssid, arvif->vdev_id, ret);
2853 		rcu_read_unlock();
2854 		return;
2855 	}
2856 
2857 	rcu_read_unlock();
2858 
2859 	ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2860 	if (ret) {
2861 		ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
2862 			    bss_conf->bssid, arvif->vdev_id, ret);
2863 		return;
2864 	}
2865 
2866 	ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2867 	if (ret) {
2868 		ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
2869 			    arvif->vdev_id, ret);
2870 		return;
2871 	}
2872 
2873 	ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2874 	if (ret) {
2875 		ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2876 			    arvif->vdev_id, bss_conf->bssid, ret);
2877 		return;
2878 	}
2879 
2880 	ath10k_dbg(ar, ATH10K_DBG_MAC,
2881 		   "mac vdev %d up (associated) bssid %pM aid %d\n",
2882 		   arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2883 
2884 	WARN_ON(arvif->is_up);
2885 
2886 	arvif->aid = bss_conf->aid;
2887 	ether_addr_copy(arvif->bssid, bss_conf->bssid);
2888 
2889 	ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2890 	if (ret) {
2891 		ath10k_warn(ar, "failed to set vdev %d up: %d\n",
2892 			    arvif->vdev_id, ret);
2893 		return;
2894 	}
2895 
2896 	arvif->is_up = true;
2897 
2898 	/* Workaround: Some firmware revisions (tested with qca6174
2899 	 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2900 	 * poked with peer param command.
2901 	 */
2902 	ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2903 					WMI_PEER_DUMMY_VAR, 1);
2904 	if (ret) {
2905 		ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2906 			    arvif->bssid, arvif->vdev_id, ret);
2907 		return;
2908 	}
2909 }
2910 
2911 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2912 				struct ieee80211_vif *vif)
2913 {
2914 	struct ath10k *ar = hw->priv;
2915 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2916 	struct ieee80211_sta_vht_cap vht_cap = {};
2917 	int ret;
2918 
2919 	lockdep_assert_held(&ar->conf_mutex);
2920 
2921 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2922 		   arvif->vdev_id, arvif->bssid);
2923 
2924 	ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
2925 	if (ret)
2926 		ath10k_warn(ar, "failed to down vdev %i: %d\n",
2927 			    arvif->vdev_id, ret);
2928 
2929 	arvif->def_wep_key_idx = -1;
2930 
2931 	ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2932 	if (ret) {
2933 		ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2934 			    arvif->vdev_id, ret);
2935 		return;
2936 	}
2937 
2938 	arvif->is_up = false;
2939 
2940 	cancel_delayed_work_sync(&arvif->connection_loss_work);
2941 }
2942 
2943 static int ath10k_station_assoc(struct ath10k *ar,
2944 				struct ieee80211_vif *vif,
2945 				struct ieee80211_sta *sta,
2946 				bool reassoc)
2947 {
2948 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
2949 	struct wmi_peer_assoc_complete_arg peer_arg;
2950 	int ret = 0;
2951 
2952 	lockdep_assert_held(&ar->conf_mutex);
2953 
2954 	ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
2955 	if (ret) {
2956 		ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
2957 			    sta->addr, arvif->vdev_id, ret);
2958 		return ret;
2959 	}
2960 
2961 	ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2962 	if (ret) {
2963 		ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2964 			    sta->addr, arvif->vdev_id, ret);
2965 		return ret;
2966 	}
2967 
2968 	/* Re-assoc is run only to update supported rates for given station. It
2969 	 * doesn't make much sense to reconfigure the peer completely.
2970 	 */
2971 	if (!reassoc) {
2972 		ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2973 					     &sta->ht_cap);
2974 		if (ret) {
2975 			ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
2976 				    arvif->vdev_id, ret);
2977 			return ret;
2978 		}
2979 
2980 		ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2981 		if (ret) {
2982 			ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2983 				    sta->addr, arvif->vdev_id, ret);
2984 			return ret;
2985 		}
2986 
2987 		if (!sta->wme) {
2988 			arvif->num_legacy_stations++;
2989 			ret  = ath10k_recalc_rtscts_prot(arvif);
2990 			if (ret) {
2991 				ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2992 					    arvif->vdev_id, ret);
2993 				return ret;
2994 			}
2995 		}
2996 
2997 		/* Plumb cached keys only for static WEP */
2998 		if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) {
2999 			ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
3000 			if (ret) {
3001 				ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
3002 					    arvif->vdev_id, ret);
3003 				return ret;
3004 			}
3005 		}
3006 	}
3007 
3008 	return ret;
3009 }
3010 
3011 static int ath10k_station_disassoc(struct ath10k *ar,
3012 				   struct ieee80211_vif *vif,
3013 				   struct ieee80211_sta *sta)
3014 {
3015 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
3016 	int ret = 0;
3017 
3018 	lockdep_assert_held(&ar->conf_mutex);
3019 
3020 	if (!sta->wme) {
3021 		arvif->num_legacy_stations--;
3022 		ret = ath10k_recalc_rtscts_prot(arvif);
3023 		if (ret) {
3024 			ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3025 				    arvif->vdev_id, ret);
3026 			return ret;
3027 		}
3028 	}
3029 
3030 	ret = ath10k_clear_peer_keys(arvif, sta->addr);
3031 	if (ret) {
3032 		ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
3033 			    arvif->vdev_id, ret);
3034 		return ret;
3035 	}
3036 
3037 	return ret;
3038 }
3039 
3040 /**************/
3041 /* Regulatory */
3042 /**************/
3043 
3044 static int ath10k_update_channel_list(struct ath10k *ar)
3045 {
3046 	struct ieee80211_hw *hw = ar->hw;
3047 	struct ieee80211_supported_band **bands;
3048 	enum nl80211_band band;
3049 	struct ieee80211_channel *channel;
3050 	struct wmi_scan_chan_list_arg arg = {0};
3051 	struct wmi_channel_arg *ch;
3052 	bool passive;
3053 	int len;
3054 	int ret;
3055 	int i;
3056 
3057 	lockdep_assert_held(&ar->conf_mutex);
3058 
3059 	bands = hw->wiphy->bands;
3060 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
3061 		if (!bands[band])
3062 			continue;
3063 
3064 		for (i = 0; i < bands[band]->n_channels; i++) {
3065 			if (bands[band]->channels[i].flags &
3066 			    IEEE80211_CHAN_DISABLED)
3067 				continue;
3068 
3069 			arg.n_channels++;
3070 		}
3071 	}
3072 
3073 	len = sizeof(struct wmi_channel_arg) * arg.n_channels;
3074 	arg.channels = kzalloc(len, GFP_KERNEL);
3075 	if (!arg.channels)
3076 		return -ENOMEM;
3077 
3078 	ch = arg.channels;
3079 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
3080 		if (!bands[band])
3081 			continue;
3082 
3083 		for (i = 0; i < bands[band]->n_channels; i++) {
3084 			channel = &bands[band]->channels[i];
3085 
3086 			if (channel->flags & IEEE80211_CHAN_DISABLED)
3087 				continue;
3088 
3089 			ch->allow_ht = true;
3090 
3091 			/* FIXME: when should we really allow VHT? */
3092 			ch->allow_vht = true;
3093 
3094 			ch->allow_ibss =
3095 				!(channel->flags & IEEE80211_CHAN_NO_IR);
3096 
3097 			ch->ht40plus =
3098 				!(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
3099 
3100 			ch->chan_radar =
3101 				!!(channel->flags & IEEE80211_CHAN_RADAR);
3102 
3103 			passive = channel->flags & IEEE80211_CHAN_NO_IR;
3104 			ch->passive = passive;
3105 
3106 			/* the firmware is ignoring the "radar" flag of the
3107 			 * channel and is scanning actively using Probe Requests
3108 			 * on "Radar detection"/DFS channels which are not
3109 			 * marked as "available"
3110 			 */
3111 			ch->passive |= ch->chan_radar;
3112 
3113 			ch->freq = channel->center_freq;
3114 			ch->band_center_freq1 = channel->center_freq;
3115 			ch->min_power = 0;
3116 			ch->max_power = channel->max_power * 2;
3117 			ch->max_reg_power = channel->max_reg_power * 2;
3118 			ch->max_antenna_gain = channel->max_antenna_gain * 2;
3119 			ch->reg_class_id = 0; /* FIXME */
3120 
3121 			/* FIXME: why use only legacy modes, why not any
3122 			 * HT/VHT modes? Would that even make any
3123 			 * difference?
3124 			 */
3125 			if (channel->band == NL80211_BAND_2GHZ)
3126 				ch->mode = MODE_11G;
3127 			else
3128 				ch->mode = MODE_11A;
3129 
3130 			if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
3131 				continue;
3132 
3133 			ath10k_dbg(ar, ATH10K_DBG_WMI,
3134 				   "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3135 				    ch - arg.channels, arg.n_channels,
3136 				   ch->freq, ch->max_power, ch->max_reg_power,
3137 				   ch->max_antenna_gain, ch->mode);
3138 
3139 			ch++;
3140 		}
3141 	}
3142 
3143 	ret = ath10k_wmi_scan_chan_list(ar, &arg);
3144 	kfree(arg.channels);
3145 
3146 	return ret;
3147 }
3148 
3149 static enum wmi_dfs_region
3150 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
3151 {
3152 	switch (dfs_region) {
3153 	case NL80211_DFS_UNSET:
3154 		return WMI_UNINIT_DFS_DOMAIN;
3155 	case NL80211_DFS_FCC:
3156 		return WMI_FCC_DFS_DOMAIN;
3157 	case NL80211_DFS_ETSI:
3158 		return WMI_ETSI_DFS_DOMAIN;
3159 	case NL80211_DFS_JP:
3160 		return WMI_MKK4_DFS_DOMAIN;
3161 	}
3162 	return WMI_UNINIT_DFS_DOMAIN;
3163 }
3164 
3165 static void ath10k_regd_update(struct ath10k *ar)
3166 {
3167 	struct reg_dmn_pair_mapping *regpair;
3168 	int ret;
3169 	enum wmi_dfs_region wmi_dfs_reg;
3170 	enum nl80211_dfs_regions nl_dfs_reg;
3171 
3172 	lockdep_assert_held(&ar->conf_mutex);
3173 
3174 	ret = ath10k_update_channel_list(ar);
3175 	if (ret)
3176 		ath10k_warn(ar, "failed to update channel list: %d\n", ret);
3177 
3178 	regpair = ar->ath_common.regulatory.regpair;
3179 
3180 	if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3181 		nl_dfs_reg = ar->dfs_detector->region;
3182 		wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
3183 	} else {
3184 		wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
3185 	}
3186 
3187 	/* Target allows setting up per-band regdomain but ath_common provides
3188 	 * a combined one only
3189 	 */
3190 	ret = ath10k_wmi_pdev_set_regdomain(ar,
3191 					    regpair->reg_domain,
3192 					    regpair->reg_domain, /* 2ghz */
3193 					    regpair->reg_domain, /* 5ghz */
3194 					    regpair->reg_2ghz_ctl,
3195 					    regpair->reg_5ghz_ctl,
3196 					    wmi_dfs_reg);
3197 	if (ret)
3198 		ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
3199 }
3200 
3201 static void ath10k_mac_update_channel_list(struct ath10k *ar,
3202 					   struct ieee80211_supported_band *band)
3203 {
3204 	int i;
3205 
3206 	if (ar->low_5ghz_chan && ar->high_5ghz_chan) {
3207 		for (i = 0; i < band->n_channels; i++) {
3208 			if (band->channels[i].center_freq < ar->low_5ghz_chan ||
3209 			    band->channels[i].center_freq > ar->high_5ghz_chan)
3210 				band->channels[i].flags |=
3211 					IEEE80211_CHAN_DISABLED;
3212 		}
3213 	}
3214 }
3215 
3216 static void ath10k_reg_notifier(struct wiphy *wiphy,
3217 				struct regulatory_request *request)
3218 {
3219 	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
3220 	struct ath10k *ar = hw->priv;
3221 	bool result;
3222 
3223 	ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
3224 
3225 	if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3226 		ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
3227 			   request->dfs_region);
3228 		result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
3229 							  request->dfs_region);
3230 		if (!result)
3231 			ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3232 				    request->dfs_region);
3233 	}
3234 
3235 	mutex_lock(&ar->conf_mutex);
3236 	if (ar->state == ATH10K_STATE_ON)
3237 		ath10k_regd_update(ar);
3238 	mutex_unlock(&ar->conf_mutex);
3239 
3240 	if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
3241 		ath10k_mac_update_channel_list(ar,
3242 					       ar->hw->wiphy->bands[NL80211_BAND_5GHZ]);
3243 }
3244 
3245 static void ath10k_stop_radar_confirmation(struct ath10k *ar)
3246 {
3247 	spin_lock_bh(&ar->data_lock);
3248 	ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED;
3249 	spin_unlock_bh(&ar->data_lock);
3250 
3251 	cancel_work_sync(&ar->radar_confirmation_work);
3252 }
3253 
3254 /***************/
3255 /* TX handlers */
3256 /***************/
3257 
3258 enum ath10k_mac_tx_path {
3259 	ATH10K_MAC_TX_HTT,
3260 	ATH10K_MAC_TX_HTT_MGMT,
3261 	ATH10K_MAC_TX_WMI_MGMT,
3262 	ATH10K_MAC_TX_UNKNOWN,
3263 };
3264 
3265 void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3266 {
3267 	lockdep_assert_held(&ar->htt.tx_lock);
3268 
3269 	WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3270 	ar->tx_paused |= BIT(reason);
3271 	ieee80211_stop_queues(ar->hw);
3272 }
3273 
3274 static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3275 				      struct ieee80211_vif *vif)
3276 {
3277 	struct ath10k *ar = data;
3278 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
3279 
3280 	if (arvif->tx_paused)
3281 		return;
3282 
3283 	ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3284 }
3285 
3286 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3287 {
3288 	lockdep_assert_held(&ar->htt.tx_lock);
3289 
3290 	WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3291 	ar->tx_paused &= ~BIT(reason);
3292 
3293 	if (ar->tx_paused)
3294 		return;
3295 
3296 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
3297 						   IEEE80211_IFACE_ITER_RESUME_ALL,
3298 						   ath10k_mac_tx_unlock_iter,
3299 						   ar);
3300 
3301 	ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3302 }
3303 
3304 void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3305 {
3306 	struct ath10k *ar = arvif->ar;
3307 
3308 	lockdep_assert_held(&ar->htt.tx_lock);
3309 
3310 	WARN_ON(reason >= BITS_PER_LONG);
3311 	arvif->tx_paused |= BIT(reason);
3312 	ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3313 }
3314 
3315 void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3316 {
3317 	struct ath10k *ar = arvif->ar;
3318 
3319 	lockdep_assert_held(&ar->htt.tx_lock);
3320 
3321 	WARN_ON(reason >= BITS_PER_LONG);
3322 	arvif->tx_paused &= ~BIT(reason);
3323 
3324 	if (ar->tx_paused)
3325 		return;
3326 
3327 	if (arvif->tx_paused)
3328 		return;
3329 
3330 	ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3331 }
3332 
3333 static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3334 					   enum wmi_tlv_tx_pause_id pause_id,
3335 					   enum wmi_tlv_tx_pause_action action)
3336 {
3337 	struct ath10k *ar = arvif->ar;
3338 
3339 	lockdep_assert_held(&ar->htt.tx_lock);
3340 
3341 	switch (action) {
3342 	case WMI_TLV_TX_PAUSE_ACTION_STOP:
3343 		ath10k_mac_vif_tx_lock(arvif, pause_id);
3344 		break;
3345 	case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3346 		ath10k_mac_vif_tx_unlock(arvif, pause_id);
3347 		break;
3348 	default:
3349 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
3350 			   "received unknown tx pause action %d on vdev %i, ignoring\n",
3351 			    action, arvif->vdev_id);
3352 		break;
3353 	}
3354 }
3355 
3356 struct ath10k_mac_tx_pause {
3357 	u32 vdev_id;
3358 	enum wmi_tlv_tx_pause_id pause_id;
3359 	enum wmi_tlv_tx_pause_action action;
3360 };
3361 
3362 static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3363 					    struct ieee80211_vif *vif)
3364 {
3365 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
3366 	struct ath10k_mac_tx_pause *arg = data;
3367 
3368 	if (arvif->vdev_id != arg->vdev_id)
3369 		return;
3370 
3371 	ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3372 }
3373 
3374 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3375 				     enum wmi_tlv_tx_pause_id pause_id,
3376 				     enum wmi_tlv_tx_pause_action action)
3377 {
3378 	struct ath10k_mac_tx_pause arg = {
3379 		.vdev_id = vdev_id,
3380 		.pause_id = pause_id,
3381 		.action = action,
3382 	};
3383 
3384 	spin_lock_bh(&ar->htt.tx_lock);
3385 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
3386 						   IEEE80211_IFACE_ITER_RESUME_ALL,
3387 						   ath10k_mac_handle_tx_pause_iter,
3388 						   &arg);
3389 	spin_unlock_bh(&ar->htt.tx_lock);
3390 }
3391 
3392 static enum ath10k_hw_txrx_mode
3393 ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3394 			   struct ieee80211_vif *vif,
3395 			   struct ieee80211_sta *sta,
3396 			   struct sk_buff *skb)
3397 {
3398 	const struct ieee80211_hdr *hdr = (void *)skb->data;
3399 	__le16 fc = hdr->frame_control;
3400 
3401 	if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3402 		return ATH10K_HW_TXRX_RAW;
3403 
3404 	if (ieee80211_is_mgmt(fc))
3405 		return ATH10K_HW_TXRX_MGMT;
3406 
3407 	/* Workaround:
3408 	 *
3409 	 * NullFunc frames are mostly used to ping if a client or AP are still
3410 	 * reachable and responsive. This implies tx status reports must be
3411 	 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3412 	 * come to a conclusion that the other end disappeared and tear down
3413 	 * BSS connection or it can never disconnect from BSS/client (which is
3414 	 * the case).
3415 	 *
3416 	 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3417 	 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3418 	 * which seems to deliver correct tx reports for NullFunc frames. The
3419 	 * downside of using it is it ignores client powersave state so it can
3420 	 * end up disconnecting sleeping clients in AP mode. It should fix STA
3421 	 * mode though because AP don't sleep.
3422 	 */
3423 	if (ar->htt.target_version_major < 3 &&
3424 	    (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3425 	    !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3426 		      ar->running_fw->fw_file.fw_features))
3427 		return ATH10K_HW_TXRX_MGMT;
3428 
3429 	/* Workaround:
3430 	 *
3431 	 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3432 	 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3433 	 * to work with Ethernet txmode so use it.
3434 	 *
3435 	 * FIXME: Check if raw mode works with TDLS.
3436 	 */
3437 	if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3438 		return ATH10K_HW_TXRX_ETHERNET;
3439 
3440 	if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3441 		return ATH10K_HW_TXRX_RAW;
3442 
3443 	return ATH10K_HW_TXRX_NATIVE_WIFI;
3444 }
3445 
3446 static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3447 				     struct sk_buff *skb)
3448 {
3449 	const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3450 	const struct ieee80211_hdr *hdr = (void *)skb->data;
3451 	const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3452 			 IEEE80211_TX_CTL_INJECTED;
3453 
3454 	if (!ieee80211_has_protected(hdr->frame_control))
3455 		return false;
3456 
3457 	if ((info->flags & mask) == mask)
3458 		return false;
3459 
3460 	if (vif)
3461 		return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt;
3462 
3463 	return true;
3464 }
3465 
3466 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3467  * Control in the header.
3468  */
3469 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3470 {
3471 	struct ieee80211_hdr *hdr = (void *)skb->data;
3472 	struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3473 	u8 *qos_ctl;
3474 
3475 	if (!ieee80211_is_data_qos(hdr->frame_control))
3476 		return;
3477 
3478 	qos_ctl = ieee80211_get_qos_ctl(hdr);
3479 	memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3480 		skb->data, (void *)qos_ctl - (void *)skb->data);
3481 	skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3482 
3483 	/* Some firmware revisions don't handle sending QoS NullFunc well.
3484 	 * These frames are mainly used for CQM purposes so it doesn't really
3485 	 * matter whether QoS NullFunc or NullFunc are sent.
3486 	 */
3487 	hdr = (void *)skb->data;
3488 	if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3489 		cb->flags &= ~ATH10K_SKB_F_QOS;
3490 
3491 	hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3492 }
3493 
3494 static void ath10k_tx_h_8023(struct sk_buff *skb)
3495 {
3496 	struct ieee80211_hdr *hdr;
3497 	struct rfc1042_hdr *rfc1042;
3498 	struct ethhdr *eth;
3499 	size_t hdrlen;
3500 	u8 da[ETH_ALEN];
3501 	u8 sa[ETH_ALEN];
3502 	__be16 type;
3503 
3504 	hdr = (void *)skb->data;
3505 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
3506 	rfc1042 = (void *)skb->data + hdrlen;
3507 
3508 	ether_addr_copy(da, ieee80211_get_DA(hdr));
3509 	ether_addr_copy(sa, ieee80211_get_SA(hdr));
3510 	type = rfc1042->snap_type;
3511 
3512 	skb_pull(skb, hdrlen + sizeof(*rfc1042));
3513 	skb_push(skb, sizeof(*eth));
3514 
3515 	eth = (void *)skb->data;
3516 	ether_addr_copy(eth->h_dest, da);
3517 	ether_addr_copy(eth->h_source, sa);
3518 	eth->h_proto = type;
3519 }
3520 
3521 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3522 				       struct ieee80211_vif *vif,
3523 				       struct sk_buff *skb)
3524 {
3525 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3526 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
3527 
3528 	/* This is case only for P2P_GO */
3529 	if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
3530 		return;
3531 
3532 	if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3533 		spin_lock_bh(&ar->data_lock);
3534 		if (arvif->u.ap.noa_data)
3535 			if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3536 					      GFP_ATOMIC))
3537 				skb_put_data(skb, arvif->u.ap.noa_data,
3538 					     arvif->u.ap.noa_len);
3539 		spin_unlock_bh(&ar->data_lock);
3540 	}
3541 }
3542 
3543 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
3544 				    struct ieee80211_vif *vif,
3545 				    struct ieee80211_txq *txq,
3546 				    struct sk_buff *skb)
3547 {
3548 	struct ieee80211_hdr *hdr = (void *)skb->data;
3549 	struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3550 
3551 	cb->flags = 0;
3552 	if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3553 		cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3554 
3555 	if (ieee80211_is_mgmt(hdr->frame_control))
3556 		cb->flags |= ATH10K_SKB_F_MGMT;
3557 
3558 	if (ieee80211_is_data_qos(hdr->frame_control))
3559 		cb->flags |= ATH10K_SKB_F_QOS;
3560 
3561 	cb->vif = vif;
3562 	cb->txq = txq;
3563 }
3564 
3565 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
3566 {
3567 	/* FIXME: Not really sure since when the behaviour changed. At some
3568 	 * point new firmware stopped requiring creation of peer entries for
3569 	 * offchannel tx (and actually creating them causes issues with wmi-htc
3570 	 * tx credit replenishment and reliability). Assuming it's at least 3.4
3571 	 * because that's when the `freq` was introduced to TX_FRM HTT command.
3572 	 */
3573 	return (ar->htt.target_version_major >= 3 &&
3574 		ar->htt.target_version_minor >= 4 &&
3575 		ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
3576 }
3577 
3578 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3579 {
3580 	struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3581 	int ret = 0;
3582 
3583 	spin_lock_bh(&ar->data_lock);
3584 
3585 	if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3586 		ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3587 		ret = -ENOSPC;
3588 		goto unlock;
3589 	}
3590 
3591 	__skb_queue_tail(q, skb);
3592 	ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3593 
3594 unlock:
3595 	spin_unlock_bh(&ar->data_lock);
3596 
3597 	return ret;
3598 }
3599 
3600 static enum ath10k_mac_tx_path
3601 ath10k_mac_tx_h_get_txpath(struct ath10k *ar,
3602 			   struct sk_buff *skb,
3603 			   enum ath10k_hw_txrx_mode txmode)
3604 {
3605 	switch (txmode) {
3606 	case ATH10K_HW_TXRX_RAW:
3607 	case ATH10K_HW_TXRX_NATIVE_WIFI:
3608 	case ATH10K_HW_TXRX_ETHERNET:
3609 		return ATH10K_MAC_TX_HTT;
3610 	case ATH10K_HW_TXRX_MGMT:
3611 		if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3612 			     ar->running_fw->fw_file.fw_features) ||
3613 			     test_bit(WMI_SERVICE_MGMT_TX_WMI,
3614 				      ar->wmi.svc_map))
3615 			return ATH10K_MAC_TX_WMI_MGMT;
3616 		else if (ar->htt.target_version_major >= 3)
3617 			return ATH10K_MAC_TX_HTT;
3618 		else
3619 			return ATH10K_MAC_TX_HTT_MGMT;
3620 	}
3621 
3622 	return ATH10K_MAC_TX_UNKNOWN;
3623 }
3624 
3625 static int ath10k_mac_tx_submit(struct ath10k *ar,
3626 				enum ath10k_hw_txrx_mode txmode,
3627 				enum ath10k_mac_tx_path txpath,
3628 				struct sk_buff *skb)
3629 {
3630 	struct ath10k_htt *htt = &ar->htt;
3631 	int ret = -EINVAL;
3632 
3633 	switch (txpath) {
3634 	case ATH10K_MAC_TX_HTT:
3635 		ret = ath10k_htt_tx(htt, txmode, skb);
3636 		break;
3637 	case ATH10K_MAC_TX_HTT_MGMT:
3638 		ret = ath10k_htt_mgmt_tx(htt, skb);
3639 		break;
3640 	case ATH10K_MAC_TX_WMI_MGMT:
3641 		ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3642 		break;
3643 	case ATH10K_MAC_TX_UNKNOWN:
3644 		WARN_ON_ONCE(1);
3645 		ret = -EINVAL;
3646 		break;
3647 	}
3648 
3649 	if (ret) {
3650 		ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3651 			    ret);
3652 		ieee80211_free_txskb(ar->hw, skb);
3653 	}
3654 
3655 	return ret;
3656 }
3657 
3658 /* This function consumes the sk_buff regardless of return value as far as
3659  * caller is concerned so no freeing is necessary afterwards.
3660  */
3661 static int ath10k_mac_tx(struct ath10k *ar,
3662 			 struct ieee80211_vif *vif,
3663 			 enum ath10k_hw_txrx_mode txmode,
3664 			 enum ath10k_mac_tx_path txpath,
3665 			 struct sk_buff *skb)
3666 {
3667 	struct ieee80211_hw *hw = ar->hw;
3668 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3669 	int ret;
3670 
3671 	/* We should disable CCK RATE due to P2P */
3672 	if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
3673 		ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3674 
3675 	switch (txmode) {
3676 	case ATH10K_HW_TXRX_MGMT:
3677 	case ATH10K_HW_TXRX_NATIVE_WIFI:
3678 		ath10k_tx_h_nwifi(hw, skb);
3679 		ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3680 		ath10k_tx_h_seq_no(vif, skb);
3681 		break;
3682 	case ATH10K_HW_TXRX_ETHERNET:
3683 		ath10k_tx_h_8023(skb);
3684 		break;
3685 	case ATH10K_HW_TXRX_RAW:
3686 		if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3687 			WARN_ON_ONCE(1);
3688 			ieee80211_free_txskb(hw, skb);
3689 			return -ENOTSUPP;
3690 		}
3691 	}
3692 
3693 	if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3694 		if (!ath10k_mac_tx_frm_has_freq(ar)) {
3695 			ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %pK\n",
3696 				   skb);
3697 
3698 			skb_queue_tail(&ar->offchan_tx_queue, skb);
3699 			ieee80211_queue_work(hw, &ar->offchan_tx_work);
3700 			return 0;
3701 		}
3702 	}
3703 
3704 	ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb);
3705 	if (ret) {
3706 		ath10k_warn(ar, "failed to submit frame: %d\n", ret);
3707 		return ret;
3708 	}
3709 
3710 	return 0;
3711 }
3712 
3713 void ath10k_offchan_tx_purge(struct ath10k *ar)
3714 {
3715 	struct sk_buff *skb;
3716 
3717 	for (;;) {
3718 		skb = skb_dequeue(&ar->offchan_tx_queue);
3719 		if (!skb)
3720 			break;
3721 
3722 		ieee80211_free_txskb(ar->hw, skb);
3723 	}
3724 }
3725 
3726 void ath10k_offchan_tx_work(struct work_struct *work)
3727 {
3728 	struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3729 	struct ath10k_peer *peer;
3730 	struct ath10k_vif *arvif;
3731 	enum ath10k_hw_txrx_mode txmode;
3732 	enum ath10k_mac_tx_path txpath;
3733 	struct ieee80211_hdr *hdr;
3734 	struct ieee80211_vif *vif;
3735 	struct ieee80211_sta *sta;
3736 	struct sk_buff *skb;
3737 	const u8 *peer_addr;
3738 	int vdev_id;
3739 	int ret;
3740 	unsigned long time_left;
3741 	bool tmp_peer_created = false;
3742 
3743 	/* FW requirement: We must create a peer before FW will send out
3744 	 * an offchannel frame. Otherwise the frame will be stuck and
3745 	 * never transmitted. We delete the peer upon tx completion.
3746 	 * It is unlikely that a peer for offchannel tx will already be
3747 	 * present. However it may be in some rare cases so account for that.
3748 	 * Otherwise we might remove a legitimate peer and break stuff.
3749 	 */
3750 
3751 	for (;;) {
3752 		skb = skb_dequeue(&ar->offchan_tx_queue);
3753 		if (!skb)
3754 			break;
3755 
3756 		mutex_lock(&ar->conf_mutex);
3757 
3758 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK\n",
3759 			   skb);
3760 
3761 		hdr = (struct ieee80211_hdr *)skb->data;
3762 		peer_addr = ieee80211_get_DA(hdr);
3763 
3764 		spin_lock_bh(&ar->data_lock);
3765 		vdev_id = ar->scan.vdev_id;
3766 		peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3767 		spin_unlock_bh(&ar->data_lock);
3768 
3769 		if (peer)
3770 			/* FIXME: should this use ath10k_warn()? */
3771 			ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
3772 				   peer_addr, vdev_id);
3773 
3774 		if (!peer) {
3775 			ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
3776 						 peer_addr,
3777 						 WMI_PEER_TYPE_DEFAULT);
3778 			if (ret)
3779 				ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
3780 					    peer_addr, vdev_id, ret);
3781 			tmp_peer_created = (ret == 0);
3782 		}
3783 
3784 		spin_lock_bh(&ar->data_lock);
3785 		reinit_completion(&ar->offchan_tx_completed);
3786 		ar->offchan_tx_skb = skb;
3787 		spin_unlock_bh(&ar->data_lock);
3788 
3789 		/* It's safe to access vif and sta - conf_mutex guarantees that
3790 		 * sta_state() and remove_interface() are locked exclusively
3791 		 * out wrt to this offchannel worker.
3792 		 */
3793 		arvif = ath10k_get_arvif(ar, vdev_id);
3794 		if (arvif) {
3795 			vif = arvif->vif;
3796 			sta = ieee80211_find_sta(vif, peer_addr);
3797 		} else {
3798 			vif = NULL;
3799 			sta = NULL;
3800 		}
3801 
3802 		txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3803 		txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
3804 
3805 		ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb);
3806 		if (ret) {
3807 			ath10k_warn(ar, "failed to transmit offchannel frame: %d\n",
3808 				    ret);
3809 			/* not serious */
3810 		}
3811 
3812 		time_left =
3813 		wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3814 		if (time_left == 0)
3815 			ath10k_warn(ar, "timed out waiting for offchannel skb %pK\n",
3816 				    skb);
3817 
3818 		if (!peer && tmp_peer_created) {
3819 			ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3820 			if (ret)
3821 				ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
3822 					    peer_addr, vdev_id, ret);
3823 		}
3824 
3825 		mutex_unlock(&ar->conf_mutex);
3826 	}
3827 }
3828 
3829 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3830 {
3831 	struct sk_buff *skb;
3832 
3833 	for (;;) {
3834 		skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3835 		if (!skb)
3836 			break;
3837 
3838 		ieee80211_free_txskb(ar->hw, skb);
3839 	}
3840 }
3841 
3842 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3843 {
3844 	struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3845 	struct sk_buff *skb;
3846 	dma_addr_t paddr;
3847 	int ret;
3848 
3849 	for (;;) {
3850 		skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3851 		if (!skb)
3852 			break;
3853 
3854 		if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
3855 			     ar->running_fw->fw_file.fw_features)) {
3856 			paddr = dma_map_single(ar->dev, skb->data,
3857 					       skb->len, DMA_TO_DEVICE);
3858 			if (!paddr)
3859 				continue;
3860 			ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr);
3861 			if (ret) {
3862 				ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n",
3863 					    ret);
3864 				dma_unmap_single(ar->dev, paddr, skb->len,
3865 						 DMA_FROM_DEVICE);
3866 				ieee80211_free_txskb(ar->hw, skb);
3867 			}
3868 		} else {
3869 			ret = ath10k_wmi_mgmt_tx(ar, skb);
3870 			if (ret) {
3871 				ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
3872 					    ret);
3873 				ieee80211_free_txskb(ar->hw, skb);
3874 			}
3875 		}
3876 	}
3877 }
3878 
3879 static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
3880 {
3881 	struct ath10k_txq *artxq;
3882 
3883 	if (!txq)
3884 		return;
3885 
3886 	artxq = (void *)txq->drv_priv;
3887 	INIT_LIST_HEAD(&artxq->list);
3888 }
3889 
3890 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
3891 {
3892 	struct ath10k_txq *artxq;
3893 	struct ath10k_skb_cb *cb;
3894 	struct sk_buff *msdu;
3895 	int msdu_id;
3896 
3897 	if (!txq)
3898 		return;
3899 
3900 	artxq = (void *)txq->drv_priv;
3901 	spin_lock_bh(&ar->txqs_lock);
3902 	if (!list_empty(&artxq->list))
3903 		list_del_init(&artxq->list);
3904 	spin_unlock_bh(&ar->txqs_lock);
3905 
3906 	spin_lock_bh(&ar->htt.tx_lock);
3907 	idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
3908 		cb = ATH10K_SKB_CB(msdu);
3909 		if (cb->txq == txq)
3910 			cb->txq = NULL;
3911 	}
3912 	spin_unlock_bh(&ar->htt.tx_lock);
3913 }
3914 
3915 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
3916 					    u16 peer_id,
3917 					    u8 tid)
3918 {
3919 	struct ath10k_peer *peer;
3920 
3921 	lockdep_assert_held(&ar->data_lock);
3922 
3923 	peer = ar->peer_map[peer_id];
3924 	if (!peer)
3925 		return NULL;
3926 
3927 	if (peer->removed)
3928 		return NULL;
3929 
3930 	if (peer->sta)
3931 		return peer->sta->txq[tid];
3932 	else if (peer->vif)
3933 		return peer->vif->txq;
3934 	else
3935 		return NULL;
3936 }
3937 
3938 static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
3939 				   struct ieee80211_txq *txq)
3940 {
3941 	struct ath10k *ar = hw->priv;
3942 	struct ath10k_txq *artxq = (void *)txq->drv_priv;
3943 
3944 	/* No need to get locks */
3945 
3946 	if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
3947 		return true;
3948 
3949 	if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed)
3950 		return true;
3951 
3952 	if (artxq->num_fw_queued < artxq->num_push_allowed)
3953 		return true;
3954 
3955 	return false;
3956 }
3957 
3958 int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
3959 			   struct ieee80211_txq *txq)
3960 {
3961 	struct ath10k *ar = hw->priv;
3962 	struct ath10k_htt *htt = &ar->htt;
3963 	struct ath10k_txq *artxq = (void *)txq->drv_priv;
3964 	struct ieee80211_vif *vif = txq->vif;
3965 	struct ieee80211_sta *sta = txq->sta;
3966 	enum ath10k_hw_txrx_mode txmode;
3967 	enum ath10k_mac_tx_path txpath;
3968 	struct sk_buff *skb;
3969 	struct ieee80211_hdr *hdr;
3970 	size_t skb_len;
3971 	bool is_mgmt, is_presp;
3972 	int ret;
3973 
3974 	spin_lock_bh(&ar->htt.tx_lock);
3975 	ret = ath10k_htt_tx_inc_pending(htt);
3976 	spin_unlock_bh(&ar->htt.tx_lock);
3977 
3978 	if (ret)
3979 		return ret;
3980 
3981 	skb = ieee80211_tx_dequeue(hw, txq);
3982 	if (!skb) {
3983 		spin_lock_bh(&ar->htt.tx_lock);
3984 		ath10k_htt_tx_dec_pending(htt);
3985 		spin_unlock_bh(&ar->htt.tx_lock);
3986 
3987 		return -ENOENT;
3988 	}
3989 
3990 	ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
3991 
3992 	skb_len = skb->len;
3993 	txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3994 	txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
3995 	is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
3996 
3997 	if (is_mgmt) {
3998 		hdr = (struct ieee80211_hdr *)skb->data;
3999 		is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4000 
4001 		spin_lock_bh(&ar->htt.tx_lock);
4002 		ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4003 
4004 		if (ret) {
4005 			ath10k_htt_tx_dec_pending(htt);
4006 			spin_unlock_bh(&ar->htt.tx_lock);
4007 			return ret;
4008 		}
4009 		spin_unlock_bh(&ar->htt.tx_lock);
4010 	}
4011 
4012 	ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb);
4013 	if (unlikely(ret)) {
4014 		ath10k_warn(ar, "failed to push frame: %d\n", ret);
4015 
4016 		spin_lock_bh(&ar->htt.tx_lock);
4017 		ath10k_htt_tx_dec_pending(htt);
4018 		if (is_mgmt)
4019 			ath10k_htt_tx_mgmt_dec_pending(htt);
4020 		spin_unlock_bh(&ar->htt.tx_lock);
4021 
4022 		return ret;
4023 	}
4024 
4025 	spin_lock_bh(&ar->htt.tx_lock);
4026 	artxq->num_fw_queued++;
4027 	spin_unlock_bh(&ar->htt.tx_lock);
4028 
4029 	return skb_len;
4030 }
4031 
4032 void ath10k_mac_tx_push_pending(struct ath10k *ar)
4033 {
4034 	struct ieee80211_hw *hw = ar->hw;
4035 	struct ieee80211_txq *txq;
4036 	struct ath10k_txq *artxq;
4037 	struct ath10k_txq *last;
4038 	int ret;
4039 	int max;
4040 
4041 	if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
4042 		return;
4043 
4044 	spin_lock_bh(&ar->txqs_lock);
4045 	rcu_read_lock();
4046 
4047 	last = list_last_entry(&ar->txqs, struct ath10k_txq, list);
4048 	while (!list_empty(&ar->txqs)) {
4049 		artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
4050 		txq = container_of((void *)artxq, struct ieee80211_txq,
4051 				   drv_priv);
4052 
4053 		/* Prevent aggressive sta/tid taking over tx queue */
4054 		max = HTC_HOST_MAX_MSG_PER_TX_BUNDLE;
4055 		ret = 0;
4056 		while (ath10k_mac_tx_can_push(hw, txq) && max--) {
4057 			ret = ath10k_mac_tx_push_txq(hw, txq);
4058 			if (ret < 0)
4059 				break;
4060 		}
4061 
4062 		list_del_init(&artxq->list);
4063 		if (ret != -ENOENT)
4064 			list_add_tail(&artxq->list, &ar->txqs);
4065 
4066 		ath10k_htt_tx_txq_update(hw, txq);
4067 
4068 		if (artxq == last || (ret < 0 && ret != -ENOENT))
4069 			break;
4070 	}
4071 
4072 	rcu_read_unlock();
4073 	spin_unlock_bh(&ar->txqs_lock);
4074 }
4075 EXPORT_SYMBOL(ath10k_mac_tx_push_pending);
4076 
4077 /************/
4078 /* Scanning */
4079 /************/
4080 
4081 void __ath10k_scan_finish(struct ath10k *ar)
4082 {
4083 	lockdep_assert_held(&ar->data_lock);
4084 
4085 	switch (ar->scan.state) {
4086 	case ATH10K_SCAN_IDLE:
4087 		break;
4088 	case ATH10K_SCAN_RUNNING:
4089 	case ATH10K_SCAN_ABORTING:
4090 		if (!ar->scan.is_roc) {
4091 			struct cfg80211_scan_info info = {
4092 				.aborted = (ar->scan.state ==
4093 					    ATH10K_SCAN_ABORTING),
4094 			};
4095 
4096 			ieee80211_scan_completed(ar->hw, &info);
4097 		} else if (ar->scan.roc_notify) {
4098 			ieee80211_remain_on_channel_expired(ar->hw);
4099 		}
4100 		/* fall through */
4101 	case ATH10K_SCAN_STARTING:
4102 		ar->scan.state = ATH10K_SCAN_IDLE;
4103 		ar->scan_channel = NULL;
4104 		ar->scan.roc_freq = 0;
4105 		ath10k_offchan_tx_purge(ar);
4106 		cancel_delayed_work(&ar->scan.timeout);
4107 		complete(&ar->scan.completed);
4108 		break;
4109 	}
4110 }
4111 
4112 void ath10k_scan_finish(struct ath10k *ar)
4113 {
4114 	spin_lock_bh(&ar->data_lock);
4115 	__ath10k_scan_finish(ar);
4116 	spin_unlock_bh(&ar->data_lock);
4117 }
4118 
4119 static int ath10k_scan_stop(struct ath10k *ar)
4120 {
4121 	struct wmi_stop_scan_arg arg = {
4122 		.req_id = 1, /* FIXME */
4123 		.req_type = WMI_SCAN_STOP_ONE,
4124 		.u.scan_id = ATH10K_SCAN_ID,
4125 	};
4126 	int ret;
4127 
4128 	lockdep_assert_held(&ar->conf_mutex);
4129 
4130 	ret = ath10k_wmi_stop_scan(ar, &arg);
4131 	if (ret) {
4132 		ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
4133 		goto out;
4134 	}
4135 
4136 	ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4137 	if (ret == 0) {
4138 		ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
4139 		ret = -ETIMEDOUT;
4140 	} else if (ret > 0) {
4141 		ret = 0;
4142 	}
4143 
4144 out:
4145 	/* Scan state should be updated upon scan completion but in case
4146 	 * firmware fails to deliver the event (for whatever reason) it is
4147 	 * desired to clean up scan state anyway. Firmware may have just
4148 	 * dropped the scan completion event delivery due to transport pipe
4149 	 * being overflown with data and/or it can recover on its own before
4150 	 * next scan request is submitted.
4151 	 */
4152 	spin_lock_bh(&ar->data_lock);
4153 	if (ar->scan.state != ATH10K_SCAN_IDLE)
4154 		__ath10k_scan_finish(ar);
4155 	spin_unlock_bh(&ar->data_lock);
4156 
4157 	return ret;
4158 }
4159 
4160 static void ath10k_scan_abort(struct ath10k *ar)
4161 {
4162 	int ret;
4163 
4164 	lockdep_assert_held(&ar->conf_mutex);
4165 
4166 	spin_lock_bh(&ar->data_lock);
4167 
4168 	switch (ar->scan.state) {
4169 	case ATH10K_SCAN_IDLE:
4170 		/* This can happen if timeout worker kicked in and called
4171 		 * abortion while scan completion was being processed.
4172 		 */
4173 		break;
4174 	case ATH10K_SCAN_STARTING:
4175 	case ATH10K_SCAN_ABORTING:
4176 		ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
4177 			    ath10k_scan_state_str(ar->scan.state),
4178 			    ar->scan.state);
4179 		break;
4180 	case ATH10K_SCAN_RUNNING:
4181 		ar->scan.state = ATH10K_SCAN_ABORTING;
4182 		spin_unlock_bh(&ar->data_lock);
4183 
4184 		ret = ath10k_scan_stop(ar);
4185 		if (ret)
4186 			ath10k_warn(ar, "failed to abort scan: %d\n", ret);
4187 
4188 		spin_lock_bh(&ar->data_lock);
4189 		break;
4190 	}
4191 
4192 	spin_unlock_bh(&ar->data_lock);
4193 }
4194 
4195 void ath10k_scan_timeout_work(struct work_struct *work)
4196 {
4197 	struct ath10k *ar = container_of(work, struct ath10k,
4198 					 scan.timeout.work);
4199 
4200 	mutex_lock(&ar->conf_mutex);
4201 	ath10k_scan_abort(ar);
4202 	mutex_unlock(&ar->conf_mutex);
4203 }
4204 
4205 static int ath10k_start_scan(struct ath10k *ar,
4206 			     const struct wmi_start_scan_arg *arg)
4207 {
4208 	int ret;
4209 
4210 	lockdep_assert_held(&ar->conf_mutex);
4211 
4212 	ret = ath10k_wmi_start_scan(ar, arg);
4213 	if (ret)
4214 		return ret;
4215 
4216 	ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4217 	if (ret == 0) {
4218 		ret = ath10k_scan_stop(ar);
4219 		if (ret)
4220 			ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4221 
4222 		return -ETIMEDOUT;
4223 	}
4224 
4225 	/* If we failed to start the scan, return error code at
4226 	 * this point.  This is probably due to some issue in the
4227 	 * firmware, but no need to wedge the driver due to that...
4228 	 */
4229 	spin_lock_bh(&ar->data_lock);
4230 	if (ar->scan.state == ATH10K_SCAN_IDLE) {
4231 		spin_unlock_bh(&ar->data_lock);
4232 		return -EINVAL;
4233 	}
4234 	spin_unlock_bh(&ar->data_lock);
4235 
4236 	return 0;
4237 }
4238 
4239 /**********************/
4240 /* mac80211 callbacks */
4241 /**********************/
4242 
4243 static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
4244 			     struct ieee80211_tx_control *control,
4245 			     struct sk_buff *skb)
4246 {
4247 	struct ath10k *ar = hw->priv;
4248 	struct ath10k_htt *htt = &ar->htt;
4249 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4250 	struct ieee80211_vif *vif = info->control.vif;
4251 	struct ieee80211_sta *sta = control->sta;
4252 	struct ieee80211_txq *txq = NULL;
4253 	struct ieee80211_hdr *hdr = (void *)skb->data;
4254 	enum ath10k_hw_txrx_mode txmode;
4255 	enum ath10k_mac_tx_path txpath;
4256 	bool is_htt;
4257 	bool is_mgmt;
4258 	bool is_presp;
4259 	int ret;
4260 
4261 	ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
4262 
4263 	txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4264 	txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4265 	is_htt = (txpath == ATH10K_MAC_TX_HTT ||
4266 		  txpath == ATH10K_MAC_TX_HTT_MGMT);
4267 	is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4268 
4269 	if (is_htt) {
4270 		spin_lock_bh(&ar->htt.tx_lock);
4271 		is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4272 
4273 		ret = ath10k_htt_tx_inc_pending(htt);
4274 		if (ret) {
4275 			ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n",
4276 				    ret);
4277 			spin_unlock_bh(&ar->htt.tx_lock);
4278 			ieee80211_free_txskb(ar->hw, skb);
4279 			return;
4280 		}
4281 
4282 		ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4283 		if (ret) {
4284 			ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n",
4285 				   ret);
4286 			ath10k_htt_tx_dec_pending(htt);
4287 			spin_unlock_bh(&ar->htt.tx_lock);
4288 			ieee80211_free_txskb(ar->hw, skb);
4289 			return;
4290 		}
4291 		spin_unlock_bh(&ar->htt.tx_lock);
4292 	}
4293 
4294 	ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb);
4295 	if (ret) {
4296 		ath10k_warn(ar, "failed to transmit frame: %d\n", ret);
4297 		if (is_htt) {
4298 			spin_lock_bh(&ar->htt.tx_lock);
4299 			ath10k_htt_tx_dec_pending(htt);
4300 			if (is_mgmt)
4301 				ath10k_htt_tx_mgmt_dec_pending(htt);
4302 			spin_unlock_bh(&ar->htt.tx_lock);
4303 		}
4304 		return;
4305 	}
4306 }
4307 
4308 static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
4309 					struct ieee80211_txq *txq)
4310 {
4311 	struct ath10k *ar = hw->priv;
4312 	struct ath10k_txq *artxq = (void *)txq->drv_priv;
4313 	struct ieee80211_txq *f_txq;
4314 	struct ath10k_txq *f_artxq;
4315 	int ret = 0;
4316 	int max = HTC_HOST_MAX_MSG_PER_TX_BUNDLE;
4317 
4318 	spin_lock_bh(&ar->txqs_lock);
4319 	if (list_empty(&artxq->list))
4320 		list_add_tail(&artxq->list, &ar->txqs);
4321 
4322 	f_artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
4323 	f_txq = container_of((void *)f_artxq, struct ieee80211_txq, drv_priv);
4324 	list_del_init(&f_artxq->list);
4325 
4326 	while (ath10k_mac_tx_can_push(hw, f_txq) && max--) {
4327 		ret = ath10k_mac_tx_push_txq(hw, f_txq);
4328 		if (ret < 0)
4329 			break;
4330 	}
4331 	if (ret != -ENOENT)
4332 		list_add_tail(&f_artxq->list, &ar->txqs);
4333 	spin_unlock_bh(&ar->txqs_lock);
4334 
4335 	ath10k_htt_tx_txq_update(hw, f_txq);
4336 	ath10k_htt_tx_txq_update(hw, txq);
4337 }
4338 
4339 /* Must not be called with conf_mutex held as workers can use that also. */
4340 void ath10k_drain_tx(struct ath10k *ar)
4341 {
4342 	/* make sure rcu-protected mac80211 tx path itself is drained */
4343 	synchronize_net();
4344 
4345 	ath10k_offchan_tx_purge(ar);
4346 	ath10k_mgmt_over_wmi_tx_purge(ar);
4347 
4348 	cancel_work_sync(&ar->offchan_tx_work);
4349 	cancel_work_sync(&ar->wmi_mgmt_tx_work);
4350 }
4351 
4352 void ath10k_halt(struct ath10k *ar)
4353 {
4354 	struct ath10k_vif *arvif;
4355 
4356 	lockdep_assert_held(&ar->conf_mutex);
4357 
4358 	clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
4359 	ar->filter_flags = 0;
4360 	ar->monitor = false;
4361 	ar->monitor_arvif = NULL;
4362 
4363 	if (ar->monitor_started)
4364 		ath10k_monitor_stop(ar);
4365 
4366 	ar->monitor_started = false;
4367 	ar->tx_paused = 0;
4368 
4369 	ath10k_scan_finish(ar);
4370 	ath10k_peer_cleanup_all(ar);
4371 	ath10k_stop_radar_confirmation(ar);
4372 	ath10k_core_stop(ar);
4373 	ath10k_hif_power_down(ar);
4374 
4375 	spin_lock_bh(&ar->data_lock);
4376 	list_for_each_entry(arvif, &ar->arvifs, list)
4377 		ath10k_mac_vif_beacon_cleanup(arvif);
4378 	spin_unlock_bh(&ar->data_lock);
4379 }
4380 
4381 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
4382 {
4383 	struct ath10k *ar = hw->priv;
4384 
4385 	mutex_lock(&ar->conf_mutex);
4386 
4387 	*tx_ant = ar->cfg_tx_chainmask;
4388 	*rx_ant = ar->cfg_rx_chainmask;
4389 
4390 	mutex_unlock(&ar->conf_mutex);
4391 
4392 	return 0;
4393 }
4394 
4395 static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
4396 {
4397 	/* It is not clear that allowing gaps in chainmask
4398 	 * is helpful.  Probably it will not do what user
4399 	 * is hoping for, so warn in that case.
4400 	 */
4401 	if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
4402 		return;
4403 
4404 	ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x.  Suggested values: 15, 7, 3, 1 or 0.\n",
4405 		    dbg, cm);
4406 }
4407 
4408 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4409 {
4410 	int nsts = ar->vht_cap_info;
4411 
4412 	nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4413 	nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4414 
4415 	/* If firmware does not deliver to host number of space-time
4416 	 * streams supported, assume it support up to 4 BF STS and return
4417 	 * the value for VHT CAP: nsts-1)
4418 	 */
4419 	if (nsts == 0)
4420 		return 3;
4421 
4422 	return nsts;
4423 }
4424 
4425 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4426 {
4427 	int sound_dim = ar->vht_cap_info;
4428 
4429 	sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4430 	sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4431 
4432 	/* If the sounding dimension is not advertised by the firmware,
4433 	 * let's use a default value of 1
4434 	 */
4435 	if (sound_dim == 0)
4436 		return 1;
4437 
4438 	return sound_dim;
4439 }
4440 
4441 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4442 {
4443 	struct ieee80211_sta_vht_cap vht_cap = {0};
4444 	struct ath10k_hw_params *hw = &ar->hw_params;
4445 	u16 mcs_map;
4446 	u32 val;
4447 	int i;
4448 
4449 	vht_cap.vht_supported = 1;
4450 	vht_cap.cap = ar->vht_cap_info;
4451 
4452 	if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4453 				IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
4454 		val = ath10k_mac_get_vht_cap_bf_sts(ar);
4455 		val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4456 		val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4457 
4458 		vht_cap.cap |= val;
4459 	}
4460 
4461 	if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4462 				IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
4463 		val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4464 		val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4465 		val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4466 
4467 		vht_cap.cap |= val;
4468 	}
4469 
4470 	/* Currently the firmware seems to be buggy, don't enable 80+80
4471 	 * mode until that's resolved.
4472 	 */
4473 	if ((ar->vht_cap_info & IEEE80211_VHT_CAP_SHORT_GI_160) &&
4474 	    (ar->vht_cap_info & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) == 0)
4475 		vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
4476 
4477 	mcs_map = 0;
4478 	for (i = 0; i < 8; i++) {
4479 		if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
4480 			mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4481 		else
4482 			mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4483 	}
4484 
4485 	if (ar->cfg_tx_chainmask <= 1)
4486 		vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4487 
4488 	vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4489 	vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4490 
4491 	/* If we are supporting 160Mhz or 80+80, then the NIC may be able to do
4492 	 * a restricted NSS for 160 or 80+80 vs what it can do for 80Mhz.  Give
4493 	 * user-space a clue if that is the case.
4494 	 */
4495 	if ((vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) &&
4496 	    (hw->vht160_mcs_rx_highest != 0 ||
4497 	     hw->vht160_mcs_tx_highest != 0)) {
4498 		vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest);
4499 		vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest);
4500 	}
4501 
4502 	return vht_cap;
4503 }
4504 
4505 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4506 {
4507 	int i;
4508 	struct ieee80211_sta_ht_cap ht_cap = {0};
4509 
4510 	if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4511 		return ht_cap;
4512 
4513 	ht_cap.ht_supported = 1;
4514 	ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4515 	ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4516 	ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4517 	ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4518 	ht_cap.cap |=
4519 		WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
4520 
4521 	if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4522 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4523 
4524 	if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4525 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4526 
4527 	if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4528 		u32 smps;
4529 
4530 		smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4531 		smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4532 
4533 		ht_cap.cap |= smps;
4534 	}
4535 
4536 	if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1))
4537 		ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4538 
4539 	if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4540 		u32 stbc;
4541 
4542 		stbc   = ar->ht_cap_info;
4543 		stbc  &= WMI_HT_CAP_RX_STBC;
4544 		stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4545 		stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4546 		stbc  &= IEEE80211_HT_CAP_RX_STBC;
4547 
4548 		ht_cap.cap |= stbc;
4549 	}
4550 
4551 	if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4552 		ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4553 
4554 	if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4555 		ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4556 
4557 	/* max AMSDU is implicitly taken from vht_cap_info */
4558 	if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4559 		ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4560 
4561 	for (i = 0; i < ar->num_rf_chains; i++) {
4562 		if (ar->cfg_rx_chainmask & BIT(i))
4563 			ht_cap.mcs.rx_mask[i] = 0xFF;
4564 	}
4565 
4566 	ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4567 
4568 	return ht_cap;
4569 }
4570 
4571 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
4572 {
4573 	struct ieee80211_supported_band *band;
4574 	struct ieee80211_sta_vht_cap vht_cap;
4575 	struct ieee80211_sta_ht_cap ht_cap;
4576 
4577 	ht_cap = ath10k_get_ht_cap(ar);
4578 	vht_cap = ath10k_create_vht_cap(ar);
4579 
4580 	if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4581 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4582 		band->ht_cap = ht_cap;
4583 	}
4584 	if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4585 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4586 		band->ht_cap = ht_cap;
4587 		band->vht_cap = vht_cap;
4588 	}
4589 }
4590 
4591 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
4592 {
4593 	int ret;
4594 
4595 	lockdep_assert_held(&ar->conf_mutex);
4596 
4597 	ath10k_check_chain_mask(ar, tx_ant, "tx");
4598 	ath10k_check_chain_mask(ar, rx_ant, "rx");
4599 
4600 	ar->cfg_tx_chainmask = tx_ant;
4601 	ar->cfg_rx_chainmask = rx_ant;
4602 
4603 	if ((ar->state != ATH10K_STATE_ON) &&
4604 	    (ar->state != ATH10K_STATE_RESTARTED))
4605 		return 0;
4606 
4607 	ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
4608 					tx_ant);
4609 	if (ret) {
4610 		ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
4611 			    ret, tx_ant);
4612 		return ret;
4613 	}
4614 
4615 	ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
4616 					rx_ant);
4617 	if (ret) {
4618 		ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
4619 			    ret, rx_ant);
4620 		return ret;
4621 	}
4622 
4623 	/* Reload HT/VHT capability */
4624 	ath10k_mac_setup_ht_vht_cap(ar);
4625 
4626 	return 0;
4627 }
4628 
4629 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
4630 {
4631 	struct ath10k *ar = hw->priv;
4632 	int ret;
4633 
4634 	mutex_lock(&ar->conf_mutex);
4635 	ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
4636 	mutex_unlock(&ar->conf_mutex);
4637 	return ret;
4638 }
4639 
4640 static int ath10k_start(struct ieee80211_hw *hw)
4641 {
4642 	struct ath10k *ar = hw->priv;
4643 	u32 param;
4644 	int ret = 0;
4645 
4646 	/*
4647 	 * This makes sense only when restarting hw. It is harmless to call
4648 	 * unconditionally. This is necessary to make sure no HTT/WMI tx
4649 	 * commands will be submitted while restarting.
4650 	 */
4651 	ath10k_drain_tx(ar);
4652 
4653 	mutex_lock(&ar->conf_mutex);
4654 
4655 	switch (ar->state) {
4656 	case ATH10K_STATE_OFF:
4657 		ar->state = ATH10K_STATE_ON;
4658 		break;
4659 	case ATH10K_STATE_RESTARTING:
4660 		ar->state = ATH10K_STATE_RESTARTED;
4661 		break;
4662 	case ATH10K_STATE_ON:
4663 	case ATH10K_STATE_RESTARTED:
4664 	case ATH10K_STATE_WEDGED:
4665 		WARN_ON(1);
4666 		ret = -EINVAL;
4667 		goto err;
4668 	case ATH10K_STATE_UTF:
4669 		ret = -EBUSY;
4670 		goto err;
4671 	}
4672 
4673 	ret = ath10k_hif_power_up(ar);
4674 	if (ret) {
4675 		ath10k_err(ar, "Could not init hif: %d\n", ret);
4676 		goto err_off;
4677 	}
4678 
4679 	ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
4680 				&ar->normal_mode_fw);
4681 	if (ret) {
4682 		ath10k_err(ar, "Could not init core: %d\n", ret);
4683 		goto err_power_down;
4684 	}
4685 
4686 	param = ar->wmi.pdev_param->pmf_qos;
4687 	ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4688 	if (ret) {
4689 		ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
4690 		goto err_core_stop;
4691 	}
4692 
4693 	param = ar->wmi.pdev_param->dynamic_bw;
4694 	ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4695 	if (ret) {
4696 		ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
4697 		goto err_core_stop;
4698 	}
4699 
4700 	if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
4701 		ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
4702 		if (ret) {
4703 			ath10k_err(ar, "failed to set prob req oui: %i\n", ret);
4704 			goto err_core_stop;
4705 		}
4706 	}
4707 
4708 	if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
4709 		ret = ath10k_wmi_adaptive_qcs(ar, true);
4710 		if (ret) {
4711 			ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
4712 				    ret);
4713 			goto err_core_stop;
4714 		}
4715 	}
4716 
4717 	if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
4718 		param = ar->wmi.pdev_param->burst_enable;
4719 		ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4720 		if (ret) {
4721 			ath10k_warn(ar, "failed to disable burst: %d\n", ret);
4722 			goto err_core_stop;
4723 		}
4724 	}
4725 
4726 	param = ar->wmi.pdev_param->idle_ps_config;
4727 	ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4728 	if (ret && ret != -EOPNOTSUPP) {
4729 		ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret);
4730 		goto err_core_stop;
4731 	}
4732 
4733 	__ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
4734 
4735 	/*
4736 	 * By default FW set ARP frames ac to voice (6). In that case ARP
4737 	 * exchange is not working properly for UAPSD enabled AP. ARP requests
4738 	 * which arrives with access category 0 are processed by network stack
4739 	 * and send back with access category 0, but FW changes access category
4740 	 * to 6. Set ARP frames access category to best effort (0) solves
4741 	 * this problem.
4742 	 */
4743 
4744 	param = ar->wmi.pdev_param->arp_ac_override;
4745 	ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4746 	if (ret) {
4747 		ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
4748 			    ret);
4749 		goto err_core_stop;
4750 	}
4751 
4752 	if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
4753 		     ar->running_fw->fw_file.fw_features)) {
4754 		ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
4755 							  WMI_CCA_DETECT_LEVEL_AUTO,
4756 							  WMI_CCA_DETECT_MARGIN_AUTO);
4757 		if (ret) {
4758 			ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
4759 				    ret);
4760 			goto err_core_stop;
4761 		}
4762 	}
4763 
4764 	param = ar->wmi.pdev_param->ani_enable;
4765 	ret = ath10k_wmi_pdev_set_param(ar, param, 1);
4766 	if (ret) {
4767 		ath10k_warn(ar, "failed to enable ani by default: %d\n",
4768 			    ret);
4769 		goto err_core_stop;
4770 	}
4771 
4772 	ar->ani_enabled = true;
4773 
4774 	if (ath10k_peer_stats_enabled(ar)) {
4775 		param = ar->wmi.pdev_param->peer_stats_update_period;
4776 		ret = ath10k_wmi_pdev_set_param(ar, param,
4777 						PEER_DEFAULT_STATS_UPDATE_PERIOD);
4778 		if (ret) {
4779 			ath10k_warn(ar,
4780 				    "failed to set peer stats period : %d\n",
4781 				    ret);
4782 			goto err_core_stop;
4783 		}
4784 	}
4785 
4786 	param = ar->wmi.pdev_param->enable_btcoex;
4787 	if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
4788 	    test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
4789 		     ar->running_fw->fw_file.fw_features)) {
4790 		ret = ath10k_wmi_pdev_set_param(ar, param, 0);
4791 		if (ret) {
4792 			ath10k_warn(ar,
4793 				    "failed to set btcoex param: %d\n", ret);
4794 			goto err_core_stop;
4795 		}
4796 		clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
4797 	}
4798 
4799 	ar->num_started_vdevs = 0;
4800 	ath10k_regd_update(ar);
4801 
4802 	ath10k_spectral_start(ar);
4803 	ath10k_thermal_set_throttling(ar);
4804 
4805 	ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
4806 
4807 	mutex_unlock(&ar->conf_mutex);
4808 	return 0;
4809 
4810 err_core_stop:
4811 	ath10k_core_stop(ar);
4812 
4813 err_power_down:
4814 	ath10k_hif_power_down(ar);
4815 
4816 err_off:
4817 	ar->state = ATH10K_STATE_OFF;
4818 
4819 err:
4820 	mutex_unlock(&ar->conf_mutex);
4821 	return ret;
4822 }
4823 
4824 static void ath10k_stop(struct ieee80211_hw *hw)
4825 {
4826 	struct ath10k *ar = hw->priv;
4827 
4828 	ath10k_drain_tx(ar);
4829 
4830 	mutex_lock(&ar->conf_mutex);
4831 	if (ar->state != ATH10K_STATE_OFF) {
4832 		ath10k_halt(ar);
4833 		ar->state = ATH10K_STATE_OFF;
4834 	}
4835 	mutex_unlock(&ar->conf_mutex);
4836 
4837 	cancel_work_sync(&ar->set_coverage_class_work);
4838 	cancel_delayed_work_sync(&ar->scan.timeout);
4839 	cancel_work_sync(&ar->restart_work);
4840 }
4841 
4842 static int ath10k_config_ps(struct ath10k *ar)
4843 {
4844 	struct ath10k_vif *arvif;
4845 	int ret = 0;
4846 
4847 	lockdep_assert_held(&ar->conf_mutex);
4848 
4849 	list_for_each_entry(arvif, &ar->arvifs, list) {
4850 		ret = ath10k_mac_vif_setup_ps(arvif);
4851 		if (ret) {
4852 			ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
4853 			break;
4854 		}
4855 	}
4856 
4857 	return ret;
4858 }
4859 
4860 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
4861 {
4862 	int ret;
4863 	u32 param;
4864 
4865 	lockdep_assert_held(&ar->conf_mutex);
4866 
4867 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
4868 
4869 	param = ar->wmi.pdev_param->txpower_limit2g;
4870 	ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4871 	if (ret) {
4872 		ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
4873 			    txpower, ret);
4874 		return ret;
4875 	}
4876 
4877 	param = ar->wmi.pdev_param->txpower_limit5g;
4878 	ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4879 	if (ret) {
4880 		ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
4881 			    txpower, ret);
4882 		return ret;
4883 	}
4884 
4885 	return 0;
4886 }
4887 
4888 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4889 {
4890 	struct ath10k_vif *arvif;
4891 	int ret, txpower = -1;
4892 
4893 	lockdep_assert_held(&ar->conf_mutex);
4894 
4895 	list_for_each_entry(arvif, &ar->arvifs, list) {
4896 		if (arvif->txpower <= 0)
4897 			continue;
4898 
4899 		if (txpower == -1)
4900 			txpower = arvif->txpower;
4901 		else
4902 			txpower = min(txpower, arvif->txpower);
4903 	}
4904 
4905 	if (txpower == -1)
4906 		return 0;
4907 
4908 	ret = ath10k_mac_txpower_setup(ar, txpower);
4909 	if (ret) {
4910 		ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4911 			    txpower, ret);
4912 		return ret;
4913 	}
4914 
4915 	return 0;
4916 }
4917 
4918 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4919 {
4920 	struct ath10k *ar = hw->priv;
4921 	struct ieee80211_conf *conf = &hw->conf;
4922 	int ret = 0;
4923 
4924 	mutex_lock(&ar->conf_mutex);
4925 
4926 	if (changed & IEEE80211_CONF_CHANGE_PS)
4927 		ath10k_config_ps(ar);
4928 
4929 	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
4930 		ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4931 		ret = ath10k_monitor_recalc(ar);
4932 		if (ret)
4933 			ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4934 	}
4935 
4936 	mutex_unlock(&ar->conf_mutex);
4937 	return ret;
4938 }
4939 
4940 static u32 get_nss_from_chainmask(u16 chain_mask)
4941 {
4942 	if ((chain_mask & 0xf) == 0xf)
4943 		return 4;
4944 	else if ((chain_mask & 0x7) == 0x7)
4945 		return 3;
4946 	else if ((chain_mask & 0x3) == 0x3)
4947 		return 2;
4948 	return 1;
4949 }
4950 
4951 static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4952 {
4953 	u32 value = 0;
4954 	struct ath10k *ar = arvif->ar;
4955 	int nsts;
4956 	int sound_dim;
4957 
4958 	if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4959 		return 0;
4960 
4961 	nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
4962 	if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4963 				IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
4964 		value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4965 
4966 	sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4967 	if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4968 				IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
4969 		value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4970 
4971 	if (!value)
4972 		return 0;
4973 
4974 	if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4975 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4976 
4977 	if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4978 		value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4979 			  WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4980 
4981 	if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4982 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4983 
4984 	if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4985 		value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4986 			  WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4987 
4988 	return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4989 					 ar->wmi.vdev_param->txbf, value);
4990 }
4991 
4992 /*
4993  * TODO:
4994  * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4995  * because we will send mgmt frames without CCK. This requirement
4996  * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4997  * in the TX packet.
4998  */
4999 static int ath10k_add_interface(struct ieee80211_hw *hw,
5000 				struct ieee80211_vif *vif)
5001 {
5002 	struct ath10k *ar = hw->priv;
5003 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5004 	struct ath10k_peer *peer;
5005 	enum wmi_sta_powersave_param param;
5006 	int ret = 0;
5007 	u32 value;
5008 	int bit;
5009 	int i;
5010 	u32 vdev_param;
5011 
5012 	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5013 
5014 	mutex_lock(&ar->conf_mutex);
5015 
5016 	memset(arvif, 0, sizeof(*arvif));
5017 	ath10k_mac_txq_init(vif->txq);
5018 
5019 	arvif->ar = ar;
5020 	arvif->vif = vif;
5021 
5022 	INIT_LIST_HEAD(&arvif->list);
5023 	INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
5024 	INIT_DELAYED_WORK(&arvif->connection_loss_work,
5025 			  ath10k_mac_vif_sta_connection_loss_work);
5026 
5027 	for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5028 		arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5029 		memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5030 		       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5031 		memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5032 		       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5033 	}
5034 
5035 	if (ar->num_peers >= ar->max_num_peers) {
5036 		ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
5037 		ret = -ENOBUFS;
5038 		goto err;
5039 	}
5040 
5041 	if (ar->free_vdev_map == 0) {
5042 		ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
5043 		ret = -EBUSY;
5044 		goto err;
5045 	}
5046 	bit = __ffs64(ar->free_vdev_map);
5047 
5048 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
5049 		   bit, ar->free_vdev_map);
5050 
5051 	arvif->vdev_id = bit;
5052 	arvif->vdev_subtype =
5053 		ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
5054 
5055 	switch (vif->type) {
5056 	case NL80211_IFTYPE_P2P_DEVICE:
5057 		arvif->vdev_type = WMI_VDEV_TYPE_STA;
5058 		arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5059 					(ar, WMI_VDEV_SUBTYPE_P2P_DEVICE);
5060 		break;
5061 	case NL80211_IFTYPE_UNSPECIFIED:
5062 	case NL80211_IFTYPE_STATION:
5063 		arvif->vdev_type = WMI_VDEV_TYPE_STA;
5064 		if (vif->p2p)
5065 			arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5066 					(ar, WMI_VDEV_SUBTYPE_P2P_CLIENT);
5067 		break;
5068 	case NL80211_IFTYPE_ADHOC:
5069 		arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
5070 		break;
5071 	case NL80211_IFTYPE_MESH_POINT:
5072 		if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
5073 			arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5074 						(ar, WMI_VDEV_SUBTYPE_MESH_11S);
5075 		} else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5076 			ret = -EINVAL;
5077 			ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
5078 			goto err;
5079 		}
5080 		arvif->vdev_type = WMI_VDEV_TYPE_AP;
5081 		break;
5082 	case NL80211_IFTYPE_AP:
5083 		arvif->vdev_type = WMI_VDEV_TYPE_AP;
5084 
5085 		if (vif->p2p)
5086 			arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5087 						(ar, WMI_VDEV_SUBTYPE_P2P_GO);
5088 		break;
5089 	case NL80211_IFTYPE_MONITOR:
5090 		arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5091 		break;
5092 	default:
5093 		WARN_ON(1);
5094 		break;
5095 	}
5096 
5097 	/* Using vdev_id as queue number will make it very easy to do per-vif
5098 	 * tx queue locking. This shouldn't wrap due to interface combinations
5099 	 * but do a modulo for correctness sake and prevent using offchannel tx
5100 	 * queues for regular vif tx.
5101 	 */
5102 	vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5103 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5104 		vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5105 
5106 	/* Some firmware revisions don't wait for beacon tx completion before
5107 	 * sending another SWBA event. This could lead to hardware using old
5108 	 * (freed) beacon data in some cases, e.g. tx credit starvation
5109 	 * combined with missed TBTT. This is very very rare.
5110 	 *
5111 	 * On non-IOMMU-enabled hosts this could be a possible security issue
5112 	 * because hw could beacon some random data on the air.  On
5113 	 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
5114 	 * device would crash.
5115 	 *
5116 	 * Since there are no beacon tx completions (implicit nor explicit)
5117 	 * propagated to host the only workaround for this is to allocate a
5118 	 * DMA-coherent buffer for a lifetime of a vif and use it for all
5119 	 * beacon tx commands. Worst case for this approach is some beacons may
5120 	 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
5121 	 */
5122 	if (vif->type == NL80211_IFTYPE_ADHOC ||
5123 	    vif->type == NL80211_IFTYPE_MESH_POINT ||
5124 	    vif->type == NL80211_IFTYPE_AP) {
5125 		arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
5126 							IEEE80211_MAX_FRAME_LEN,
5127 							&arvif->beacon_paddr,
5128 							GFP_ATOMIC);
5129 		if (!arvif->beacon_buf) {
5130 			ret = -ENOMEM;
5131 			ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
5132 				    ret);
5133 			goto err;
5134 		}
5135 	}
5136 	if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
5137 		arvif->nohwcrypt = true;
5138 
5139 	if (arvif->nohwcrypt &&
5140 	    !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5141 		ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
5142 		goto err;
5143 	}
5144 
5145 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
5146 		   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5147 		   arvif->beacon_buf ? "single-buf" : "per-skb");
5148 
5149 	ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
5150 				     arvif->vdev_subtype, vif->addr);
5151 	if (ret) {
5152 		ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
5153 			    arvif->vdev_id, ret);
5154 		goto err;
5155 	}
5156 
5157 	ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
5158 	spin_lock_bh(&ar->data_lock);
5159 	list_add(&arvif->list, &ar->arvifs);
5160 	spin_unlock_bh(&ar->data_lock);
5161 
5162 	/* It makes no sense to have firmware do keepalives. mac80211 already
5163 	 * takes care of this with idle connection polling.
5164 	 */
5165 	ret = ath10k_mac_vif_disable_keepalive(arvif);
5166 	if (ret) {
5167 		ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
5168 			    arvif->vdev_id, ret);
5169 		goto err_vdev_delete;
5170 	}
5171 
5172 	arvif->def_wep_key_idx = -1;
5173 
5174 	vdev_param = ar->wmi.vdev_param->tx_encap_type;
5175 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5176 					ATH10K_HW_TXRX_NATIVE_WIFI);
5177 	/* 10.X firmware does not support this VDEV parameter. Do not warn */
5178 	if (ret && ret != -EOPNOTSUPP) {
5179 		ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
5180 			    arvif->vdev_id, ret);
5181 		goto err_vdev_delete;
5182 	}
5183 
5184 	/* Configuring number of spatial stream for monitor interface is causing
5185 	 * target assert in qca9888 and qca6174.
5186 	 */
5187 	if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) {
5188 		u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
5189 
5190 		vdev_param = ar->wmi.vdev_param->nss;
5191 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5192 						nss);
5193 		if (ret) {
5194 			ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
5195 				    arvif->vdev_id, ar->cfg_tx_chainmask, nss,
5196 				    ret);
5197 			goto err_vdev_delete;
5198 		}
5199 	}
5200 
5201 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5202 	    arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5203 		ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
5204 					 vif->addr, WMI_PEER_TYPE_DEFAULT);
5205 		if (ret) {
5206 			ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
5207 				    arvif->vdev_id, ret);
5208 			goto err_vdev_delete;
5209 		}
5210 
5211 		spin_lock_bh(&ar->data_lock);
5212 
5213 		peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
5214 		if (!peer) {
5215 			ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
5216 				    vif->addr, arvif->vdev_id);
5217 			spin_unlock_bh(&ar->data_lock);
5218 			ret = -ENOENT;
5219 			goto err_peer_delete;
5220 		}
5221 
5222 		arvif->peer_id = find_first_bit(peer->peer_ids,
5223 						ATH10K_MAX_NUM_PEER_IDS);
5224 
5225 		spin_unlock_bh(&ar->data_lock);
5226 	} else {
5227 		arvif->peer_id = HTT_INVALID_PEERID;
5228 	}
5229 
5230 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5231 		ret = ath10k_mac_set_kickout(arvif);
5232 		if (ret) {
5233 			ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
5234 				    arvif->vdev_id, ret);
5235 			goto err_peer_delete;
5236 		}
5237 	}
5238 
5239 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
5240 		param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5241 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5242 		ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5243 						  param, value);
5244 		if (ret) {
5245 			ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
5246 				    arvif->vdev_id, ret);
5247 			goto err_peer_delete;
5248 		}
5249 
5250 		ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5251 		if (ret) {
5252 			ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5253 				    arvif->vdev_id, ret);
5254 			goto err_peer_delete;
5255 		}
5256 
5257 		ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5258 		if (ret) {
5259 			ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5260 				    arvif->vdev_id, ret);
5261 			goto err_peer_delete;
5262 		}
5263 	}
5264 
5265 	ret = ath10k_mac_set_txbf_conf(arvif);
5266 	if (ret) {
5267 		ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
5268 			    arvif->vdev_id, ret);
5269 		goto err_peer_delete;
5270 	}
5271 
5272 	ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
5273 	if (ret) {
5274 		ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5275 			    arvif->vdev_id, ret);
5276 		goto err_peer_delete;
5277 	}
5278 
5279 	arvif->txpower = vif->bss_conf.txpower;
5280 	ret = ath10k_mac_txpower_recalc(ar);
5281 	if (ret) {
5282 		ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5283 		goto err_peer_delete;
5284 	}
5285 
5286 	if (vif->type == NL80211_IFTYPE_MONITOR) {
5287 		ar->monitor_arvif = arvif;
5288 		ret = ath10k_monitor_recalc(ar);
5289 		if (ret) {
5290 			ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5291 			goto err_peer_delete;
5292 		}
5293 	}
5294 
5295 	spin_lock_bh(&ar->htt.tx_lock);
5296 	if (!ar->tx_paused)
5297 		ieee80211_wake_queue(ar->hw, arvif->vdev_id);
5298 	spin_unlock_bh(&ar->htt.tx_lock);
5299 
5300 	mutex_unlock(&ar->conf_mutex);
5301 	return 0;
5302 
5303 err_peer_delete:
5304 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5305 	    arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
5306 		ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
5307 
5308 err_vdev_delete:
5309 	ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5310 	ar->free_vdev_map |= 1LL << arvif->vdev_id;
5311 	spin_lock_bh(&ar->data_lock);
5312 	list_del(&arvif->list);
5313 	spin_unlock_bh(&ar->data_lock);
5314 
5315 err:
5316 	if (arvif->beacon_buf) {
5317 		dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
5318 				  arvif->beacon_buf, arvif->beacon_paddr);
5319 		arvif->beacon_buf = NULL;
5320 	}
5321 
5322 	mutex_unlock(&ar->conf_mutex);
5323 
5324 	return ret;
5325 }
5326 
5327 static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
5328 {
5329 	int i;
5330 
5331 	for (i = 0; i < BITS_PER_LONG; i++)
5332 		ath10k_mac_vif_tx_unlock(arvif, i);
5333 }
5334 
5335 static void ath10k_remove_interface(struct ieee80211_hw *hw,
5336 				    struct ieee80211_vif *vif)
5337 {
5338 	struct ath10k *ar = hw->priv;
5339 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5340 	struct ath10k_peer *peer;
5341 	int ret;
5342 	int i;
5343 
5344 	cancel_work_sync(&arvif->ap_csa_work);
5345 	cancel_delayed_work_sync(&arvif->connection_loss_work);
5346 
5347 	mutex_lock(&ar->conf_mutex);
5348 
5349 	spin_lock_bh(&ar->data_lock);
5350 	ath10k_mac_vif_beacon_cleanup(arvif);
5351 	spin_unlock_bh(&ar->data_lock);
5352 
5353 	ret = ath10k_spectral_vif_stop(arvif);
5354 	if (ret)
5355 		ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
5356 			    arvif->vdev_id, ret);
5357 
5358 	ar->free_vdev_map |= 1LL << arvif->vdev_id;
5359 	spin_lock_bh(&ar->data_lock);
5360 	list_del(&arvif->list);
5361 	spin_unlock_bh(&ar->data_lock);
5362 
5363 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5364 	    arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5365 		ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
5366 					     vif->addr);
5367 		if (ret)
5368 			ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5369 				    arvif->vdev_id, ret);
5370 
5371 		kfree(arvif->u.ap.noa_data);
5372 	}
5373 
5374 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
5375 		   arvif->vdev_id);
5376 
5377 	ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5378 	if (ret)
5379 		ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
5380 			    arvif->vdev_id, ret);
5381 
5382 	/* Some firmware revisions don't notify host about self-peer removal
5383 	 * until after associated vdev is deleted.
5384 	 */
5385 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5386 	    arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5387 		ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
5388 						   vif->addr);
5389 		if (ret)
5390 			ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
5391 				    arvif->vdev_id, ret);
5392 
5393 		spin_lock_bh(&ar->data_lock);
5394 		ar->num_peers--;
5395 		spin_unlock_bh(&ar->data_lock);
5396 	}
5397 
5398 	spin_lock_bh(&ar->data_lock);
5399 	for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
5400 		peer = ar->peer_map[i];
5401 		if (!peer)
5402 			continue;
5403 
5404 		if (peer->vif == vif) {
5405 			ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5406 				    vif->addr, arvif->vdev_id);
5407 			peer->vif = NULL;
5408 		}
5409 	}
5410 	spin_unlock_bh(&ar->data_lock);
5411 
5412 	ath10k_peer_cleanup(ar, arvif->vdev_id);
5413 	ath10k_mac_txq_unref(ar, vif->txq);
5414 
5415 	if (vif->type == NL80211_IFTYPE_MONITOR) {
5416 		ar->monitor_arvif = NULL;
5417 		ret = ath10k_monitor_recalc(ar);
5418 		if (ret)
5419 			ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5420 	}
5421 
5422 	ret = ath10k_mac_txpower_recalc(ar);
5423 	if (ret)
5424 		ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5425 
5426 	spin_lock_bh(&ar->htt.tx_lock);
5427 	ath10k_mac_vif_tx_unlock_all(arvif);
5428 	spin_unlock_bh(&ar->htt.tx_lock);
5429 
5430 	ath10k_mac_txq_unref(ar, vif->txq);
5431 
5432 	mutex_unlock(&ar->conf_mutex);
5433 }
5434 
5435 /*
5436  * FIXME: Has to be verified.
5437  */
5438 #define SUPPORTED_FILTERS			\
5439 	(FIF_ALLMULTI |				\
5440 	FIF_CONTROL |				\
5441 	FIF_PSPOLL |				\
5442 	FIF_OTHER_BSS |				\
5443 	FIF_BCN_PRBRESP_PROMISC |		\
5444 	FIF_PROBE_REQ |				\
5445 	FIF_FCSFAIL)
5446 
5447 static void ath10k_configure_filter(struct ieee80211_hw *hw,
5448 				    unsigned int changed_flags,
5449 				    unsigned int *total_flags,
5450 				    u64 multicast)
5451 {
5452 	struct ath10k *ar = hw->priv;
5453 	int ret;
5454 
5455 	mutex_lock(&ar->conf_mutex);
5456 
5457 	changed_flags &= SUPPORTED_FILTERS;
5458 	*total_flags &= SUPPORTED_FILTERS;
5459 	ar->filter_flags = *total_flags;
5460 
5461 	ret = ath10k_monitor_recalc(ar);
5462 	if (ret)
5463 		ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5464 
5465 	mutex_unlock(&ar->conf_mutex);
5466 }
5467 
5468 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
5469 				    struct ieee80211_vif *vif,
5470 				    struct ieee80211_bss_conf *info,
5471 				    u32 changed)
5472 {
5473 	struct ath10k *ar = hw->priv;
5474 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5475 	struct cfg80211_chan_def def;
5476 	u32 vdev_param, pdev_param, slottime, preamble;
5477 	u16 bitrate, hw_value;
5478 	u8 rate, basic_rate_idx;
5479 	int rateidx, ret = 0, hw_rate_code;
5480 	enum nl80211_band band;
5481 	const struct ieee80211_supported_band *sband;
5482 
5483 	mutex_lock(&ar->conf_mutex);
5484 
5485 	if (changed & BSS_CHANGED_IBSS)
5486 		ath10k_control_ibss(arvif, info, vif->addr);
5487 
5488 	if (changed & BSS_CHANGED_BEACON_INT) {
5489 		arvif->beacon_interval = info->beacon_int;
5490 		vdev_param = ar->wmi.vdev_param->beacon_interval;
5491 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5492 						arvif->beacon_interval);
5493 		ath10k_dbg(ar, ATH10K_DBG_MAC,
5494 			   "mac vdev %d beacon_interval %d\n",
5495 			   arvif->vdev_id, arvif->beacon_interval);
5496 
5497 		if (ret)
5498 			ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
5499 				    arvif->vdev_id, ret);
5500 	}
5501 
5502 	if (changed & BSS_CHANGED_BEACON) {
5503 		ath10k_dbg(ar, ATH10K_DBG_MAC,
5504 			   "vdev %d set beacon tx mode to staggered\n",
5505 			   arvif->vdev_id);
5506 
5507 		pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
5508 		ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
5509 						WMI_BEACON_STAGGERED_MODE);
5510 		if (ret)
5511 			ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
5512 				    arvif->vdev_id, ret);
5513 
5514 		ret = ath10k_mac_setup_bcn_tmpl(arvif);
5515 		if (ret)
5516 			ath10k_warn(ar, "failed to update beacon template: %d\n",
5517 				    ret);
5518 
5519 		if (ieee80211_vif_is_mesh(vif)) {
5520 			/* mesh doesn't use SSID but firmware needs it */
5521 			strncpy(arvif->u.ap.ssid, "mesh",
5522 				sizeof(arvif->u.ap.ssid));
5523 			arvif->u.ap.ssid_len = 4;
5524 		}
5525 	}
5526 
5527 	if (changed & BSS_CHANGED_AP_PROBE_RESP) {
5528 		ret = ath10k_mac_setup_prb_tmpl(arvif);
5529 		if (ret)
5530 			ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
5531 				    arvif->vdev_id, ret);
5532 	}
5533 
5534 	if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
5535 		arvif->dtim_period = info->dtim_period;
5536 
5537 		ath10k_dbg(ar, ATH10K_DBG_MAC,
5538 			   "mac vdev %d dtim_period %d\n",
5539 			   arvif->vdev_id, arvif->dtim_period);
5540 
5541 		vdev_param = ar->wmi.vdev_param->dtim_period;
5542 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5543 						arvif->dtim_period);
5544 		if (ret)
5545 			ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
5546 				    arvif->vdev_id, ret);
5547 	}
5548 
5549 	if (changed & BSS_CHANGED_SSID &&
5550 	    vif->type == NL80211_IFTYPE_AP) {
5551 		arvif->u.ap.ssid_len = info->ssid_len;
5552 		if (info->ssid_len)
5553 			memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
5554 		arvif->u.ap.hidden_ssid = info->hidden_ssid;
5555 	}
5556 
5557 	if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
5558 		ether_addr_copy(arvif->bssid, info->bssid);
5559 
5560 	if (changed & BSS_CHANGED_BEACON_ENABLED)
5561 		ath10k_control_beaconing(arvif, info);
5562 
5563 	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
5564 		arvif->use_cts_prot = info->use_cts_prot;
5565 
5566 		ret = ath10k_recalc_rtscts_prot(arvif);
5567 		if (ret)
5568 			ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
5569 				    arvif->vdev_id, ret);
5570 
5571 		if (ath10k_mac_can_set_cts_prot(arvif)) {
5572 			ret = ath10k_mac_set_cts_prot(arvif);
5573 			if (ret)
5574 				ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
5575 					    arvif->vdev_id, ret);
5576 		}
5577 	}
5578 
5579 	if (changed & BSS_CHANGED_ERP_SLOT) {
5580 		if (info->use_short_slot)
5581 			slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
5582 
5583 		else
5584 			slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
5585 
5586 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
5587 			   arvif->vdev_id, slottime);
5588 
5589 		vdev_param = ar->wmi.vdev_param->slot_time;
5590 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5591 						slottime);
5592 		if (ret)
5593 			ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
5594 				    arvif->vdev_id, ret);
5595 	}
5596 
5597 	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
5598 		if (info->use_short_preamble)
5599 			preamble = WMI_VDEV_PREAMBLE_SHORT;
5600 		else
5601 			preamble = WMI_VDEV_PREAMBLE_LONG;
5602 
5603 		ath10k_dbg(ar, ATH10K_DBG_MAC,
5604 			   "mac vdev %d preamble %dn",
5605 			   arvif->vdev_id, preamble);
5606 
5607 		vdev_param = ar->wmi.vdev_param->preamble;
5608 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5609 						preamble);
5610 		if (ret)
5611 			ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
5612 				    arvif->vdev_id, ret);
5613 	}
5614 
5615 	if (changed & BSS_CHANGED_ASSOC) {
5616 		if (info->assoc) {
5617 			/* Workaround: Make sure monitor vdev is not running
5618 			 * when associating to prevent some firmware revisions
5619 			 * (e.g. 10.1 and 10.2) from crashing.
5620 			 */
5621 			if (ar->monitor_started)
5622 				ath10k_monitor_stop(ar);
5623 			ath10k_bss_assoc(hw, vif, info);
5624 			ath10k_monitor_recalc(ar);
5625 		} else {
5626 			ath10k_bss_disassoc(hw, vif);
5627 		}
5628 	}
5629 
5630 	if (changed & BSS_CHANGED_TXPOWER) {
5631 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
5632 			   arvif->vdev_id, info->txpower);
5633 
5634 		arvif->txpower = info->txpower;
5635 		ret = ath10k_mac_txpower_recalc(ar);
5636 		if (ret)
5637 			ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5638 	}
5639 
5640 	if (changed & BSS_CHANGED_PS) {
5641 		arvif->ps = vif->bss_conf.ps;
5642 
5643 		ret = ath10k_config_ps(ar);
5644 		if (ret)
5645 			ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
5646 				    arvif->vdev_id, ret);
5647 	}
5648 
5649 	if (changed & BSS_CHANGED_MCAST_RATE &&
5650 	    !WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) {
5651 		band = def.chan->band;
5652 		rateidx = vif->bss_conf.mcast_rate[band] - 1;
5653 
5654 		if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
5655 			rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
5656 
5657 		bitrate = ath10k_wmi_legacy_rates[rateidx].bitrate;
5658 		hw_value = ath10k_wmi_legacy_rates[rateidx].hw_value;
5659 		if (ath10k_mac_bitrate_is_cck(bitrate))
5660 			preamble = WMI_RATE_PREAMBLE_CCK;
5661 		else
5662 			preamble = WMI_RATE_PREAMBLE_OFDM;
5663 
5664 		rate = ATH10K_HW_RATECODE(hw_value, 0, preamble);
5665 
5666 		ath10k_dbg(ar, ATH10K_DBG_MAC,
5667 			   "mac vdev %d mcast_rate %x\n",
5668 			   arvif->vdev_id, rate);
5669 
5670 		vdev_param = ar->wmi.vdev_param->mcast_data_rate;
5671 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
5672 						vdev_param, rate);
5673 		if (ret)
5674 			ath10k_warn(ar,
5675 				    "failed to set mcast rate on vdev %i: %d\n",
5676 				    arvif->vdev_id,  ret);
5677 
5678 		vdev_param = ar->wmi.vdev_param->bcast_data_rate;
5679 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
5680 						vdev_param, rate);
5681 		if (ret)
5682 			ath10k_warn(ar,
5683 				    "failed to set bcast rate on vdev %i: %d\n",
5684 				    arvif->vdev_id,  ret);
5685 	}
5686 
5687 	if (changed & BSS_CHANGED_BASIC_RATES) {
5688 		if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) {
5689 			mutex_unlock(&ar->conf_mutex);
5690 			return;
5691 		}
5692 
5693 		sband = ar->hw->wiphy->bands[def.chan->band];
5694 		basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
5695 		bitrate = sband->bitrates[basic_rate_idx].bitrate;
5696 
5697 		hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
5698 		if (hw_rate_code < 0) {
5699 			ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
5700 			mutex_unlock(&ar->conf_mutex);
5701 			return;
5702 		}
5703 
5704 		vdev_param = ar->wmi.vdev_param->mgmt_rate;
5705 		ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5706 						hw_rate_code);
5707 		if (ret)
5708 			ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
5709 	}
5710 
5711 	mutex_unlock(&ar->conf_mutex);
5712 }
5713 
5714 static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, s16 value)
5715 {
5716 	struct ath10k *ar = hw->priv;
5717 
5718 	/* This function should never be called if setting the coverage class
5719 	 * is not supported on this hardware.
5720 	 */
5721 	if (!ar->hw_params.hw_ops->set_coverage_class) {
5722 		WARN_ON_ONCE(1);
5723 		return;
5724 	}
5725 	ar->hw_params.hw_ops->set_coverage_class(ar, value);
5726 }
5727 
5728 struct ath10k_mac_tdls_iter_data {
5729 	u32 num_tdls_stations;
5730 	struct ieee80211_vif *curr_vif;
5731 };
5732 
5733 static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5734 						    struct ieee80211_sta *sta)
5735 {
5736 	struct ath10k_mac_tdls_iter_data *iter_data = data;
5737 	struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5738 	struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5739 
5740 	if (sta->tdls && sta_vif == iter_data->curr_vif)
5741 		iter_data->num_tdls_stations++;
5742 }
5743 
5744 static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5745 					      struct ieee80211_vif *vif)
5746 {
5747 	struct ath10k_mac_tdls_iter_data data = {};
5748 
5749 	data.curr_vif = vif;
5750 
5751 	ieee80211_iterate_stations_atomic(hw,
5752 					  ath10k_mac_tdls_vif_stations_count_iter,
5753 					  &data);
5754 	return data.num_tdls_stations;
5755 }
5756 
5757 static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5758 					    struct ieee80211_vif *vif)
5759 {
5760 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5761 	int *num_tdls_vifs = data;
5762 
5763 	if (vif->type != NL80211_IFTYPE_STATION)
5764 		return;
5765 
5766 	if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5767 		(*num_tdls_vifs)++;
5768 }
5769 
5770 static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5771 {
5772 	int num_tdls_vifs = 0;
5773 
5774 	ieee80211_iterate_active_interfaces_atomic(hw,
5775 						   IEEE80211_IFACE_ITER_NORMAL,
5776 						   ath10k_mac_tdls_vifs_count_iter,
5777 						   &num_tdls_vifs);
5778 	return num_tdls_vifs;
5779 }
5780 
5781 static int ath10k_hw_scan(struct ieee80211_hw *hw,
5782 			  struct ieee80211_vif *vif,
5783 			  struct ieee80211_scan_request *hw_req)
5784 {
5785 	struct ath10k *ar = hw->priv;
5786 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5787 	struct cfg80211_scan_request *req = &hw_req->req;
5788 	struct wmi_start_scan_arg arg;
5789 	int ret = 0;
5790 	int i;
5791 	u32 scan_timeout;
5792 
5793 	mutex_lock(&ar->conf_mutex);
5794 
5795 	if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
5796 		ret = -EBUSY;
5797 		goto exit;
5798 	}
5799 
5800 	spin_lock_bh(&ar->data_lock);
5801 	switch (ar->scan.state) {
5802 	case ATH10K_SCAN_IDLE:
5803 		reinit_completion(&ar->scan.started);
5804 		reinit_completion(&ar->scan.completed);
5805 		ar->scan.state = ATH10K_SCAN_STARTING;
5806 		ar->scan.is_roc = false;
5807 		ar->scan.vdev_id = arvif->vdev_id;
5808 		ret = 0;
5809 		break;
5810 	case ATH10K_SCAN_STARTING:
5811 	case ATH10K_SCAN_RUNNING:
5812 	case ATH10K_SCAN_ABORTING:
5813 		ret = -EBUSY;
5814 		break;
5815 	}
5816 	spin_unlock_bh(&ar->data_lock);
5817 
5818 	if (ret)
5819 		goto exit;
5820 
5821 	memset(&arg, 0, sizeof(arg));
5822 	ath10k_wmi_start_scan_init(ar, &arg);
5823 	arg.vdev_id = arvif->vdev_id;
5824 	arg.scan_id = ATH10K_SCAN_ID;
5825 
5826 	if (req->ie_len) {
5827 		arg.ie_len = req->ie_len;
5828 		memcpy(arg.ie, req->ie, arg.ie_len);
5829 	}
5830 
5831 	if (req->n_ssids) {
5832 		arg.n_ssids = req->n_ssids;
5833 		for (i = 0; i < arg.n_ssids; i++) {
5834 			arg.ssids[i].len  = req->ssids[i].ssid_len;
5835 			arg.ssids[i].ssid = req->ssids[i].ssid;
5836 		}
5837 	} else {
5838 		arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5839 	}
5840 
5841 	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
5842 		arg.scan_ctrl_flags |=  WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ;
5843 		ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
5844 		ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
5845 	}
5846 
5847 	if (req->n_channels) {
5848 		arg.n_channels = req->n_channels;
5849 		for (i = 0; i < arg.n_channels; i++)
5850 			arg.channels[i] = req->channels[i]->center_freq;
5851 	}
5852 
5853 	/* if duration is set, default dwell times will be overwritten */
5854 	if (req->duration) {
5855 		arg.dwell_time_active = req->duration;
5856 		arg.dwell_time_passive = req->duration;
5857 		arg.burst_duration_ms = req->duration;
5858 
5859 		scan_timeout = min_t(u32, arg.max_rest_time *
5860 				(arg.n_channels - 1) + (req->duration +
5861 				ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
5862 				arg.n_channels, arg.max_scan_time + 200);
5863 
5864 	} else {
5865 		/* Add a 200ms margin to account for event/command processing */
5866 		scan_timeout = arg.max_scan_time + 200;
5867 	}
5868 
5869 	ret = ath10k_start_scan(ar, &arg);
5870 	if (ret) {
5871 		ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
5872 		spin_lock_bh(&ar->data_lock);
5873 		ar->scan.state = ATH10K_SCAN_IDLE;
5874 		spin_unlock_bh(&ar->data_lock);
5875 	}
5876 
5877 	ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5878 				     msecs_to_jiffies(scan_timeout));
5879 
5880 exit:
5881 	mutex_unlock(&ar->conf_mutex);
5882 	return ret;
5883 }
5884 
5885 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
5886 				  struct ieee80211_vif *vif)
5887 {
5888 	struct ath10k *ar = hw->priv;
5889 
5890 	mutex_lock(&ar->conf_mutex);
5891 	ath10k_scan_abort(ar);
5892 	mutex_unlock(&ar->conf_mutex);
5893 
5894 	cancel_delayed_work_sync(&ar->scan.timeout);
5895 }
5896 
5897 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
5898 					struct ath10k_vif *arvif,
5899 					enum set_key_cmd cmd,
5900 					struct ieee80211_key_conf *key)
5901 {
5902 	u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
5903 	int ret;
5904 
5905 	/* 10.1 firmware branch requires default key index to be set to group
5906 	 * key index after installing it. Otherwise FW/HW Txes corrupted
5907 	 * frames with multi-vif APs. This is not required for main firmware
5908 	 * branch (e.g. 636).
5909 	 *
5910 	 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5911 	 *
5912 	 * FIXME: It remains unknown if this is required for multi-vif STA
5913 	 * interfaces on 10.1.
5914 	 */
5915 
5916 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5917 	    arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
5918 		return;
5919 
5920 	if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
5921 		return;
5922 
5923 	if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
5924 		return;
5925 
5926 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5927 		return;
5928 
5929 	if (cmd != SET_KEY)
5930 		return;
5931 
5932 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5933 					key->keyidx);
5934 	if (ret)
5935 		ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
5936 			    arvif->vdev_id, ret);
5937 }
5938 
5939 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5940 			  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5941 			  struct ieee80211_key_conf *key)
5942 {
5943 	struct ath10k *ar = hw->priv;
5944 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
5945 	struct ath10k_peer *peer;
5946 	const u8 *peer_addr;
5947 	bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
5948 		      key->cipher == WLAN_CIPHER_SUITE_WEP104;
5949 	int ret = 0;
5950 	int ret2;
5951 	u32 flags = 0;
5952 	u32 flags2;
5953 
5954 	/* this one needs to be done in software */
5955 	if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
5956 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
5957 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
5958 	    key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
5959 		return 1;
5960 
5961 	if (arvif->nohwcrypt)
5962 		return 1;
5963 
5964 	if (key->keyidx > WMI_MAX_KEY_INDEX)
5965 		return -ENOSPC;
5966 
5967 	mutex_lock(&ar->conf_mutex);
5968 
5969 	if (sta)
5970 		peer_addr = sta->addr;
5971 	else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
5972 		peer_addr = vif->bss_conf.bssid;
5973 	else
5974 		peer_addr = vif->addr;
5975 
5976 	key->hw_key_idx = key->keyidx;
5977 
5978 	if (is_wep) {
5979 		if (cmd == SET_KEY)
5980 			arvif->wep_keys[key->keyidx] = key;
5981 		else
5982 			arvif->wep_keys[key->keyidx] = NULL;
5983 	}
5984 
5985 	/* the peer should not disappear in mid-way (unless FW goes awry) since
5986 	 * we already hold conf_mutex. we just make sure its there now.
5987 	 */
5988 	spin_lock_bh(&ar->data_lock);
5989 	peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5990 	spin_unlock_bh(&ar->data_lock);
5991 
5992 	if (!peer) {
5993 		if (cmd == SET_KEY) {
5994 			ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
5995 				    peer_addr);
5996 			ret = -EOPNOTSUPP;
5997 			goto exit;
5998 		} else {
5999 			/* if the peer doesn't exist there is no key to disable anymore */
6000 			goto exit;
6001 		}
6002 	}
6003 
6004 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6005 		flags |= WMI_KEY_PAIRWISE;
6006 	else
6007 		flags |= WMI_KEY_GROUP;
6008 
6009 	if (is_wep) {
6010 		if (cmd == DISABLE_KEY)
6011 			ath10k_clear_vdev_key(arvif, key);
6012 
6013 		/* When WEP keys are uploaded it's possible that there are
6014 		 * stations associated already (e.g. when merging) without any
6015 		 * keys. Static WEP needs an explicit per-peer key upload.
6016 		 */
6017 		if (vif->type == NL80211_IFTYPE_ADHOC &&
6018 		    cmd == SET_KEY)
6019 			ath10k_mac_vif_update_wep_key(arvif, key);
6020 
6021 		/* 802.1x never sets the def_wep_key_idx so each set_key()
6022 		 * call changes default tx key.
6023 		 *
6024 		 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
6025 		 * after first set_key().
6026 		 */
6027 		if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
6028 			flags |= WMI_KEY_TX_USAGE;
6029 	}
6030 
6031 	ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
6032 	if (ret) {
6033 		WARN_ON(ret > 0);
6034 		ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
6035 			    arvif->vdev_id, peer_addr, ret);
6036 		goto exit;
6037 	}
6038 
6039 	/* mac80211 sets static WEP keys as groupwise while firmware requires
6040 	 * them to be installed twice as both pairwise and groupwise.
6041 	 */
6042 	if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
6043 		flags2 = flags;
6044 		flags2 &= ~WMI_KEY_GROUP;
6045 		flags2 |= WMI_KEY_PAIRWISE;
6046 
6047 		ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
6048 		if (ret) {
6049 			WARN_ON(ret > 0);
6050 			ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
6051 				    arvif->vdev_id, peer_addr, ret);
6052 			ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
6053 						  peer_addr, flags);
6054 			if (ret2) {
6055 				WARN_ON(ret2 > 0);
6056 				ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
6057 					    arvif->vdev_id, peer_addr, ret2);
6058 			}
6059 			goto exit;
6060 		}
6061 	}
6062 
6063 	ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
6064 
6065 	spin_lock_bh(&ar->data_lock);
6066 	peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6067 	if (peer && cmd == SET_KEY)
6068 		peer->keys[key->keyidx] = key;
6069 	else if (peer && cmd == DISABLE_KEY)
6070 		peer->keys[key->keyidx] = NULL;
6071 	else if (peer == NULL)
6072 		/* impossible unless FW goes crazy */
6073 		ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
6074 	spin_unlock_bh(&ar->data_lock);
6075 
6076 	if (sta && sta->tdls)
6077 		ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6078 					  WMI_PEER_AUTHORIZE, 1);
6079 
6080 exit:
6081 	mutex_unlock(&ar->conf_mutex);
6082 	return ret;
6083 }
6084 
6085 static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
6086 					   struct ieee80211_vif *vif,
6087 					   int keyidx)
6088 {
6089 	struct ath10k *ar = hw->priv;
6090 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
6091 	int ret;
6092 
6093 	mutex_lock(&arvif->ar->conf_mutex);
6094 
6095 	if (arvif->ar->state != ATH10K_STATE_ON)
6096 		goto unlock;
6097 
6098 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
6099 		   arvif->vdev_id, keyidx);
6100 
6101 	ret = ath10k_wmi_vdev_set_param(arvif->ar,
6102 					arvif->vdev_id,
6103 					arvif->ar->wmi.vdev_param->def_keyid,
6104 					keyidx);
6105 
6106 	if (ret) {
6107 		ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
6108 			    arvif->vdev_id,
6109 			    ret);
6110 		goto unlock;
6111 	}
6112 
6113 	arvif->def_wep_key_idx = keyidx;
6114 
6115 unlock:
6116 	mutex_unlock(&arvif->ar->conf_mutex);
6117 }
6118 
6119 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
6120 {
6121 	struct ath10k *ar;
6122 	struct ath10k_vif *arvif;
6123 	struct ath10k_sta *arsta;
6124 	struct ieee80211_sta *sta;
6125 	struct cfg80211_chan_def def;
6126 	enum nl80211_band band;
6127 	const u8 *ht_mcs_mask;
6128 	const u16 *vht_mcs_mask;
6129 	u32 changed, bw, nss, smps;
6130 	int err;
6131 
6132 	arsta = container_of(wk, struct ath10k_sta, update_wk);
6133 	sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
6134 	arvif = arsta->arvif;
6135 	ar = arvif->ar;
6136 
6137 	if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
6138 		return;
6139 
6140 	band = def.chan->band;
6141 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
6142 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
6143 
6144 	spin_lock_bh(&ar->data_lock);
6145 
6146 	changed = arsta->changed;
6147 	arsta->changed = 0;
6148 
6149 	bw = arsta->bw;
6150 	nss = arsta->nss;
6151 	smps = arsta->smps;
6152 
6153 	spin_unlock_bh(&ar->data_lock);
6154 
6155 	mutex_lock(&ar->conf_mutex);
6156 
6157 	nss = max_t(u32, 1, nss);
6158 	nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6159 			   ath10k_mac_max_vht_nss(vht_mcs_mask)));
6160 
6161 	if (changed & IEEE80211_RC_BW_CHANGED) {
6162 		enum wmi_phy_mode mode;
6163 
6164 		mode = chan_to_phymode(&def);
6165 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n",
6166 			   sta->addr, bw, mode);
6167 
6168 		err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6169 						WMI_PEER_PHYMODE, mode);
6170 		if (err) {
6171 			ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
6172 				    sta->addr, mode, err);
6173 			goto exit;
6174 		}
6175 
6176 		err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6177 						WMI_PEER_CHAN_WIDTH, bw);
6178 		if (err)
6179 			ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
6180 				    sta->addr, bw, err);
6181 	}
6182 
6183 	if (changed & IEEE80211_RC_NSS_CHANGED) {
6184 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
6185 			   sta->addr, nss);
6186 
6187 		err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6188 						WMI_PEER_NSS, nss);
6189 		if (err)
6190 			ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
6191 				    sta->addr, nss, err);
6192 	}
6193 
6194 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
6195 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
6196 			   sta->addr, smps);
6197 
6198 		err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6199 						WMI_PEER_SMPS_STATE, smps);
6200 		if (err)
6201 			ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
6202 				    sta->addr, smps, err);
6203 	}
6204 
6205 	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6206 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
6207 			   sta->addr);
6208 
6209 		err = ath10k_station_assoc(ar, arvif->vif, sta, true);
6210 		if (err)
6211 			ath10k_warn(ar, "failed to reassociate station: %pM\n",
6212 				    sta->addr);
6213 	}
6214 
6215 exit:
6216 	mutex_unlock(&ar->conf_mutex);
6217 }
6218 
6219 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
6220 				       struct ieee80211_sta *sta)
6221 {
6222 	struct ath10k *ar = arvif->ar;
6223 
6224 	lockdep_assert_held(&ar->conf_mutex);
6225 
6226 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6227 		return 0;
6228 
6229 	if (ar->num_stations >= ar->max_num_stations)
6230 		return -ENOBUFS;
6231 
6232 	ar->num_stations++;
6233 
6234 	return 0;
6235 }
6236 
6237 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
6238 					struct ieee80211_sta *sta)
6239 {
6240 	struct ath10k *ar = arvif->ar;
6241 
6242 	lockdep_assert_held(&ar->conf_mutex);
6243 
6244 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6245 		return;
6246 
6247 	ar->num_stations--;
6248 }
6249 
6250 static int ath10k_sta_state(struct ieee80211_hw *hw,
6251 			    struct ieee80211_vif *vif,
6252 			    struct ieee80211_sta *sta,
6253 			    enum ieee80211_sta_state old_state,
6254 			    enum ieee80211_sta_state new_state)
6255 {
6256 	struct ath10k *ar = hw->priv;
6257 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
6258 	struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6259 	struct ath10k_peer *peer;
6260 	int ret = 0;
6261 	int i;
6262 
6263 	if (old_state == IEEE80211_STA_NOTEXIST &&
6264 	    new_state == IEEE80211_STA_NONE) {
6265 		memset(arsta, 0, sizeof(*arsta));
6266 		arsta->arvif = arvif;
6267 		arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
6268 		INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
6269 
6270 		for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
6271 			ath10k_mac_txq_init(sta->txq[i]);
6272 	}
6273 
6274 	/* cancel must be done outside the mutex to avoid deadlock */
6275 	if ((old_state == IEEE80211_STA_NONE &&
6276 	     new_state == IEEE80211_STA_NOTEXIST))
6277 		cancel_work_sync(&arsta->update_wk);
6278 
6279 	mutex_lock(&ar->conf_mutex);
6280 
6281 	if (old_state == IEEE80211_STA_NOTEXIST &&
6282 	    new_state == IEEE80211_STA_NONE) {
6283 		/*
6284 		 * New station addition.
6285 		 */
6286 		enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
6287 		u32 num_tdls_stations;
6288 		u32 num_tdls_vifs;
6289 
6290 		ath10k_dbg(ar, ATH10K_DBG_MAC,
6291 			   "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
6292 			   arvif->vdev_id, sta->addr,
6293 			   ar->num_stations + 1, ar->max_num_stations,
6294 			   ar->num_peers + 1, ar->max_num_peers);
6295 
6296 		if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
6297 			arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats),
6298 						  GFP_KERNEL);
6299 			if (!arsta->tx_stats)
6300 				goto exit;
6301 		}
6302 
6303 		num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
6304 		num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
6305 
6306 		if (sta->tdls) {
6307 			if (num_tdls_stations >= ar->max_num_tdls_vdevs) {
6308 				ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
6309 					    arvif->vdev_id,
6310 					    ar->max_num_tdls_vdevs);
6311 				ret = -ELNRNG;
6312 				goto exit;
6313 			}
6314 			peer_type = WMI_PEER_TYPE_TDLS;
6315 		}
6316 
6317 		ret = ath10k_mac_inc_num_stations(arvif, sta);
6318 		if (ret) {
6319 			ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
6320 				    ar->max_num_stations);
6321 			goto exit;
6322 		}
6323 
6324 		ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id,
6325 					 sta->addr, peer_type);
6326 		if (ret) {
6327 			ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
6328 				    sta->addr, arvif->vdev_id, ret);
6329 			ath10k_mac_dec_num_stations(arvif, sta);
6330 			goto exit;
6331 		}
6332 
6333 		spin_lock_bh(&ar->data_lock);
6334 
6335 		peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
6336 		if (!peer) {
6337 			ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
6338 				    vif->addr, arvif->vdev_id);
6339 			spin_unlock_bh(&ar->data_lock);
6340 			ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6341 			ath10k_mac_dec_num_stations(arvif, sta);
6342 			ret = -ENOENT;
6343 			goto exit;
6344 		}
6345 
6346 		arsta->peer_id = find_first_bit(peer->peer_ids,
6347 						ATH10K_MAX_NUM_PEER_IDS);
6348 
6349 		spin_unlock_bh(&ar->data_lock);
6350 
6351 		if (!sta->tdls)
6352 			goto exit;
6353 
6354 		ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6355 						      WMI_TDLS_ENABLE_ACTIVE);
6356 		if (ret) {
6357 			ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
6358 				    arvif->vdev_id, ret);
6359 			ath10k_peer_delete(ar, arvif->vdev_id,
6360 					   sta->addr);
6361 			ath10k_mac_dec_num_stations(arvif, sta);
6362 			goto exit;
6363 		}
6364 
6365 		ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
6366 						  WMI_TDLS_PEER_STATE_PEERING);
6367 		if (ret) {
6368 			ath10k_warn(ar,
6369 				    "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
6370 				    sta->addr, arvif->vdev_id, ret);
6371 			ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6372 			ath10k_mac_dec_num_stations(arvif, sta);
6373 
6374 			if (num_tdls_stations != 0)
6375 				goto exit;
6376 			ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6377 							WMI_TDLS_DISABLE);
6378 		}
6379 	} else if ((old_state == IEEE80211_STA_NONE &&
6380 		    new_state == IEEE80211_STA_NOTEXIST)) {
6381 		/*
6382 		 * Existing station deletion.
6383 		 */
6384 		ath10k_dbg(ar, ATH10K_DBG_MAC,
6385 			   "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
6386 			   arvif->vdev_id, sta->addr, sta);
6387 
6388 		if (ath10k_debug_is_extd_tx_stats_enabled(ar))
6389 			kfree(arsta->tx_stats);
6390 
6391 		if (sta->tdls) {
6392 			ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
6393 							  sta,
6394 							  WMI_TDLS_PEER_STATE_TEARDOWN);
6395 			if (ret)
6396 				ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
6397 					    sta->addr,
6398 					    WMI_TDLS_PEER_STATE_TEARDOWN, ret);
6399 		}
6400 
6401 		ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
6402 		if (ret)
6403 			ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
6404 				    sta->addr, arvif->vdev_id, ret);
6405 
6406 		ath10k_mac_dec_num_stations(arvif, sta);
6407 
6408 		spin_lock_bh(&ar->data_lock);
6409 		for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
6410 			peer = ar->peer_map[i];
6411 			if (!peer)
6412 				continue;
6413 
6414 			if (peer->sta == sta) {
6415 				ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
6416 					    sta->addr, peer, i, arvif->vdev_id);
6417 				peer->sta = NULL;
6418 
6419 				/* Clean up the peer object as well since we
6420 				 * must have failed to do this above.
6421 				 */
6422 				list_del(&peer->list);
6423 				ar->peer_map[i] = NULL;
6424 				kfree(peer);
6425 				ar->num_peers--;
6426 			}
6427 		}
6428 		spin_unlock_bh(&ar->data_lock);
6429 
6430 		for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
6431 			ath10k_mac_txq_unref(ar, sta->txq[i]);
6432 
6433 		if (!sta->tdls)
6434 			goto exit;
6435 
6436 		if (ath10k_mac_tdls_vif_stations_count(hw, vif))
6437 			goto exit;
6438 
6439 		/* This was the last tdls peer in current vif */
6440 		ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
6441 						      WMI_TDLS_DISABLE);
6442 		if (ret) {
6443 			ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
6444 				    arvif->vdev_id, ret);
6445 		}
6446 	} else if (old_state == IEEE80211_STA_AUTH &&
6447 		   new_state == IEEE80211_STA_ASSOC &&
6448 		   (vif->type == NL80211_IFTYPE_AP ||
6449 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
6450 		    vif->type == NL80211_IFTYPE_ADHOC)) {
6451 		/*
6452 		 * New association.
6453 		 */
6454 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
6455 			   sta->addr);
6456 
6457 		ret = ath10k_station_assoc(ar, vif, sta, false);
6458 		if (ret)
6459 			ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
6460 				    sta->addr, arvif->vdev_id, ret);
6461 	} else if (old_state == IEEE80211_STA_ASSOC &&
6462 		   new_state == IEEE80211_STA_AUTHORIZED &&
6463 		   sta->tdls) {
6464 		/*
6465 		 * Tdls station authorized.
6466 		 */
6467 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
6468 			   sta->addr);
6469 
6470 		ret = ath10k_station_assoc(ar, vif, sta, false);
6471 		if (ret) {
6472 			ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
6473 				    sta->addr, arvif->vdev_id, ret);
6474 			goto exit;
6475 		}
6476 
6477 		ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
6478 						  WMI_TDLS_PEER_STATE_CONNECTED);
6479 		if (ret)
6480 			ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
6481 				    sta->addr, arvif->vdev_id, ret);
6482 	} else if (old_state == IEEE80211_STA_ASSOC &&
6483 		    new_state == IEEE80211_STA_AUTH &&
6484 		    (vif->type == NL80211_IFTYPE_AP ||
6485 		     vif->type == NL80211_IFTYPE_MESH_POINT ||
6486 		     vif->type == NL80211_IFTYPE_ADHOC)) {
6487 		/*
6488 		 * Disassociation.
6489 		 */
6490 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
6491 			   sta->addr);
6492 
6493 		ret = ath10k_station_disassoc(ar, vif, sta);
6494 		if (ret)
6495 			ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
6496 				    sta->addr, arvif->vdev_id, ret);
6497 	}
6498 exit:
6499 	mutex_unlock(&ar->conf_mutex);
6500 	return ret;
6501 }
6502 
6503 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
6504 				u16 ac, bool enable)
6505 {
6506 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
6507 	struct wmi_sta_uapsd_auto_trig_arg arg = {};
6508 	u32 prio = 0, acc = 0;
6509 	u32 value = 0;
6510 	int ret = 0;
6511 
6512 	lockdep_assert_held(&ar->conf_mutex);
6513 
6514 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
6515 		return 0;
6516 
6517 	switch (ac) {
6518 	case IEEE80211_AC_VO:
6519 		value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
6520 			WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
6521 		prio = 7;
6522 		acc = 3;
6523 		break;
6524 	case IEEE80211_AC_VI:
6525 		value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
6526 			WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
6527 		prio = 5;
6528 		acc = 2;
6529 		break;
6530 	case IEEE80211_AC_BE:
6531 		value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
6532 			WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
6533 		prio = 2;
6534 		acc = 1;
6535 		break;
6536 	case IEEE80211_AC_BK:
6537 		value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
6538 			WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
6539 		prio = 0;
6540 		acc = 0;
6541 		break;
6542 	}
6543 
6544 	if (enable)
6545 		arvif->u.sta.uapsd |= value;
6546 	else
6547 		arvif->u.sta.uapsd &= ~value;
6548 
6549 	ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6550 					  WMI_STA_PS_PARAM_UAPSD,
6551 					  arvif->u.sta.uapsd);
6552 	if (ret) {
6553 		ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
6554 		goto exit;
6555 	}
6556 
6557 	if (arvif->u.sta.uapsd)
6558 		value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
6559 	else
6560 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6561 
6562 	ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6563 					  WMI_STA_PS_PARAM_RX_WAKE_POLICY,
6564 					  value);
6565 	if (ret)
6566 		ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
6567 
6568 	ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
6569 	if (ret) {
6570 		ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
6571 			    arvif->vdev_id, ret);
6572 		return ret;
6573 	}
6574 
6575 	ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
6576 	if (ret) {
6577 		ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
6578 			    arvif->vdev_id, ret);
6579 		return ret;
6580 	}
6581 
6582 	if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
6583 	    test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
6584 		/* Only userspace can make an educated decision when to send
6585 		 * trigger frame. The following effectively disables u-UAPSD
6586 		 * autotrigger in firmware (which is enabled by default
6587 		 * provided the autotrigger service is available).
6588 		 */
6589 
6590 		arg.wmm_ac = acc;
6591 		arg.user_priority = prio;
6592 		arg.service_interval = 0;
6593 		arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
6594 		arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
6595 
6596 		ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
6597 						arvif->bssid, &arg, 1);
6598 		if (ret) {
6599 			ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
6600 				    ret);
6601 			return ret;
6602 		}
6603 	}
6604 
6605 exit:
6606 	return ret;
6607 }
6608 
6609 static int ath10k_conf_tx(struct ieee80211_hw *hw,
6610 			  struct ieee80211_vif *vif, u16 ac,
6611 			  const struct ieee80211_tx_queue_params *params)
6612 {
6613 	struct ath10k *ar = hw->priv;
6614 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
6615 	struct wmi_wmm_params_arg *p = NULL;
6616 	int ret;
6617 
6618 	mutex_lock(&ar->conf_mutex);
6619 
6620 	switch (ac) {
6621 	case IEEE80211_AC_VO:
6622 		p = &arvif->wmm_params.ac_vo;
6623 		break;
6624 	case IEEE80211_AC_VI:
6625 		p = &arvif->wmm_params.ac_vi;
6626 		break;
6627 	case IEEE80211_AC_BE:
6628 		p = &arvif->wmm_params.ac_be;
6629 		break;
6630 	case IEEE80211_AC_BK:
6631 		p = &arvif->wmm_params.ac_bk;
6632 		break;
6633 	}
6634 
6635 	if (WARN_ON(!p)) {
6636 		ret = -EINVAL;
6637 		goto exit;
6638 	}
6639 
6640 	p->cwmin = params->cw_min;
6641 	p->cwmax = params->cw_max;
6642 	p->aifs = params->aifs;
6643 
6644 	/*
6645 	 * The channel time duration programmed in the HW is in absolute
6646 	 * microseconds, while mac80211 gives the txop in units of
6647 	 * 32 microseconds.
6648 	 */
6649 	p->txop = params->txop * 32;
6650 
6651 	if (ar->wmi.ops->gen_vdev_wmm_conf) {
6652 		ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
6653 					       &arvif->wmm_params);
6654 		if (ret) {
6655 			ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
6656 				    arvif->vdev_id, ret);
6657 			goto exit;
6658 		}
6659 	} else {
6660 		/* This won't work well with multi-interface cases but it's
6661 		 * better than nothing.
6662 		 */
6663 		ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
6664 		if (ret) {
6665 			ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
6666 			goto exit;
6667 		}
6668 	}
6669 
6670 	ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
6671 	if (ret)
6672 		ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
6673 
6674 exit:
6675 	mutex_unlock(&ar->conf_mutex);
6676 	return ret;
6677 }
6678 
6679 #define ATH10K_ROC_TIMEOUT_HZ (2 * HZ)
6680 
6681 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
6682 				    struct ieee80211_vif *vif,
6683 				    struct ieee80211_channel *chan,
6684 				    int duration,
6685 				    enum ieee80211_roc_type type)
6686 {
6687 	struct ath10k *ar = hw->priv;
6688 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
6689 	struct wmi_start_scan_arg arg;
6690 	int ret = 0;
6691 	u32 scan_time_msec;
6692 
6693 	mutex_lock(&ar->conf_mutex);
6694 
6695 	if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
6696 		ret = -EBUSY;
6697 		goto exit;
6698 	}
6699 
6700 	spin_lock_bh(&ar->data_lock);
6701 	switch (ar->scan.state) {
6702 	case ATH10K_SCAN_IDLE:
6703 		reinit_completion(&ar->scan.started);
6704 		reinit_completion(&ar->scan.completed);
6705 		reinit_completion(&ar->scan.on_channel);
6706 		ar->scan.state = ATH10K_SCAN_STARTING;
6707 		ar->scan.is_roc = true;
6708 		ar->scan.vdev_id = arvif->vdev_id;
6709 		ar->scan.roc_freq = chan->center_freq;
6710 		ar->scan.roc_notify = true;
6711 		ret = 0;
6712 		break;
6713 	case ATH10K_SCAN_STARTING:
6714 	case ATH10K_SCAN_RUNNING:
6715 	case ATH10K_SCAN_ABORTING:
6716 		ret = -EBUSY;
6717 		break;
6718 	}
6719 	spin_unlock_bh(&ar->data_lock);
6720 
6721 	if (ret)
6722 		goto exit;
6723 
6724 	scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
6725 
6726 	memset(&arg, 0, sizeof(arg));
6727 	ath10k_wmi_start_scan_init(ar, &arg);
6728 	arg.vdev_id = arvif->vdev_id;
6729 	arg.scan_id = ATH10K_SCAN_ID;
6730 	arg.n_channels = 1;
6731 	arg.channels[0] = chan->center_freq;
6732 	arg.dwell_time_active = scan_time_msec;
6733 	arg.dwell_time_passive = scan_time_msec;
6734 	arg.max_scan_time = scan_time_msec;
6735 	arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
6736 	arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
6737 	arg.burst_duration_ms = duration;
6738 
6739 	ret = ath10k_start_scan(ar, &arg);
6740 	if (ret) {
6741 		ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
6742 		spin_lock_bh(&ar->data_lock);
6743 		ar->scan.state = ATH10K_SCAN_IDLE;
6744 		spin_unlock_bh(&ar->data_lock);
6745 		goto exit;
6746 	}
6747 
6748 	ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
6749 	if (ret == 0) {
6750 		ath10k_warn(ar, "failed to switch to channel for roc scan\n");
6751 
6752 		ret = ath10k_scan_stop(ar);
6753 		if (ret)
6754 			ath10k_warn(ar, "failed to stop scan: %d\n", ret);
6755 
6756 		ret = -ETIMEDOUT;
6757 		goto exit;
6758 	}
6759 
6760 	ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
6761 				     msecs_to_jiffies(duration));
6762 
6763 	ret = 0;
6764 exit:
6765 	mutex_unlock(&ar->conf_mutex);
6766 	return ret;
6767 }
6768 
6769 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
6770 {
6771 	struct ath10k *ar = hw->priv;
6772 
6773 	mutex_lock(&ar->conf_mutex);
6774 
6775 	spin_lock_bh(&ar->data_lock);
6776 	ar->scan.roc_notify = false;
6777 	spin_unlock_bh(&ar->data_lock);
6778 
6779 	ath10k_scan_abort(ar);
6780 
6781 	mutex_unlock(&ar->conf_mutex);
6782 
6783 	cancel_delayed_work_sync(&ar->scan.timeout);
6784 
6785 	return 0;
6786 }
6787 
6788 /*
6789  * Both RTS and Fragmentation threshold are interface-specific
6790  * in ath10k, but device-specific in mac80211.
6791  */
6792 
6793 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
6794 {
6795 	struct ath10k *ar = hw->priv;
6796 	struct ath10k_vif *arvif;
6797 	int ret = 0;
6798 
6799 	mutex_lock(&ar->conf_mutex);
6800 	list_for_each_entry(arvif, &ar->arvifs, list) {
6801 		ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
6802 			   arvif->vdev_id, value);
6803 
6804 		ret = ath10k_mac_set_rts(arvif, value);
6805 		if (ret) {
6806 			ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
6807 				    arvif->vdev_id, ret);
6808 			break;
6809 		}
6810 	}
6811 	mutex_unlock(&ar->conf_mutex);
6812 
6813 	return ret;
6814 }
6815 
6816 static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
6817 {
6818 	/* Even though there's a WMI enum for fragmentation threshold no known
6819 	 * firmware actually implements it. Moreover it is not possible to rely
6820 	 * frame fragmentation to mac80211 because firmware clears the "more
6821 	 * fragments" bit in frame control making it impossible for remote
6822 	 * devices to reassemble frames.
6823 	 *
6824 	 * Hence implement a dummy callback just to say fragmentation isn't
6825 	 * supported. This effectively prevents mac80211 from doing frame
6826 	 * fragmentation in software.
6827 	 */
6828 	return -EOPNOTSUPP;
6829 }
6830 
6831 void ath10k_mac_wait_tx_complete(struct ath10k *ar)
6832 {
6833 	bool skip;
6834 	long time_left;
6835 
6836 	/* mac80211 doesn't care if we really xmit queued frames or not
6837 	 * we'll collect those frames either way if we stop/delete vdevs
6838 	 */
6839 
6840 	if (ar->state == ATH10K_STATE_WEDGED)
6841 		return;
6842 
6843 	time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
6844 			bool empty;
6845 
6846 			spin_lock_bh(&ar->htt.tx_lock);
6847 			empty = (ar->htt.num_pending_tx == 0);
6848 			spin_unlock_bh(&ar->htt.tx_lock);
6849 
6850 			skip = (ar->state == ATH10K_STATE_WEDGED) ||
6851 			       test_bit(ATH10K_FLAG_CRASH_FLUSH,
6852 					&ar->dev_flags);
6853 
6854 			(empty || skip);
6855 		}), ATH10K_FLUSH_TIMEOUT_HZ);
6856 
6857 	if (time_left == 0 || skip)
6858 		ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
6859 			    skip, ar->state, time_left);
6860 }
6861 
6862 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6863 			 u32 queues, bool drop)
6864 {
6865 	struct ath10k *ar = hw->priv;
6866 	struct ath10k_vif *arvif;
6867 	u32 bitmap;
6868 
6869 	if (drop) {
6870 		if (vif->type == NL80211_IFTYPE_STATION) {
6871 			bitmap = ~(1 << WMI_MGMT_TID);
6872 			list_for_each_entry(arvif, &ar->arvifs, list) {
6873 				if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6874 					ath10k_wmi_peer_flush(ar, arvif->vdev_id,
6875 							      arvif->bssid, bitmap);
6876 			}
6877 		}
6878 		return;
6879 	}
6880 
6881 	mutex_lock(&ar->conf_mutex);
6882 	ath10k_mac_wait_tx_complete(ar);
6883 	mutex_unlock(&ar->conf_mutex);
6884 }
6885 
6886 /* TODO: Implement this function properly
6887  * For now it is needed to reply to Probe Requests in IBSS mode.
6888  * Propably we need this information from FW.
6889  */
6890 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
6891 {
6892 	return 1;
6893 }
6894 
6895 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
6896 				     enum ieee80211_reconfig_type reconfig_type)
6897 {
6898 	struct ath10k *ar = hw->priv;
6899 
6900 	if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
6901 		return;
6902 
6903 	mutex_lock(&ar->conf_mutex);
6904 
6905 	/* If device failed to restart it will be in a different state, e.g.
6906 	 * ATH10K_STATE_WEDGED
6907 	 */
6908 	if (ar->state == ATH10K_STATE_RESTARTED) {
6909 		ath10k_info(ar, "device successfully recovered\n");
6910 		ar->state = ATH10K_STATE_ON;
6911 		ieee80211_wake_queues(ar->hw);
6912 	}
6913 
6914 	mutex_unlock(&ar->conf_mutex);
6915 }
6916 
6917 static void
6918 ath10k_mac_update_bss_chan_survey(struct ath10k *ar,
6919 				  struct ieee80211_channel *channel)
6920 {
6921 	int ret;
6922 	enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR;
6923 
6924 	lockdep_assert_held(&ar->conf_mutex);
6925 
6926 	if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) ||
6927 	    (ar->rx_channel != channel))
6928 		return;
6929 
6930 	if (ar->scan.state != ATH10K_SCAN_IDLE) {
6931 		ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n");
6932 		return;
6933 	}
6934 
6935 	reinit_completion(&ar->bss_survey_done);
6936 
6937 	ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type);
6938 	if (ret) {
6939 		ath10k_warn(ar, "failed to send pdev bss chan info request\n");
6940 		return;
6941 	}
6942 
6943 	ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
6944 	if (!ret) {
6945 		ath10k_warn(ar, "bss channel survey timed out\n");
6946 		return;
6947 	}
6948 }
6949 
6950 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
6951 			     struct survey_info *survey)
6952 {
6953 	struct ath10k *ar = hw->priv;
6954 	struct ieee80211_supported_band *sband;
6955 	struct survey_info *ar_survey = &ar->survey[idx];
6956 	int ret = 0;
6957 
6958 	mutex_lock(&ar->conf_mutex);
6959 
6960 	sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
6961 	if (sband && idx >= sband->n_channels) {
6962 		idx -= sband->n_channels;
6963 		sband = NULL;
6964 	}
6965 
6966 	if (!sband)
6967 		sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
6968 
6969 	if (!sband || idx >= sband->n_channels) {
6970 		ret = -ENOENT;
6971 		goto exit;
6972 	}
6973 
6974 	ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
6975 
6976 	spin_lock_bh(&ar->data_lock);
6977 	memcpy(survey, ar_survey, sizeof(*survey));
6978 	spin_unlock_bh(&ar->data_lock);
6979 
6980 	survey->channel = &sband->channels[idx];
6981 
6982 	if (ar->rx_channel == survey->channel)
6983 		survey->filled |= SURVEY_INFO_IN_USE;
6984 
6985 exit:
6986 	mutex_unlock(&ar->conf_mutex);
6987 	return ret;
6988 }
6989 
6990 static bool
6991 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6992 					enum nl80211_band band,
6993 					const struct cfg80211_bitrate_mask *mask)
6994 {
6995 	int num_rates = 0;
6996 	int i;
6997 
6998 	num_rates += hweight32(mask->control[band].legacy);
6999 
7000 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
7001 		num_rates += hweight8(mask->control[band].ht_mcs[i]);
7002 
7003 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
7004 		num_rates += hweight16(mask->control[band].vht_mcs[i]);
7005 
7006 	return num_rates == 1;
7007 }
7008 
7009 static bool
7010 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
7011 				       enum nl80211_band band,
7012 				       const struct cfg80211_bitrate_mask *mask,
7013 				       int *nss)
7014 {
7015 	struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7016 	u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7017 	u8 ht_nss_mask = 0;
7018 	u8 vht_nss_mask = 0;
7019 	int i;
7020 
7021 	if (mask->control[band].legacy)
7022 		return false;
7023 
7024 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7025 		if (mask->control[band].ht_mcs[i] == 0)
7026 			continue;
7027 		else if (mask->control[band].ht_mcs[i] ==
7028 			 sband->ht_cap.mcs.rx_mask[i])
7029 			ht_nss_mask |= BIT(i);
7030 		else
7031 			return false;
7032 	}
7033 
7034 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7035 		if (mask->control[band].vht_mcs[i] == 0)
7036 			continue;
7037 		else if (mask->control[band].vht_mcs[i] ==
7038 			 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7039 			vht_nss_mask |= BIT(i);
7040 		else
7041 			return false;
7042 	}
7043 
7044 	if (ht_nss_mask != vht_nss_mask)
7045 		return false;
7046 
7047 	if (ht_nss_mask == 0)
7048 		return false;
7049 
7050 	if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7051 		return false;
7052 
7053 	*nss = fls(ht_nss_mask);
7054 
7055 	return true;
7056 }
7057 
7058 static int
7059 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
7060 					enum nl80211_band band,
7061 					const struct cfg80211_bitrate_mask *mask,
7062 					u8 *rate, u8 *nss)
7063 {
7064 	int rate_idx;
7065 	int i;
7066 	u16 bitrate;
7067 	u8 preamble;
7068 	u8 hw_rate;
7069 
7070 	if (hweight32(mask->control[band].legacy) == 1) {
7071 		rate_idx = ffs(mask->control[band].legacy) - 1;
7072 
7073 		if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
7074 			rate_idx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
7075 
7076 		hw_rate = ath10k_wmi_legacy_rates[rate_idx].hw_value;
7077 		bitrate = ath10k_wmi_legacy_rates[rate_idx].bitrate;
7078 
7079 		if (ath10k_mac_bitrate_is_cck(bitrate))
7080 			preamble = WMI_RATE_PREAMBLE_CCK;
7081 		else
7082 			preamble = WMI_RATE_PREAMBLE_OFDM;
7083 
7084 		*nss = 1;
7085 		*rate = preamble << 6 |
7086 			(*nss - 1) << 4 |
7087 			hw_rate << 0;
7088 
7089 		return 0;
7090 	}
7091 
7092 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7093 		if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
7094 			*nss = i + 1;
7095 			*rate = WMI_RATE_PREAMBLE_HT << 6 |
7096 				(*nss - 1) << 4 |
7097 				(ffs(mask->control[band].ht_mcs[i]) - 1);
7098 
7099 			return 0;
7100 		}
7101 	}
7102 
7103 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7104 		if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
7105 			*nss = i + 1;
7106 			*rate = WMI_RATE_PREAMBLE_VHT << 6 |
7107 				(*nss - 1) << 4 |
7108 				(ffs(mask->control[band].vht_mcs[i]) - 1);
7109 
7110 			return 0;
7111 		}
7112 	}
7113 
7114 	return -EINVAL;
7115 }
7116 
7117 static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
7118 					    u8 rate, u8 nss, u8 sgi, u8 ldpc)
7119 {
7120 	struct ath10k *ar = arvif->ar;
7121 	u32 vdev_param;
7122 	int ret;
7123 
7124 	lockdep_assert_held(&ar->conf_mutex);
7125 
7126 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
7127 		   arvif->vdev_id, rate, nss, sgi);
7128 
7129 	vdev_param = ar->wmi.vdev_param->fixed_rate;
7130 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
7131 	if (ret) {
7132 		ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
7133 			    rate, ret);
7134 		return ret;
7135 	}
7136 
7137 	vdev_param = ar->wmi.vdev_param->nss;
7138 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
7139 	if (ret) {
7140 		ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
7141 		return ret;
7142 	}
7143 
7144 	vdev_param = ar->wmi.vdev_param->sgi;
7145 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
7146 	if (ret) {
7147 		ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
7148 		return ret;
7149 	}
7150 
7151 	vdev_param = ar->wmi.vdev_param->ldpc;
7152 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
7153 	if (ret) {
7154 		ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
7155 		return ret;
7156 	}
7157 
7158 	return 0;
7159 }
7160 
7161 static bool
7162 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
7163 				enum nl80211_band band,
7164 				const struct cfg80211_bitrate_mask *mask)
7165 {
7166 	int i;
7167 	u16 vht_mcs;
7168 
7169 	/* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
7170 	 * to express all VHT MCS rate masks. Effectively only the following
7171 	 * ranges can be used: none, 0-7, 0-8 and 0-9.
7172 	 */
7173 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7174 		vht_mcs = mask->control[band].vht_mcs[i];
7175 
7176 		switch (vht_mcs) {
7177 		case 0:
7178 		case BIT(8) - 1:
7179 		case BIT(9) - 1:
7180 		case BIT(10) - 1:
7181 			break;
7182 		default:
7183 			ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
7184 			return false;
7185 		}
7186 	}
7187 
7188 	return true;
7189 }
7190 
7191 static void ath10k_mac_set_bitrate_mask_iter(void *data,
7192 					     struct ieee80211_sta *sta)
7193 {
7194 	struct ath10k_vif *arvif = data;
7195 	struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7196 	struct ath10k *ar = arvif->ar;
7197 
7198 	if (arsta->arvif != arvif)
7199 		return;
7200 
7201 	spin_lock_bh(&ar->data_lock);
7202 	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7203 	spin_unlock_bh(&ar->data_lock);
7204 
7205 	ieee80211_queue_work(ar->hw, &arsta->update_wk);
7206 }
7207 
7208 static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7209 					  struct ieee80211_vif *vif,
7210 					  const struct cfg80211_bitrate_mask *mask)
7211 {
7212 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7213 	struct cfg80211_chan_def def;
7214 	struct ath10k *ar = arvif->ar;
7215 	enum nl80211_band band;
7216 	const u8 *ht_mcs_mask;
7217 	const u16 *vht_mcs_mask;
7218 	u8 rate;
7219 	u8 nss;
7220 	u8 sgi;
7221 	u8 ldpc;
7222 	int single_nss;
7223 	int ret;
7224 
7225 	if (ath10k_mac_vif_chan(vif, &def))
7226 		return -EPERM;
7227 
7228 	band = def.chan->band;
7229 	ht_mcs_mask = mask->control[band].ht_mcs;
7230 	vht_mcs_mask = mask->control[band].vht_mcs;
7231 	ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
7232 
7233 	sgi = mask->control[band].gi;
7234 	if (sgi == NL80211_TXRATE_FORCE_LGI)
7235 		return -EINVAL;
7236 
7237 	if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
7238 		ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
7239 							      &rate, &nss);
7240 		if (ret) {
7241 			ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
7242 				    arvif->vdev_id, ret);
7243 			return ret;
7244 		}
7245 	} else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7246 							  &single_nss)) {
7247 		rate = WMI_FIXED_RATE_NONE;
7248 		nss = single_nss;
7249 	} else {
7250 		rate = WMI_FIXED_RATE_NONE;
7251 		nss = min(ar->num_rf_chains,
7252 			  max(ath10k_mac_max_ht_nss(ht_mcs_mask),
7253 			      ath10k_mac_max_vht_nss(vht_mcs_mask)));
7254 
7255 		if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
7256 			return -EINVAL;
7257 
7258 		mutex_lock(&ar->conf_mutex);
7259 
7260 		arvif->bitrate_mask = *mask;
7261 		ieee80211_iterate_stations_atomic(ar->hw,
7262 						  ath10k_mac_set_bitrate_mask_iter,
7263 						  arvif);
7264 
7265 		mutex_unlock(&ar->conf_mutex);
7266 	}
7267 
7268 	mutex_lock(&ar->conf_mutex);
7269 
7270 	ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
7271 	if (ret) {
7272 		ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
7273 			    arvif->vdev_id, ret);
7274 		goto exit;
7275 	}
7276 
7277 exit:
7278 	mutex_unlock(&ar->conf_mutex);
7279 
7280 	return ret;
7281 }
7282 
7283 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
7284 				 struct ieee80211_vif *vif,
7285 				 struct ieee80211_sta *sta,
7286 				 u32 changed)
7287 {
7288 	struct ath10k *ar = hw->priv;
7289 	struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7290 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7291 	struct ath10k_peer *peer;
7292 	u32 bw, smps;
7293 
7294 	spin_lock_bh(&ar->data_lock);
7295 
7296 	peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
7297 	if (!peer) {
7298 		spin_unlock_bh(&ar->data_lock);
7299 		ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n",
7300 			    sta->addr, arvif->vdev_id);
7301 		return;
7302 	}
7303 
7304 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7305 		   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7306 		   sta->addr, changed, sta->bandwidth, sta->rx_nss,
7307 		   sta->smps_mode);
7308 
7309 	if (changed & IEEE80211_RC_BW_CHANGED) {
7310 		bw = WMI_PEER_CHWIDTH_20MHZ;
7311 
7312 		switch (sta->bandwidth) {
7313 		case IEEE80211_STA_RX_BW_20:
7314 			bw = WMI_PEER_CHWIDTH_20MHZ;
7315 			break;
7316 		case IEEE80211_STA_RX_BW_40:
7317 			bw = WMI_PEER_CHWIDTH_40MHZ;
7318 			break;
7319 		case IEEE80211_STA_RX_BW_80:
7320 			bw = WMI_PEER_CHWIDTH_80MHZ;
7321 			break;
7322 		case IEEE80211_STA_RX_BW_160:
7323 			bw = WMI_PEER_CHWIDTH_160MHZ;
7324 			break;
7325 		default:
7326 			ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
7327 				    sta->bandwidth, sta->addr);
7328 			bw = WMI_PEER_CHWIDTH_20MHZ;
7329 			break;
7330 		}
7331 
7332 		arsta->bw = bw;
7333 	}
7334 
7335 	if (changed & IEEE80211_RC_NSS_CHANGED)
7336 		arsta->nss = sta->rx_nss;
7337 
7338 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
7339 		smps = WMI_PEER_SMPS_PS_NONE;
7340 
7341 		switch (sta->smps_mode) {
7342 		case IEEE80211_SMPS_AUTOMATIC:
7343 		case IEEE80211_SMPS_OFF:
7344 			smps = WMI_PEER_SMPS_PS_NONE;
7345 			break;
7346 		case IEEE80211_SMPS_STATIC:
7347 			smps = WMI_PEER_SMPS_STATIC;
7348 			break;
7349 		case IEEE80211_SMPS_DYNAMIC:
7350 			smps = WMI_PEER_SMPS_DYNAMIC;
7351 			break;
7352 		case IEEE80211_SMPS_NUM_MODES:
7353 			ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
7354 				    sta->smps_mode, sta->addr);
7355 			smps = WMI_PEER_SMPS_PS_NONE;
7356 			break;
7357 		}
7358 
7359 		arsta->smps = smps;
7360 	}
7361 
7362 	arsta->changed |= changed;
7363 
7364 	spin_unlock_bh(&ar->data_lock);
7365 
7366 	ieee80211_queue_work(hw, &arsta->update_wk);
7367 }
7368 
7369 static void ath10k_offset_tsf(struct ieee80211_hw *hw,
7370 			      struct ieee80211_vif *vif, s64 tsf_offset)
7371 {
7372 	struct ath10k *ar = hw->priv;
7373 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7374 	u32 offset, vdev_param;
7375 	int ret;
7376 
7377 	if (tsf_offset < 0) {
7378 		vdev_param = ar->wmi.vdev_param->dec_tsf;
7379 		offset = -tsf_offset;
7380 	} else {
7381 		vdev_param = ar->wmi.vdev_param->inc_tsf;
7382 		offset = tsf_offset;
7383 	}
7384 
7385 	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
7386 					vdev_param, offset);
7387 
7388 	if (ret && ret != -EOPNOTSUPP)
7389 		ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
7390 			    offset, vdev_param, ret);
7391 }
7392 
7393 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
7394 			       struct ieee80211_vif *vif,
7395 			       struct ieee80211_ampdu_params *params)
7396 {
7397 	struct ath10k *ar = hw->priv;
7398 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7399 	struct ieee80211_sta *sta = params->sta;
7400 	enum ieee80211_ampdu_mlme_action action = params->action;
7401 	u16 tid = params->tid;
7402 
7403 	ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
7404 		   arvif->vdev_id, sta->addr, tid, action);
7405 
7406 	switch (action) {
7407 	case IEEE80211_AMPDU_RX_START:
7408 	case IEEE80211_AMPDU_RX_STOP:
7409 		/* HTT AddBa/DelBa events trigger mac80211 Rx BA session
7410 		 * creation/removal. Do we need to verify this?
7411 		 */
7412 		return 0;
7413 	case IEEE80211_AMPDU_TX_START:
7414 	case IEEE80211_AMPDU_TX_STOP_CONT:
7415 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
7416 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7417 	case IEEE80211_AMPDU_TX_OPERATIONAL:
7418 		/* Firmware offloads Tx aggregation entirely so deny mac80211
7419 		 * Tx aggregation requests.
7420 		 */
7421 		return -EOPNOTSUPP;
7422 	}
7423 
7424 	return -EINVAL;
7425 }
7426 
7427 static void
7428 ath10k_mac_update_rx_channel(struct ath10k *ar,
7429 			     struct ieee80211_chanctx_conf *ctx,
7430 			     struct ieee80211_vif_chanctx_switch *vifs,
7431 			     int n_vifs)
7432 {
7433 	struct cfg80211_chan_def *def = NULL;
7434 
7435 	/* Both locks are required because ar->rx_channel is modified. This
7436 	 * allows readers to hold either lock.
7437 	 */
7438 	lockdep_assert_held(&ar->conf_mutex);
7439 	lockdep_assert_held(&ar->data_lock);
7440 
7441 	WARN_ON(ctx && vifs);
7442 	WARN_ON(vifs && !n_vifs);
7443 
7444 	/* FIXME: Sort of an optimization and a workaround. Peers and vifs are
7445 	 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
7446 	 * ppdu on Rx may reduce performance on low-end systems. It should be
7447 	 * possible to make tables/hashmaps to speed the lookup up (be vary of
7448 	 * cpu data cache lines though regarding sizes) but to keep the initial
7449 	 * implementation simple and less intrusive fallback to the slow lookup
7450 	 * only for multi-channel cases. Single-channel cases will remain to
7451 	 * use the old channel derival and thus performance should not be
7452 	 * affected much.
7453 	 */
7454 	rcu_read_lock();
7455 	if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
7456 		ieee80211_iter_chan_contexts_atomic(ar->hw,
7457 						    ath10k_mac_get_any_chandef_iter,
7458 						    &def);
7459 
7460 		if (vifs)
7461 			def = &vifs[0].new_ctx->def;
7462 
7463 		ar->rx_channel = def->chan;
7464 	} else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) ||
7465 		   (ctx && (ar->state == ATH10K_STATE_RESTARTED))) {
7466 		/* During driver restart due to firmware assert, since mac80211
7467 		 * already has valid channel context for given radio, channel
7468 		 * context iteration return num_chanctx > 0. So fix rx_channel
7469 		 * when restart is in progress.
7470 		 */
7471 		ar->rx_channel = ctx->def.chan;
7472 	} else {
7473 		ar->rx_channel = NULL;
7474 	}
7475 	rcu_read_unlock();
7476 }
7477 
7478 static void
7479 ath10k_mac_update_vif_chan(struct ath10k *ar,
7480 			   struct ieee80211_vif_chanctx_switch *vifs,
7481 			   int n_vifs)
7482 {
7483 	struct ath10k_vif *arvif;
7484 	int ret;
7485 	int i;
7486 
7487 	lockdep_assert_held(&ar->conf_mutex);
7488 
7489 	/* First stop monitor interface. Some FW versions crash if there's a
7490 	 * lone monitor interface.
7491 	 */
7492 	if (ar->monitor_started)
7493 		ath10k_monitor_stop(ar);
7494 
7495 	for (i = 0; i < n_vifs; i++) {
7496 		arvif = (void *)vifs[i].vif->drv_priv;
7497 
7498 		ath10k_dbg(ar, ATH10K_DBG_MAC,
7499 			   "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
7500 			   arvif->vdev_id,
7501 			   vifs[i].old_ctx->def.chan->center_freq,
7502 			   vifs[i].new_ctx->def.chan->center_freq,
7503 			   vifs[i].old_ctx->def.width,
7504 			   vifs[i].new_ctx->def.width);
7505 
7506 		if (WARN_ON(!arvif->is_started))
7507 			continue;
7508 
7509 		if (WARN_ON(!arvif->is_up))
7510 			continue;
7511 
7512 		ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
7513 		if (ret) {
7514 			ath10k_warn(ar, "failed to down vdev %d: %d\n",
7515 				    arvif->vdev_id, ret);
7516 			continue;
7517 		}
7518 	}
7519 
7520 	/* All relevant vdevs are downed and associated channel resources
7521 	 * should be available for the channel switch now.
7522 	 */
7523 
7524 	spin_lock_bh(&ar->data_lock);
7525 	ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
7526 	spin_unlock_bh(&ar->data_lock);
7527 
7528 	for (i = 0; i < n_vifs; i++) {
7529 		arvif = (void *)vifs[i].vif->drv_priv;
7530 
7531 		if (WARN_ON(!arvif->is_started))
7532 			continue;
7533 
7534 		if (WARN_ON(!arvif->is_up))
7535 			continue;
7536 
7537 		ret = ath10k_mac_setup_bcn_tmpl(arvif);
7538 		if (ret)
7539 			ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
7540 				    ret);
7541 
7542 		ret = ath10k_mac_setup_prb_tmpl(arvif);
7543 		if (ret)
7544 			ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
7545 				    ret);
7546 
7547 		ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
7548 		if (ret) {
7549 			ath10k_warn(ar, "failed to restart vdev %d: %d\n",
7550 				    arvif->vdev_id, ret);
7551 			continue;
7552 		}
7553 
7554 		ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7555 					 arvif->bssid);
7556 		if (ret) {
7557 			ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
7558 				    arvif->vdev_id, ret);
7559 			continue;
7560 		}
7561 	}
7562 
7563 	ath10k_monitor_recalc(ar);
7564 }
7565 
7566 static int
7567 ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
7568 			  struct ieee80211_chanctx_conf *ctx)
7569 {
7570 	struct ath10k *ar = hw->priv;
7571 
7572 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7573 		   "mac chanctx add freq %hu width %d ptr %pK\n",
7574 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
7575 
7576 	mutex_lock(&ar->conf_mutex);
7577 
7578 	spin_lock_bh(&ar->data_lock);
7579 	ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
7580 	spin_unlock_bh(&ar->data_lock);
7581 
7582 	ath10k_recalc_radar_detection(ar);
7583 	ath10k_monitor_recalc(ar);
7584 
7585 	mutex_unlock(&ar->conf_mutex);
7586 
7587 	return 0;
7588 }
7589 
7590 static void
7591 ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
7592 			     struct ieee80211_chanctx_conf *ctx)
7593 {
7594 	struct ath10k *ar = hw->priv;
7595 
7596 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7597 		   "mac chanctx remove freq %hu width %d ptr %pK\n",
7598 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
7599 
7600 	mutex_lock(&ar->conf_mutex);
7601 
7602 	spin_lock_bh(&ar->data_lock);
7603 	ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
7604 	spin_unlock_bh(&ar->data_lock);
7605 
7606 	ath10k_recalc_radar_detection(ar);
7607 	ath10k_monitor_recalc(ar);
7608 
7609 	mutex_unlock(&ar->conf_mutex);
7610 }
7611 
7612 struct ath10k_mac_change_chanctx_arg {
7613 	struct ieee80211_chanctx_conf *ctx;
7614 	struct ieee80211_vif_chanctx_switch *vifs;
7615 	int n_vifs;
7616 	int next_vif;
7617 };
7618 
7619 static void
7620 ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7621 				   struct ieee80211_vif *vif)
7622 {
7623 	struct ath10k_mac_change_chanctx_arg *arg = data;
7624 
7625 	if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
7626 		return;
7627 
7628 	arg->n_vifs++;
7629 }
7630 
7631 static void
7632 ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7633 				    struct ieee80211_vif *vif)
7634 {
7635 	struct ath10k_mac_change_chanctx_arg *arg = data;
7636 	struct ieee80211_chanctx_conf *ctx;
7637 
7638 	ctx = rcu_access_pointer(vif->chanctx_conf);
7639 	if (ctx != arg->ctx)
7640 		return;
7641 
7642 	if (WARN_ON(arg->next_vif == arg->n_vifs))
7643 		return;
7644 
7645 	arg->vifs[arg->next_vif].vif = vif;
7646 	arg->vifs[arg->next_vif].old_ctx = ctx;
7647 	arg->vifs[arg->next_vif].new_ctx = ctx;
7648 	arg->next_vif++;
7649 }
7650 
7651 static void
7652 ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7653 			     struct ieee80211_chanctx_conf *ctx,
7654 			     u32 changed)
7655 {
7656 	struct ath10k *ar = hw->priv;
7657 	struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
7658 
7659 	mutex_lock(&ar->conf_mutex);
7660 
7661 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7662 		   "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
7663 		   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7664 
7665 	/* This shouldn't really happen because channel switching should use
7666 	 * switch_vif_chanctx().
7667 	 */
7668 	if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7669 		goto unlock;
7670 
7671 	if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
7672 		ieee80211_iterate_active_interfaces_atomic(
7673 					hw,
7674 					IEEE80211_IFACE_ITER_NORMAL,
7675 					ath10k_mac_change_chanctx_cnt_iter,
7676 					&arg);
7677 		if (arg.n_vifs == 0)
7678 			goto radar;
7679 
7680 		arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
7681 				   GFP_KERNEL);
7682 		if (!arg.vifs)
7683 			goto radar;
7684 
7685 		ieee80211_iterate_active_interfaces_atomic(
7686 					hw,
7687 					IEEE80211_IFACE_ITER_NORMAL,
7688 					ath10k_mac_change_chanctx_fill_iter,
7689 					&arg);
7690 		ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7691 		kfree(arg.vifs);
7692 	}
7693 
7694 radar:
7695 	ath10k_recalc_radar_detection(ar);
7696 
7697 	/* FIXME: How to configure Rx chains properly? */
7698 
7699 	/* No other actions are actually necessary. Firmware maintains channel
7700 	 * definitions per vdev internally and there's no host-side channel
7701 	 * context abstraction to configure, e.g. channel width.
7702 	 */
7703 
7704 unlock:
7705 	mutex_unlock(&ar->conf_mutex);
7706 }
7707 
7708 static int
7709 ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7710 				 struct ieee80211_vif *vif,
7711 				 struct ieee80211_chanctx_conf *ctx)
7712 {
7713 	struct ath10k *ar = hw->priv;
7714 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7715 	int ret;
7716 
7717 	mutex_lock(&ar->conf_mutex);
7718 
7719 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7720 		   "mac chanctx assign ptr %pK vdev_id %i\n",
7721 		   ctx, arvif->vdev_id);
7722 
7723 	if (WARN_ON(arvif->is_started)) {
7724 		mutex_unlock(&ar->conf_mutex);
7725 		return -EBUSY;
7726 	}
7727 
7728 	ret = ath10k_vdev_start(arvif, &ctx->def);
7729 	if (ret) {
7730 		ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
7731 			    arvif->vdev_id, vif->addr,
7732 			    ctx->def.chan->center_freq, ret);
7733 		goto err;
7734 	}
7735 
7736 	arvif->is_started = true;
7737 
7738 	ret = ath10k_mac_vif_setup_ps(arvif);
7739 	if (ret) {
7740 		ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
7741 			    arvif->vdev_id, ret);
7742 		goto err_stop;
7743 	}
7744 
7745 	if (vif->type == NL80211_IFTYPE_MONITOR) {
7746 		ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
7747 		if (ret) {
7748 			ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
7749 				    arvif->vdev_id, ret);
7750 			goto err_stop;
7751 		}
7752 
7753 		arvif->is_up = true;
7754 	}
7755 
7756 	if (ath10k_mac_can_set_cts_prot(arvif)) {
7757 		ret = ath10k_mac_set_cts_prot(arvif);
7758 		if (ret)
7759 			ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
7760 				    arvif->vdev_id, ret);
7761 	}
7762 
7763 	if (ath10k_peer_stats_enabled(ar)) {
7764 		ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS;
7765 		ret = ath10k_wmi_pdev_pktlog_enable(ar,
7766 						    ar->pktlog_filter);
7767 		if (ret) {
7768 			ath10k_warn(ar, "failed to enable pktlog %d\n", ret);
7769 			goto err_stop;
7770 		}
7771 	}
7772 
7773 	mutex_unlock(&ar->conf_mutex);
7774 	return 0;
7775 
7776 err_stop:
7777 	ath10k_vdev_stop(arvif);
7778 	arvif->is_started = false;
7779 	ath10k_mac_vif_setup_ps(arvif);
7780 
7781 err:
7782 	mutex_unlock(&ar->conf_mutex);
7783 	return ret;
7784 }
7785 
7786 static void
7787 ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7788 				   struct ieee80211_vif *vif,
7789 				   struct ieee80211_chanctx_conf *ctx)
7790 {
7791 	struct ath10k *ar = hw->priv;
7792 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
7793 	int ret;
7794 
7795 	mutex_lock(&ar->conf_mutex);
7796 
7797 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7798 		   "mac chanctx unassign ptr %pK vdev_id %i\n",
7799 		   ctx, arvif->vdev_id);
7800 
7801 	WARN_ON(!arvif->is_started);
7802 
7803 	if (vif->type == NL80211_IFTYPE_MONITOR) {
7804 		WARN_ON(!arvif->is_up);
7805 
7806 		ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
7807 		if (ret)
7808 			ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
7809 				    arvif->vdev_id, ret);
7810 
7811 		arvif->is_up = false;
7812 	}
7813 
7814 	ret = ath10k_vdev_stop(arvif);
7815 	if (ret)
7816 		ath10k_warn(ar, "failed to stop vdev %i: %d\n",
7817 			    arvif->vdev_id, ret);
7818 
7819 	arvif->is_started = false;
7820 
7821 	mutex_unlock(&ar->conf_mutex);
7822 }
7823 
7824 static int
7825 ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7826 				 struct ieee80211_vif_chanctx_switch *vifs,
7827 				 int n_vifs,
7828 				 enum ieee80211_chanctx_switch_mode mode)
7829 {
7830 	struct ath10k *ar = hw->priv;
7831 
7832 	mutex_lock(&ar->conf_mutex);
7833 
7834 	ath10k_dbg(ar, ATH10K_DBG_MAC,
7835 		   "mac chanctx switch n_vifs %d mode %d\n",
7836 		   n_vifs, mode);
7837 	ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
7838 
7839 	mutex_unlock(&ar->conf_mutex);
7840 	return 0;
7841 }
7842 
7843 static void ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw *hw,
7844 					     struct ieee80211_vif *vif,
7845 					     struct ieee80211_sta *sta)
7846 {
7847 	struct ath10k *ar;
7848 	struct ath10k_peer *peer;
7849 
7850 	ar = hw->priv;
7851 
7852 	list_for_each_entry(peer, &ar->peers, list)
7853 		if (peer->sta == sta)
7854 			peer->removed = true;
7855 }
7856 
7857 static void ath10k_sta_statistics(struct ieee80211_hw *hw,
7858 				  struct ieee80211_vif *vif,
7859 				  struct ieee80211_sta *sta,
7860 				  struct station_info *sinfo)
7861 {
7862 	struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7863 	struct ath10k *ar = arsta->arvif->ar;
7864 
7865 	if (!ath10k_peer_stats_enabled(ar))
7866 		return;
7867 
7868 	sinfo->rx_duration = arsta->rx_duration;
7869 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
7870 
7871 	if (!arsta->txrate.legacy && !arsta->txrate.nss)
7872 		return;
7873 
7874 	if (arsta->txrate.legacy) {
7875 		sinfo->txrate.legacy = arsta->txrate.legacy;
7876 	} else {
7877 		sinfo->txrate.mcs = arsta->txrate.mcs;
7878 		sinfo->txrate.nss = arsta->txrate.nss;
7879 		sinfo->txrate.bw = arsta->txrate.bw;
7880 	}
7881 	sinfo->txrate.flags = arsta->txrate.flags;
7882 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
7883 }
7884 
7885 static const struct ieee80211_ops ath10k_ops = {
7886 	.tx				= ath10k_mac_op_tx,
7887 	.wake_tx_queue			= ath10k_mac_op_wake_tx_queue,
7888 	.start				= ath10k_start,
7889 	.stop				= ath10k_stop,
7890 	.config				= ath10k_config,
7891 	.add_interface			= ath10k_add_interface,
7892 	.remove_interface		= ath10k_remove_interface,
7893 	.configure_filter		= ath10k_configure_filter,
7894 	.bss_info_changed		= ath10k_bss_info_changed,
7895 	.set_coverage_class		= ath10k_mac_op_set_coverage_class,
7896 	.hw_scan			= ath10k_hw_scan,
7897 	.cancel_hw_scan			= ath10k_cancel_hw_scan,
7898 	.set_key			= ath10k_set_key,
7899 	.set_default_unicast_key        = ath10k_set_default_unicast_key,
7900 	.sta_state			= ath10k_sta_state,
7901 	.conf_tx			= ath10k_conf_tx,
7902 	.remain_on_channel		= ath10k_remain_on_channel,
7903 	.cancel_remain_on_channel	= ath10k_cancel_remain_on_channel,
7904 	.set_rts_threshold		= ath10k_set_rts_threshold,
7905 	.set_frag_threshold		= ath10k_mac_op_set_frag_threshold,
7906 	.flush				= ath10k_flush,
7907 	.tx_last_beacon			= ath10k_tx_last_beacon,
7908 	.set_antenna			= ath10k_set_antenna,
7909 	.get_antenna			= ath10k_get_antenna,
7910 	.reconfig_complete		= ath10k_reconfig_complete,
7911 	.get_survey			= ath10k_get_survey,
7912 	.set_bitrate_mask		= ath10k_mac_op_set_bitrate_mask,
7913 	.sta_rc_update			= ath10k_sta_rc_update,
7914 	.offset_tsf			= ath10k_offset_tsf,
7915 	.ampdu_action			= ath10k_ampdu_action,
7916 	.get_et_sset_count		= ath10k_debug_get_et_sset_count,
7917 	.get_et_stats			= ath10k_debug_get_et_stats,
7918 	.get_et_strings			= ath10k_debug_get_et_strings,
7919 	.add_chanctx			= ath10k_mac_op_add_chanctx,
7920 	.remove_chanctx			= ath10k_mac_op_remove_chanctx,
7921 	.change_chanctx			= ath10k_mac_op_change_chanctx,
7922 	.assign_vif_chanctx		= ath10k_mac_op_assign_vif_chanctx,
7923 	.unassign_vif_chanctx		= ath10k_mac_op_unassign_vif_chanctx,
7924 	.switch_vif_chanctx		= ath10k_mac_op_switch_vif_chanctx,
7925 	.sta_pre_rcu_remove		= ath10k_mac_op_sta_pre_rcu_remove,
7926 	.sta_statistics			= ath10k_sta_statistics,
7927 
7928 	CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
7929 
7930 #ifdef CONFIG_PM
7931 	.suspend			= ath10k_wow_op_suspend,
7932 	.resume				= ath10k_wow_op_resume,
7933 	.set_wakeup			= ath10k_wow_op_set_wakeup,
7934 #endif
7935 #ifdef CONFIG_MAC80211_DEBUGFS
7936 	.sta_add_debugfs		= ath10k_sta_add_debugfs,
7937 #endif
7938 };
7939 
7940 #define CHAN2G(_channel, _freq, _flags) { \
7941 	.band			= NL80211_BAND_2GHZ, \
7942 	.hw_value		= (_channel), \
7943 	.center_freq		= (_freq), \
7944 	.flags			= (_flags), \
7945 	.max_antenna_gain	= 0, \
7946 	.max_power		= 30, \
7947 }
7948 
7949 #define CHAN5G(_channel, _freq, _flags) { \
7950 	.band			= NL80211_BAND_5GHZ, \
7951 	.hw_value		= (_channel), \
7952 	.center_freq		= (_freq), \
7953 	.flags			= (_flags), \
7954 	.max_antenna_gain	= 0, \
7955 	.max_power		= 30, \
7956 }
7957 
7958 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
7959 	CHAN2G(1, 2412, 0),
7960 	CHAN2G(2, 2417, 0),
7961 	CHAN2G(3, 2422, 0),
7962 	CHAN2G(4, 2427, 0),
7963 	CHAN2G(5, 2432, 0),
7964 	CHAN2G(6, 2437, 0),
7965 	CHAN2G(7, 2442, 0),
7966 	CHAN2G(8, 2447, 0),
7967 	CHAN2G(9, 2452, 0),
7968 	CHAN2G(10, 2457, 0),
7969 	CHAN2G(11, 2462, 0),
7970 	CHAN2G(12, 2467, 0),
7971 	CHAN2G(13, 2472, 0),
7972 	CHAN2G(14, 2484, 0),
7973 };
7974 
7975 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
7976 	CHAN5G(36, 5180, 0),
7977 	CHAN5G(40, 5200, 0),
7978 	CHAN5G(44, 5220, 0),
7979 	CHAN5G(48, 5240, 0),
7980 	CHAN5G(52, 5260, 0),
7981 	CHAN5G(56, 5280, 0),
7982 	CHAN5G(60, 5300, 0),
7983 	CHAN5G(64, 5320, 0),
7984 	CHAN5G(100, 5500, 0),
7985 	CHAN5G(104, 5520, 0),
7986 	CHAN5G(108, 5540, 0),
7987 	CHAN5G(112, 5560, 0),
7988 	CHAN5G(116, 5580, 0),
7989 	CHAN5G(120, 5600, 0),
7990 	CHAN5G(124, 5620, 0),
7991 	CHAN5G(128, 5640, 0),
7992 	CHAN5G(132, 5660, 0),
7993 	CHAN5G(136, 5680, 0),
7994 	CHAN5G(140, 5700, 0),
7995 	CHAN5G(144, 5720, 0),
7996 	CHAN5G(149, 5745, 0),
7997 	CHAN5G(153, 5765, 0),
7998 	CHAN5G(157, 5785, 0),
7999 	CHAN5G(161, 5805, 0),
8000 	CHAN5G(165, 5825, 0),
8001 	CHAN5G(169, 5845, 0),
8002 	CHAN5G(173, 5865, 0),
8003 	/* If you add more, you may need to change ATH10K_MAX_5G_CHAN */
8004 	/* And you will definitely need to change ATH10K_NUM_CHANS in core.h */
8005 };
8006 
8007 struct ath10k *ath10k_mac_create(size_t priv_size)
8008 {
8009 	struct ieee80211_hw *hw;
8010 	struct ieee80211_ops *ops;
8011 	struct ath10k *ar;
8012 
8013 	ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
8014 	if (!ops)
8015 		return NULL;
8016 
8017 	hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
8018 	if (!hw) {
8019 		kfree(ops);
8020 		return NULL;
8021 	}
8022 
8023 	ar = hw->priv;
8024 	ar->hw = hw;
8025 	ar->ops = ops;
8026 
8027 	return ar;
8028 }
8029 
8030 void ath10k_mac_destroy(struct ath10k *ar)
8031 {
8032 	struct ieee80211_ops *ops = ar->ops;
8033 
8034 	ieee80211_free_hw(ar->hw);
8035 	kfree(ops);
8036 }
8037 
8038 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
8039 	{
8040 		.max	= 8,
8041 		.types	= BIT(NL80211_IFTYPE_STATION)
8042 			| BIT(NL80211_IFTYPE_P2P_CLIENT)
8043 	},
8044 	{
8045 		.max	= 3,
8046 		.types	= BIT(NL80211_IFTYPE_P2P_GO)
8047 	},
8048 	{
8049 		.max	= 1,
8050 		.types	= BIT(NL80211_IFTYPE_P2P_DEVICE)
8051 	},
8052 	{
8053 		.max	= 7,
8054 		.types	= BIT(NL80211_IFTYPE_AP)
8055 #ifdef CONFIG_MAC80211_MESH
8056 			| BIT(NL80211_IFTYPE_MESH_POINT)
8057 #endif
8058 	},
8059 };
8060 
8061 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
8062 	{
8063 		.max	= 8,
8064 		.types	= BIT(NL80211_IFTYPE_AP)
8065 #ifdef CONFIG_MAC80211_MESH
8066 			| BIT(NL80211_IFTYPE_MESH_POINT)
8067 #endif
8068 	},
8069 	{
8070 		.max	= 1,
8071 		.types	= BIT(NL80211_IFTYPE_STATION)
8072 	},
8073 };
8074 
8075 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
8076 	{
8077 		.limits = ath10k_if_limits,
8078 		.n_limits = ARRAY_SIZE(ath10k_if_limits),
8079 		.max_interfaces = 8,
8080 		.num_different_channels = 1,
8081 		.beacon_int_infra_match = true,
8082 	},
8083 };
8084 
8085 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
8086 	{
8087 		.limits = ath10k_10x_if_limits,
8088 		.n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
8089 		.max_interfaces = 8,
8090 		.num_different_channels = 1,
8091 		.beacon_int_infra_match = true,
8092 		.beacon_int_min_gcd = 1,
8093 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
8094 		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8095 					BIT(NL80211_CHAN_WIDTH_20) |
8096 					BIT(NL80211_CHAN_WIDTH_40) |
8097 					BIT(NL80211_CHAN_WIDTH_80),
8098 #endif
8099 	},
8100 };
8101 
8102 static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
8103 	{
8104 		.max = 2,
8105 		.types = BIT(NL80211_IFTYPE_STATION),
8106 	},
8107 	{
8108 		.max = 2,
8109 		.types = BIT(NL80211_IFTYPE_AP) |
8110 #ifdef CONFIG_MAC80211_MESH
8111 			 BIT(NL80211_IFTYPE_MESH_POINT) |
8112 #endif
8113 			 BIT(NL80211_IFTYPE_P2P_CLIENT) |
8114 			 BIT(NL80211_IFTYPE_P2P_GO),
8115 	},
8116 	{
8117 		.max = 1,
8118 		.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
8119 	},
8120 };
8121 
8122 static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
8123 	{
8124 		.max = 2,
8125 		.types = BIT(NL80211_IFTYPE_STATION),
8126 	},
8127 	{
8128 		.max = 2,
8129 		.types = BIT(NL80211_IFTYPE_P2P_CLIENT),
8130 	},
8131 	{
8132 		.max = 1,
8133 		.types = BIT(NL80211_IFTYPE_AP) |
8134 #ifdef CONFIG_MAC80211_MESH
8135 			 BIT(NL80211_IFTYPE_MESH_POINT) |
8136 #endif
8137 			 BIT(NL80211_IFTYPE_P2P_GO),
8138 	},
8139 	{
8140 		.max = 1,
8141 		.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
8142 	},
8143 };
8144 
8145 static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
8146 	{
8147 		.max = 1,
8148 		.types = BIT(NL80211_IFTYPE_STATION),
8149 	},
8150 	{
8151 		.max = 1,
8152 		.types = BIT(NL80211_IFTYPE_ADHOC),
8153 	},
8154 };
8155 
8156 /* FIXME: This is not thouroughly tested. These combinations may over- or
8157  * underestimate hw/fw capabilities.
8158  */
8159 static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
8160 	{
8161 		.limits = ath10k_tlv_if_limit,
8162 		.num_different_channels = 1,
8163 		.max_interfaces = 4,
8164 		.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
8165 	},
8166 	{
8167 		.limits = ath10k_tlv_if_limit_ibss,
8168 		.num_different_channels = 1,
8169 		.max_interfaces = 2,
8170 		.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
8171 	},
8172 };
8173 
8174 static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
8175 	{
8176 		.limits = ath10k_tlv_if_limit,
8177 		.num_different_channels = 1,
8178 		.max_interfaces = 4,
8179 		.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
8180 	},
8181 	{
8182 		.limits = ath10k_tlv_qcs_if_limit,
8183 		.num_different_channels = 2,
8184 		.max_interfaces = 4,
8185 		.n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
8186 	},
8187 	{
8188 		.limits = ath10k_tlv_if_limit_ibss,
8189 		.num_different_channels = 1,
8190 		.max_interfaces = 2,
8191 		.n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
8192 	},
8193 };
8194 
8195 static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
8196 	{
8197 		.max = 1,
8198 		.types = BIT(NL80211_IFTYPE_STATION),
8199 	},
8200 	{
8201 		.max	= 16,
8202 		.types	= BIT(NL80211_IFTYPE_AP)
8203 #ifdef CONFIG_MAC80211_MESH
8204 			| BIT(NL80211_IFTYPE_MESH_POINT)
8205 #endif
8206 	},
8207 };
8208 
8209 static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
8210 	{
8211 		.limits = ath10k_10_4_if_limits,
8212 		.n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
8213 		.max_interfaces = 16,
8214 		.num_different_channels = 1,
8215 		.beacon_int_infra_match = true,
8216 		.beacon_int_min_gcd = 1,
8217 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
8218 		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8219 					BIT(NL80211_CHAN_WIDTH_20) |
8220 					BIT(NL80211_CHAN_WIDTH_40) |
8221 					BIT(NL80211_CHAN_WIDTH_80),
8222 #endif
8223 	},
8224 };
8225 
8226 static const struct
8227 ieee80211_iface_combination ath10k_10_4_bcn_int_if_comb[] = {
8228 	{
8229 		.limits = ath10k_10_4_if_limits,
8230 		.n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
8231 		.max_interfaces = 16,
8232 		.num_different_channels = 1,
8233 		.beacon_int_infra_match = true,
8234 		.beacon_int_min_gcd = 100,
8235 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
8236 		.radar_detect_widths =  BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8237 					BIT(NL80211_CHAN_WIDTH_20) |
8238 					BIT(NL80211_CHAN_WIDTH_40) |
8239 					BIT(NL80211_CHAN_WIDTH_80),
8240 #endif
8241 	},
8242 };
8243 
8244 static void ath10k_get_arvif_iter(void *data, u8 *mac,
8245 				  struct ieee80211_vif *vif)
8246 {
8247 	struct ath10k_vif_iter *arvif_iter = data;
8248 	struct ath10k_vif *arvif = (void *)vif->drv_priv;
8249 
8250 	if (arvif->vdev_id == arvif_iter->vdev_id)
8251 		arvif_iter->arvif = arvif;
8252 }
8253 
8254 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
8255 {
8256 	struct ath10k_vif_iter arvif_iter;
8257 	u32 flags;
8258 
8259 	memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
8260 	arvif_iter.vdev_id = vdev_id;
8261 
8262 	flags = IEEE80211_IFACE_ITER_RESUME_ALL;
8263 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
8264 						   flags,
8265 						   ath10k_get_arvif_iter,
8266 						   &arvif_iter);
8267 	if (!arvif_iter.arvif) {
8268 		ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
8269 		return NULL;
8270 	}
8271 
8272 	return arvif_iter.arvif;
8273 }
8274 
8275 #define WRD_METHOD "WRDD"
8276 #define WRDD_WIFI  (0x07)
8277 
8278 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd)
8279 {
8280 	union acpi_object *mcc_pkg;
8281 	union acpi_object *domain_type;
8282 	union acpi_object *mcc_value;
8283 	u32 i;
8284 
8285 	if (wrdd->type != ACPI_TYPE_PACKAGE ||
8286 	    wrdd->package.count < 2 ||
8287 	    wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
8288 	    wrdd->package.elements[0].integer.value != 0) {
8289 		ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n");
8290 		return 0;
8291 	}
8292 
8293 	for (i = 1; i < wrdd->package.count; ++i) {
8294 		mcc_pkg = &wrdd->package.elements[i];
8295 
8296 		if (mcc_pkg->type != ACPI_TYPE_PACKAGE)
8297 			continue;
8298 		if (mcc_pkg->package.count < 2)
8299 			continue;
8300 		if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
8301 		    mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
8302 			continue;
8303 
8304 		domain_type = &mcc_pkg->package.elements[0];
8305 		if (domain_type->integer.value != WRDD_WIFI)
8306 			continue;
8307 
8308 		mcc_value = &mcc_pkg->package.elements[1];
8309 		return mcc_value->integer.value;
8310 	}
8311 	return 0;
8312 }
8313 
8314 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
8315 {
8316 	struct pci_dev __maybe_unused *pdev = to_pci_dev(ar->dev);
8317 	acpi_handle root_handle;
8318 	acpi_handle handle;
8319 	struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
8320 	acpi_status status;
8321 	u32 alpha2_code;
8322 	char alpha2[3];
8323 
8324 	root_handle = ACPI_HANDLE(&pdev->dev);
8325 	if (!root_handle)
8326 		return -EOPNOTSUPP;
8327 
8328 	status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
8329 	if (ACPI_FAILURE(status)) {
8330 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
8331 			   "failed to get wrd method %d\n", status);
8332 		return -EIO;
8333 	}
8334 
8335 	status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
8336 	if (ACPI_FAILURE(status)) {
8337 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
8338 			   "failed to call wrdc %d\n", status);
8339 		return -EIO;
8340 	}
8341 
8342 	alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer);
8343 	kfree(wrdd.pointer);
8344 	if (!alpha2_code)
8345 		return -EIO;
8346 
8347 	alpha2[0] = (alpha2_code >> 8) & 0xff;
8348 	alpha2[1] = (alpha2_code >> 0) & 0xff;
8349 	alpha2[2] = '\0';
8350 
8351 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
8352 		   "regulatory hint from WRDD (alpha2-code): %s\n", alpha2);
8353 
8354 	*rd = ath_regd_find_country_by_name(alpha2);
8355 	if (*rd == 0xffff)
8356 		return -EIO;
8357 
8358 	*rd |= COUNTRY_ERD_FLAG;
8359 	return 0;
8360 }
8361 
8362 static int ath10k_mac_init_rd(struct ath10k *ar)
8363 {
8364 	int ret;
8365 	u16 rd;
8366 
8367 	ret = ath10k_mac_get_wrdd_regulatory(ar, &rd);
8368 	if (ret) {
8369 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
8370 			   "fallback to eeprom programmed regulatory settings\n");
8371 		rd = ar->hw_eeprom_rd;
8372 	}
8373 
8374 	ar->ath_common.regulatory.current_rd = rd;
8375 	return 0;
8376 }
8377 
8378 int ath10k_mac_register(struct ath10k *ar)
8379 {
8380 	static const u32 cipher_suites[] = {
8381 		WLAN_CIPHER_SUITE_WEP40,
8382 		WLAN_CIPHER_SUITE_WEP104,
8383 		WLAN_CIPHER_SUITE_TKIP,
8384 		WLAN_CIPHER_SUITE_CCMP,
8385 
8386 		/* Do not add hardware supported ciphers before this line.
8387 		 * Allow software encryption for all chips. Don't forget to
8388 		 * update n_cipher_suites below.
8389 		 */
8390 		WLAN_CIPHER_SUITE_AES_CMAC,
8391 		WLAN_CIPHER_SUITE_BIP_CMAC_256,
8392 		WLAN_CIPHER_SUITE_BIP_GMAC_128,
8393 		WLAN_CIPHER_SUITE_BIP_GMAC_256,
8394 
8395 		/* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
8396 		 * and CCMP-256 in hardware.
8397 		 */
8398 		WLAN_CIPHER_SUITE_GCMP,
8399 		WLAN_CIPHER_SUITE_GCMP_256,
8400 		WLAN_CIPHER_SUITE_CCMP_256,
8401 	};
8402 	struct ieee80211_supported_band *band;
8403 	void *channels;
8404 	int ret;
8405 
8406 	if (!is_valid_ether_addr(ar->mac_addr)) {
8407 		ath10k_warn(ar, "invalid MAC address; choosing random\n");
8408 		eth_random_addr(ar->mac_addr);
8409 	}
8410 	SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
8411 
8412 	SET_IEEE80211_DEV(ar->hw, ar->dev);
8413 
8414 	BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
8415 		      ARRAY_SIZE(ath10k_5ghz_channels)) !=
8416 		     ATH10K_NUM_CHANS);
8417 
8418 	if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
8419 		channels = kmemdup(ath10k_2ghz_channels,
8420 				   sizeof(ath10k_2ghz_channels),
8421 				   GFP_KERNEL);
8422 		if (!channels) {
8423 			ret = -ENOMEM;
8424 			goto err_free;
8425 		}
8426 
8427 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8428 		band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
8429 		band->channels = channels;
8430 
8431 		if (ar->hw_params.cck_rate_map_rev2) {
8432 			band->n_bitrates = ath10k_g_rates_rev2_size;
8433 			band->bitrates = ath10k_g_rates_rev2;
8434 		} else {
8435 			band->n_bitrates = ath10k_g_rates_size;
8436 			band->bitrates = ath10k_g_rates;
8437 		}
8438 
8439 		ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
8440 	}
8441 
8442 	if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
8443 		channels = kmemdup(ath10k_5ghz_channels,
8444 				   sizeof(ath10k_5ghz_channels),
8445 				   GFP_KERNEL);
8446 		if (!channels) {
8447 			ret = -ENOMEM;
8448 			goto err_free;
8449 		}
8450 
8451 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8452 		band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
8453 		band->channels = channels;
8454 		band->n_bitrates = ath10k_a_rates_size;
8455 		band->bitrates = ath10k_a_rates;
8456 		ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
8457 	}
8458 
8459 	wiphy_read_of_freq_limits(ar->hw->wiphy);
8460 	ath10k_mac_setup_ht_vht_cap(ar);
8461 
8462 	ar->hw->wiphy->interface_modes =
8463 		BIT(NL80211_IFTYPE_STATION) |
8464 		BIT(NL80211_IFTYPE_AP) |
8465 		BIT(NL80211_IFTYPE_MESH_POINT);
8466 
8467 	ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
8468 	ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
8469 
8470 	if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features))
8471 		ar->hw->wiphy->interface_modes |=
8472 			BIT(NL80211_IFTYPE_P2P_DEVICE) |
8473 			BIT(NL80211_IFTYPE_P2P_CLIENT) |
8474 			BIT(NL80211_IFTYPE_P2P_GO);
8475 
8476 	ieee80211_hw_set(ar->hw, SIGNAL_DBM);
8477 
8478 	if (!test_bit(ATH10K_FW_FEATURE_NO_PS,
8479 		      ar->running_fw->fw_file.fw_features)) {
8480 		ieee80211_hw_set(ar->hw, SUPPORTS_PS);
8481 		ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
8482 	}
8483 
8484 	ieee80211_hw_set(ar->hw, MFP_CAPABLE);
8485 	ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
8486 	ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
8487 	ieee80211_hw_set(ar->hw, AP_LINK_PS);
8488 	ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
8489 	ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
8490 	ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
8491 	ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
8492 	ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
8493 	ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
8494 	ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
8495 	ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
8496 	ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
8497 
8498 	if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
8499 		ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
8500 
8501 	ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8502 	ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8503 
8504 	if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
8505 		ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8506 
8507 	if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
8508 		ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8509 		ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8510 	}
8511 
8512 	ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8513 	ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8514 
8515 	if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) {
8516 		ar->hw->wiphy->max_sched_scan_reqs = 1;
8517 		ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
8518 		ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
8519 		ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
8520 		ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
8521 		ar->hw->wiphy->max_sched_scan_plan_interval =
8522 			WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
8523 		ar->hw->wiphy->max_sched_scan_plan_iterations =
8524 			WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
8525 	}
8526 
8527 	ar->hw->vif_data_size = sizeof(struct ath10k_vif);
8528 	ar->hw->sta_data_size = sizeof(struct ath10k_sta);
8529 	ar->hw->txq_data_size = sizeof(struct ath10k_txq);
8530 
8531 	ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
8532 
8533 	if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
8534 		ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
8535 
8536 		/* Firmware delivers WPS/P2P Probe Requests frames to driver so
8537 		 * that userspace (e.g. wpa_supplicant/hostapd) can generate
8538 		 * correct Probe Responses. This is more of a hack advert..
8539 		 */
8540 		ar->hw->wiphy->probe_resp_offload |=
8541 			NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
8542 			NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
8543 			NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
8544 	}
8545 
8546 	if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) ||
8547 	    test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) {
8548 		ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
8549 		if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map))
8550 			ieee80211_hw_set(ar->hw, TDLS_WIDER_BW);
8551 	}
8552 
8553 	if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
8554 		ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
8555 
8556 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8557 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8558 	ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8559 
8560 	ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8561 	ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8562 				   NL80211_FEATURE_AP_SCAN;
8563 
8564 	ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8565 
8566 	ret = ath10k_wow_init(ar);
8567 	if (ret) {
8568 		ath10k_warn(ar, "failed to init wow: %d\n", ret);
8569 		goto err_free;
8570 	}
8571 
8572 	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
8573 	wiphy_ext_feature_set(ar->hw->wiphy,
8574 			      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
8575 
8576 	if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
8577 	    test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
8578 		wiphy_ext_feature_set(ar->hw->wiphy,
8579 				      NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
8580 
8581 	/*
8582 	 * on LL hardware queues are managed entirely by the FW
8583 	 * so we only advertise to mac we can do the queues thing
8584 	 */
8585 	ar->hw->queues = IEEE80211_MAX_QUEUES;
8586 
8587 	/* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
8588 	 * something that vdev_ids can't reach so that we don't stop the queue
8589 	 * accidentally.
8590 	 */
8591 	ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
8592 
8593 	switch (ar->running_fw->fw_file.wmi_op_version) {
8594 	case ATH10K_FW_WMI_OP_VERSION_MAIN:
8595 		ar->hw->wiphy->iface_combinations = ath10k_if_comb;
8596 		ar->hw->wiphy->n_iface_combinations =
8597 			ARRAY_SIZE(ath10k_if_comb);
8598 		ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
8599 		break;
8600 	case ATH10K_FW_WMI_OP_VERSION_TLV:
8601 		if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
8602 			ar->hw->wiphy->iface_combinations =
8603 				ath10k_tlv_qcs_if_comb;
8604 			ar->hw->wiphy->n_iface_combinations =
8605 				ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
8606 		} else {
8607 			ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
8608 			ar->hw->wiphy->n_iface_combinations =
8609 				ARRAY_SIZE(ath10k_tlv_if_comb);
8610 		}
8611 		ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
8612 		break;
8613 	case ATH10K_FW_WMI_OP_VERSION_10_1:
8614 	case ATH10K_FW_WMI_OP_VERSION_10_2:
8615 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
8616 		ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
8617 		ar->hw->wiphy->n_iface_combinations =
8618 			ARRAY_SIZE(ath10k_10x_if_comb);
8619 		break;
8620 	case ATH10K_FW_WMI_OP_VERSION_10_4:
8621 		ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
8622 		ar->hw->wiphy->n_iface_combinations =
8623 			ARRAY_SIZE(ath10k_10_4_if_comb);
8624 		if (test_bit(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT,
8625 			     ar->wmi.svc_map)) {
8626 			ar->hw->wiphy->iface_combinations =
8627 				ath10k_10_4_bcn_int_if_comb;
8628 			ar->hw->wiphy->n_iface_combinations =
8629 				ARRAY_SIZE(ath10k_10_4_bcn_int_if_comb);
8630 		}
8631 		break;
8632 	case ATH10K_FW_WMI_OP_VERSION_UNSET:
8633 	case ATH10K_FW_WMI_OP_VERSION_MAX:
8634 		WARN_ON(1);
8635 		ret = -EINVAL;
8636 		goto err_free;
8637 	}
8638 
8639 	if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
8640 		ar->hw->netdev_features = NETIF_F_HW_CSUM;
8641 
8642 	if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
8643 		/* Init ath dfs pattern detector */
8644 		ar->ath_common.debug_mask = ATH_DBG_DFS;
8645 		ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
8646 							     NL80211_DFS_UNSET);
8647 
8648 		if (!ar->dfs_detector)
8649 			ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
8650 	}
8651 
8652 	ret = ath10k_mac_init_rd(ar);
8653 	if (ret) {
8654 		ath10k_err(ar, "failed to derive regdom: %d\n", ret);
8655 		goto err_dfs_detector_exit;
8656 	}
8657 
8658 	/* Disable set_coverage_class for chipsets that do not support it. */
8659 	if (!ar->hw_params.hw_ops->set_coverage_class)
8660 		ar->ops->set_coverage_class = NULL;
8661 
8662 	ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
8663 			    ath10k_reg_notifier);
8664 	if (ret) {
8665 		ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
8666 		goto err_dfs_detector_exit;
8667 	}
8668 
8669 	if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
8670 		ar->hw->wiphy->features |=
8671 			NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8672 	}
8673 
8674 	ar->hw->wiphy->cipher_suites = cipher_suites;
8675 
8676 	/* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
8677 	 * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
8678 	 * from chip specific hw_param table.
8679 	 */
8680 	if (!ar->hw_params.n_cipher_suites ||
8681 	    ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
8682 		ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
8683 			   ar->hw_params.n_cipher_suites);
8684 		ar->hw_params.n_cipher_suites = 8;
8685 	}
8686 	ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
8687 
8688 	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8689 
8690 	ret = ieee80211_register_hw(ar->hw);
8691 	if (ret) {
8692 		ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
8693 		goto err_dfs_detector_exit;
8694 	}
8695 
8696 	if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
8697 		ret = regulatory_hint(ar->hw->wiphy,
8698 				      ar->ath_common.regulatory.alpha2);
8699 		if (ret)
8700 			goto err_unregister;
8701 	}
8702 
8703 	return 0;
8704 
8705 err_unregister:
8706 	ieee80211_unregister_hw(ar->hw);
8707 
8708 err_dfs_detector_exit:
8709 	if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
8710 		ar->dfs_detector->exit(ar->dfs_detector);
8711 
8712 err_free:
8713 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8714 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8715 
8716 	SET_IEEE80211_DEV(ar->hw, NULL);
8717 	return ret;
8718 }
8719 
8720 void ath10k_mac_unregister(struct ath10k *ar)
8721 {
8722 	ieee80211_unregister_hw(ar->hw);
8723 
8724 	if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
8725 		ar->dfs_detector->exit(ar->dfs_detector);
8726 
8727 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8728 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8729 
8730 	SET_IEEE80211_DEV(ar->hw, NULL);
8731 }
8732