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