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