blob: 484c1a10372f13a9fead3d7c4f4368080ab9f10a [file] [log] [blame]
Kalle Valo5e3dd152013-06-12 20:52:10 +03001/*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include "mac.h"
19
20#include <net/mac80211.h>
21#include <linux/etherdevice.h>
22
Michal Kazior8cd13ca2013-07-16 09:38:54 +020023#include "hif.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030024#include "core.h"
25#include "debug.h"
26#include "wmi.h"
27#include "htt.h"
28#include "txrx.h"
Kalle Valo43d2a302014-09-10 18:23:30 +030029#include "testmode.h"
Michal Kaziord7579d12014-12-03 10:10:54 +020030#include "wmi.h"
Michal Kaziorb4aa5392015-03-31 10:26:24 +000031#include "wmi-tlv.h"
Michal Kaziord7579d12014-12-03 10:10:54 +020032#include "wmi-ops.h"
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +020033#include "wow.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030034
Michal Kaziordcc33092015-03-30 09:51:54 +030035/*********/
36/* Rates */
37/*********/
38
Michal Kaziordcc33092015-03-30 09:51:54 +030039static struct ieee80211_rate ath10k_rates[] = {
Michal Kazior5528e032015-03-30 09:51:56 +030040 { .bitrate = 10,
41 .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
42 { .bitrate = 20,
43 .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
44 .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
45 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
46 { .bitrate = 55,
47 .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
48 .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
49 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
50 { .bitrate = 110,
51 .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
52 .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
53 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
Michal Kazior5653b392015-03-30 09:51:54 +030054
Michal Kazioraf001482015-03-30 09:51:56 +030055 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
56 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
57 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
58 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
59 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
60 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
61 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
62 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
Michal Kaziordcc33092015-03-30 09:51:54 +030063};
64
Michal Kazior8d7aa6b2015-03-30 09:51:57 +030065#define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
66
67#define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
68#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
69 ATH10K_MAC_FIRST_OFDM_RATE_IDX)
Michal Kaziordcc33092015-03-30 09:51:54 +030070#define ath10k_g_rates (ath10k_rates + 0)
71#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
72
Michal Kazior486017c2015-03-30 09:51:54 +030073static bool ath10k_mac_bitrate_is_cck(int bitrate)
74{
75 switch (bitrate) {
76 case 10:
77 case 20:
78 case 55:
79 case 110:
80 return true;
81 }
82
83 return false;
84}
85
86static u8 ath10k_mac_bitrate_to_rate(int bitrate)
87{
88 return DIV_ROUND_UP(bitrate, 5) |
89 (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
90}
91
Michal Kazior5528e032015-03-30 09:51:56 +030092u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
93 u8 hw_rate)
94{
95 const struct ieee80211_rate *rate;
96 int i;
97
98 for (i = 0; i < sband->n_bitrates; i++) {
99 rate = &sband->bitrates[i];
100
101 if (rate->hw_value == hw_rate)
102 return i;
103 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
104 rate->hw_value_short == hw_rate)
105 return i;
106 }
107
108 return 0;
109}
110
Michal Kazior01cebe12015-03-30 09:51:56 +0300111u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
112 u32 bitrate)
113{
114 int i;
115
116 for (i = 0; i < sband->n_bitrates; i++)
117 if (sband->bitrates[i].bitrate == bitrate)
118 return i;
119
120 return 0;
121}
122
Michal Kazior3ae54222015-03-31 10:49:20 +0000123static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
124{
125 switch ((mcs_map >> (2 * nss)) & 0x3) {
126 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
127 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
128 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
129 }
130 return 0;
131}
132
Michal Kazior45c9abc2015-04-21 20:42:58 +0300133static u32
134ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
135{
136 int nss;
137
138 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
139 if (ht_mcs_mask[nss])
140 return nss + 1;
141
142 return 1;
143}
144
145static u32
146ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
147{
148 int nss;
149
150 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
151 if (vht_mcs_mask[nss])
152 return nss + 1;
153
154 return 1;
155}
Kalle Valo5e3dd152013-06-12 20:52:10 +0300156
157/**********/
158/* Crypto */
159/**********/
160
161static int ath10k_send_key(struct ath10k_vif *arvif,
162 struct ieee80211_key_conf *key,
163 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100164 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300165{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200166 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300167 struct wmi_vdev_install_key_arg arg = {
168 .vdev_id = arvif->vdev_id,
169 .key_idx = key->keyidx,
170 .key_len = key->keylen,
171 .key_data = key->key,
Michal Kazior370e5672015-02-18 14:02:26 +0100172 .key_flags = flags,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300173 .macaddr = macaddr,
174 };
175
Michal Kazior548db542013-07-05 16:15:15 +0300176 lockdep_assert_held(&arvif->ar->conf_mutex);
177
Kalle Valo5e3dd152013-06-12 20:52:10 +0300178 switch (key->cipher) {
179 case WLAN_CIPHER_SUITE_CCMP:
180 arg.key_cipher = WMI_CIPHER_AES_CCM;
Marek Kwaczynskie4e82e92015-01-24 12:14:53 +0200181 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300182 break;
183 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300184 arg.key_cipher = WMI_CIPHER_TKIP;
185 arg.key_txmic_len = 8;
186 arg.key_rxmic_len = 8;
187 break;
188 case WLAN_CIPHER_SUITE_WEP40:
189 case WLAN_CIPHER_SUITE_WEP104:
190 arg.key_cipher = WMI_CIPHER_WEP;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300191 break;
Johannes Berg3cb10942015-01-22 21:38:45 +0100192 case WLAN_CIPHER_SUITE_AES_CMAC:
Bartosz Markowskid7131c02015-03-10 14:32:19 +0100193 WARN_ON(1);
194 return -EINVAL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300195 default:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200196 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300197 return -EOPNOTSUPP;
198 }
199
Kalle Valob9e284e2015-10-05 17:56:35 +0300200 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
David Liuccec9032015-07-24 20:25:32 +0300201 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
David Liuccec9032015-07-24 20:25:32 +0300202
Kalle Valo5e3dd152013-06-12 20:52:10 +0300203 if (cmd == DISABLE_KEY) {
204 arg.key_cipher = WMI_CIPHER_NONE;
205 arg.key_data = NULL;
206 }
207
208 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
209}
210
211static int ath10k_install_key(struct ath10k_vif *arvif,
212 struct ieee80211_key_conf *key,
213 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100214 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300215{
216 struct ath10k *ar = arvif->ar;
217 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300218 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300219
Michal Kazior548db542013-07-05 16:15:15 +0300220 lockdep_assert_held(&ar->conf_mutex);
221
Wolfram Sang16735d02013-11-14 14:32:02 -0800222 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300223
David Liuccec9032015-07-24 20:25:32 +0300224 if (arvif->nohwcrypt)
225 return 1;
226
Michal Kazior370e5672015-02-18 14:02:26 +0100227 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300228 if (ret)
229 return ret;
230
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300231 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
232 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300233 return -ETIMEDOUT;
234
235 return 0;
236}
237
238static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
239 const u8 *addr)
240{
241 struct ath10k *ar = arvif->ar;
242 struct ath10k_peer *peer;
243 int ret;
244 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100245 u32 flags;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300246
247 lockdep_assert_held(&ar->conf_mutex);
248
Michal Kazior8674d902015-08-13 14:10:46 +0200249 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
250 arvif->vif->type != NL80211_IFTYPE_ADHOC))
251 return -EINVAL;
252
Kalle Valo5e3dd152013-06-12 20:52:10 +0300253 spin_lock_bh(&ar->data_lock);
254 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
255 spin_unlock_bh(&ar->data_lock);
256
257 if (!peer)
258 return -ENOENT;
259
260 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
261 if (arvif->wep_keys[i] == NULL)
262 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100263
Michal Kazior8674d902015-08-13 14:10:46 +0200264 switch (arvif->vif->type) {
265 case NL80211_IFTYPE_AP:
266 flags = WMI_KEY_PAIRWISE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300267
Michal Kazior8674d902015-08-13 14:10:46 +0200268 if (arvif->def_wep_key_idx == i)
269 flags |= WMI_KEY_TX_USAGE;
Michal Kaziorce90b272015-04-10 13:23:21 +0000270
Michal Kazior8674d902015-08-13 14:10:46 +0200271 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
272 SET_KEY, addr, flags);
273 if (ret < 0)
274 return ret;
275 break;
276 case NL80211_IFTYPE_ADHOC:
277 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
278 SET_KEY, addr,
279 WMI_KEY_PAIRWISE);
280 if (ret < 0)
281 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300282
Michal Kazior8674d902015-08-13 14:10:46 +0200283 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
284 SET_KEY, addr, WMI_KEY_GROUP);
285 if (ret < 0)
286 return ret;
287 break;
288 default:
289 WARN_ON(1);
290 return -EINVAL;
291 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300292
Sujith Manoharanae167132014-11-25 11:46:59 +0530293 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300294 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530295 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300296 }
297
Michal Kaziorce90b272015-04-10 13:23:21 +0000298 /* In some cases (notably with static WEP IBSS with multiple keys)
299 * multicast Tx becomes broken. Both pairwise and groupwise keys are
300 * installed already. Using WMI_KEY_TX_USAGE in different combinations
301 * didn't seem help. Using def_keyid vdev parameter seems to be
302 * effective so use that.
303 *
304 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
305 */
Michal Kazior8674d902015-08-13 14:10:46 +0200306 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
307 return 0;
308
Michal Kaziorce90b272015-04-10 13:23:21 +0000309 if (arvif->def_wep_key_idx == -1)
310 return 0;
311
312 ret = ath10k_wmi_vdev_set_param(arvif->ar,
313 arvif->vdev_id,
314 arvif->ar->wmi.vdev_param->def_keyid,
315 arvif->def_wep_key_idx);
316 if (ret) {
317 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
318 arvif->vdev_id, ret);
319 return ret;
320 }
321
Kalle Valo5e3dd152013-06-12 20:52:10 +0300322 return 0;
323}
324
325static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
326 const u8 *addr)
327{
328 struct ath10k *ar = arvif->ar;
329 struct ath10k_peer *peer;
330 int first_errno = 0;
331 int ret;
332 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100333 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300334
335 lockdep_assert_held(&ar->conf_mutex);
336
337 spin_lock_bh(&ar->data_lock);
338 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
339 spin_unlock_bh(&ar->data_lock);
340
341 if (!peer)
342 return -ENOENT;
343
344 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
345 if (peer->keys[i] == NULL)
346 continue;
347
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200348 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300349 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100350 DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300351 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300352 first_errno = ret;
353
David Liuccec9032015-07-24 20:25:32 +0300354 if (ret < 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200355 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300356 i, ret);
357
Sujith Manoharanae167132014-11-25 11:46:59 +0530358 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300359 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530360 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300361 }
362
363 return first_errno;
364}
365
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530366bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
367 u8 keyidx)
368{
369 struct ath10k_peer *peer;
370 int i;
371
372 lockdep_assert_held(&ar->data_lock);
373
374 /* We don't know which vdev this peer belongs to,
375 * since WMI doesn't give us that information.
376 *
377 * FIXME: multi-bss needs to be handled.
378 */
379 peer = ath10k_peer_find(ar, 0, addr);
380 if (!peer)
381 return false;
382
383 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
384 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
385 return true;
386 }
387
388 return false;
389}
390
Kalle Valo5e3dd152013-06-12 20:52:10 +0300391static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
392 struct ieee80211_key_conf *key)
393{
394 struct ath10k *ar = arvif->ar;
395 struct ath10k_peer *peer;
396 u8 addr[ETH_ALEN];
397 int first_errno = 0;
398 int ret;
399 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100400 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300401
402 lockdep_assert_held(&ar->conf_mutex);
403
404 for (;;) {
405 /* since ath10k_install_key we can't hold data_lock all the
406 * time, so we try to remove the keys incrementally */
407 spin_lock_bh(&ar->data_lock);
408 i = 0;
409 list_for_each_entry(peer, &ar->peers, list) {
410 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
411 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300412 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300413 peer->keys[i] = NULL;
414 break;
415 }
416 }
417
418 if (i < ARRAY_SIZE(peer->keys))
419 break;
420 }
421 spin_unlock_bh(&ar->data_lock);
422
423 if (i == ARRAY_SIZE(peer->keys))
424 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200425 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100426 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300427 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300428 first_errno = ret;
429
430 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200431 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200432 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300433 }
434
435 return first_errno;
436}
437
Michal Kaziorad325cb2015-02-18 14:02:27 +0100438static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
439 struct ieee80211_key_conf *key)
440{
441 struct ath10k *ar = arvif->ar;
442 struct ath10k_peer *peer;
443 int ret;
444
445 lockdep_assert_held(&ar->conf_mutex);
446
447 list_for_each_entry(peer, &ar->peers, list) {
448 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
449 continue;
450
451 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
452 continue;
453
454 if (peer->keys[key->keyidx] == key)
455 continue;
456
457 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
458 arvif->vdev_id, key->keyidx);
459
460 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
461 if (ret) {
462 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
463 arvif->vdev_id, peer->addr, ret);
464 return ret;
465 }
466 }
467
468 return 0;
469}
470
Kalle Valo5e3dd152013-06-12 20:52:10 +0300471/*********************/
472/* General utilities */
473/*********************/
474
475static inline enum wmi_phy_mode
476chan_to_phymode(const struct cfg80211_chan_def *chandef)
477{
478 enum wmi_phy_mode phymode = MODE_UNKNOWN;
479
480 switch (chandef->chan->band) {
481 case IEEE80211_BAND_2GHZ:
482 switch (chandef->width) {
483 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800484 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
485 phymode = MODE_11B;
486 else
487 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300488 break;
489 case NL80211_CHAN_WIDTH_20:
490 phymode = MODE_11NG_HT20;
491 break;
492 case NL80211_CHAN_WIDTH_40:
493 phymode = MODE_11NG_HT40;
494 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400495 case NL80211_CHAN_WIDTH_5:
496 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300497 case NL80211_CHAN_WIDTH_80:
498 case NL80211_CHAN_WIDTH_80P80:
499 case NL80211_CHAN_WIDTH_160:
500 phymode = MODE_UNKNOWN;
501 break;
502 }
503 break;
504 case IEEE80211_BAND_5GHZ:
505 switch (chandef->width) {
506 case NL80211_CHAN_WIDTH_20_NOHT:
507 phymode = MODE_11A;
508 break;
509 case NL80211_CHAN_WIDTH_20:
510 phymode = MODE_11NA_HT20;
511 break;
512 case NL80211_CHAN_WIDTH_40:
513 phymode = MODE_11NA_HT40;
514 break;
515 case NL80211_CHAN_WIDTH_80:
516 phymode = MODE_11AC_VHT80;
517 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400518 case NL80211_CHAN_WIDTH_5:
519 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300520 case NL80211_CHAN_WIDTH_80P80:
521 case NL80211_CHAN_WIDTH_160:
522 phymode = MODE_UNKNOWN;
523 break;
524 }
525 break;
526 default:
527 break;
528 }
529
530 WARN_ON(phymode == MODE_UNKNOWN);
531 return phymode;
532}
533
534static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
535{
536/*
537 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
538 * 0 for no restriction
539 * 1 for 1/4 us
540 * 2 for 1/2 us
541 * 3 for 1 us
542 * 4 for 2 us
543 * 5 for 4 us
544 * 6 for 8 us
545 * 7 for 16 us
546 */
547 switch (mpdudensity) {
548 case 0:
549 return 0;
550 case 1:
551 case 2:
552 case 3:
553 /* Our lower layer calculations limit our precision to
554 1 microsecond */
555 return 1;
556 case 4:
557 return 2;
558 case 5:
559 return 4;
560 case 6:
561 return 8;
562 case 7:
563 return 16;
564 default:
565 return 0;
566 }
567}
568
Michal Kazior500ff9f2015-03-31 10:26:21 +0000569int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
570 struct cfg80211_chan_def *def)
571{
572 struct ieee80211_chanctx_conf *conf;
573
574 rcu_read_lock();
575 conf = rcu_dereference(vif->chanctx_conf);
576 if (!conf) {
577 rcu_read_unlock();
578 return -ENOENT;
579 }
580
581 *def = conf->def;
582 rcu_read_unlock();
583
584 return 0;
585}
586
587static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
588 struct ieee80211_chanctx_conf *conf,
589 void *data)
590{
591 int *num = data;
592
593 (*num)++;
594}
595
596static int ath10k_mac_num_chanctxs(struct ath10k *ar)
597{
598 int num = 0;
599
600 ieee80211_iter_chan_contexts_atomic(ar->hw,
601 ath10k_mac_num_chanctxs_iter,
602 &num);
603
604 return num;
605}
606
607static void
608ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
609 struct ieee80211_chanctx_conf *conf,
610 void *data)
611{
612 struct cfg80211_chan_def **def = data;
613
614 *def = &conf->def;
615}
616
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300617static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
618 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300619{
Michal Kaziore04cafb2015-08-05 12:15:24 +0200620 struct ath10k_vif *arvif;
621 int num_peers = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300622 int ret;
623
624 lockdep_assert_held(&ar->conf_mutex);
625
Michal Kaziore04cafb2015-08-05 12:15:24 +0200626 num_peers = ar->num_peers;
627
628 /* Each vdev consumes a peer entry as well */
629 list_for_each_entry(arvif, &ar->arvifs, list)
630 num_peers++;
631
632 if (num_peers >= ar->max_num_peers)
Michal Kaziorcfd10612014-11-25 15:16:05 +0100633 return -ENOBUFS;
634
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300635 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800636 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200637 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200638 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300639 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800640 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300641
642 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800643 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200644 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200645 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300646 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800647 }
Michal Kazior292a7532014-11-25 15:16:04 +0100648
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100649 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300650
651 return 0;
652}
653
Kalle Valo5a13e762014-01-20 11:01:46 +0200654static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
655{
656 struct ath10k *ar = arvif->ar;
657 u32 param;
658 int ret;
659
660 param = ar->wmi.pdev_param->sta_kickout_th;
661 ret = ath10k_wmi_pdev_set_param(ar, param,
662 ATH10K_KICKOUT_THRESHOLD);
663 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200664 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200665 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200666 return ret;
667 }
668
669 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
670 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
671 ATH10K_KEEPALIVE_MIN_IDLE);
672 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200673 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200674 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200675 return ret;
676 }
677
678 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
679 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
680 ATH10K_KEEPALIVE_MAX_IDLE);
681 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200682 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200683 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200684 return ret;
685 }
686
687 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
688 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
689 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
690 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200691 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200692 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200693 return ret;
694 }
695
696 return 0;
697}
698
Vivek Natarajanacab6402014-11-26 09:06:12 +0200699static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200700{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200701 struct ath10k *ar = arvif->ar;
702 u32 vdev_param;
703
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200704 vdev_param = ar->wmi.vdev_param->rts_threshold;
705 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200706}
707
Kalle Valo5e3dd152013-06-12 20:52:10 +0300708static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
709{
710 int ret;
711
712 lockdep_assert_held(&ar->conf_mutex);
713
714 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
715 if (ret)
716 return ret;
717
718 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
719 if (ret)
720 return ret;
721
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100722 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100723
Kalle Valo5e3dd152013-06-12 20:52:10 +0300724 return 0;
725}
726
727static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
728{
729 struct ath10k_peer *peer, *tmp;
730
731 lockdep_assert_held(&ar->conf_mutex);
732
733 spin_lock_bh(&ar->data_lock);
734 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
735 if (peer->vdev_id != vdev_id)
736 continue;
737
Michal Kazior7aa7a722014-08-25 12:09:38 +0200738 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300739 peer->addr, vdev_id);
740
741 list_del(&peer->list);
742 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100743 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300744 }
745 spin_unlock_bh(&ar->data_lock);
746}
747
Michal Kaziora96d7742013-07-16 09:38:56 +0200748static void ath10k_peer_cleanup_all(struct ath10k *ar)
749{
750 struct ath10k_peer *peer, *tmp;
751
752 lockdep_assert_held(&ar->conf_mutex);
753
754 spin_lock_bh(&ar->data_lock);
755 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
756 list_del(&peer->list);
757 kfree(peer);
758 }
759 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100760
761 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100762 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200763}
764
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300765static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
766 struct ieee80211_sta *sta,
767 enum wmi_tdls_peer_state state)
768{
769 int ret;
770 struct wmi_tdls_peer_update_cmd_arg arg = {};
771 struct wmi_tdls_peer_capab_arg cap = {};
772 struct wmi_channel_arg chan_arg = {};
773
774 lockdep_assert_held(&ar->conf_mutex);
775
776 arg.vdev_id = vdev_id;
777 arg.peer_state = state;
778 ether_addr_copy(arg.addr, sta->addr);
779
780 cap.peer_max_sp = sta->max_sp;
781 cap.peer_uapsd_queues = sta->uapsd_queues;
782
783 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
784 !sta->tdls_initiator)
785 cap.is_peer_responder = 1;
786
787 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
788 if (ret) {
789 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
790 arg.addr, vdev_id, ret);
791 return ret;
792 }
793
794 return 0;
795}
796
Kalle Valo5e3dd152013-06-12 20:52:10 +0300797/************************/
798/* Interface management */
799/************************/
800
Michal Kazior64badcb2014-09-18 11:18:02 +0300801void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
802{
803 struct ath10k *ar = arvif->ar;
804
805 lockdep_assert_held(&ar->data_lock);
806
807 if (!arvif->beacon)
808 return;
809
810 if (!arvif->beacon_buf)
811 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
812 arvif->beacon->len, DMA_TO_DEVICE);
813
Michal Kazioraf213192015-01-29 14:29:52 +0200814 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
815 arvif->beacon_state != ATH10K_BEACON_SENT))
816 return;
817
Michal Kazior64badcb2014-09-18 11:18:02 +0300818 dev_kfree_skb_any(arvif->beacon);
819
820 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200821 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300822}
823
824static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
825{
826 struct ath10k *ar = arvif->ar;
827
828 lockdep_assert_held(&ar->data_lock);
829
830 ath10k_mac_vif_beacon_free(arvif);
831
832 if (arvif->beacon_buf) {
833 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
834 arvif->beacon_buf, arvif->beacon_paddr);
835 arvif->beacon_buf = NULL;
836 }
837}
838
Kalle Valo5e3dd152013-06-12 20:52:10 +0300839static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
840{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300841 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300842
Michal Kazior548db542013-07-05 16:15:15 +0300843 lockdep_assert_held(&ar->conf_mutex);
844
Michal Kazior7962b0d2014-10-28 10:34:38 +0100845 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
846 return -ESHUTDOWN;
847
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300848 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
849 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
850 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300851 return -ETIMEDOUT;
852
853 return 0;
854}
855
Michal Kazior1bbc0972014-04-08 09:45:47 +0300856static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300857{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000858 struct cfg80211_chan_def *chandef = NULL;
Maninder Singh19be9e92015-07-16 09:25:33 +0530859 struct ieee80211_channel *channel = NULL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300860 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300861 int ret = 0;
862
863 lockdep_assert_held(&ar->conf_mutex);
864
Michal Kazior500ff9f2015-03-31 10:26:21 +0000865 ieee80211_iter_chan_contexts_atomic(ar->hw,
866 ath10k_mac_get_any_chandef_iter,
867 &chandef);
868 if (WARN_ON_ONCE(!chandef))
869 return -ENOENT;
870
871 channel = chandef->chan;
872
Kalle Valo5e3dd152013-06-12 20:52:10 +0300873 arg.vdev_id = vdev_id;
874 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100875 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300876
877 /* TODO setup this dynamically, what in case we
878 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100879 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200880 arg.channel.chan_radar =
881 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300882
Michal Kazior89c5c842013-10-23 04:02:13 -0700883 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700884 arg.channel.max_power = channel->max_power * 2;
885 arg.channel.max_reg_power = channel->max_reg_power * 2;
886 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300887
Michal Kazior7962b0d2014-10-28 10:34:38 +0100888 reinit_completion(&ar->vdev_setup_done);
889
Kalle Valo5e3dd152013-06-12 20:52:10 +0300890 ret = ath10k_wmi_vdev_start(ar, &arg);
891 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200892 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200893 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300894 return ret;
895 }
896
897 ret = ath10k_vdev_setup_sync(ar);
898 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200899 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200900 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300901 return ret;
902 }
903
904 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
905 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200906 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200907 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300908 goto vdev_stop;
909 }
910
911 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300912
Michal Kazior7aa7a722014-08-25 12:09:38 +0200913 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300914 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300915 return 0;
916
917vdev_stop:
918 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
919 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200920 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200921 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300922
923 return ret;
924}
925
Michal Kazior1bbc0972014-04-08 09:45:47 +0300926static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300927{
928 int ret = 0;
929
930 lockdep_assert_held(&ar->conf_mutex);
931
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200932 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
933 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200934 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200935 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300936
Michal Kazior7962b0d2014-10-28 10:34:38 +0100937 reinit_completion(&ar->vdev_setup_done);
938
Kalle Valo5e3dd152013-06-12 20:52:10 +0300939 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
940 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200941 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200942 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300943
944 ret = ath10k_vdev_setup_sync(ar);
945 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200946 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200947 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300948
Michal Kazior7aa7a722014-08-25 12:09:38 +0200949 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300950 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300951 return ret;
952}
953
Michal Kazior1bbc0972014-04-08 09:45:47 +0300954static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955{
956 int bit, ret = 0;
957
958 lockdep_assert_held(&ar->conf_mutex);
959
Ben Greeara9aefb32014-08-12 11:02:19 +0300960 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200961 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300962 return -ENOMEM;
963 }
964
Ben Greear16c11172014-09-23 14:17:16 -0700965 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300966
Ben Greear16c11172014-09-23 14:17:16 -0700967 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300968
969 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
970 WMI_VDEV_TYPE_MONITOR,
971 0, ar->mac_addr);
972 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200973 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200974 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300975 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300976 }
977
Ben Greear16c11172014-09-23 14:17:16 -0700978 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200979 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300980 ar->monitor_vdev_id);
981
Kalle Valo5e3dd152013-06-12 20:52:10 +0300982 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300983}
984
Michal Kazior1bbc0972014-04-08 09:45:47 +0300985static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300986{
987 int ret = 0;
988
989 lockdep_assert_held(&ar->conf_mutex);
990
Kalle Valo5e3dd152013-06-12 20:52:10 +0300991 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
992 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200993 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200994 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300995 return ret;
996 }
997
Ben Greear16c11172014-09-23 14:17:16 -0700998 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300999
Michal Kazior7aa7a722014-08-25 12:09:38 +02001000 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001001 ar->monitor_vdev_id);
1002 return ret;
1003}
1004
Michal Kazior1bbc0972014-04-08 09:45:47 +03001005static int ath10k_monitor_start(struct ath10k *ar)
1006{
1007 int ret;
1008
1009 lockdep_assert_held(&ar->conf_mutex);
1010
Michal Kazior1bbc0972014-04-08 09:45:47 +03001011 ret = ath10k_monitor_vdev_create(ar);
1012 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001013 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001014 return ret;
1015 }
1016
1017 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1018 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001019 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001020 ath10k_monitor_vdev_delete(ar);
1021 return ret;
1022 }
1023
1024 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001025 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +03001026
1027 return 0;
1028}
1029
Michal Kazior19337472014-08-28 12:58:16 +02001030static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001031{
1032 int ret;
1033
1034 lockdep_assert_held(&ar->conf_mutex);
1035
Michal Kazior1bbc0972014-04-08 09:45:47 +03001036 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001037 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001038 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001039 return ret;
1040 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001041
1042 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001043 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001044 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001045 return ret;
1046 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001047
1048 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001049 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001050
1051 return 0;
1052}
1053
Michal Kazior500ff9f2015-03-31 10:26:21 +00001054static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1055{
1056 int num_ctx;
1057
1058 /* At least one chanctx is required to derive a channel to start
1059 * monitor vdev on.
1060 */
1061 num_ctx = ath10k_mac_num_chanctxs(ar);
1062 if (num_ctx == 0)
1063 return false;
1064
1065 /* If there's already an existing special monitor interface then don't
1066 * bother creating another monitor vdev.
1067 */
1068 if (ar->monitor_arvif)
1069 return false;
1070
1071 return ar->monitor ||
Bob Copeland0d031c82015-09-09 12:47:34 -04001072 ar->filter_flags & FIF_OTHER_BSS ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001073 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1074}
1075
1076static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1077{
1078 int num_ctx;
1079
1080 num_ctx = ath10k_mac_num_chanctxs(ar);
1081
1082 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1083 * shouldn't allow this but make sure to prevent handling the following
1084 * case anyway since multi-channel DFS hasn't been tested at all.
1085 */
1086 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1087 return false;
1088
1089 return true;
1090}
1091
Michal Kazior19337472014-08-28 12:58:16 +02001092static int ath10k_monitor_recalc(struct ath10k *ar)
1093{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001094 bool needed;
1095 bool allowed;
1096 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001097
1098 lockdep_assert_held(&ar->conf_mutex);
1099
Michal Kazior500ff9f2015-03-31 10:26:21 +00001100 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1101 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001102
1103 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001104 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1105 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001106
Michal Kazior500ff9f2015-03-31 10:26:21 +00001107 if (WARN_ON(needed && !allowed)) {
1108 if (ar->monitor_started) {
1109 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1110
1111 ret = ath10k_monitor_stop(ar);
1112 if (ret)
Kalle Valo2a995082015-10-05 17:56:37 +03001113 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1114 ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001115 /* not serious */
1116 }
1117
1118 return -EPERM;
1119 }
1120
1121 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001122 return 0;
1123
Michal Kazior500ff9f2015-03-31 10:26:21 +00001124 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001125 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001126 else
1127 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001128}
1129
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001130static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1131{
1132 struct ath10k *ar = arvif->ar;
1133 u32 vdev_param, rts_cts = 0;
1134
1135 lockdep_assert_held(&ar->conf_mutex);
1136
1137 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1138
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001139 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001140
1141 if (arvif->num_legacy_stations > 0)
1142 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1143 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001144 else
1145 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1146 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001147
1148 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1149 rts_cts);
1150}
1151
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001152static int ath10k_start_cac(struct ath10k *ar)
1153{
1154 int ret;
1155
1156 lockdep_assert_held(&ar->conf_mutex);
1157
1158 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1159
Michal Kazior19337472014-08-28 12:58:16 +02001160 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001161 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001162 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001163 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1164 return ret;
1165 }
1166
Michal Kazior7aa7a722014-08-25 12:09:38 +02001167 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001168 ar->monitor_vdev_id);
1169
1170 return 0;
1171}
1172
1173static int ath10k_stop_cac(struct ath10k *ar)
1174{
1175 lockdep_assert_held(&ar->conf_mutex);
1176
1177 /* CAC is not running - do nothing */
1178 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1179 return 0;
1180
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001181 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001182 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001183
Michal Kazior7aa7a722014-08-25 12:09:38 +02001184 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001185
1186 return 0;
1187}
1188
Michal Kazior500ff9f2015-03-31 10:26:21 +00001189static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1190 struct ieee80211_chanctx_conf *conf,
1191 void *data)
1192{
1193 bool *ret = data;
1194
1195 if (!*ret && conf->radar_enabled)
1196 *ret = true;
1197}
1198
1199static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1200{
1201 bool has_radar = false;
1202
1203 ieee80211_iter_chan_contexts_atomic(ar->hw,
1204 ath10k_mac_has_radar_iter,
1205 &has_radar);
1206
1207 return has_radar;
1208}
1209
Michal Kaziord6500972014-04-08 09:56:09 +03001210static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001211{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001212 int ret;
1213
1214 lockdep_assert_held(&ar->conf_mutex);
1215
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001216 ath10k_stop_cac(ar);
1217
Michal Kazior500ff9f2015-03-31 10:26:21 +00001218 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001219 return;
1220
Michal Kaziord6500972014-04-08 09:56:09 +03001221 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001222 return;
1223
1224 ret = ath10k_start_cac(ar);
1225 if (ret) {
1226 /*
1227 * Not possible to start CAC on current channel so starting
1228 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1229 * by indicating that radar was detected.
1230 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001231 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001232 ieee80211_radar_detected(ar->hw);
1233 }
1234}
1235
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301236static int ath10k_vdev_stop(struct ath10k_vif *arvif)
Michal Kazior72654fa2014-04-08 09:56:09 +03001237{
1238 struct ath10k *ar = arvif->ar;
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301239 int ret;
1240
1241 lockdep_assert_held(&ar->conf_mutex);
1242
1243 reinit_completion(&ar->vdev_setup_done);
1244
1245 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1246 if (ret) {
1247 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1248 arvif->vdev_id, ret);
1249 return ret;
1250 }
1251
1252 ret = ath10k_vdev_setup_sync(ar);
1253 if (ret) {
1254 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1255 arvif->vdev_id, ret);
1256 return ret;
1257 }
1258
1259 WARN_ON(ar->num_started_vdevs == 0);
1260
1261 if (ar->num_started_vdevs != 0) {
1262 ar->num_started_vdevs--;
1263 ath10k_recalc_radar_detection(ar);
1264 }
1265
1266 return ret;
1267}
1268
Michal Kazior500ff9f2015-03-31 10:26:21 +00001269static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1270 const struct cfg80211_chan_def *chandef,
1271 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001272{
1273 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001274 struct wmi_vdev_start_request_arg arg = {};
1275 int ret = 0;
1276
1277 lockdep_assert_held(&ar->conf_mutex);
1278
1279 reinit_completion(&ar->vdev_setup_done);
1280
1281 arg.vdev_id = arvif->vdev_id;
1282 arg.dtim_period = arvif->dtim_period;
1283 arg.bcn_intval = arvif->beacon_interval;
1284
1285 arg.channel.freq = chandef->chan->center_freq;
1286 arg.channel.band_center_freq1 = chandef->center_freq1;
1287 arg.channel.mode = chan_to_phymode(chandef);
1288
1289 arg.channel.min_power = 0;
1290 arg.channel.max_power = chandef->chan->max_power * 2;
1291 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1292 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1293
1294 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1295 arg.ssid = arvif->u.ap.ssid;
1296 arg.ssid_len = arvif->u.ap.ssid_len;
1297 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1298
1299 /* For now allow DFS for AP mode */
1300 arg.channel.chan_radar =
1301 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1302 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1303 arg.ssid = arvif->vif->bss_conf.ssid;
1304 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1305 }
1306
Michal Kazior7aa7a722014-08-25 12:09:38 +02001307 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001308 "mac vdev %d start center_freq %d phymode %s\n",
1309 arg.vdev_id, arg.channel.freq,
1310 ath10k_wmi_phymode_str(arg.channel.mode));
1311
Michal Kaziordc55e302014-07-29 12:53:36 +03001312 if (restart)
1313 ret = ath10k_wmi_vdev_restart(ar, &arg);
1314 else
1315 ret = ath10k_wmi_vdev_start(ar, &arg);
1316
Michal Kazior72654fa2014-04-08 09:56:09 +03001317 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001318 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001319 arg.vdev_id, ret);
1320 return ret;
1321 }
1322
1323 ret = ath10k_vdev_setup_sync(ar);
1324 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001325 ath10k_warn(ar,
1326 "failed to synchronize setup for vdev %i restart %d: %d\n",
1327 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001328 return ret;
1329 }
1330
Michal Kaziord6500972014-04-08 09:56:09 +03001331 ar->num_started_vdevs++;
1332 ath10k_recalc_radar_detection(ar);
1333
Michal Kazior72654fa2014-04-08 09:56:09 +03001334 return ret;
1335}
1336
Michal Kazior500ff9f2015-03-31 10:26:21 +00001337static int ath10k_vdev_start(struct ath10k_vif *arvif,
1338 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001339{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001340 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001341}
1342
Michal Kazior500ff9f2015-03-31 10:26:21 +00001343static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1344 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001345{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001346 return ath10k_vdev_start_restart(arvif, def, true);
Michal Kazior72654fa2014-04-08 09:56:09 +03001347}
1348
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001349static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1350 struct sk_buff *bcn)
1351{
1352 struct ath10k *ar = arvif->ar;
1353 struct ieee80211_mgmt *mgmt;
1354 const u8 *p2p_ie;
1355 int ret;
1356
1357 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1358 return 0;
1359
1360 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1361 return 0;
1362
1363 mgmt = (void *)bcn->data;
1364 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1365 mgmt->u.beacon.variable,
1366 bcn->len - (mgmt->u.beacon.variable -
1367 bcn->data));
1368 if (!p2p_ie)
1369 return -ENOENT;
1370
1371 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1372 if (ret) {
1373 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1374 arvif->vdev_id, ret);
1375 return ret;
1376 }
1377
1378 return 0;
1379}
1380
1381static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1382 u8 oui_type, size_t ie_offset)
1383{
1384 size_t len;
1385 const u8 *next;
1386 const u8 *end;
1387 u8 *ie;
1388
1389 if (WARN_ON(skb->len < ie_offset))
1390 return -EINVAL;
1391
1392 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1393 skb->data + ie_offset,
1394 skb->len - ie_offset);
1395 if (!ie)
1396 return -ENOENT;
1397
1398 len = ie[1] + 2;
1399 end = skb->data + skb->len;
1400 next = ie + len;
1401
1402 if (WARN_ON(next > end))
1403 return -EINVAL;
1404
1405 memmove(ie, next, end - next);
1406 skb_trim(skb, skb->len - len);
1407
1408 return 0;
1409}
1410
1411static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1412{
1413 struct ath10k *ar = arvif->ar;
1414 struct ieee80211_hw *hw = ar->hw;
1415 struct ieee80211_vif *vif = arvif->vif;
1416 struct ieee80211_mutable_offsets offs = {};
1417 struct sk_buff *bcn;
1418 int ret;
1419
1420 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1421 return 0;
1422
Michal Kazior81a9a172015-03-05 16:02:17 +02001423 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1424 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1425 return 0;
1426
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001427 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1428 if (!bcn) {
1429 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1430 return -EPERM;
1431 }
1432
1433 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1434 if (ret) {
1435 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1436 kfree_skb(bcn);
1437 return ret;
1438 }
1439
1440 /* P2P IE is inserted by firmware automatically (as configured above)
1441 * so remove it from the base beacon template to avoid duplicate P2P
1442 * IEs in beacon frames.
1443 */
1444 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1445 offsetof(struct ieee80211_mgmt,
1446 u.beacon.variable));
1447
1448 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1449 0, NULL, 0);
1450 kfree_skb(bcn);
1451
1452 if (ret) {
1453 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1454 ret);
1455 return ret;
1456 }
1457
1458 return 0;
1459}
1460
1461static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1462{
1463 struct ath10k *ar = arvif->ar;
1464 struct ieee80211_hw *hw = ar->hw;
1465 struct ieee80211_vif *vif = arvif->vif;
1466 struct sk_buff *prb;
1467 int ret;
1468
1469 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1470 return 0;
1471
Michal Kazior81a9a172015-03-05 16:02:17 +02001472 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1473 return 0;
1474
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001475 prb = ieee80211_proberesp_get(hw, vif);
1476 if (!prb) {
1477 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1478 return -EPERM;
1479 }
1480
1481 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1482 kfree_skb(prb);
1483
1484 if (ret) {
1485 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1486 ret);
1487 return ret;
1488 }
1489
1490 return 0;
1491}
1492
Michal Kazior500ff9f2015-03-31 10:26:21 +00001493static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1494{
1495 struct ath10k *ar = arvif->ar;
1496 struct cfg80211_chan_def def;
1497 int ret;
1498
1499 /* When originally vdev is started during assign_vif_chanctx() some
1500 * information is missing, notably SSID. Firmware revisions with beacon
1501 * offloading require the SSID to be provided during vdev (re)start to
1502 * handle hidden SSID properly.
1503 *
1504 * Vdev restart must be done after vdev has been both started and
1505 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1506 * deliver vdev restart response event causing timeouts during vdev
1507 * syncing in ath10k.
1508 *
1509 * Note: The vdev down/up and template reinstallation could be skipped
1510 * since only wmi-tlv firmware are known to have beacon offload and
1511 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1512 * response delivery. It's probably more robust to keep it as is.
1513 */
1514 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1515 return 0;
1516
1517 if (WARN_ON(!arvif->is_started))
1518 return -EINVAL;
1519
1520 if (WARN_ON(!arvif->is_up))
1521 return -EINVAL;
1522
1523 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1524 return -EINVAL;
1525
1526 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1527 if (ret) {
1528 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1529 arvif->vdev_id, ret);
1530 return ret;
1531 }
1532
1533 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1534 * firmware will crash upon vdev up.
1535 */
1536
1537 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1538 if (ret) {
1539 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1540 return ret;
1541 }
1542
1543 ret = ath10k_mac_setup_prb_tmpl(arvif);
1544 if (ret) {
1545 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1546 return ret;
1547 }
1548
1549 ret = ath10k_vdev_restart(arvif, &def);
1550 if (ret) {
1551 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1552 arvif->vdev_id, ret);
1553 return ret;
1554 }
1555
1556 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1557 arvif->bssid);
1558 if (ret) {
1559 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1560 arvif->vdev_id, ret);
1561 return ret;
1562 }
1563
1564 return 0;
1565}
1566
Kalle Valo5e3dd152013-06-12 20:52:10 +03001567static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001568 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001569{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001570 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001571 int ret = 0;
1572
Michal Kazior548db542013-07-05 16:15:15 +03001573 lockdep_assert_held(&arvif->ar->conf_mutex);
1574
Kalle Valo5e3dd152013-06-12 20:52:10 +03001575 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001576 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1577 if (ret)
1578 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1579 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001580
Michal Kaziorc930f742014-01-23 11:38:25 +01001581 arvif->is_up = false;
1582
Michal Kazior748afc42014-01-23 12:48:21 +01001583 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001584 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001585 spin_unlock_bh(&arvif->ar->data_lock);
1586
Kalle Valo5e3dd152013-06-12 20:52:10 +03001587 return;
1588 }
1589
1590 arvif->tx_seq_no = 0x1000;
1591
Michal Kaziorc930f742014-01-23 11:38:25 +01001592 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001593 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001594
1595 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1596 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001597 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001598 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001599 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001600 return;
1601 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001602
Michal Kaziorc930f742014-01-23 11:38:25 +01001603 arvif->is_up = true;
1604
Michal Kazior500ff9f2015-03-31 10:26:21 +00001605 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1606 if (ret) {
1607 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1608 arvif->vdev_id, ret);
1609 return;
1610 }
1611
Michal Kazior7aa7a722014-08-25 12:09:38 +02001612 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001613}
1614
1615static void ath10k_control_ibss(struct ath10k_vif *arvif,
1616 struct ieee80211_bss_conf *info,
1617 const u8 self_peer[ETH_ALEN])
1618{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001619 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001620 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001621 int ret = 0;
1622
Michal Kazior548db542013-07-05 16:15:15 +03001623 lockdep_assert_held(&arvif->ar->conf_mutex);
1624
Kalle Valo5e3dd152013-06-12 20:52:10 +03001625 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001626 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001627 return;
1628
Joe Perches93803b32015-03-02 19:54:49 -08001629 eth_zero_addr(arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001630
1631 return;
1632 }
1633
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001634 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1635 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001636 ATH10K_DEFAULT_ATIM);
1637 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001638 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001639 arvif->vdev_id, ret);
1640}
1641
Michal Kazior9f9b5742014-12-12 12:41:36 +01001642static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1643{
1644 struct ath10k *ar = arvif->ar;
1645 u32 param;
1646 u32 value;
1647 int ret;
1648
1649 lockdep_assert_held(&arvif->ar->conf_mutex);
1650
1651 if (arvif->u.sta.uapsd)
1652 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1653 else
1654 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1655
1656 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1657 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1658 if (ret) {
1659 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1660 value, arvif->vdev_id, ret);
1661 return ret;
1662 }
1663
1664 return 0;
1665}
1666
1667static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1668{
1669 struct ath10k *ar = arvif->ar;
1670 u32 param;
1671 u32 value;
1672 int ret;
1673
1674 lockdep_assert_held(&arvif->ar->conf_mutex);
1675
1676 if (arvif->u.sta.uapsd)
1677 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1678 else
1679 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1680
1681 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1682 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1683 param, value);
1684 if (ret) {
1685 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1686 value, arvif->vdev_id, ret);
1687 return ret;
1688 }
1689
1690 return 0;
1691}
1692
Michal Kazior424f2632015-07-09 13:08:35 +02001693static int ath10k_mac_num_vifs_started(struct ath10k *ar)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001694{
1695 struct ath10k_vif *arvif;
1696 int num = 0;
1697
1698 lockdep_assert_held(&ar->conf_mutex);
1699
1700 list_for_each_entry(arvif, &ar->arvifs, list)
Michal Kazior424f2632015-07-09 13:08:35 +02001701 if (arvif->is_started)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001702 num++;
1703
1704 return num;
1705}
1706
Michal Kaziorad088bf2013-10-16 15:44:46 +03001707static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001708{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001709 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001710 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001711 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001712 enum wmi_sta_powersave_param param;
1713 enum wmi_sta_ps_mode psmode;
1714 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001715 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001716 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001717
Michal Kazior548db542013-07-05 16:15:15 +03001718 lockdep_assert_held(&arvif->ar->conf_mutex);
1719
Michal Kaziorad088bf2013-10-16 15:44:46 +03001720 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1721 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001722
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001723 enable_ps = arvif->ps;
1724
Michal Kazior424f2632015-07-09 13:08:35 +02001725 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001726 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1727 ar->fw_features)) {
1728 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1729 arvif->vdev_id);
1730 enable_ps = false;
1731 }
1732
Janusz Dziedzic917826b2015-05-18 09:38:17 +00001733 if (!arvif->is_started) {
1734 /* mac80211 can update vif powersave state while disconnected.
1735 * Firmware doesn't behave nicely and consumes more power than
1736 * necessary if PS is disabled on a non-started vdev. Hence
1737 * force-enable PS for non-running vdevs.
1738 */
1739 psmode = WMI_STA_PS_MODE_ENABLED;
1740 } else if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001741 psmode = WMI_STA_PS_MODE_ENABLED;
1742 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1743
Michal Kazior526549a2014-12-12 12:41:37 +01001744 ps_timeout = conf->dynamic_ps_timeout;
1745 if (ps_timeout == 0) {
1746 /* Firmware doesn't like 0 */
1747 ps_timeout = ieee80211_tu_to_usec(
1748 vif->bss_conf.beacon_int) / 1000;
1749 }
1750
Michal Kaziorad088bf2013-10-16 15:44:46 +03001751 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001752 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001753 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001754 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001755 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001756 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001757 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001758 } else {
1759 psmode = WMI_STA_PS_MODE_DISABLED;
1760 }
1761
Michal Kazior7aa7a722014-08-25 12:09:38 +02001762 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001763 arvif->vdev_id, psmode ? "enable" : "disable");
1764
Michal Kaziorad088bf2013-10-16 15:44:46 +03001765 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1766 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001767 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001768 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001769 return ret;
1770 }
1771
1772 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001773}
1774
Michal Kazior46725b12015-01-28 09:57:49 +02001775static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1776{
1777 struct ath10k *ar = arvif->ar;
1778 struct wmi_sta_keepalive_arg arg = {};
1779 int ret;
1780
1781 lockdep_assert_held(&arvif->ar->conf_mutex);
1782
1783 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1784 return 0;
1785
1786 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1787 return 0;
1788
1789 /* Some firmware revisions have a bug and ignore the `enabled` field.
1790 * Instead use the interval to disable the keepalive.
1791 */
1792 arg.vdev_id = arvif->vdev_id;
1793 arg.enabled = 1;
1794 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1795 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1796
1797 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1798 if (ret) {
1799 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1800 arvif->vdev_id, ret);
1801 return ret;
1802 }
1803
1804 return 0;
1805}
1806
Michal Kazior81a9a172015-03-05 16:02:17 +02001807static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1808{
1809 struct ath10k *ar = arvif->ar;
1810 struct ieee80211_vif *vif = arvif->vif;
1811 int ret;
1812
Michal Kazior8513d952015-03-09 14:19:24 +01001813 lockdep_assert_held(&arvif->ar->conf_mutex);
1814
1815 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1816 return;
1817
Michal Kazior81a9a172015-03-05 16:02:17 +02001818 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1819 return;
1820
1821 if (!vif->csa_active)
1822 return;
1823
1824 if (!arvif->is_up)
1825 return;
1826
1827 if (!ieee80211_csa_is_complete(vif)) {
1828 ieee80211_csa_update_counter(vif);
1829
1830 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1831 if (ret)
1832 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1833 ret);
1834
1835 ret = ath10k_mac_setup_prb_tmpl(arvif);
1836 if (ret)
1837 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1838 ret);
1839 } else {
1840 ieee80211_csa_finish(vif);
1841 }
1842}
1843
1844static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1845{
1846 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1847 ap_csa_work);
1848 struct ath10k *ar = arvif->ar;
1849
1850 mutex_lock(&ar->conf_mutex);
1851 ath10k_mac_vif_ap_csa_count_down(arvif);
1852 mutex_unlock(&ar->conf_mutex);
1853}
1854
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001855static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1856 struct ieee80211_vif *vif)
1857{
1858 struct sk_buff *skb = data;
1859 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1860 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1861
1862 if (vif->type != NL80211_IFTYPE_STATION)
1863 return;
1864
1865 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1866 return;
1867
1868 cancel_delayed_work(&arvif->connection_loss_work);
1869}
1870
1871void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1872{
1873 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1874 IEEE80211_IFACE_ITER_NORMAL,
1875 ath10k_mac_handle_beacon_iter,
1876 skb);
1877}
1878
1879static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1880 struct ieee80211_vif *vif)
1881{
1882 u32 *vdev_id = data;
1883 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1884 struct ath10k *ar = arvif->ar;
1885 struct ieee80211_hw *hw = ar->hw;
1886
1887 if (arvif->vdev_id != *vdev_id)
1888 return;
1889
1890 if (!arvif->is_up)
1891 return;
1892
1893 ieee80211_beacon_loss(vif);
1894
1895 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1896 * (done by mac80211) succeeds but beacons do not resume then it
1897 * doesn't make sense to continue operation. Queue connection loss work
1898 * which can be cancelled when beacon is received.
1899 */
1900 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1901 ATH10K_CONNECTION_LOSS_HZ);
1902}
1903
1904void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1905{
1906 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1907 IEEE80211_IFACE_ITER_NORMAL,
1908 ath10k_mac_handle_beacon_miss_iter,
1909 &vdev_id);
1910}
1911
1912static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1913{
1914 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1915 connection_loss_work.work);
1916 struct ieee80211_vif *vif = arvif->vif;
1917
1918 if (!arvif->is_up)
1919 return;
1920
1921 ieee80211_connection_loss(vif);
1922}
1923
Kalle Valo5e3dd152013-06-12 20:52:10 +03001924/**********************/
1925/* Station management */
1926/**********************/
1927
Michal Kazior590922a2014-10-21 10:10:29 +03001928static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1929 struct ieee80211_vif *vif)
1930{
1931 /* Some firmware revisions have unstable STA powersave when listen
1932 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1933 * generate NullFunc frames properly even if buffered frames have been
1934 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1935 * buffered frames. Often pinging the device from AP would simply fail.
1936 *
1937 * As a workaround set it to 1.
1938 */
1939 if (vif->type == NL80211_IFTYPE_STATION)
1940 return 1;
1941
1942 return ar->hw->conf.listen_interval;
1943}
1944
Kalle Valo5e3dd152013-06-12 20:52:10 +03001945static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001946 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001947 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001948 struct wmi_peer_assoc_complete_arg *arg)
1949{
Michal Kazior590922a2014-10-21 10:10:29 +03001950 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001951 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001952
Michal Kazior548db542013-07-05 16:15:15 +03001953 lockdep_assert_held(&ar->conf_mutex);
1954
Michal Kaziorc51880e2015-03-30 09:51:57 +03001955 if (vif->type == NL80211_IFTYPE_STATION)
1956 aid = vif->bss_conf.aid;
1957 else
1958 aid = sta->aid;
1959
Kalle Valob25f32c2014-09-14 12:50:49 +03001960 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001961 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001962 arg->peer_aid = aid;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001963 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001964 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001965 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001966 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001967}
1968
1969static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001970 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001971 struct wmi_peer_assoc_complete_arg *arg)
1972{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001973 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001974 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001975 struct cfg80211_bss *bss;
1976 const u8 *rsnie = NULL;
1977 const u8 *wpaie = NULL;
1978
Michal Kazior548db542013-07-05 16:15:15 +03001979 lockdep_assert_held(&ar->conf_mutex);
1980
Michal Kazior500ff9f2015-03-31 10:26:21 +00001981 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1982 return;
1983
1984 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1985 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001986 if (bss) {
1987 const struct cfg80211_bss_ies *ies;
1988
1989 rcu_read_lock();
1990 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1991
1992 ies = rcu_dereference(bss->ies);
1993
1994 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001995 WLAN_OUI_TYPE_MICROSOFT_WPA,
1996 ies->data,
1997 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001998 rcu_read_unlock();
1999 cfg80211_put_bss(ar->hw->wiphy, bss);
2000 }
2001
2002 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2003 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002004 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002005 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
2006 }
2007
2008 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002009 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002010 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
2011 }
2012}
2013
2014static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002015 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002016 struct ieee80211_sta *sta,
2017 struct wmi_peer_assoc_complete_arg *arg)
2018{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002019 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002020 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002021 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002022 const struct ieee80211_supported_band *sband;
2023 const struct ieee80211_rate *rates;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002024 enum ieee80211_band band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002025 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03002026 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002027 int i;
2028
Michal Kazior548db542013-07-05 16:15:15 +03002029 lockdep_assert_held(&ar->conf_mutex);
2030
Michal Kazior500ff9f2015-03-31 10:26:21 +00002031 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2032 return;
2033
Michal Kazior45c9abc2015-04-21 20:42:58 +03002034 band = def.chan->band;
2035 sband = ar->hw->wiphy->bands[band];
2036 ratemask = sta->supp_rates[band];
2037 ratemask &= arvif->bitrate_mask.control[band].legacy;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002038 rates = sband->bitrates;
2039
2040 rateset->num_rates = 0;
2041
2042 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2043 if (!(ratemask & 1))
2044 continue;
2045
Michal Kazior486017c2015-03-30 09:51:54 +03002046 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2047 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002048 rateset->num_rates++;
2049 }
2050}
2051
Michal Kazior45c9abc2015-04-21 20:42:58 +03002052static bool
2053ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2054{
2055 int nss;
2056
2057 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2058 if (ht_mcs_mask[nss])
2059 return false;
2060
2061 return true;
2062}
2063
2064static bool
2065ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2066{
2067 int nss;
2068
2069 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2070 if (vht_mcs_mask[nss])
2071 return false;
2072
2073 return true;
2074}
2075
Kalle Valo5e3dd152013-06-12 20:52:10 +03002076static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
Michal Kazior45c9abc2015-04-21 20:42:58 +03002077 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002078 struct ieee80211_sta *sta,
2079 struct wmi_peer_assoc_complete_arg *arg)
2080{
2081 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002082 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2083 struct cfg80211_chan_def def;
2084 enum ieee80211_band band;
2085 const u8 *ht_mcs_mask;
2086 const u16 *vht_mcs_mask;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002087 int i, n;
2088 u8 max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002089 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002090
Michal Kazior548db542013-07-05 16:15:15 +03002091 lockdep_assert_held(&ar->conf_mutex);
2092
Michal Kazior45c9abc2015-04-21 20:42:58 +03002093 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2094 return;
2095
Kalle Valo5e3dd152013-06-12 20:52:10 +03002096 if (!ht_cap->ht_supported)
2097 return;
2098
Michal Kazior45c9abc2015-04-21 20:42:58 +03002099 band = def.chan->band;
2100 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2101 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2102
2103 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2104 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2105 return;
2106
Kalle Valo5e3dd152013-06-12 20:52:10 +03002107 arg->peer_flags |= WMI_PEER_HT;
2108 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2109 ht_cap->ampdu_factor)) - 1;
2110
2111 arg->peer_mpdu_density =
2112 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2113
2114 arg->peer_ht_caps = ht_cap->cap;
2115 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2116
2117 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2118 arg->peer_flags |= WMI_PEER_LDPC;
2119
2120 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2121 arg->peer_flags |= WMI_PEER_40MHZ;
2122 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2123 }
2124
Michal Kazior45c9abc2015-04-21 20:42:58 +03002125 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2126 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2127 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002128
Michal Kazior45c9abc2015-04-21 20:42:58 +03002129 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2130 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2131 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002132
2133 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2134 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2135 arg->peer_flags |= WMI_PEER_STBC;
2136 }
2137
2138 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002139 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2140 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2141 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2142 arg->peer_rate_caps |= stbc;
2143 arg->peer_flags |= WMI_PEER_STBC;
2144 }
2145
Kalle Valo5e3dd152013-06-12 20:52:10 +03002146 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2147 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2148 else if (ht_cap->mcs.rx_mask[1])
2149 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2150
Michal Kazior45c9abc2015-04-21 20:42:58 +03002151 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2152 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2153 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2154 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002155 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002156 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002157
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002158 /*
2159 * This is a workaround for HT-enabled STAs which break the spec
2160 * and have no HT capabilities RX mask (no HT RX MCS map).
2161 *
2162 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2163 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2164 *
2165 * Firmware asserts if such situation occurs.
2166 */
2167 if (n == 0) {
2168 arg->peer_ht_rates.num_rates = 8;
2169 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2170 arg->peer_ht_rates.rates[i] = i;
2171 } else {
2172 arg->peer_ht_rates.num_rates = n;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002173 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002174 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002175
Michal Kazior7aa7a722014-08-25 12:09:38 +02002176 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002177 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002178 arg->peer_ht_rates.num_rates,
2179 arg->peer_num_spatial_streams);
2180}
2181
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002182static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2183 struct ath10k_vif *arvif,
2184 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002185{
2186 u32 uapsd = 0;
2187 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002188 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002189
Michal Kazior548db542013-07-05 16:15:15 +03002190 lockdep_assert_held(&ar->conf_mutex);
2191
Kalle Valo5e3dd152013-06-12 20:52:10 +03002192 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002193 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002194 sta->uapsd_queues, sta->max_sp);
2195
Kalle Valo5e3dd152013-06-12 20:52:10 +03002196 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2197 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2198 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2199 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2200 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2201 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2202 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2203 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2204 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2205 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2206 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2207 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2208
Kalle Valo5e3dd152013-06-12 20:52:10 +03002209 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2210 max_sp = sta->max_sp;
2211
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002212 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2213 sta->addr,
2214 WMI_AP_PS_PEER_PARAM_UAPSD,
2215 uapsd);
2216 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002217 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002218 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002219 return ret;
2220 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002221
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002222 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2223 sta->addr,
2224 WMI_AP_PS_PEER_PARAM_MAX_SP,
2225 max_sp);
2226 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002227 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002228 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002229 return ret;
2230 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002231
2232 /* TODO setup this based on STA listen interval and
2233 beacon interval. Currently we don't know
2234 sta->listen_interval - mac80211 patch required.
2235 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002236 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002237 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2238 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002239 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002240 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002241 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002242 return ret;
2243 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002244 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002245
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002246 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002247}
2248
Michal Kazior45c9abc2015-04-21 20:42:58 +03002249static u16
2250ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2251 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2252{
2253 int idx_limit;
2254 int nss;
2255 u16 mcs_map;
2256 u16 mcs;
2257
2258 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2259 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2260 vht_mcs_limit[nss];
2261
2262 if (mcs_map)
2263 idx_limit = fls(mcs_map) - 1;
2264 else
2265 idx_limit = -1;
2266
2267 switch (idx_limit) {
2268 case 0: /* fall through */
2269 case 1: /* fall through */
2270 case 2: /* fall through */
2271 case 3: /* fall through */
2272 case 4: /* fall through */
2273 case 5: /* fall through */
2274 case 6: /* fall through */
2275 default:
2276 /* see ath10k_mac_can_set_bitrate_mask() */
2277 WARN_ON(1);
2278 /* fall through */
2279 case -1:
2280 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2281 break;
2282 case 7:
2283 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2284 break;
2285 case 8:
2286 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2287 break;
2288 case 9:
2289 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2290 break;
2291 }
2292
2293 tx_mcs_set &= ~(0x3 << (nss * 2));
2294 tx_mcs_set |= mcs << (nss * 2);
2295 }
2296
2297 return tx_mcs_set;
2298}
2299
Kalle Valo5e3dd152013-06-12 20:52:10 +03002300static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002301 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002302 struct ieee80211_sta *sta,
2303 struct wmi_peer_assoc_complete_arg *arg)
2304{
2305 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002306 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002307 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002308 enum ieee80211_band band;
2309 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002310 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002311
Michal Kazior500ff9f2015-03-31 10:26:21 +00002312 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2313 return;
2314
Kalle Valo5e3dd152013-06-12 20:52:10 +03002315 if (!vht_cap->vht_supported)
2316 return;
2317
Michal Kazior45c9abc2015-04-21 20:42:58 +03002318 band = def.chan->band;
2319 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2320
2321 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2322 return;
2323
Kalle Valo5e3dd152013-06-12 20:52:10 +03002324 arg->peer_flags |= WMI_PEER_VHT;
Yanbo Lid68bb122015-01-23 08:18:20 +08002325
Michal Kazior500ff9f2015-03-31 10:26:21 +00002326 if (def.chan->band == IEEE80211_BAND_2GHZ)
Yanbo Lid68bb122015-01-23 08:18:20 +08002327 arg->peer_flags |= WMI_PEER_VHT_2G;
2328
Kalle Valo5e3dd152013-06-12 20:52:10 +03002329 arg->peer_vht_caps = vht_cap->cap;
2330
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002331 ampdu_factor = (vht_cap->cap &
2332 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2333 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2334
2335 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2336 * zero in VHT IE. Using it would result in degraded throughput.
2337 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2338 * it if VHT max_mpdu is smaller. */
2339 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2340 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2341 ampdu_factor)) - 1);
2342
Kalle Valo5e3dd152013-06-12 20:52:10 +03002343 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2344 arg->peer_flags |= WMI_PEER_80MHZ;
2345
2346 arg->peer_vht_rates.rx_max_rate =
2347 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2348 arg->peer_vht_rates.rx_mcs_set =
2349 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2350 arg->peer_vht_rates.tx_max_rate =
2351 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002352 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2353 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002354
Michal Kazior7aa7a722014-08-25 12:09:38 +02002355 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002356 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002357}
2358
2359static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002360 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002361 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002362 struct wmi_peer_assoc_complete_arg *arg)
2363{
Michal Kazior590922a2014-10-21 10:10:29 +03002364 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2365
Kalle Valo5e3dd152013-06-12 20:52:10 +03002366 switch (arvif->vdev_type) {
2367 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002368 if (sta->wme)
2369 arg->peer_flags |= WMI_PEER_QOS;
2370
2371 if (sta->wme && sta->uapsd_queues) {
2372 arg->peer_flags |= WMI_PEER_APSD;
2373 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2374 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002375 break;
2376 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002377 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002378 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002379 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002380 case WMI_VDEV_TYPE_IBSS:
2381 if (sta->wme)
2382 arg->peer_flags |= WMI_PEER_QOS;
2383 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002384 default:
2385 break;
2386 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002387
2388 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2389 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002390}
2391
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002392static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002393{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002394 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2395 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002396}
2397
Kalle Valo5e3dd152013-06-12 20:52:10 +03002398static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002399 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002400 struct ieee80211_sta *sta,
2401 struct wmi_peer_assoc_complete_arg *arg)
2402{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002403 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002404 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002405 enum ieee80211_band band;
2406 const u8 *ht_mcs_mask;
2407 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002408 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2409
Michal Kazior500ff9f2015-03-31 10:26:21 +00002410 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2411 return;
2412
Michal Kazior45c9abc2015-04-21 20:42:58 +03002413 band = def.chan->band;
2414 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2415 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2416
2417 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002418 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002419 if (sta->vht_cap.vht_supported &&
2420 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002421 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2422 phymode = MODE_11AC_VHT40;
2423 else
2424 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002425 } else if (sta->ht_cap.ht_supported &&
2426 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002427 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2428 phymode = MODE_11NG_HT40;
2429 else
2430 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002431 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002432 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002433 } else {
2434 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002435 }
2436
2437 break;
2438 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002439 /*
2440 * Check VHT first.
2441 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002442 if (sta->vht_cap.vht_supported &&
2443 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002444 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2445 phymode = MODE_11AC_VHT80;
2446 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2447 phymode = MODE_11AC_VHT40;
2448 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2449 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002450 } else if (sta->ht_cap.ht_supported &&
2451 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2452 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002453 phymode = MODE_11NA_HT40;
2454 else
2455 phymode = MODE_11NA_HT20;
2456 } else {
2457 phymode = MODE_11A;
2458 }
2459
2460 break;
2461 default:
2462 break;
2463 }
2464
Michal Kazior7aa7a722014-08-25 12:09:38 +02002465 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002466 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002467
Kalle Valo5e3dd152013-06-12 20:52:10 +03002468 arg->peer_phymode = phymode;
2469 WARN_ON(phymode == MODE_UNKNOWN);
2470}
2471
Kalle Valob9ada652013-10-16 15:44:46 +03002472static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002473 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002474 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002475 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002476{
Michal Kazior548db542013-07-05 16:15:15 +03002477 lockdep_assert_held(&ar->conf_mutex);
2478
Kalle Valob9ada652013-10-16 15:44:46 +03002479 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002480
Michal Kazior590922a2014-10-21 10:10:29 +03002481 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2482 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002483 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002484 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002485 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002486 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2487 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002488
Kalle Valob9ada652013-10-16 15:44:46 +03002489 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002490}
2491
Michal Kazior90046f52014-02-14 14:45:51 +01002492static const u32 ath10k_smps_map[] = {
2493 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2494 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2495 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2496 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2497};
2498
2499static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2500 const u8 *addr,
2501 const struct ieee80211_sta_ht_cap *ht_cap)
2502{
2503 int smps;
2504
2505 if (!ht_cap->ht_supported)
2506 return 0;
2507
2508 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2509 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2510
2511 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2512 return -EINVAL;
2513
2514 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2515 WMI_PEER_SMPS_STATE,
2516 ath10k_smps_map[smps]);
2517}
2518
Michal Kazior139e1702015-02-15 16:50:42 +02002519static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2520 struct ieee80211_vif *vif,
2521 struct ieee80211_sta_vht_cap vht_cap)
2522{
2523 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2524 int ret;
2525 u32 param;
2526 u32 value;
2527
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302528 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2529 return 0;
2530
Michal Kazior139e1702015-02-15 16:50:42 +02002531 if (!(ar->vht_cap_info &
2532 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2533 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2534 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2535 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2536 return 0;
2537
2538 param = ar->wmi.vdev_param->txbf;
2539 value = 0;
2540
2541 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2542 return 0;
2543
2544 /* The following logic is correct. If a remote STA advertises support
2545 * for being a beamformer then we should enable us being a beamformee.
2546 */
2547
2548 if (ar->vht_cap_info &
2549 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2550 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2551 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2552 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2553
2554 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2555 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2556 }
2557
2558 if (ar->vht_cap_info &
2559 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2560 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2561 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2562 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2563
2564 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2565 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2566 }
2567
2568 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2569 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2570
2571 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2572 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2573
2574 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2575 if (ret) {
2576 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2577 value, ret);
2578 return ret;
2579 }
2580
2581 return 0;
2582}
2583
Kalle Valo5e3dd152013-06-12 20:52:10 +03002584/* can be called only in mac80211 callbacks due to `key_count` usage */
2585static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2586 struct ieee80211_vif *vif,
2587 struct ieee80211_bss_conf *bss_conf)
2588{
2589 struct ath10k *ar = hw->priv;
2590 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002591 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002592 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002593 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002594 struct ieee80211_sta *ap_sta;
2595 int ret;
2596
Michal Kazior548db542013-07-05 16:15:15 +03002597 lockdep_assert_held(&ar->conf_mutex);
2598
Michal Kazior077efc82014-10-21 10:10:29 +03002599 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2600 arvif->vdev_id, arvif->bssid, arvif->aid);
2601
Kalle Valo5e3dd152013-06-12 20:52:10 +03002602 rcu_read_lock();
2603
2604 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2605 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002606 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002607 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002608 rcu_read_unlock();
2609 return;
2610 }
2611
Michal Kazior90046f52014-02-14 14:45:51 +01002612 /* ap_sta must be accessed only within rcu section which must be left
2613 * before calling ath10k_setup_peer_smps() which might sleep. */
2614 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002615 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002616
Michal Kazior590922a2014-10-21 10:10:29 +03002617 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002618 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002619 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002620 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002621 rcu_read_unlock();
2622 return;
2623 }
2624
2625 rcu_read_unlock();
2626
Kalle Valob9ada652013-10-16 15:44:46 +03002627 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2628 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002629 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002630 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002631 return;
2632 }
2633
Michal Kazior90046f52014-02-14 14:45:51 +01002634 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2635 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002636 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002637 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002638 return;
2639 }
2640
Michal Kazior139e1702015-02-15 16:50:42 +02002641 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2642 if (ret) {
2643 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2644 arvif->vdev_id, bss_conf->bssid, ret);
2645 return;
2646 }
2647
Michal Kazior7aa7a722014-08-25 12:09:38 +02002648 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002649 "mac vdev %d up (associated) bssid %pM aid %d\n",
2650 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2651
Michal Kazior077efc82014-10-21 10:10:29 +03002652 WARN_ON(arvif->is_up);
2653
Michal Kaziorc930f742014-01-23 11:38:25 +01002654 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002655 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002656
2657 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2658 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002659 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002660 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002661 return;
2662 }
2663
2664 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002665
2666 /* Workaround: Some firmware revisions (tested with qca6174
2667 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2668 * poked with peer param command.
2669 */
2670 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2671 WMI_PEER_DUMMY_VAR, 1);
2672 if (ret) {
2673 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2674 arvif->bssid, arvif->vdev_id, ret);
2675 return;
2676 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002677}
2678
Kalle Valo5e3dd152013-06-12 20:52:10 +03002679static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2680 struct ieee80211_vif *vif)
2681{
2682 struct ath10k *ar = hw->priv;
2683 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002684 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002685 int ret;
2686
Michal Kazior548db542013-07-05 16:15:15 +03002687 lockdep_assert_held(&ar->conf_mutex);
2688
Michal Kazior077efc82014-10-21 10:10:29 +03002689 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2690 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002691
Kalle Valo5e3dd152013-06-12 20:52:10 +03002692 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002693 if (ret)
2694 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2695 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002696
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002697 arvif->def_wep_key_idx = -1;
2698
Michal Kazior139e1702015-02-15 16:50:42 +02002699 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2700 if (ret) {
2701 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2702 arvif->vdev_id, ret);
2703 return;
2704 }
2705
Michal Kaziorc930f742014-01-23 11:38:25 +01002706 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002707
2708 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002709}
2710
Michal Kazior590922a2014-10-21 10:10:29 +03002711static int ath10k_station_assoc(struct ath10k *ar,
2712 struct ieee80211_vif *vif,
2713 struct ieee80211_sta *sta,
2714 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002715{
Michal Kazior590922a2014-10-21 10:10:29 +03002716 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002717 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002718 int ret = 0;
2719
Michal Kazior548db542013-07-05 16:15:15 +03002720 lockdep_assert_held(&ar->conf_mutex);
2721
Michal Kazior590922a2014-10-21 10:10:29 +03002722 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002723 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002724 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002725 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002726 return ret;
2727 }
2728
2729 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2730 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002731 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002732 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002733 return ret;
2734 }
2735
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002736 /* Re-assoc is run only to update supported rates for given station. It
2737 * doesn't make much sense to reconfigure the peer completely.
2738 */
2739 if (!reassoc) {
2740 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2741 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002742 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002743 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002744 arvif->vdev_id, ret);
2745 return ret;
2746 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002747
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002748 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2749 if (ret) {
2750 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2751 sta->addr, arvif->vdev_id, ret);
2752 return ret;
2753 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002754
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002755 if (!sta->wme) {
2756 arvif->num_legacy_stations++;
2757 ret = ath10k_recalc_rtscts_prot(arvif);
2758 if (ret) {
2759 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2760 arvif->vdev_id, ret);
2761 return ret;
2762 }
2763 }
2764
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002765 /* Plumb cached keys only for static WEP */
2766 if (arvif->def_wep_key_idx != -1) {
2767 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2768 if (ret) {
2769 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2770 arvif->vdev_id, ret);
2771 return ret;
2772 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002773 }
2774 }
2775
Kalle Valo5e3dd152013-06-12 20:52:10 +03002776 return ret;
2777}
2778
Michal Kazior590922a2014-10-21 10:10:29 +03002779static int ath10k_station_disassoc(struct ath10k *ar,
2780 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002781 struct ieee80211_sta *sta)
2782{
Michal Kazior590922a2014-10-21 10:10:29 +03002783 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002784 int ret = 0;
2785
2786 lockdep_assert_held(&ar->conf_mutex);
2787
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002788 if (!sta->wme) {
2789 arvif->num_legacy_stations--;
2790 ret = ath10k_recalc_rtscts_prot(arvif);
2791 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002792 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002793 arvif->vdev_id, ret);
2794 return ret;
2795 }
2796 }
2797
Kalle Valo5e3dd152013-06-12 20:52:10 +03002798 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2799 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002800 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002801 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002802 return ret;
2803 }
2804
2805 return ret;
2806}
2807
2808/**************/
2809/* Regulatory */
2810/**************/
2811
2812static int ath10k_update_channel_list(struct ath10k *ar)
2813{
2814 struct ieee80211_hw *hw = ar->hw;
2815 struct ieee80211_supported_band **bands;
2816 enum ieee80211_band band;
2817 struct ieee80211_channel *channel;
2818 struct wmi_scan_chan_list_arg arg = {0};
2819 struct wmi_channel_arg *ch;
2820 bool passive;
2821 int len;
2822 int ret;
2823 int i;
2824
Michal Kazior548db542013-07-05 16:15:15 +03002825 lockdep_assert_held(&ar->conf_mutex);
2826
Kalle Valo5e3dd152013-06-12 20:52:10 +03002827 bands = hw->wiphy->bands;
2828 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2829 if (!bands[band])
2830 continue;
2831
2832 for (i = 0; i < bands[band]->n_channels; i++) {
2833 if (bands[band]->channels[i].flags &
2834 IEEE80211_CHAN_DISABLED)
2835 continue;
2836
2837 arg.n_channels++;
2838 }
2839 }
2840
2841 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2842 arg.channels = kzalloc(len, GFP_KERNEL);
2843 if (!arg.channels)
2844 return -ENOMEM;
2845
2846 ch = arg.channels;
2847 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2848 if (!bands[band])
2849 continue;
2850
2851 for (i = 0; i < bands[band]->n_channels; i++) {
2852 channel = &bands[band]->channels[i];
2853
2854 if (channel->flags & IEEE80211_CHAN_DISABLED)
2855 continue;
2856
2857 ch->allow_ht = true;
2858
2859 /* FIXME: when should we really allow VHT? */
2860 ch->allow_vht = true;
2861
2862 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002863 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002864
2865 ch->ht40plus =
2866 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2867
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002868 ch->chan_radar =
2869 !!(channel->flags & IEEE80211_CHAN_RADAR);
2870
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002871 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002872 ch->passive = passive;
2873
2874 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002875 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002876 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002877 ch->max_power = channel->max_power * 2;
2878 ch->max_reg_power = channel->max_reg_power * 2;
2879 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002880 ch->reg_class_id = 0; /* FIXME */
2881
2882 /* FIXME: why use only legacy modes, why not any
2883 * HT/VHT modes? Would that even make any
2884 * difference? */
2885 if (channel->band == IEEE80211_BAND_2GHZ)
2886 ch->mode = MODE_11G;
2887 else
2888 ch->mode = MODE_11A;
2889
2890 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2891 continue;
2892
Michal Kazior7aa7a722014-08-25 12:09:38 +02002893 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002894 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2895 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002896 ch->freq, ch->max_power, ch->max_reg_power,
2897 ch->max_antenna_gain, ch->mode);
2898
2899 ch++;
2900 }
2901 }
2902
2903 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2904 kfree(arg.channels);
2905
2906 return ret;
2907}
2908
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002909static enum wmi_dfs_region
2910ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2911{
2912 switch (dfs_region) {
2913 case NL80211_DFS_UNSET:
2914 return WMI_UNINIT_DFS_DOMAIN;
2915 case NL80211_DFS_FCC:
2916 return WMI_FCC_DFS_DOMAIN;
2917 case NL80211_DFS_ETSI:
2918 return WMI_ETSI_DFS_DOMAIN;
2919 case NL80211_DFS_JP:
2920 return WMI_MKK4_DFS_DOMAIN;
2921 }
2922 return WMI_UNINIT_DFS_DOMAIN;
2923}
2924
Michal Kaziorf7843d72013-07-16 09:38:52 +02002925static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002926{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002927 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002928 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002929 enum wmi_dfs_region wmi_dfs_reg;
2930 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002931
Michal Kaziorf7843d72013-07-16 09:38:52 +02002932 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002933
2934 ret = ath10k_update_channel_list(ar);
2935 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002936 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002937
2938 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002939
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002940 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2941 nl_dfs_reg = ar->dfs_detector->region;
2942 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2943 } else {
2944 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2945 }
2946
Kalle Valo5e3dd152013-06-12 20:52:10 +03002947 /* Target allows setting up per-band regdomain but ath_common provides
2948 * a combined one only */
2949 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002950 regpair->reg_domain,
2951 regpair->reg_domain, /* 2ghz */
2952 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002953 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002954 regpair->reg_5ghz_ctl,
2955 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002956 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002957 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002958}
Michal Kazior548db542013-07-05 16:15:15 +03002959
Michal Kaziorf7843d72013-07-16 09:38:52 +02002960static void ath10k_reg_notifier(struct wiphy *wiphy,
2961 struct regulatory_request *request)
2962{
2963 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2964 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002965 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002966
2967 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2968
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002969 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002970 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002971 request->dfs_region);
2972 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2973 request->dfs_region);
2974 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002975 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002976 request->dfs_region);
2977 }
2978
Michal Kaziorf7843d72013-07-16 09:38:52 +02002979 mutex_lock(&ar->conf_mutex);
2980 if (ar->state == ATH10K_STATE_ON)
2981 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002982 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002983}
2984
2985/***************/
2986/* TX handlers */
2987/***************/
2988
Michal Kazior96d828d2015-03-31 10:26:23 +00002989void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2990{
2991 lockdep_assert_held(&ar->htt.tx_lock);
2992
2993 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2994 ar->tx_paused |= BIT(reason);
2995 ieee80211_stop_queues(ar->hw);
2996}
2997
2998static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2999 struct ieee80211_vif *vif)
3000{
3001 struct ath10k *ar = data;
3002 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3003
3004 if (arvif->tx_paused)
3005 return;
3006
3007 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3008}
3009
3010void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3011{
3012 lockdep_assert_held(&ar->htt.tx_lock);
3013
3014 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3015 ar->tx_paused &= ~BIT(reason);
3016
3017 if (ar->tx_paused)
3018 return;
3019
3020 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3021 IEEE80211_IFACE_ITER_RESUME_ALL,
3022 ath10k_mac_tx_unlock_iter,
3023 ar);
Michal Kazior3a73d1a2015-08-06 14:46:54 +02003024
3025 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
Michal Kazior96d828d2015-03-31 10:26:23 +00003026}
3027
3028void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3029{
3030 struct ath10k *ar = arvif->ar;
3031
3032 lockdep_assert_held(&ar->htt.tx_lock);
3033
3034 WARN_ON(reason >= BITS_PER_LONG);
3035 arvif->tx_paused |= BIT(reason);
3036 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3037}
3038
3039void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3040{
3041 struct ath10k *ar = arvif->ar;
3042
3043 lockdep_assert_held(&ar->htt.tx_lock);
3044
3045 WARN_ON(reason >= BITS_PER_LONG);
3046 arvif->tx_paused &= ~BIT(reason);
3047
3048 if (ar->tx_paused)
3049 return;
3050
3051 if (arvif->tx_paused)
3052 return;
3053
3054 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3055}
3056
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003057static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3058 enum wmi_tlv_tx_pause_id pause_id,
3059 enum wmi_tlv_tx_pause_action action)
3060{
3061 struct ath10k *ar = arvif->ar;
3062
3063 lockdep_assert_held(&ar->htt.tx_lock);
3064
Michal Kazioracd0b272015-07-09 13:08:38 +02003065 switch (action) {
3066 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3067 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003068 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003069 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3070 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3071 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003072 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003073 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3074 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003075 break;
3076 }
3077}
3078
3079struct ath10k_mac_tx_pause {
3080 u32 vdev_id;
3081 enum wmi_tlv_tx_pause_id pause_id;
3082 enum wmi_tlv_tx_pause_action action;
3083};
3084
3085static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3086 struct ieee80211_vif *vif)
3087{
3088 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3089 struct ath10k_mac_tx_pause *arg = data;
3090
Michal Kazioracd0b272015-07-09 13:08:38 +02003091 if (arvif->vdev_id != arg->vdev_id)
3092 return;
3093
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003094 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3095}
3096
Michal Kazioracd0b272015-07-09 13:08:38 +02003097void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3098 enum wmi_tlv_tx_pause_id pause_id,
3099 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003100{
3101 struct ath10k_mac_tx_pause arg = {
3102 .vdev_id = vdev_id,
3103 .pause_id = pause_id,
3104 .action = action,
3105 };
3106
3107 spin_lock_bh(&ar->htt.tx_lock);
3108 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3109 IEEE80211_IFACE_ITER_RESUME_ALL,
3110 ath10k_mac_handle_tx_pause_iter,
3111 &arg);
3112 spin_unlock_bh(&ar->htt.tx_lock);
3113}
3114
Michal Kazior42c3aa62013-10-02 11:03:38 +02003115static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3116{
3117 if (ieee80211_is_mgmt(hdr->frame_control))
3118 return HTT_DATA_TX_EXT_TID_MGMT;
3119
3120 if (!ieee80211_is_data_qos(hdr->frame_control))
3121 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3122
3123 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3124 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3125
3126 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3127}
3128
Michal Kazior2b37c292014-09-02 11:00:22 +03003129static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003130{
Michal Kazior2b37c292014-09-02 11:00:22 +03003131 if (vif)
3132 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003133
Michal Kazior1bbc0972014-04-08 09:45:47 +03003134 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003135 return ar->monitor_vdev_id;
3136
Michal Kazior7aa7a722014-08-25 12:09:38 +02003137 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003138 return 0;
3139}
3140
Michal Kaziord740d8f2015-03-30 09:51:51 +03003141static enum ath10k_hw_txrx_mode
3142ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003143 struct ieee80211_sta *sta, struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003144{
3145 const struct ieee80211_hdr *hdr = (void *)skb->data;
3146 __le16 fc = hdr->frame_control;
3147
3148 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3149 return ATH10K_HW_TXRX_RAW;
3150
3151 if (ieee80211_is_mgmt(fc))
3152 return ATH10K_HW_TXRX_MGMT;
3153
3154 /* Workaround:
3155 *
3156 * NullFunc frames are mostly used to ping if a client or AP are still
3157 * reachable and responsive. This implies tx status reports must be
3158 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3159 * come to a conclusion that the other end disappeared and tear down
3160 * BSS connection or it can never disconnect from BSS/client (which is
3161 * the case).
3162 *
3163 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3164 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3165 * which seems to deliver correct tx reports for NullFunc frames. The
3166 * downside of using it is it ignores client powersave state so it can
3167 * end up disconnecting sleeping clients in AP mode. It should fix STA
3168 * mode though because AP don't sleep.
3169 */
3170 if (ar->htt.target_version_major < 3 &&
3171 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3172 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3173 return ATH10K_HW_TXRX_MGMT;
3174
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003175 /* Workaround:
3176 *
3177 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3178 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3179 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003180 *
3181 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003182 */
3183 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3184 return ATH10K_HW_TXRX_ETHERNET;
3185
David Liuccec9032015-07-24 20:25:32 +03003186 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3187 return ATH10K_HW_TXRX_RAW;
3188
Michal Kaziord740d8f2015-03-30 09:51:51 +03003189 return ATH10K_HW_TXRX_NATIVE_WIFI;
3190}
3191
David Liuccec9032015-07-24 20:25:32 +03003192static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3193 struct sk_buff *skb) {
3194 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3195 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3196 IEEE80211_TX_CTL_INJECTED;
3197 if ((info->flags & mask) == mask)
3198 return false;
3199 if (vif)
3200 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3201 return true;
3202}
3203
Michal Kazior4b604552014-07-21 21:03:09 +03003204/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3205 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003206 */
Michal Kazior4b604552014-07-21 21:03:09 +03003207static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003208{
3209 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003210 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003211 u8 *qos_ctl;
3212
3213 if (!ieee80211_is_data_qos(hdr->frame_control))
3214 return;
3215
3216 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003217 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3218 skb->data, (void *)qos_ctl - (void *)skb->data);
3219 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003220
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003221 /* Some firmware revisions don't handle sending QoS NullFunc well.
3222 * These frames are mainly used for CQM purposes so it doesn't really
3223 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003224 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003225 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003226 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003227 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003228
3229 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003230}
3231
Michal Kaziord740d8f2015-03-30 09:51:51 +03003232static void ath10k_tx_h_8023(struct sk_buff *skb)
3233{
3234 struct ieee80211_hdr *hdr;
3235 struct rfc1042_hdr *rfc1042;
3236 struct ethhdr *eth;
3237 size_t hdrlen;
3238 u8 da[ETH_ALEN];
3239 u8 sa[ETH_ALEN];
3240 __be16 type;
3241
3242 hdr = (void *)skb->data;
3243 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3244 rfc1042 = (void *)skb->data + hdrlen;
3245
3246 ether_addr_copy(da, ieee80211_get_DA(hdr));
3247 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3248 type = rfc1042->snap_type;
3249
3250 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3251 skb_push(skb, sizeof(*eth));
3252
3253 eth = (void *)skb->data;
3254 ether_addr_copy(eth->h_dest, da);
3255 ether_addr_copy(eth->h_source, sa);
3256 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003257}
3258
Michal Kazior4b604552014-07-21 21:03:09 +03003259static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3260 struct ieee80211_vif *vif,
3261 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003262{
3263 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003264 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3265
3266 /* This is case only for P2P_GO */
3267 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3268 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3269 return;
3270
3271 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3272 spin_lock_bh(&ar->data_lock);
3273 if (arvif->u.ap.noa_data)
3274 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3275 GFP_ATOMIC))
3276 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3277 arvif->u.ap.noa_data,
3278 arvif->u.ap.noa_len);
3279 spin_unlock_bh(&ar->data_lock);
3280 }
3281}
3282
Michal Kazior8d6d3622014-11-24 14:58:31 +01003283static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3284{
3285 /* FIXME: Not really sure since when the behaviour changed. At some
3286 * point new firmware stopped requiring creation of peer entries for
3287 * offchannel tx (and actually creating them causes issues with wmi-htc
3288 * tx credit replenishment and reliability). Assuming it's at least 3.4
3289 * because that's when the `freq` was introduced to TX_FRM HTT command.
3290 */
3291 return !(ar->htt.target_version_major >= 3 &&
3292 ar->htt.target_version_minor >= 4);
3293}
3294
Michal Kaziord740d8f2015-03-30 09:51:51 +03003295static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003296{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003297 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003298 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003299
Michal Kaziord740d8f2015-03-30 09:51:51 +03003300 spin_lock_bh(&ar->data_lock);
3301
3302 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3303 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3304 ret = -ENOSPC;
3305 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003306 }
3307
Michal Kaziord740d8f2015-03-30 09:51:51 +03003308 __skb_queue_tail(q, skb);
3309 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3310
3311unlock:
3312 spin_unlock_bh(&ar->data_lock);
3313
3314 return ret;
3315}
3316
3317static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3318{
3319 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3320 struct ath10k_htt *htt = &ar->htt;
3321 int ret = 0;
3322
3323 switch (cb->txmode) {
3324 case ATH10K_HW_TXRX_RAW:
3325 case ATH10K_HW_TXRX_NATIVE_WIFI:
3326 case ATH10K_HW_TXRX_ETHERNET:
3327 ret = ath10k_htt_tx(htt, skb);
3328 break;
3329 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003330 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003331 ar->fw_features))
3332 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3333 else if (ar->htt.target_version_major >= 3)
3334 ret = ath10k_htt_tx(htt, skb);
3335 else
3336 ret = ath10k_htt_mgmt_tx(htt, skb);
3337 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003338 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003339
3340 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003341 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3342 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003343 ieee80211_free_txskb(ar->hw, skb);
3344 }
3345}
3346
3347void ath10k_offchan_tx_purge(struct ath10k *ar)
3348{
3349 struct sk_buff *skb;
3350
3351 for (;;) {
3352 skb = skb_dequeue(&ar->offchan_tx_queue);
3353 if (!skb)
3354 break;
3355
3356 ieee80211_free_txskb(ar->hw, skb);
3357 }
3358}
3359
3360void ath10k_offchan_tx_work(struct work_struct *work)
3361{
3362 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3363 struct ath10k_peer *peer;
3364 struct ieee80211_hdr *hdr;
3365 struct sk_buff *skb;
3366 const u8 *peer_addr;
3367 int vdev_id;
3368 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003369 unsigned long time_left;
Michal Kazioradaeed72015-08-05 12:15:23 +02003370 bool tmp_peer_created = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003371
3372 /* FW requirement: We must create a peer before FW will send out
3373 * an offchannel frame. Otherwise the frame will be stuck and
3374 * never transmitted. We delete the peer upon tx completion.
3375 * It is unlikely that a peer for offchannel tx will already be
3376 * present. However it may be in some rare cases so account for that.
3377 * Otherwise we might remove a legitimate peer and break stuff. */
3378
3379 for (;;) {
3380 skb = skb_dequeue(&ar->offchan_tx_queue);
3381 if (!skb)
3382 break;
3383
3384 mutex_lock(&ar->conf_mutex);
3385
Michal Kazior7aa7a722014-08-25 12:09:38 +02003386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003387 skb);
3388
3389 hdr = (struct ieee80211_hdr *)skb->data;
3390 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003391 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003392
3393 spin_lock_bh(&ar->data_lock);
3394 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3395 spin_unlock_bh(&ar->data_lock);
3396
3397 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003398 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003399 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003400 peer_addr, vdev_id);
3401
3402 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003403 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3404 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003405 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003406 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003407 peer_addr, vdev_id, ret);
Michal Kazioradaeed72015-08-05 12:15:23 +02003408 tmp_peer_created = (ret == 0);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003409 }
3410
3411 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003412 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003413 ar->offchan_tx_skb = skb;
3414 spin_unlock_bh(&ar->data_lock);
3415
Michal Kaziord740d8f2015-03-30 09:51:51 +03003416 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003417
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003418 time_left =
3419 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3420 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003421 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003422 skb);
3423
Michal Kazioradaeed72015-08-05 12:15:23 +02003424 if (!peer && tmp_peer_created) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003425 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3426 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003427 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003428 peer_addr, vdev_id, ret);
3429 }
3430
3431 mutex_unlock(&ar->conf_mutex);
3432 }
3433}
3434
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003435void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3436{
3437 struct sk_buff *skb;
3438
3439 for (;;) {
3440 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3441 if (!skb)
3442 break;
3443
3444 ieee80211_free_txskb(ar->hw, skb);
3445 }
3446}
3447
3448void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3449{
3450 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3451 struct sk_buff *skb;
3452 int ret;
3453
3454 for (;;) {
3455 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3456 if (!skb)
3457 break;
3458
3459 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003460 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003461 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003462 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003463 ieee80211_free_txskb(ar->hw, skb);
3464 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003465 }
3466}
3467
Kalle Valo5e3dd152013-06-12 20:52:10 +03003468/************/
3469/* Scanning */
3470/************/
3471
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003472void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003473{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003474 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003475
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003476 switch (ar->scan.state) {
3477 case ATH10K_SCAN_IDLE:
3478 break;
3479 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003480 case ATH10K_SCAN_ABORTING:
3481 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003482 ieee80211_scan_completed(ar->hw,
3483 (ar->scan.state ==
3484 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003485 else if (ar->scan.roc_notify)
3486 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003487 /* fall through */
3488 case ATH10K_SCAN_STARTING:
3489 ar->scan.state = ATH10K_SCAN_IDLE;
3490 ar->scan_channel = NULL;
3491 ath10k_offchan_tx_purge(ar);
3492 cancel_delayed_work(&ar->scan.timeout);
3493 complete_all(&ar->scan.completed);
3494 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003495 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003496}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003497
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003498void ath10k_scan_finish(struct ath10k *ar)
3499{
3500 spin_lock_bh(&ar->data_lock);
3501 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003502 spin_unlock_bh(&ar->data_lock);
3503}
3504
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003505static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003506{
3507 struct wmi_stop_scan_arg arg = {
3508 .req_id = 1, /* FIXME */
3509 .req_type = WMI_SCAN_STOP_ONE,
3510 .u.scan_id = ATH10K_SCAN_ID,
3511 };
3512 int ret;
3513
3514 lockdep_assert_held(&ar->conf_mutex);
3515
Kalle Valo5e3dd152013-06-12 20:52:10 +03003516 ret = ath10k_wmi_stop_scan(ar, &arg);
3517 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003518 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003519 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003520 }
3521
Kalle Valo5e3dd152013-06-12 20:52:10 +03003522 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003523 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003524 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003525 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003526 } else if (ret > 0) {
3527 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003528 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003529
3530out:
3531 /* Scan state should be updated upon scan completion but in case
3532 * firmware fails to deliver the event (for whatever reason) it is
3533 * desired to clean up scan state anyway. Firmware may have just
3534 * dropped the scan completion event delivery due to transport pipe
3535 * being overflown with data and/or it can recover on its own before
3536 * next scan request is submitted.
3537 */
3538 spin_lock_bh(&ar->data_lock);
3539 if (ar->scan.state != ATH10K_SCAN_IDLE)
3540 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003541 spin_unlock_bh(&ar->data_lock);
3542
3543 return ret;
3544}
3545
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003546static void ath10k_scan_abort(struct ath10k *ar)
3547{
3548 int ret;
3549
3550 lockdep_assert_held(&ar->conf_mutex);
3551
3552 spin_lock_bh(&ar->data_lock);
3553
3554 switch (ar->scan.state) {
3555 case ATH10K_SCAN_IDLE:
3556 /* This can happen if timeout worker kicked in and called
3557 * abortion while scan completion was being processed.
3558 */
3559 break;
3560 case ATH10K_SCAN_STARTING:
3561 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003562 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003563 ath10k_scan_state_str(ar->scan.state),
3564 ar->scan.state);
3565 break;
3566 case ATH10K_SCAN_RUNNING:
3567 ar->scan.state = ATH10K_SCAN_ABORTING;
3568 spin_unlock_bh(&ar->data_lock);
3569
3570 ret = ath10k_scan_stop(ar);
3571 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003572 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003573
3574 spin_lock_bh(&ar->data_lock);
3575 break;
3576 }
3577
3578 spin_unlock_bh(&ar->data_lock);
3579}
3580
3581void ath10k_scan_timeout_work(struct work_struct *work)
3582{
3583 struct ath10k *ar = container_of(work, struct ath10k,
3584 scan.timeout.work);
3585
3586 mutex_lock(&ar->conf_mutex);
3587 ath10k_scan_abort(ar);
3588 mutex_unlock(&ar->conf_mutex);
3589}
3590
Kalle Valo5e3dd152013-06-12 20:52:10 +03003591static int ath10k_start_scan(struct ath10k *ar,
3592 const struct wmi_start_scan_arg *arg)
3593{
3594 int ret;
3595
3596 lockdep_assert_held(&ar->conf_mutex);
3597
3598 ret = ath10k_wmi_start_scan(ar, arg);
3599 if (ret)
3600 return ret;
3601
Kalle Valo5e3dd152013-06-12 20:52:10 +03003602 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3603 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003604 ret = ath10k_scan_stop(ar);
3605 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003606 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003607
3608 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003609 }
3610
Ben Greear2f9eec02015-02-15 16:50:38 +02003611 /* If we failed to start the scan, return error code at
3612 * this point. This is probably due to some issue in the
3613 * firmware, but no need to wedge the driver due to that...
3614 */
3615 spin_lock_bh(&ar->data_lock);
3616 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3617 spin_unlock_bh(&ar->data_lock);
3618 return -EINVAL;
3619 }
3620 spin_unlock_bh(&ar->data_lock);
3621
Kalle Valo5e3dd152013-06-12 20:52:10 +03003622 return 0;
3623}
3624
3625/**********************/
3626/* mac80211 callbacks */
3627/**********************/
3628
3629static void ath10k_tx(struct ieee80211_hw *hw,
3630 struct ieee80211_tx_control *control,
3631 struct sk_buff *skb)
3632{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003633 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003634 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3635 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003636 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003637 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kaziord740d8f2015-03-30 09:51:51 +03003638 __le16 fc = hdr->frame_control;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003639
3640 /* We should disable CCK RATE due to P2P */
3641 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003642 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003643
Michal Kazior4b604552014-07-21 21:03:09 +03003644 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003645 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003646 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
David Liuccec9032015-07-24 20:25:32 +03003647 ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
Michal Kazior2b37c292014-09-02 11:00:22 +03003648 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003649 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003650 ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003651
Michal Kaziord740d8f2015-03-30 09:51:51 +03003652 switch (ATH10K_SKB_CB(skb)->txmode) {
3653 case ATH10K_HW_TXRX_MGMT:
3654 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003655 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003656 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3657 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003658 break;
3659 case ATH10K_HW_TXRX_ETHERNET:
3660 ath10k_tx_h_8023(skb);
3661 break;
3662 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003663 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3664 WARN_ON_ONCE(1);
3665 ieee80211_free_txskb(hw, skb);
3666 return;
3667 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003668 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003669
Kalle Valo5e3dd152013-06-12 20:52:10 +03003670 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3671 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003672 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003673 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003674 spin_unlock_bh(&ar->data_lock);
3675
Michal Kazior8d6d3622014-11-24 14:58:31 +01003676 if (ath10k_mac_need_offchan_tx_work(ar)) {
3677 ATH10K_SKB_CB(skb)->htt.freq = 0;
3678 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003679
Michal Kazior8d6d3622014-11-24 14:58:31 +01003680 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3681 skb);
3682
3683 skb_queue_tail(&ar->offchan_tx_queue, skb);
3684 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3685 return;
3686 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003687 }
3688
Michal Kaziord740d8f2015-03-30 09:51:51 +03003689 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003690}
3691
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003692/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003693void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003694{
3695 /* make sure rcu-protected mac80211 tx path itself is drained */
3696 synchronize_net();
3697
3698 ath10k_offchan_tx_purge(ar);
3699 ath10k_mgmt_over_wmi_tx_purge(ar);
3700
3701 cancel_work_sync(&ar->offchan_tx_work);
3702 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3703}
3704
Michal Kazioraffd3212013-07-16 09:54:35 +02003705void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003706{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003707 struct ath10k_vif *arvif;
3708
Michal Kazior818bdd12013-07-16 09:38:57 +02003709 lockdep_assert_held(&ar->conf_mutex);
3710
Michal Kazior19337472014-08-28 12:58:16 +02003711 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3712 ar->filter_flags = 0;
3713 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003714 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003715
3716 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003717 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003718
3719 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003720 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003721
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003722 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003723 ath10k_peer_cleanup_all(ar);
3724 ath10k_core_stop(ar);
3725 ath10k_hif_power_down(ar);
3726
3727 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003728 list_for_each_entry(arvif, &ar->arvifs, list)
3729 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003730 spin_unlock_bh(&ar->data_lock);
3731}
3732
Ben Greear46acf7b2014-05-16 17:15:38 +03003733static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3734{
3735 struct ath10k *ar = hw->priv;
3736
3737 mutex_lock(&ar->conf_mutex);
3738
3739 if (ar->cfg_tx_chainmask) {
3740 *tx_ant = ar->cfg_tx_chainmask;
3741 *rx_ant = ar->cfg_rx_chainmask;
3742 } else {
3743 *tx_ant = ar->supp_tx_chainmask;
3744 *rx_ant = ar->supp_rx_chainmask;
3745 }
3746
3747 mutex_unlock(&ar->conf_mutex);
3748
3749 return 0;
3750}
3751
Ben Greear5572a952014-11-24 16:22:10 +02003752static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3753{
3754 /* It is not clear that allowing gaps in chainmask
3755 * is helpful. Probably it will not do what user
3756 * is hoping for, so warn in that case.
3757 */
3758 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3759 return;
3760
3761 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3762 dbg, cm);
3763}
3764
Ben Greear46acf7b2014-05-16 17:15:38 +03003765static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3766{
3767 int ret;
3768
3769 lockdep_assert_held(&ar->conf_mutex);
3770
Ben Greear5572a952014-11-24 16:22:10 +02003771 ath10k_check_chain_mask(ar, tx_ant, "tx");
3772 ath10k_check_chain_mask(ar, rx_ant, "rx");
3773
Ben Greear46acf7b2014-05-16 17:15:38 +03003774 ar->cfg_tx_chainmask = tx_ant;
3775 ar->cfg_rx_chainmask = rx_ant;
3776
3777 if ((ar->state != ATH10K_STATE_ON) &&
3778 (ar->state != ATH10K_STATE_RESTARTED))
3779 return 0;
3780
3781 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3782 tx_ant);
3783 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003784 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003785 ret, tx_ant);
3786 return ret;
3787 }
3788
3789 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3790 rx_ant);
3791 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003792 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003793 ret, rx_ant);
3794 return ret;
3795 }
3796
3797 return 0;
3798}
3799
3800static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3801{
3802 struct ath10k *ar = hw->priv;
3803 int ret;
3804
3805 mutex_lock(&ar->conf_mutex);
3806 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3807 mutex_unlock(&ar->conf_mutex);
3808 return ret;
3809}
3810
Kalle Valo5e3dd152013-06-12 20:52:10 +03003811static int ath10k_start(struct ieee80211_hw *hw)
3812{
3813 struct ath10k *ar = hw->priv;
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003814 u32 burst_enable;
Michal Kazior818bdd12013-07-16 09:38:57 +02003815 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003816
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003817 /*
3818 * This makes sense only when restarting hw. It is harmless to call
3819 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3820 * commands will be submitted while restarting.
3821 */
3822 ath10k_drain_tx(ar);
3823
Michal Kazior548db542013-07-05 16:15:15 +03003824 mutex_lock(&ar->conf_mutex);
3825
Michal Kaziorc5058f52014-05-26 12:46:03 +03003826 switch (ar->state) {
3827 case ATH10K_STATE_OFF:
3828 ar->state = ATH10K_STATE_ON;
3829 break;
3830 case ATH10K_STATE_RESTARTING:
3831 ath10k_halt(ar);
3832 ar->state = ATH10K_STATE_RESTARTED;
3833 break;
3834 case ATH10K_STATE_ON:
3835 case ATH10K_STATE_RESTARTED:
3836 case ATH10K_STATE_WEDGED:
3837 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02003838 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03003839 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03003840 case ATH10K_STATE_UTF:
3841 ret = -EBUSY;
3842 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02003843 }
3844
3845 ret = ath10k_hif_power_up(ar);
3846 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003847 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003848 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02003849 }
3850
Kalle Valo43d2a302014-09-10 18:23:30 +03003851 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02003852 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003853 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003854 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02003855 }
3856
Bartosz Markowski226a3392013-09-26 17:47:16 +02003857 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003858 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003859 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003860 goto err_core_stop;
3861 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003862
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01003863 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003864 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003865 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003866 goto err_core_stop;
3867 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003868
Michal Kaziorcf327842015-03-31 10:26:25 +00003869 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3870 ret = ath10k_wmi_adaptive_qcs(ar, true);
3871 if (ret) {
3872 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3873 ret);
3874 goto err_core_stop;
3875 }
3876 }
3877
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003878 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
3879 burst_enable = ar->wmi.pdev_param->burst_enable;
3880 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
3881 if (ret) {
3882 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
3883 goto err_core_stop;
3884 }
3885 }
3886
Ben Greear46acf7b2014-05-16 17:15:38 +03003887 if (ar->cfg_tx_chainmask)
3888 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3889 ar->cfg_rx_chainmask);
3890
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003891 /*
3892 * By default FW set ARP frames ac to voice (6). In that case ARP
3893 * exchange is not working properly for UAPSD enabled AP. ARP requests
3894 * which arrives with access category 0 are processed by network stack
3895 * and send back with access category 0, but FW changes access category
3896 * to 6. Set ARP frames access category to best effort (0) solves
3897 * this problem.
3898 */
3899
3900 ret = ath10k_wmi_pdev_set_param(ar,
3901 ar->wmi.pdev_param->arp_ac_override, 0);
3902 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003903 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003904 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003905 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003906 }
3907
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05303908 ret = ath10k_wmi_pdev_set_param(ar,
3909 ar->wmi.pdev_param->ani_enable, 1);
3910 if (ret) {
3911 ath10k_warn(ar, "failed to enable ani by default: %d\n",
3912 ret);
3913 goto err_core_stop;
3914 }
3915
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05303916 ar->ani_enabled = true;
3917
Michal Kaziord6500972014-04-08 09:56:09 +03003918 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02003919 ath10k_regd_update(ar);
3920
Simon Wunderlich855aed12014-08-02 09:12:54 +03003921 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05303922 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03003923
Michal Kaziorae254432014-05-26 12:46:02 +03003924 mutex_unlock(&ar->conf_mutex);
3925 return 0;
3926
3927err_core_stop:
3928 ath10k_core_stop(ar);
3929
3930err_power_down:
3931 ath10k_hif_power_down(ar);
3932
3933err_off:
3934 ar->state = ATH10K_STATE_OFF;
3935
3936err:
Michal Kazior548db542013-07-05 16:15:15 +03003937 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01003938 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003939}
3940
3941static void ath10k_stop(struct ieee80211_hw *hw)
3942{
3943 struct ath10k *ar = hw->priv;
3944
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003945 ath10k_drain_tx(ar);
3946
Michal Kazior548db542013-07-05 16:15:15 +03003947 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003948 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02003949 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003950 ar->state = ATH10K_STATE_OFF;
3951 }
Michal Kazior548db542013-07-05 16:15:15 +03003952 mutex_unlock(&ar->conf_mutex);
3953
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003954 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02003955 cancel_work_sync(&ar->restart_work);
3956}
3957
Michal Kaziorad088bf2013-10-16 15:44:46 +03003958static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02003959{
Michal Kaziorad088bf2013-10-16 15:44:46 +03003960 struct ath10k_vif *arvif;
3961 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02003962
3963 lockdep_assert_held(&ar->conf_mutex);
3964
Michal Kaziorad088bf2013-10-16 15:44:46 +03003965 list_for_each_entry(arvif, &ar->arvifs, list) {
3966 ret = ath10k_mac_vif_setup_ps(arvif);
3967 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003968 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003969 break;
3970 }
3971 }
Michal Kazioraffd3212013-07-16 09:54:35 +02003972
Michal Kaziorad088bf2013-10-16 15:44:46 +03003973 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003974}
3975
Michal Kazior7d9d5582014-10-21 10:40:15 +03003976static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3977{
3978 int ret;
3979 u32 param;
3980
3981 lockdep_assert_held(&ar->conf_mutex);
3982
3983 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3984
3985 param = ar->wmi.pdev_param->txpower_limit2g;
3986 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3987 if (ret) {
3988 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3989 txpower, ret);
3990 return ret;
3991 }
3992
3993 param = ar->wmi.pdev_param->txpower_limit5g;
3994 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3995 if (ret) {
3996 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3997 txpower, ret);
3998 return ret;
3999 }
4000
4001 return 0;
4002}
4003
4004static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4005{
4006 struct ath10k_vif *arvif;
4007 int ret, txpower = -1;
4008
4009 lockdep_assert_held(&ar->conf_mutex);
4010
4011 list_for_each_entry(arvif, &ar->arvifs, list) {
4012 WARN_ON(arvif->txpower < 0);
4013
4014 if (txpower == -1)
4015 txpower = arvif->txpower;
4016 else
4017 txpower = min(txpower, arvif->txpower);
4018 }
4019
4020 if (WARN_ON(txpower == -1))
4021 return -EINVAL;
4022
4023 ret = ath10k_mac_txpower_setup(ar, txpower);
4024 if (ret) {
4025 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4026 txpower, ret);
4027 return ret;
4028 }
4029
4030 return 0;
4031}
4032
Kalle Valo5e3dd152013-06-12 20:52:10 +03004033static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4034{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004035 struct ath10k *ar = hw->priv;
4036 struct ieee80211_conf *conf = &hw->conf;
4037 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004038
4039 mutex_lock(&ar->conf_mutex);
4040
Michal Kazioraffd3212013-07-16 09:54:35 +02004041 if (changed & IEEE80211_CONF_CHANGE_PS)
4042 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004043
4044 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004045 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4046 ret = ath10k_monitor_recalc(ar);
4047 if (ret)
4048 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004049 }
4050
4051 mutex_unlock(&ar->conf_mutex);
4052 return ret;
4053}
4054
Ben Greear5572a952014-11-24 16:22:10 +02004055static u32 get_nss_from_chainmask(u16 chain_mask)
4056{
4057 if ((chain_mask & 0x15) == 0x15)
4058 return 4;
4059 else if ((chain_mask & 0x7) == 0x7)
4060 return 3;
4061 else if ((chain_mask & 0x3) == 0x3)
4062 return 2;
4063 return 1;
4064}
4065
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004066static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4067{
4068 int nsts = ar->vht_cap_info;
Kalle Valo9a149692015-10-05 17:56:36 +03004069
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004070 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4071 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4072
4073 /* If firmware does not deliver to host number of space-time
4074 * streams supported, assume it support up to 4 BF STS and return
4075 * the value for VHT CAP: nsts-1)
4076 * */
4077 if (nsts == 0)
4078 return 3;
4079
4080 return nsts;
4081}
4082
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004083static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4084{
4085 int sound_dim = ar->vht_cap_info;
Kalle Valo9a149692015-10-05 17:56:36 +03004086
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004087 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
Kalle Valo9a149692015-10-05 17:56:36 +03004088 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004089
4090 /* If the sounding dimension is not advertised by the firmware,
4091 * let's use a default value of 1
4092 */
4093 if (sound_dim == 0)
4094 return 1;
4095
4096 return sound_dim;
4097}
4098
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304099static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4100{
4101 u32 value = 0;
4102 struct ath10k *ar = arvif->ar;
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004103 int nsts;
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004104 int sound_dim;
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304105
4106 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4107 return 0;
4108
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004109 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304110 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4111 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004112 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304113
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004114 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304115 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4116 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004117 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304118
4119 if (!value)
4120 return 0;
4121
4122 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4123 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4124
4125 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4126 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4127 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4128
4129 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4130 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4131
4132 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4133 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4134 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4135
4136 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4137 ar->wmi.vdev_param->txbf, value);
4138}
4139
Kalle Valo5e3dd152013-06-12 20:52:10 +03004140/*
4141 * TODO:
4142 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4143 * because we will send mgmt frames without CCK. This requirement
4144 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4145 * in the TX packet.
4146 */
4147static int ath10k_add_interface(struct ieee80211_hw *hw,
4148 struct ieee80211_vif *vif)
4149{
4150 struct ath10k *ar = hw->priv;
4151 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4152 enum wmi_sta_powersave_param param;
4153 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004154 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004155 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004156 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004157 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004158
Johannes Berg848955c2014-11-11 12:48:42 +01004159 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4160
Kalle Valo5e3dd152013-06-12 20:52:10 +03004161 mutex_lock(&ar->conf_mutex);
4162
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004163 memset(arvif, 0, sizeof(*arvif));
4164
Kalle Valo5e3dd152013-06-12 20:52:10 +03004165 arvif->ar = ar;
4166 arvif->vif = vif;
4167
Ben Greeare63b33f2013-10-22 14:54:14 -07004168 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004169 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004170 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4171 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004172
Michal Kazior45c9abc2015-04-21 20:42:58 +03004173 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4174 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4175 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4176 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4177 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4178 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4179 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004180
Michal Kaziore04cafb2015-08-05 12:15:24 +02004181 if (ar->num_peers >= ar->max_num_peers) {
4182 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
Michal Kazior503422d2015-08-19 13:08:53 +02004183 ret = -ENOBUFS;
4184 goto err;
Michal Kaziore04cafb2015-08-05 12:15:24 +02004185 }
4186
Ben Greeara9aefb32014-08-12 11:02:19 +03004187 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004188 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004189 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004190 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004191 }
Ben Greear16c11172014-09-23 14:17:16 -07004192 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004193
Ben Greear16c11172014-09-23 14:17:16 -07004194 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4195 bit, ar->free_vdev_map);
4196
4197 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004198 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004199
Kalle Valo5e3dd152013-06-12 20:52:10 +03004200 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004201 case NL80211_IFTYPE_P2P_DEVICE:
4202 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4203 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4204 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004205 case NL80211_IFTYPE_UNSPECIFIED:
4206 case NL80211_IFTYPE_STATION:
4207 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4208 if (vif->p2p)
4209 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4210 break;
4211 case NL80211_IFTYPE_ADHOC:
4212 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4213 break;
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004214 case NL80211_IFTYPE_MESH_POINT:
4215 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4216 ret = -EINVAL;
4217 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
4218 goto err;
4219 }
4220 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4221 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004222 case NL80211_IFTYPE_AP:
4223 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4224
4225 if (vif->p2p)
4226 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4227 break;
4228 case NL80211_IFTYPE_MONITOR:
4229 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4230 break;
4231 default:
4232 WARN_ON(1);
4233 break;
4234 }
4235
Michal Kazior96d828d2015-03-31 10:26:23 +00004236 /* Using vdev_id as queue number will make it very easy to do per-vif
4237 * tx queue locking. This shouldn't wrap due to interface combinations
4238 * but do a modulo for correctness sake and prevent using offchannel tx
4239 * queues for regular vif tx.
4240 */
4241 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4242 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4243 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4244
Michal Kazior64badcb2014-09-18 11:18:02 +03004245 /* Some firmware revisions don't wait for beacon tx completion before
4246 * sending another SWBA event. This could lead to hardware using old
4247 * (freed) beacon data in some cases, e.g. tx credit starvation
4248 * combined with missed TBTT. This is very very rare.
4249 *
4250 * On non-IOMMU-enabled hosts this could be a possible security issue
4251 * because hw could beacon some random data on the air. On
4252 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4253 * device would crash.
4254 *
4255 * Since there are no beacon tx completions (implicit nor explicit)
4256 * propagated to host the only workaround for this is to allocate a
4257 * DMA-coherent buffer for a lifetime of a vif and use it for all
4258 * beacon tx commands. Worst case for this approach is some beacons may
4259 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4260 */
4261 if (vif->type == NL80211_IFTYPE_ADHOC ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004262 vif->type == NL80211_IFTYPE_MESH_POINT ||
Michal Kazior64badcb2014-09-18 11:18:02 +03004263 vif->type == NL80211_IFTYPE_AP) {
4264 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4265 IEEE80211_MAX_FRAME_LEN,
4266 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304267 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004268 if (!arvif->beacon_buf) {
4269 ret = -ENOMEM;
4270 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4271 ret);
4272 goto err;
4273 }
4274 }
David Liuccec9032015-07-24 20:25:32 +03004275 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4276 arvif->nohwcrypt = true;
4277
4278 if (arvif->nohwcrypt &&
4279 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4280 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4281 goto err;
4282 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004283
4284 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4285 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4286 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004287
4288 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4289 arvif->vdev_subtype, vif->addr);
4290 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004291 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004292 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004293 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004294 }
4295
Ben Greear16c11172014-09-23 14:17:16 -07004296 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004297 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004298
Michal Kazior46725b12015-01-28 09:57:49 +02004299 /* It makes no sense to have firmware do keepalives. mac80211 already
4300 * takes care of this with idle connection polling.
4301 */
4302 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004303 if (ret) {
Michal Kazior46725b12015-01-28 09:57:49 +02004304 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004305 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004306 goto err_vdev_delete;
4307 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004308
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004309 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004310
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004311 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4312 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004313 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004314 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004315 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004316 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004317 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004318 goto err_vdev_delete;
4319 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004320
Ben Greear5572a952014-11-24 16:22:10 +02004321 if (ar->cfg_tx_chainmask) {
4322 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4323
4324 vdev_param = ar->wmi.vdev_param->nss;
4325 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4326 nss);
4327 if (ret) {
4328 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4329 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4330 ret);
4331 goto err_vdev_delete;
4332 }
4333 }
4334
Michal Kaziore57e0572015-03-24 13:14:03 +00004335 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4336 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004337 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4338 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004339 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004340 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004341 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004342 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004343 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004344 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004345
Michal Kaziore57e0572015-03-24 13:14:03 +00004346 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004347 ret = ath10k_mac_set_kickout(arvif);
4348 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004349 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004350 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004351 goto err_peer_delete;
4352 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004353 }
4354
4355 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4356 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4357 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4358 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4359 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004360 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004361 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004362 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004363 goto err_peer_delete;
4364 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004365
Michal Kazior9f9b5742014-12-12 12:41:36 +01004366 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004367 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004368 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004369 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004370 goto err_peer_delete;
4371 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004372
Michal Kazior9f9b5742014-12-12 12:41:36 +01004373 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004374 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004375 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004376 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004377 goto err_peer_delete;
4378 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004379 }
4380
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304381 ret = ath10k_mac_set_txbf_conf(arvif);
4382 if (ret) {
4383 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4384 arvif->vdev_id, ret);
4385 goto err_peer_delete;
4386 }
4387
Michal Kazior424121c2013-07-22 14:13:31 +02004388 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004389 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004390 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004391 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004392 goto err_peer_delete;
4393 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004394
Michal Kazior7d9d5582014-10-21 10:40:15 +03004395 arvif->txpower = vif->bss_conf.txpower;
4396 ret = ath10k_mac_txpower_recalc(ar);
4397 if (ret) {
4398 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4399 goto err_peer_delete;
4400 }
4401
Michal Kazior500ff9f2015-03-31 10:26:21 +00004402 if (vif->type == NL80211_IFTYPE_MONITOR) {
4403 ar->monitor_arvif = arvif;
4404 ret = ath10k_monitor_recalc(ar);
4405 if (ret) {
4406 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4407 goto err_peer_delete;
4408 }
4409 }
4410
Michal Kazior6d2d51e2015-08-07 09:08:21 +02004411 spin_lock_bh(&ar->htt.tx_lock);
4412 if (!ar->tx_paused)
4413 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4414 spin_unlock_bh(&ar->htt.tx_lock);
4415
Kalle Valo5e3dd152013-06-12 20:52:10 +03004416 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004417 return 0;
4418
4419err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004420 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4421 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004422 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4423
4424err_vdev_delete:
4425 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004426 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004427 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004428
4429err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004430 if (arvif->beacon_buf) {
4431 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4432 arvif->beacon_buf, arvif->beacon_paddr);
4433 arvif->beacon_buf = NULL;
4434 }
4435
Michal Kazior9dad14a2013-10-16 15:44:45 +03004436 mutex_unlock(&ar->conf_mutex);
4437
Kalle Valo5e3dd152013-06-12 20:52:10 +03004438 return ret;
4439}
4440
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004441static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4442{
4443 int i;
4444
4445 for (i = 0; i < BITS_PER_LONG; i++)
4446 ath10k_mac_vif_tx_unlock(arvif, i);
4447}
4448
Kalle Valo5e3dd152013-06-12 20:52:10 +03004449static void ath10k_remove_interface(struct ieee80211_hw *hw,
4450 struct ieee80211_vif *vif)
4451{
4452 struct ath10k *ar = hw->priv;
4453 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4454 int ret;
4455
Michal Kazior81a9a172015-03-05 16:02:17 +02004456 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004457 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004458
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304459 mutex_lock(&ar->conf_mutex);
4460
Michal Kaziored543882013-09-13 14:16:56 +02004461 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004462 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004463 spin_unlock_bh(&ar->data_lock);
4464
Simon Wunderlich855aed12014-08-02 09:12:54 +03004465 ret = ath10k_spectral_vif_stop(arvif);
4466 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004467 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004468 arvif->vdev_id, ret);
4469
Ben Greear16c11172014-09-23 14:17:16 -07004470 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004471 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004472
Michal Kaziore57e0572015-03-24 13:14:03 +00004473 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4474 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004475 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4476 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004477 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004478 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004479 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004480
4481 kfree(arvif->u.ap.noa_data);
4482 }
4483
Michal Kazior7aa7a722014-08-25 12:09:38 +02004484 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004485 arvif->vdev_id);
4486
Kalle Valo5e3dd152013-06-12 20:52:10 +03004487 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4488 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004489 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004490 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004491
Michal Kazior2c512052015-02-15 16:50:40 +02004492 /* Some firmware revisions don't notify host about self-peer removal
4493 * until after associated vdev is deleted.
4494 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004495 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4496 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004497 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4498 vif->addr);
4499 if (ret)
4500 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4501 arvif->vdev_id, ret);
4502
4503 spin_lock_bh(&ar->data_lock);
4504 ar->num_peers--;
4505 spin_unlock_bh(&ar->data_lock);
4506 }
4507
Kalle Valo5e3dd152013-06-12 20:52:10 +03004508 ath10k_peer_cleanup(ar, arvif->vdev_id);
4509
Michal Kazior500ff9f2015-03-31 10:26:21 +00004510 if (vif->type == NL80211_IFTYPE_MONITOR) {
4511 ar->monitor_arvif = NULL;
4512 ret = ath10k_monitor_recalc(ar);
4513 if (ret)
4514 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4515 }
4516
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004517 spin_lock_bh(&ar->htt.tx_lock);
4518 ath10k_mac_vif_tx_unlock_all(arvif);
4519 spin_unlock_bh(&ar->htt.tx_lock);
4520
Kalle Valo5e3dd152013-06-12 20:52:10 +03004521 mutex_unlock(&ar->conf_mutex);
4522}
4523
4524/*
4525 * FIXME: Has to be verified.
4526 */
4527#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004528 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004529 FIF_CONTROL | \
4530 FIF_PSPOLL | \
4531 FIF_OTHER_BSS | \
4532 FIF_BCN_PRBRESP_PROMISC | \
4533 FIF_PROBE_REQ | \
4534 FIF_FCSFAIL)
4535
4536static void ath10k_configure_filter(struct ieee80211_hw *hw,
4537 unsigned int changed_flags,
4538 unsigned int *total_flags,
4539 u64 multicast)
4540{
4541 struct ath10k *ar = hw->priv;
4542 int ret;
4543
4544 mutex_lock(&ar->conf_mutex);
4545
4546 changed_flags &= SUPPORTED_FILTERS;
4547 *total_flags &= SUPPORTED_FILTERS;
4548 ar->filter_flags = *total_flags;
4549
Michal Kazior19337472014-08-28 12:58:16 +02004550 ret = ath10k_monitor_recalc(ar);
4551 if (ret)
4552 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004553
4554 mutex_unlock(&ar->conf_mutex);
4555}
4556
4557static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4558 struct ieee80211_vif *vif,
4559 struct ieee80211_bss_conf *info,
4560 u32 changed)
4561{
4562 struct ath10k *ar = hw->priv;
4563 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4564 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004565 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004566
4567 mutex_lock(&ar->conf_mutex);
4568
4569 if (changed & BSS_CHANGED_IBSS)
4570 ath10k_control_ibss(arvif, info, vif->addr);
4571
4572 if (changed & BSS_CHANGED_BEACON_INT) {
4573 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004574 vdev_param = ar->wmi.vdev_param->beacon_interval;
4575 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004576 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004577 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004578 "mac vdev %d beacon_interval %d\n",
4579 arvif->vdev_id, arvif->beacon_interval);
4580
Kalle Valo5e3dd152013-06-12 20:52:10 +03004581 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004582 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004583 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004584 }
4585
4586 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004587 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004588 "vdev %d set beacon tx mode to staggered\n",
4589 arvif->vdev_id);
4590
Bartosz Markowski226a3392013-09-26 17:47:16 +02004591 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4592 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004593 WMI_BEACON_STAGGERED_MODE);
4594 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004595 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004596 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004597
4598 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4599 if (ret)
4600 ath10k_warn(ar, "failed to update beacon template: %d\n",
4601 ret);
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004602
4603 if (ieee80211_vif_is_mesh(vif)) {
4604 /* mesh doesn't use SSID but firmware needs it */
4605 strncpy(arvif->u.ap.ssid, "mesh",
4606 sizeof(arvif->u.ap.ssid));
4607 arvif->u.ap.ssid_len = 4;
4608 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004609 }
4610
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004611 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4612 ret = ath10k_mac_setup_prb_tmpl(arvif);
4613 if (ret)
4614 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4615 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004616 }
4617
Michal Kaziorba2479f2015-01-24 12:14:51 +02004618 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004619 arvif->dtim_period = info->dtim_period;
4620
Michal Kazior7aa7a722014-08-25 12:09:38 +02004621 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004622 "mac vdev %d dtim_period %d\n",
4623 arvif->vdev_id, arvif->dtim_period);
4624
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004625 vdev_param = ar->wmi.vdev_param->dtim_period;
4626 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004627 arvif->dtim_period);
4628 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004629 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004630 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004631 }
4632
4633 if (changed & BSS_CHANGED_SSID &&
4634 vif->type == NL80211_IFTYPE_AP) {
4635 arvif->u.ap.ssid_len = info->ssid_len;
4636 if (info->ssid_len)
4637 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4638 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4639 }
4640
Michal Kazior077efc82014-10-21 10:10:29 +03004641 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4642 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004643
4644 if (changed & BSS_CHANGED_BEACON_ENABLED)
4645 ath10k_control_beaconing(arvif, info);
4646
4647 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004648 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004649 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004650 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004651
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004652 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004653 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004654 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004655 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004656
4657 vdev_param = ar->wmi.vdev_param->protection_mode;
4658 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4659 info->use_cts_prot ? 1 : 0);
4660 if (ret)
4661 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
Kalle Valo617b0f42015-10-05 17:56:35 +03004662 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004663 }
4664
4665 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004666 if (info->use_short_slot)
4667 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4668
4669 else
4670 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4671
Michal Kazior7aa7a722014-08-25 12:09:38 +02004672 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004673 arvif->vdev_id, slottime);
4674
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004675 vdev_param = ar->wmi.vdev_param->slot_time;
4676 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004677 slottime);
4678 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004679 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004680 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004681 }
4682
4683 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004684 if (info->use_short_preamble)
4685 preamble = WMI_VDEV_PREAMBLE_SHORT;
4686 else
4687 preamble = WMI_VDEV_PREAMBLE_LONG;
4688
Michal Kazior7aa7a722014-08-25 12:09:38 +02004689 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004690 "mac vdev %d preamble %dn",
4691 arvif->vdev_id, preamble);
4692
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004693 vdev_param = ar->wmi.vdev_param->preamble;
4694 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004695 preamble);
4696 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004697 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004698 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004699 }
4700
4701 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004702 if (info->assoc) {
4703 /* Workaround: Make sure monitor vdev is not running
4704 * when associating to prevent some firmware revisions
4705 * (e.g. 10.1 and 10.2) from crashing.
4706 */
4707 if (ar->monitor_started)
4708 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004709 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004710 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004711 } else {
4712 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004713 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004714 }
4715
Michal Kazior7d9d5582014-10-21 10:40:15 +03004716 if (changed & BSS_CHANGED_TXPOWER) {
4717 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4718 arvif->vdev_id, info->txpower);
4719
4720 arvif->txpower = info->txpower;
4721 ret = ath10k_mac_txpower_recalc(ar);
4722 if (ret)
4723 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4724 }
4725
Michal Kaziorbf14e652014-12-12 12:41:38 +01004726 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004727 arvif->ps = vif->bss_conf.ps;
4728
4729 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004730 if (ret)
4731 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4732 arvif->vdev_id, ret);
4733 }
4734
Kalle Valo5e3dd152013-06-12 20:52:10 +03004735 mutex_unlock(&ar->conf_mutex);
4736}
4737
4738static int ath10k_hw_scan(struct ieee80211_hw *hw,
4739 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004740 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004741{
4742 struct ath10k *ar = hw->priv;
4743 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004744 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004745 struct wmi_start_scan_arg arg;
4746 int ret = 0;
4747 int i;
4748
4749 mutex_lock(&ar->conf_mutex);
4750
4751 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004752 switch (ar->scan.state) {
4753 case ATH10K_SCAN_IDLE:
4754 reinit_completion(&ar->scan.started);
4755 reinit_completion(&ar->scan.completed);
4756 ar->scan.state = ATH10K_SCAN_STARTING;
4757 ar->scan.is_roc = false;
4758 ar->scan.vdev_id = arvif->vdev_id;
4759 ret = 0;
4760 break;
4761 case ATH10K_SCAN_STARTING:
4762 case ATH10K_SCAN_RUNNING:
4763 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004764 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004765 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004766 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004767 spin_unlock_bh(&ar->data_lock);
4768
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004769 if (ret)
4770 goto exit;
4771
Kalle Valo5e3dd152013-06-12 20:52:10 +03004772 memset(&arg, 0, sizeof(arg));
4773 ath10k_wmi_start_scan_init(ar, &arg);
4774 arg.vdev_id = arvif->vdev_id;
4775 arg.scan_id = ATH10K_SCAN_ID;
4776
Kalle Valo5e3dd152013-06-12 20:52:10 +03004777 if (req->ie_len) {
4778 arg.ie_len = req->ie_len;
4779 memcpy(arg.ie, req->ie, arg.ie_len);
4780 }
4781
4782 if (req->n_ssids) {
4783 arg.n_ssids = req->n_ssids;
4784 for (i = 0; i < arg.n_ssids; i++) {
4785 arg.ssids[i].len = req->ssids[i].ssid_len;
4786 arg.ssids[i].ssid = req->ssids[i].ssid;
4787 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004788 } else {
4789 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004790 }
4791
4792 if (req->n_channels) {
4793 arg.n_channels = req->n_channels;
4794 for (i = 0; i < arg.n_channels; i++)
4795 arg.channels[i] = req->channels[i]->center_freq;
4796 }
4797
4798 ret = ath10k_start_scan(ar, &arg);
4799 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004800 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004801 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004802 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004803 spin_unlock_bh(&ar->data_lock);
4804 }
4805
Michal Kazior634349b2015-09-03 10:43:45 +02004806 /* Add a 200ms margin to account for event/command processing */
4807 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4808 msecs_to_jiffies(arg.max_scan_time +
4809 200));
4810
Kalle Valo5e3dd152013-06-12 20:52:10 +03004811exit:
4812 mutex_unlock(&ar->conf_mutex);
4813 return ret;
4814}
4815
4816static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4817 struct ieee80211_vif *vif)
4818{
4819 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004820
4821 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004822 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004823 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004824
4825 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004826}
4827
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004828static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4829 struct ath10k_vif *arvif,
4830 enum set_key_cmd cmd,
4831 struct ieee80211_key_conf *key)
4832{
4833 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4834 int ret;
4835
4836 /* 10.1 firmware branch requires default key index to be set to group
4837 * key index after installing it. Otherwise FW/HW Txes corrupted
4838 * frames with multi-vif APs. This is not required for main firmware
4839 * branch (e.g. 636).
4840 *
Michal Kazior8461baf2015-04-10 13:23:22 +00004841 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4842 *
4843 * FIXME: It remains unknown if this is required for multi-vif STA
4844 * interfaces on 10.1.
4845 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004846
Michal Kazior8461baf2015-04-10 13:23:22 +00004847 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4848 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004849 return;
4850
4851 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4852 return;
4853
4854 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4855 return;
4856
4857 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4858 return;
4859
4860 if (cmd != SET_KEY)
4861 return;
4862
4863 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4864 key->keyidx);
4865 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004866 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004867 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004868}
4869
Kalle Valo5e3dd152013-06-12 20:52:10 +03004870static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4871 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4872 struct ieee80211_key_conf *key)
4873{
4874 struct ath10k *ar = hw->priv;
4875 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4876 struct ath10k_peer *peer;
4877 const u8 *peer_addr;
4878 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4879 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4880 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004881 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01004882 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004883 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004884
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004885 /* this one needs to be done in software */
4886 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4887 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004888
David Liuccec9032015-07-24 20:25:32 +03004889 if (arvif->nohwcrypt)
4890 return 1;
4891
Kalle Valo5e3dd152013-06-12 20:52:10 +03004892 if (key->keyidx > WMI_MAX_KEY_INDEX)
4893 return -ENOSPC;
4894
4895 mutex_lock(&ar->conf_mutex);
4896
4897 if (sta)
4898 peer_addr = sta->addr;
4899 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4900 peer_addr = vif->bss_conf.bssid;
4901 else
4902 peer_addr = vif->addr;
4903
4904 key->hw_key_idx = key->keyidx;
4905
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03004906 if (is_wep) {
4907 if (cmd == SET_KEY)
4908 arvif->wep_keys[key->keyidx] = key;
4909 else
4910 arvif->wep_keys[key->keyidx] = NULL;
4911 }
4912
Kalle Valo5e3dd152013-06-12 20:52:10 +03004913 /* the peer should not disappear in mid-way (unless FW goes awry) since
4914 * we already hold conf_mutex. we just make sure its there now. */
4915 spin_lock_bh(&ar->data_lock);
4916 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4917 spin_unlock_bh(&ar->data_lock);
4918
4919 if (!peer) {
4920 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004921 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004922 peer_addr);
4923 ret = -EOPNOTSUPP;
4924 goto exit;
4925 } else {
4926 /* if the peer doesn't exist there is no key to disable
4927 * anymore */
4928 goto exit;
4929 }
4930 }
4931
Michal Kazior7cc45732015-03-09 14:24:17 +01004932 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4933 flags |= WMI_KEY_PAIRWISE;
4934 else
4935 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004936
Kalle Valo5e3dd152013-06-12 20:52:10 +03004937 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004938 if (cmd == DISABLE_KEY)
4939 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004940
Michal Kaziorad325cb2015-02-18 14:02:27 +01004941 /* When WEP keys are uploaded it's possible that there are
4942 * stations associated already (e.g. when merging) without any
4943 * keys. Static WEP needs an explicit per-peer key upload.
4944 */
4945 if (vif->type == NL80211_IFTYPE_ADHOC &&
4946 cmd == SET_KEY)
4947 ath10k_mac_vif_update_wep_key(arvif, key);
4948
Michal Kazior370e5672015-02-18 14:02:26 +01004949 /* 802.1x never sets the def_wep_key_idx so each set_key()
4950 * call changes default tx key.
4951 *
4952 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4953 * after first set_key().
4954 */
4955 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4956 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004957 }
4958
Michal Kazior370e5672015-02-18 14:02:26 +01004959 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004960 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004961 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004962 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004963 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004964 goto exit;
4965 }
4966
Michal Kazior29a10002015-04-10 13:05:58 +00004967 /* mac80211 sets static WEP keys as groupwise while firmware requires
4968 * them to be installed twice as both pairwise and groupwise.
4969 */
4970 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4971 flags2 = flags;
4972 flags2 &= ~WMI_KEY_GROUP;
4973 flags2 |= WMI_KEY_PAIRWISE;
4974
4975 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4976 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004977 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004978 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4979 arvif->vdev_id, peer_addr, ret);
4980 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4981 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03004982 if (ret2) {
4983 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004984 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4985 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03004986 }
Michal Kazior29a10002015-04-10 13:05:58 +00004987 goto exit;
4988 }
4989 }
4990
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004991 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4992
Kalle Valo5e3dd152013-06-12 20:52:10 +03004993 spin_lock_bh(&ar->data_lock);
4994 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4995 if (peer && cmd == SET_KEY)
4996 peer->keys[key->keyidx] = key;
4997 else if (peer && cmd == DISABLE_KEY)
4998 peer->keys[key->keyidx] = NULL;
4999 else if (peer == NULL)
5000 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005001 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005002 spin_unlock_bh(&ar->data_lock);
5003
5004exit:
5005 mutex_unlock(&ar->conf_mutex);
5006 return ret;
5007}
5008
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005009static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
5010 struct ieee80211_vif *vif,
5011 int keyidx)
5012{
5013 struct ath10k *ar = hw->priv;
5014 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5015 int ret;
5016
5017 mutex_lock(&arvif->ar->conf_mutex);
5018
5019 if (arvif->ar->state != ATH10K_STATE_ON)
5020 goto unlock;
5021
5022 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5023 arvif->vdev_id, keyidx);
5024
5025 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5026 arvif->vdev_id,
5027 arvif->ar->wmi.vdev_param->def_keyid,
5028 keyidx);
5029
5030 if (ret) {
5031 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5032 arvif->vdev_id,
5033 ret);
5034 goto unlock;
5035 }
5036
5037 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01005038
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005039unlock:
5040 mutex_unlock(&arvif->ar->conf_mutex);
5041}
5042
Michal Kazior9797feb2014-02-14 14:49:48 +01005043static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5044{
5045 struct ath10k *ar;
5046 struct ath10k_vif *arvif;
5047 struct ath10k_sta *arsta;
5048 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005049 struct cfg80211_chan_def def;
5050 enum ieee80211_band band;
5051 const u8 *ht_mcs_mask;
5052 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005053 u32 changed, bw, nss, smps;
5054 int err;
5055
5056 arsta = container_of(wk, struct ath10k_sta, update_wk);
5057 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5058 arvif = arsta->arvif;
5059 ar = arvif->ar;
5060
Michal Kazior45c9abc2015-04-21 20:42:58 +03005061 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5062 return;
5063
5064 band = def.chan->band;
5065 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5066 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5067
Michal Kazior9797feb2014-02-14 14:49:48 +01005068 spin_lock_bh(&ar->data_lock);
5069
5070 changed = arsta->changed;
5071 arsta->changed = 0;
5072
5073 bw = arsta->bw;
5074 nss = arsta->nss;
5075 smps = arsta->smps;
5076
5077 spin_unlock_bh(&ar->data_lock);
5078
5079 mutex_lock(&ar->conf_mutex);
5080
Michal Kazior45c9abc2015-04-21 20:42:58 +03005081 nss = max_t(u32, 1, nss);
5082 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5083 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5084
Michal Kazior9797feb2014-02-14 14:49:48 +01005085 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005086 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005087 sta->addr, bw);
5088
5089 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5090 WMI_PEER_CHAN_WIDTH, bw);
5091 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005092 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005093 sta->addr, bw, err);
5094 }
5095
5096 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005097 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005098 sta->addr, nss);
5099
5100 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5101 WMI_PEER_NSS, nss);
5102 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005103 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005104 sta->addr, nss, err);
5105 }
5106
5107 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005108 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005109 sta->addr, smps);
5110
5111 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5112 WMI_PEER_SMPS_STATE, smps);
5113 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005114 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005115 sta->addr, smps, err);
5116 }
5117
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005118 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5119 changed & IEEE80211_RC_NSS_CHANGED) {
5120 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005121 sta->addr);
5122
Michal Kazior590922a2014-10-21 10:10:29 +03005123 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005124 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005125 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005126 sta->addr);
5127 }
5128
Michal Kazior9797feb2014-02-14 14:49:48 +01005129 mutex_unlock(&ar->conf_mutex);
5130}
5131
Marek Puzyniak7c354242015-03-30 09:51:52 +03005132static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5133 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005134{
5135 struct ath10k *ar = arvif->ar;
5136
5137 lockdep_assert_held(&ar->conf_mutex);
5138
Marek Puzyniak7c354242015-03-30 09:51:52 +03005139 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005140 return 0;
5141
5142 if (ar->num_stations >= ar->max_num_stations)
5143 return -ENOBUFS;
5144
5145 ar->num_stations++;
5146
5147 return 0;
5148}
5149
Marek Puzyniak7c354242015-03-30 09:51:52 +03005150static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5151 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005152{
5153 struct ath10k *ar = arvif->ar;
5154
5155 lockdep_assert_held(&ar->conf_mutex);
5156
Marek Puzyniak7c354242015-03-30 09:51:52 +03005157 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005158 return;
5159
5160 ar->num_stations--;
5161}
5162
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005163struct ath10k_mac_tdls_iter_data {
5164 u32 num_tdls_stations;
5165 struct ieee80211_vif *curr_vif;
5166};
5167
5168static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5169 struct ieee80211_sta *sta)
5170{
5171 struct ath10k_mac_tdls_iter_data *iter_data = data;
5172 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5173 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5174
5175 if (sta->tdls && sta_vif == iter_data->curr_vif)
5176 iter_data->num_tdls_stations++;
5177}
5178
5179static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5180 struct ieee80211_vif *vif)
5181{
5182 struct ath10k_mac_tdls_iter_data data = {};
5183
5184 data.curr_vif = vif;
5185
5186 ieee80211_iterate_stations_atomic(hw,
5187 ath10k_mac_tdls_vif_stations_count_iter,
5188 &data);
5189 return data.num_tdls_stations;
5190}
5191
5192static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5193 struct ieee80211_vif *vif)
5194{
5195 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5196 int *num_tdls_vifs = data;
5197
5198 if (vif->type != NL80211_IFTYPE_STATION)
5199 return;
5200
5201 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5202 (*num_tdls_vifs)++;
5203}
5204
5205static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5206{
5207 int num_tdls_vifs = 0;
5208
5209 ieee80211_iterate_active_interfaces_atomic(hw,
5210 IEEE80211_IFACE_ITER_NORMAL,
5211 ath10k_mac_tdls_vifs_count_iter,
5212 &num_tdls_vifs);
5213 return num_tdls_vifs;
5214}
5215
Kalle Valo5e3dd152013-06-12 20:52:10 +03005216static int ath10k_sta_state(struct ieee80211_hw *hw,
5217 struct ieee80211_vif *vif,
5218 struct ieee80211_sta *sta,
5219 enum ieee80211_sta_state old_state,
5220 enum ieee80211_sta_state new_state)
5221{
5222 struct ath10k *ar = hw->priv;
5223 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005224 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005225 int ret = 0;
5226
Michal Kazior76f90022014-02-25 09:29:57 +02005227 if (old_state == IEEE80211_STA_NOTEXIST &&
5228 new_state == IEEE80211_STA_NONE) {
5229 memset(arsta, 0, sizeof(*arsta));
5230 arsta->arvif = arvif;
5231 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5232 }
5233
Michal Kazior9797feb2014-02-14 14:49:48 +01005234 /* cancel must be done outside the mutex to avoid deadlock */
5235 if ((old_state == IEEE80211_STA_NONE &&
5236 new_state == IEEE80211_STA_NOTEXIST))
5237 cancel_work_sync(&arsta->update_wk);
5238
Kalle Valo5e3dd152013-06-12 20:52:10 +03005239 mutex_lock(&ar->conf_mutex);
5240
5241 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005242 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005243 /*
5244 * New station addition.
5245 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005246 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5247 u32 num_tdls_stations;
5248 u32 num_tdls_vifs;
5249
Michal Kaziorcfd10612014-11-25 15:16:05 +01005250 ath10k_dbg(ar, ATH10K_DBG_MAC,
5251 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5252 arvif->vdev_id, sta->addr,
5253 ar->num_stations + 1, ar->max_num_stations,
5254 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005255
Marek Puzyniak7c354242015-03-30 09:51:52 +03005256 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005257 if (ret) {
5258 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5259 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005260 goto exit;
5261 }
5262
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005263 if (sta->tdls)
5264 peer_type = WMI_PEER_TYPE_TDLS;
5265
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005266 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005267 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005268 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005269 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08005270 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005271 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005272 goto exit;
5273 }
Michal Kazior077efc82014-10-21 10:10:29 +03005274
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005275 if (!sta->tdls)
5276 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005277
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005278 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5279 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5280
5281 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5282 num_tdls_stations == 0) {
5283 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5284 arvif->vdev_id, ar->max_num_tdls_vdevs);
5285 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5286 ath10k_mac_dec_num_stations(arvif, sta);
5287 ret = -ENOBUFS;
5288 goto exit;
5289 }
5290
5291 if (num_tdls_stations == 0) {
5292 /* This is the first tdls peer in current vif */
5293 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5294
5295 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5296 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005297 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005298 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005299 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005300 ath10k_peer_delete(ar, arvif->vdev_id,
5301 sta->addr);
5302 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005303 goto exit;
5304 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005305 }
Michal Kazior077efc82014-10-21 10:10:29 +03005306
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005307 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5308 WMI_TDLS_PEER_STATE_PEERING);
5309 if (ret) {
5310 ath10k_warn(ar,
5311 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5312 sta->addr, arvif->vdev_id, ret);
5313 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5314 ath10k_mac_dec_num_stations(arvif, sta);
5315
5316 if (num_tdls_stations != 0)
5317 goto exit;
5318 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5319 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005320 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005321 } else if ((old_state == IEEE80211_STA_NONE &&
5322 new_state == IEEE80211_STA_NOTEXIST)) {
5323 /*
5324 * Existing station deletion.
5325 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005326 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005327 "mac vdev %d peer delete %pM (sta gone)\n",
5328 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005329
Kalle Valo5e3dd152013-06-12 20:52:10 +03005330 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5331 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005332 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005333 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005334
Marek Puzyniak7c354242015-03-30 09:51:52 +03005335 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005336
5337 if (!sta->tdls)
5338 goto exit;
5339
5340 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5341 goto exit;
5342
5343 /* This was the last tdls peer in current vif */
5344 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5345 WMI_TDLS_DISABLE);
5346 if (ret) {
5347 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5348 arvif->vdev_id, ret);
5349 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005350 } else if (old_state == IEEE80211_STA_AUTH &&
5351 new_state == IEEE80211_STA_ASSOC &&
5352 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005353 vif->type == NL80211_IFTYPE_MESH_POINT ||
Kalle Valo5e3dd152013-06-12 20:52:10 +03005354 vif->type == NL80211_IFTYPE_ADHOC)) {
5355 /*
5356 * New association.
5357 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005358 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005359 sta->addr);
5360
Michal Kazior590922a2014-10-21 10:10:29 +03005361 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005362 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005363 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005364 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005365 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005366 new_state == IEEE80211_STA_AUTHORIZED &&
5367 sta->tdls) {
5368 /*
5369 * Tdls station authorized.
5370 */
5371 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5372 sta->addr);
5373
5374 ret = ath10k_station_assoc(ar, vif, sta, false);
5375 if (ret) {
5376 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5377 sta->addr, arvif->vdev_id, ret);
5378 goto exit;
5379 }
5380
5381 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5382 WMI_TDLS_PEER_STATE_CONNECTED);
5383 if (ret)
5384 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5385 sta->addr, arvif->vdev_id, ret);
5386 } else if (old_state == IEEE80211_STA_ASSOC &&
5387 new_state == IEEE80211_STA_AUTH &&
5388 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005389 vif->type == NL80211_IFTYPE_MESH_POINT ||
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005390 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005391 /*
5392 * Disassociation.
5393 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005394 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005395 sta->addr);
5396
Michal Kazior590922a2014-10-21 10:10:29 +03005397 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005398 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005399 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005400 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005401 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005402exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005403 mutex_unlock(&ar->conf_mutex);
5404 return ret;
5405}
5406
5407static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005408 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005409{
5410 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005411 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5412 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005413 u32 value = 0;
5414 int ret = 0;
5415
Michal Kazior548db542013-07-05 16:15:15 +03005416 lockdep_assert_held(&ar->conf_mutex);
5417
Kalle Valo5e3dd152013-06-12 20:52:10 +03005418 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5419 return 0;
5420
5421 switch (ac) {
5422 case IEEE80211_AC_VO:
5423 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5424 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005425 prio = 7;
5426 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005427 break;
5428 case IEEE80211_AC_VI:
5429 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5430 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005431 prio = 5;
5432 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005433 break;
5434 case IEEE80211_AC_BE:
5435 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5436 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005437 prio = 2;
5438 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005439 break;
5440 case IEEE80211_AC_BK:
5441 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5442 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005443 prio = 0;
5444 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005445 break;
5446 }
5447
5448 if (enable)
5449 arvif->u.sta.uapsd |= value;
5450 else
5451 arvif->u.sta.uapsd &= ~value;
5452
5453 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5454 WMI_STA_PS_PARAM_UAPSD,
5455 arvif->u.sta.uapsd);
5456 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005457 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005458 goto exit;
5459 }
5460
5461 if (arvif->u.sta.uapsd)
5462 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5463 else
5464 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5465
5466 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5467 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5468 value);
5469 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005470 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005471
Michal Kazior9f9b5742014-12-12 12:41:36 +01005472 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5473 if (ret) {
5474 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5475 arvif->vdev_id, ret);
5476 return ret;
5477 }
5478
5479 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5480 if (ret) {
5481 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5482 arvif->vdev_id, ret);
5483 return ret;
5484 }
5485
Michal Kaziorb0e56152015-01-24 12:14:52 +02005486 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5487 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5488 /* Only userspace can make an educated decision when to send
5489 * trigger frame. The following effectively disables u-UAPSD
5490 * autotrigger in firmware (which is enabled by default
5491 * provided the autotrigger service is available).
5492 */
5493
5494 arg.wmm_ac = acc;
5495 arg.user_priority = prio;
5496 arg.service_interval = 0;
5497 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5498 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5499
5500 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5501 arvif->bssid, &arg, 1);
5502 if (ret) {
5503 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5504 ret);
5505 return ret;
5506 }
5507 }
5508
Kalle Valo5e3dd152013-06-12 20:52:10 +03005509exit:
5510 return ret;
5511}
5512
5513static int ath10k_conf_tx(struct ieee80211_hw *hw,
5514 struct ieee80211_vif *vif, u16 ac,
5515 const struct ieee80211_tx_queue_params *params)
5516{
5517 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005518 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005519 struct wmi_wmm_params_arg *p = NULL;
5520 int ret;
5521
5522 mutex_lock(&ar->conf_mutex);
5523
5524 switch (ac) {
5525 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005526 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005527 break;
5528 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005529 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005530 break;
5531 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005532 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005533 break;
5534 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005535 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005536 break;
5537 }
5538
5539 if (WARN_ON(!p)) {
5540 ret = -EINVAL;
5541 goto exit;
5542 }
5543
5544 p->cwmin = params->cw_min;
5545 p->cwmax = params->cw_max;
5546 p->aifs = params->aifs;
5547
5548 /*
5549 * The channel time duration programmed in the HW is in absolute
5550 * microseconds, while mac80211 gives the txop in units of
5551 * 32 microseconds.
5552 */
5553 p->txop = params->txop * 32;
5554
Michal Kazior7fc979a2015-01-28 09:57:28 +02005555 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5556 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5557 &arvif->wmm_params);
5558 if (ret) {
5559 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5560 arvif->vdev_id, ret);
5561 goto exit;
5562 }
5563 } else {
5564 /* This won't work well with multi-interface cases but it's
5565 * better than nothing.
5566 */
5567 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5568 if (ret) {
5569 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5570 goto exit;
5571 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005572 }
5573
5574 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5575 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005576 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005577
5578exit:
5579 mutex_unlock(&ar->conf_mutex);
5580 return ret;
5581}
5582
5583#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5584
5585static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5586 struct ieee80211_vif *vif,
5587 struct ieee80211_channel *chan,
5588 int duration,
5589 enum ieee80211_roc_type type)
5590{
5591 struct ath10k *ar = hw->priv;
5592 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5593 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005594 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005595 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005596
5597 mutex_lock(&ar->conf_mutex);
5598
5599 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005600 switch (ar->scan.state) {
5601 case ATH10K_SCAN_IDLE:
5602 reinit_completion(&ar->scan.started);
5603 reinit_completion(&ar->scan.completed);
5604 reinit_completion(&ar->scan.on_channel);
5605 ar->scan.state = ATH10K_SCAN_STARTING;
5606 ar->scan.is_roc = true;
5607 ar->scan.vdev_id = arvif->vdev_id;
5608 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005609 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005610 ret = 0;
5611 break;
5612 case ATH10K_SCAN_STARTING:
5613 case ATH10K_SCAN_RUNNING:
5614 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005615 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005616 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005617 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005618 spin_unlock_bh(&ar->data_lock);
5619
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005620 if (ret)
5621 goto exit;
5622
Michal Kaziorfcf98442015-03-31 11:03:47 +00005623 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005624
Kalle Valo5e3dd152013-06-12 20:52:10 +03005625 memset(&arg, 0, sizeof(arg));
5626 ath10k_wmi_start_scan_init(ar, &arg);
5627 arg.vdev_id = arvif->vdev_id;
5628 arg.scan_id = ATH10K_SCAN_ID;
5629 arg.n_channels = 1;
5630 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005631 arg.dwell_time_active = scan_time_msec;
5632 arg.dwell_time_passive = scan_time_msec;
5633 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005634 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5635 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005636 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005637
5638 ret = ath10k_start_scan(ar, &arg);
5639 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005640 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005641 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005642 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005643 spin_unlock_bh(&ar->data_lock);
5644 goto exit;
5645 }
5646
5647 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5648 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005649 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005650
5651 ret = ath10k_scan_stop(ar);
5652 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005653 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005654
Kalle Valo5e3dd152013-06-12 20:52:10 +03005655 ret = -ETIMEDOUT;
5656 goto exit;
5657 }
5658
Michal Kaziorfcf98442015-03-31 11:03:47 +00005659 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5660 msecs_to_jiffies(duration));
5661
Kalle Valo5e3dd152013-06-12 20:52:10 +03005662 ret = 0;
5663exit:
5664 mutex_unlock(&ar->conf_mutex);
5665 return ret;
5666}
5667
5668static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5669{
5670 struct ath10k *ar = hw->priv;
5671
5672 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005673
5674 spin_lock_bh(&ar->data_lock);
5675 ar->scan.roc_notify = false;
5676 spin_unlock_bh(&ar->data_lock);
5677
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005678 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005679
Kalle Valo5e3dd152013-06-12 20:52:10 +03005680 mutex_unlock(&ar->conf_mutex);
5681
Michal Kazior4eb2e162014-10-28 10:23:09 +01005682 cancel_delayed_work_sync(&ar->scan.timeout);
5683
Kalle Valo5e3dd152013-06-12 20:52:10 +03005684 return 0;
5685}
5686
5687/*
5688 * Both RTS and Fragmentation threshold are interface-specific
5689 * in ath10k, but device-specific in mac80211.
5690 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005691
5692static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5693{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005694 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005695 struct ath10k_vif *arvif;
5696 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005697
Michal Kaziorad088bf2013-10-16 15:44:46 +03005698 mutex_lock(&ar->conf_mutex);
5699 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005700 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005701 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005702
Michal Kaziorad088bf2013-10-16 15:44:46 +03005703 ret = ath10k_mac_set_rts(arvif, value);
5704 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005705 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005706 arvif->vdev_id, ret);
5707 break;
5708 }
5709 }
5710 mutex_unlock(&ar->conf_mutex);
5711
5712 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005713}
5714
Michal Kazior92092fe2015-08-03 11:16:43 +02005715static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5716{
5717 /* Even though there's a WMI enum for fragmentation threshold no known
5718 * firmware actually implements it. Moreover it is not possible to rely
5719 * frame fragmentation to mac80211 because firmware clears the "more
5720 * fragments" bit in frame control making it impossible for remote
5721 * devices to reassemble frames.
5722 *
5723 * Hence implement a dummy callback just to say fragmentation isn't
5724 * supported. This effectively prevents mac80211 from doing frame
5725 * fragmentation in software.
5726 */
5727 return -EOPNOTSUPP;
5728}
5729
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005730static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5731 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005732{
5733 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005734 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005735 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005736
5737 /* mac80211 doesn't care if we really xmit queued frames or not
5738 * we'll collect those frames either way if we stop/delete vdevs */
5739 if (drop)
5740 return;
5741
Michal Kazior548db542013-07-05 16:15:15 +03005742 mutex_lock(&ar->conf_mutex);
5743
Michal Kazioraffd3212013-07-16 09:54:35 +02005744 if (ar->state == ATH10K_STATE_WEDGED)
5745 goto skip;
5746
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005747 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005748 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005749
Michal Kazioredb82362013-07-05 16:15:14 +03005750 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005751 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005752 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005753
Michal Kazior7962b0d2014-10-28 10:34:38 +01005754 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5755 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5756 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005757
5758 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005759 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005760
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005761 if (time_left == 0 || skip)
5762 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5763 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005764
Michal Kazioraffd3212013-07-16 09:54:35 +02005765skip:
Michal Kazior548db542013-07-05 16:15:15 +03005766 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005767}
5768
5769/* TODO: Implement this function properly
5770 * For now it is needed to reply to Probe Requests in IBSS mode.
5771 * Propably we need this information from FW.
5772 */
5773static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5774{
5775 return 1;
5776}
5777
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005778static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5779 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005780{
5781 struct ath10k *ar = hw->priv;
5782
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005783 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5784 return;
5785
Michal Kazioraffd3212013-07-16 09:54:35 +02005786 mutex_lock(&ar->conf_mutex);
5787
5788 /* If device failed to restart it will be in a different state, e.g.
5789 * ATH10K_STATE_WEDGED */
5790 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005791 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005792 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005793 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005794 }
5795
5796 mutex_unlock(&ar->conf_mutex);
5797}
5798
Michal Kazior2e1dea42013-07-31 10:32:40 +02005799static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5800 struct survey_info *survey)
5801{
5802 struct ath10k *ar = hw->priv;
5803 struct ieee80211_supported_band *sband;
5804 struct survey_info *ar_survey = &ar->survey[idx];
5805 int ret = 0;
5806
5807 mutex_lock(&ar->conf_mutex);
5808
5809 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5810 if (sband && idx >= sband->n_channels) {
5811 idx -= sband->n_channels;
5812 sband = NULL;
5813 }
5814
5815 if (!sband)
5816 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5817
5818 if (!sband || idx >= sband->n_channels) {
5819 ret = -ENOENT;
5820 goto exit;
5821 }
5822
5823 spin_lock_bh(&ar->data_lock);
5824 memcpy(survey, ar_survey, sizeof(*survey));
5825 spin_unlock_bh(&ar->data_lock);
5826
5827 survey->channel = &sband->channels[idx];
5828
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005829 if (ar->rx_channel == survey->channel)
5830 survey->filled |= SURVEY_INFO_IN_USE;
5831
Michal Kazior2e1dea42013-07-31 10:32:40 +02005832exit:
5833 mutex_unlock(&ar->conf_mutex);
5834 return ret;
5835}
5836
Michal Kazior3ae54222015-03-31 10:49:20 +00005837static bool
5838ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5839 enum ieee80211_band band,
5840 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005841{
Michal Kazior3ae54222015-03-31 10:49:20 +00005842 int num_rates = 0;
5843 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005844
Michal Kazior3ae54222015-03-31 10:49:20 +00005845 num_rates += hweight32(mask->control[band].legacy);
5846
5847 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5848 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5849
5850 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5851 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5852
5853 return num_rates == 1;
5854}
5855
5856static bool
5857ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5858 enum ieee80211_band band,
5859 const struct cfg80211_bitrate_mask *mask,
5860 int *nss)
5861{
5862 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5863 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5864 u8 ht_nss_mask = 0;
5865 u8 vht_nss_mask = 0;
5866 int i;
5867
5868 if (mask->control[band].legacy)
5869 return false;
5870
5871 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5872 if (mask->control[band].ht_mcs[i] == 0)
5873 continue;
5874 else if (mask->control[band].ht_mcs[i] ==
5875 sband->ht_cap.mcs.rx_mask[i])
5876 ht_nss_mask |= BIT(i);
5877 else
5878 return false;
5879 }
5880
5881 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5882 if (mask->control[band].vht_mcs[i] == 0)
5883 continue;
5884 else if (mask->control[band].vht_mcs[i] ==
5885 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5886 vht_nss_mask |= BIT(i);
5887 else
5888 return false;
5889 }
5890
5891 if (ht_nss_mask != vht_nss_mask)
5892 return false;
5893
5894 if (ht_nss_mask == 0)
5895 return false;
5896
5897 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5898 return false;
5899
5900 *nss = fls(ht_nss_mask);
5901
5902 return true;
5903}
5904
5905static int
5906ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5907 enum ieee80211_band band,
5908 const struct cfg80211_bitrate_mask *mask,
5909 u8 *rate, u8 *nss)
5910{
5911 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5912 int rate_idx;
5913 int i;
5914 u16 bitrate;
5915 u8 preamble;
5916 u8 hw_rate;
5917
5918 if (hweight32(mask->control[band].legacy) == 1) {
5919 rate_idx = ffs(mask->control[band].legacy) - 1;
5920
5921 hw_rate = sband->bitrates[rate_idx].hw_value;
5922 bitrate = sband->bitrates[rate_idx].bitrate;
5923
5924 if (ath10k_mac_bitrate_is_cck(bitrate))
5925 preamble = WMI_RATE_PREAMBLE_CCK;
5926 else
5927 preamble = WMI_RATE_PREAMBLE_OFDM;
5928
5929 *nss = 1;
5930 *rate = preamble << 6 |
5931 (*nss - 1) << 4 |
5932 hw_rate << 0;
5933
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005934 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005935 }
5936
Michal Kazior3ae54222015-03-31 10:49:20 +00005937 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5938 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5939 *nss = i + 1;
5940 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5941 (*nss - 1) << 4 |
5942 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005943
Michal Kazior3ae54222015-03-31 10:49:20 +00005944 return 0;
5945 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005946 }
5947
Michal Kazior3ae54222015-03-31 10:49:20 +00005948 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5949 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5950 *nss = i + 1;
5951 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5952 (*nss - 1) << 4 |
5953 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005954
Michal Kazior3ae54222015-03-31 10:49:20 +00005955 return 0;
5956 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005957 }
5958
Michal Kazior3ae54222015-03-31 10:49:20 +00005959 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005960}
5961
Michal Kazior3ae54222015-03-31 10:49:20 +00005962static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05305963 u8 rate, u8 nss, u8 sgi, u8 ldpc)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005964{
5965 struct ath10k *ar = arvif->ar;
5966 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005967 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005968
Michal Kazior3ae54222015-03-31 10:49:20 +00005969 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005970
Michal Kazior3ae54222015-03-31 10:49:20 +00005971 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5972 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005973
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005974 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005975 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005976 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005977 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005978 rate, ret);
5979 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005980 }
5981
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005982 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005983 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005984 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005985 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5986 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005987 }
5988
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005989 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005990 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005991 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005992 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5993 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005994 }
5995
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05305996 vdev_param = ar->wmi.vdev_param->ldpc;
5997 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
5998 if (ret) {
5999 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
6000 return ret;
6001 }
6002
Michal Kazior3ae54222015-03-31 10:49:20 +00006003 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006004}
6005
Michal Kazior45c9abc2015-04-21 20:42:58 +03006006static bool
6007ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
6008 enum ieee80211_band band,
6009 const struct cfg80211_bitrate_mask *mask)
6010{
6011 int i;
6012 u16 vht_mcs;
6013
6014 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6015 * to express all VHT MCS rate masks. Effectively only the following
6016 * ranges can be used: none, 0-7, 0-8 and 0-9.
6017 */
6018 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6019 vht_mcs = mask->control[band].vht_mcs[i];
6020
6021 switch (vht_mcs) {
6022 case 0:
6023 case BIT(8) - 1:
6024 case BIT(9) - 1:
6025 case BIT(10) - 1:
6026 break;
6027 default:
6028 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6029 return false;
6030 }
6031 }
6032
6033 return true;
6034}
6035
6036static void ath10k_mac_set_bitrate_mask_iter(void *data,
6037 struct ieee80211_sta *sta)
6038{
6039 struct ath10k_vif *arvif = data;
6040 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6041 struct ath10k *ar = arvif->ar;
6042
6043 if (arsta->arvif != arvif)
6044 return;
6045
6046 spin_lock_bh(&ar->data_lock);
6047 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6048 spin_unlock_bh(&ar->data_lock);
6049
6050 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6051}
6052
Michal Kazior3ae54222015-03-31 10:49:20 +00006053static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6054 struct ieee80211_vif *vif,
6055 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006056{
6057 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006058 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006059 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006060 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006061 const u8 *ht_mcs_mask;
6062 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006063 u8 rate;
6064 u8 nss;
6065 u8 sgi;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306066 u8 ldpc;
Michal Kazior3ae54222015-03-31 10:49:20 +00006067 int single_nss;
6068 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006069
Michal Kazior500ff9f2015-03-31 10:26:21 +00006070 if (ath10k_mac_vif_chan(vif, &def))
6071 return -EPERM;
6072
Michal Kazior500ff9f2015-03-31 10:26:21 +00006073 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006074 ht_mcs_mask = mask->control[band].ht_mcs;
6075 vht_mcs_mask = mask->control[band].vht_mcs;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306076 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006077
Michal Kazior3ae54222015-03-31 10:49:20 +00006078 sgi = mask->control[band].gi;
6079 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006080 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006081
Michal Kazior3ae54222015-03-31 10:49:20 +00006082 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6083 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6084 &rate, &nss);
6085 if (ret) {
6086 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6087 arvif->vdev_id, ret);
6088 return ret;
6089 }
6090 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6091 &single_nss)) {
6092 rate = WMI_FIXED_RATE_NONE;
6093 nss = single_nss;
6094 } else {
6095 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006096 nss = min(ar->num_rf_chains,
6097 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6098 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6099
6100 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6101 return -EINVAL;
6102
6103 mutex_lock(&ar->conf_mutex);
6104
6105 arvif->bitrate_mask = *mask;
6106 ieee80211_iterate_stations_atomic(ar->hw,
6107 ath10k_mac_set_bitrate_mask_iter,
6108 arvif);
6109
6110 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006111 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006112
6113 mutex_lock(&ar->conf_mutex);
6114
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306115 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006116 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006117 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6118 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006119 goto exit;
6120 }
6121
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006122exit:
6123 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006124
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006125 return ret;
6126}
6127
Michal Kazior9797feb2014-02-14 14:49:48 +01006128static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6129 struct ieee80211_vif *vif,
6130 struct ieee80211_sta *sta,
6131 u32 changed)
6132{
6133 struct ath10k *ar = hw->priv;
6134 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6135 u32 bw, smps;
6136
6137 spin_lock_bh(&ar->data_lock);
6138
Michal Kazior7aa7a722014-08-25 12:09:38 +02006139 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006140 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6141 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6142 sta->smps_mode);
6143
6144 if (changed & IEEE80211_RC_BW_CHANGED) {
6145 bw = WMI_PEER_CHWIDTH_20MHZ;
6146
6147 switch (sta->bandwidth) {
6148 case IEEE80211_STA_RX_BW_20:
6149 bw = WMI_PEER_CHWIDTH_20MHZ;
6150 break;
6151 case IEEE80211_STA_RX_BW_40:
6152 bw = WMI_PEER_CHWIDTH_40MHZ;
6153 break;
6154 case IEEE80211_STA_RX_BW_80:
6155 bw = WMI_PEER_CHWIDTH_80MHZ;
6156 break;
6157 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006158 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006159 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006160 bw = WMI_PEER_CHWIDTH_20MHZ;
6161 break;
6162 }
6163
6164 arsta->bw = bw;
6165 }
6166
6167 if (changed & IEEE80211_RC_NSS_CHANGED)
6168 arsta->nss = sta->rx_nss;
6169
6170 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6171 smps = WMI_PEER_SMPS_PS_NONE;
6172
6173 switch (sta->smps_mode) {
6174 case IEEE80211_SMPS_AUTOMATIC:
6175 case IEEE80211_SMPS_OFF:
6176 smps = WMI_PEER_SMPS_PS_NONE;
6177 break;
6178 case IEEE80211_SMPS_STATIC:
6179 smps = WMI_PEER_SMPS_STATIC;
6180 break;
6181 case IEEE80211_SMPS_DYNAMIC:
6182 smps = WMI_PEER_SMPS_DYNAMIC;
6183 break;
6184 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006185 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006186 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006187 smps = WMI_PEER_SMPS_PS_NONE;
6188 break;
6189 }
6190
6191 arsta->smps = smps;
6192 }
6193
Michal Kazior9797feb2014-02-14 14:49:48 +01006194 arsta->changed |= changed;
6195
6196 spin_unlock_bh(&ar->data_lock);
6197
6198 ieee80211_queue_work(hw, &arsta->update_wk);
6199}
6200
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006201static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6202{
6203 /*
6204 * FIXME: Return 0 for time being. Need to figure out whether FW
6205 * has the API to fetch 64-bit local TSF
6206 */
6207
6208 return 0;
6209}
6210
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006211static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6212 struct ieee80211_vif *vif,
6213 enum ieee80211_ampdu_mlme_action action,
6214 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
Emmanuel Grumbache3abc8f2015-08-16 11:13:22 +03006215 u8 buf_size, bool amsdu)
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006216{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006217 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006218 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6219
Michal Kazior7aa7a722014-08-25 12:09:38 +02006220 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006221 arvif->vdev_id, sta->addr, tid, action);
6222
6223 switch (action) {
6224 case IEEE80211_AMPDU_RX_START:
6225 case IEEE80211_AMPDU_RX_STOP:
6226 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6227 * creation/removal. Do we need to verify this?
6228 */
6229 return 0;
6230 case IEEE80211_AMPDU_TX_START:
6231 case IEEE80211_AMPDU_TX_STOP_CONT:
6232 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6233 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6234 case IEEE80211_AMPDU_TX_OPERATIONAL:
6235 /* Firmware offloads Tx aggregation entirely so deny mac80211
6236 * Tx aggregation requests.
6237 */
6238 return -EOPNOTSUPP;
6239 }
6240
6241 return -EINVAL;
6242}
6243
Michal Kazior500ff9f2015-03-31 10:26:21 +00006244static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006245ath10k_mac_update_rx_channel(struct ath10k *ar,
6246 struct ieee80211_chanctx_conf *ctx,
6247 struct ieee80211_vif_chanctx_switch *vifs,
6248 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006249{
6250 struct cfg80211_chan_def *def = NULL;
6251
6252 /* Both locks are required because ar->rx_channel is modified. This
6253 * allows readers to hold either lock.
6254 */
6255 lockdep_assert_held(&ar->conf_mutex);
6256 lockdep_assert_held(&ar->data_lock);
6257
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006258 WARN_ON(ctx && vifs);
6259 WARN_ON(vifs && n_vifs != 1);
6260
Michal Kazior500ff9f2015-03-31 10:26:21 +00006261 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6262 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6263 * ppdu on Rx may reduce performance on low-end systems. It should be
6264 * possible to make tables/hashmaps to speed the lookup up (be vary of
6265 * cpu data cache lines though regarding sizes) but to keep the initial
6266 * implementation simple and less intrusive fallback to the slow lookup
6267 * only for multi-channel cases. Single-channel cases will remain to
6268 * use the old channel derival and thus performance should not be
6269 * affected much.
6270 */
6271 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006272 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006273 ieee80211_iter_chan_contexts_atomic(ar->hw,
Kalle Valo617b0f42015-10-05 17:56:35 +03006274 ath10k_mac_get_any_chandef_iter,
6275 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006276
6277 if (vifs)
6278 def = &vifs[0].new_ctx->def;
6279
Michal Kazior500ff9f2015-03-31 10:26:21 +00006280 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006281 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6282 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006283 } else {
6284 ar->rx_channel = NULL;
6285 }
6286 rcu_read_unlock();
6287}
6288
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006289static void
6290ath10k_mac_update_vif_chan(struct ath10k *ar,
6291 struct ieee80211_vif_chanctx_switch *vifs,
6292 int n_vifs)
6293{
6294 struct ath10k_vif *arvif;
6295 int ret;
6296 int i;
6297
6298 lockdep_assert_held(&ar->conf_mutex);
6299
6300 /* First stop monitor interface. Some FW versions crash if there's a
6301 * lone monitor interface.
6302 */
6303 if (ar->monitor_started)
6304 ath10k_monitor_stop(ar);
6305
6306 for (i = 0; i < n_vifs; i++) {
6307 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6308
6309 ath10k_dbg(ar, ATH10K_DBG_MAC,
6310 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
6311 arvif->vdev_id,
6312 vifs[i].old_ctx->def.chan->center_freq,
6313 vifs[i].new_ctx->def.chan->center_freq,
6314 vifs[i].old_ctx->def.width,
6315 vifs[i].new_ctx->def.width);
6316
6317 if (WARN_ON(!arvif->is_started))
6318 continue;
6319
6320 if (WARN_ON(!arvif->is_up))
6321 continue;
6322
6323 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6324 if (ret) {
6325 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6326 arvif->vdev_id, ret);
6327 continue;
6328 }
6329 }
6330
6331 /* All relevant vdevs are downed and associated channel resources
6332 * should be available for the channel switch now.
6333 */
6334
6335 spin_lock_bh(&ar->data_lock);
6336 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
6337 spin_unlock_bh(&ar->data_lock);
6338
6339 for (i = 0; i < n_vifs; i++) {
6340 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6341
6342 if (WARN_ON(!arvif->is_started))
6343 continue;
6344
6345 if (WARN_ON(!arvif->is_up))
6346 continue;
6347
6348 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6349 if (ret)
6350 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6351 ret);
6352
6353 ret = ath10k_mac_setup_prb_tmpl(arvif);
6354 if (ret)
6355 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6356 ret);
6357
6358 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6359 if (ret) {
6360 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6361 arvif->vdev_id, ret);
6362 continue;
6363 }
6364
6365 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6366 arvif->bssid);
6367 if (ret) {
6368 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6369 arvif->vdev_id, ret);
6370 continue;
6371 }
6372 }
6373
6374 ath10k_monitor_recalc(ar);
6375}
6376
Michal Kazior500ff9f2015-03-31 10:26:21 +00006377static int
6378ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6379 struct ieee80211_chanctx_conf *ctx)
6380{
6381 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006382
6383 ath10k_dbg(ar, ATH10K_DBG_MAC,
6384 "mac chanctx add freq %hu width %d ptr %p\n",
6385 ctx->def.chan->center_freq, ctx->def.width, ctx);
6386
6387 mutex_lock(&ar->conf_mutex);
6388
6389 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006390 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006391 spin_unlock_bh(&ar->data_lock);
6392
6393 ath10k_recalc_radar_detection(ar);
6394 ath10k_monitor_recalc(ar);
6395
6396 mutex_unlock(&ar->conf_mutex);
6397
6398 return 0;
6399}
6400
6401static void
6402ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6403 struct ieee80211_chanctx_conf *ctx)
6404{
6405 struct ath10k *ar = hw->priv;
6406
6407 ath10k_dbg(ar, ATH10K_DBG_MAC,
6408 "mac chanctx remove freq %hu width %d ptr %p\n",
6409 ctx->def.chan->center_freq, ctx->def.width, ctx);
6410
6411 mutex_lock(&ar->conf_mutex);
6412
6413 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006414 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006415 spin_unlock_bh(&ar->data_lock);
6416
6417 ath10k_recalc_radar_detection(ar);
6418 ath10k_monitor_recalc(ar);
6419
6420 mutex_unlock(&ar->conf_mutex);
6421}
6422
Michal Kazior9713e3d2015-09-03 10:44:52 +02006423struct ath10k_mac_change_chanctx_arg {
6424 struct ieee80211_chanctx_conf *ctx;
6425 struct ieee80211_vif_chanctx_switch *vifs;
6426 int n_vifs;
6427 int next_vif;
6428};
6429
6430static void
6431ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6432 struct ieee80211_vif *vif)
6433{
6434 struct ath10k_mac_change_chanctx_arg *arg = data;
6435
6436 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
6437 return;
6438
6439 arg->n_vifs++;
6440}
6441
6442static void
6443ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6444 struct ieee80211_vif *vif)
6445{
6446 struct ath10k_mac_change_chanctx_arg *arg = data;
6447 struct ieee80211_chanctx_conf *ctx;
6448
6449 ctx = rcu_access_pointer(vif->chanctx_conf);
6450 if (ctx != arg->ctx)
6451 return;
6452
6453 if (WARN_ON(arg->next_vif == arg->n_vifs))
6454 return;
6455
6456 arg->vifs[arg->next_vif].vif = vif;
6457 arg->vifs[arg->next_vif].old_ctx = ctx;
6458 arg->vifs[arg->next_vif].new_ctx = ctx;
6459 arg->next_vif++;
6460}
6461
Michal Kazior500ff9f2015-03-31 10:26:21 +00006462static void
6463ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6464 struct ieee80211_chanctx_conf *ctx,
6465 u32 changed)
6466{
6467 struct ath10k *ar = hw->priv;
Michal Kazior9713e3d2015-09-03 10:44:52 +02006468 struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
Michal Kazior500ff9f2015-03-31 10:26:21 +00006469
6470 mutex_lock(&ar->conf_mutex);
6471
6472 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006473 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6474 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006475
6476 /* This shouldn't really happen because channel switching should use
6477 * switch_vif_chanctx().
6478 */
6479 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6480 goto unlock;
6481
Michal Kazior9713e3d2015-09-03 10:44:52 +02006482 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
6483 ieee80211_iterate_active_interfaces_atomic(
6484 hw,
6485 IEEE80211_IFACE_ITER_NORMAL,
6486 ath10k_mac_change_chanctx_cnt_iter,
6487 &arg);
6488 if (arg.n_vifs == 0)
6489 goto radar;
6490
6491 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
6492 GFP_KERNEL);
6493 if (!arg.vifs)
6494 goto radar;
6495
6496 ieee80211_iterate_active_interfaces_atomic(
6497 hw,
6498 IEEE80211_IFACE_ITER_NORMAL,
6499 ath10k_mac_change_chanctx_fill_iter,
6500 &arg);
6501 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6502 kfree(arg.vifs);
6503 }
6504
6505radar:
Michal Kazior500ff9f2015-03-31 10:26:21 +00006506 ath10k_recalc_radar_detection(ar);
6507
6508 /* FIXME: How to configure Rx chains properly? */
6509
6510 /* No other actions are actually necessary. Firmware maintains channel
6511 * definitions per vdev internally and there's no host-side channel
6512 * context abstraction to configure, e.g. channel width.
6513 */
6514
6515unlock:
6516 mutex_unlock(&ar->conf_mutex);
6517}
6518
6519static int
6520ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6521 struct ieee80211_vif *vif,
6522 struct ieee80211_chanctx_conf *ctx)
6523{
6524 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006525 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6526 int ret;
6527
6528 mutex_lock(&ar->conf_mutex);
6529
6530 ath10k_dbg(ar, ATH10K_DBG_MAC,
6531 "mac chanctx assign ptr %p vdev_id %i\n",
6532 ctx, arvif->vdev_id);
6533
6534 if (WARN_ON(arvif->is_started)) {
6535 mutex_unlock(&ar->conf_mutex);
6536 return -EBUSY;
6537 }
6538
Michal Kazior089ab7a2015-06-03 12:16:55 +02006539 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006540 if (ret) {
6541 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6542 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006543 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006544 goto err;
6545 }
6546
6547 arvif->is_started = true;
6548
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006549 ret = ath10k_mac_vif_setup_ps(arvif);
6550 if (ret) {
6551 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6552 arvif->vdev_id, ret);
6553 goto err_stop;
6554 }
6555
Michal Kazior500ff9f2015-03-31 10:26:21 +00006556 if (vif->type == NL80211_IFTYPE_MONITOR) {
6557 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6558 if (ret) {
6559 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6560 arvif->vdev_id, ret);
6561 goto err_stop;
6562 }
6563
6564 arvif->is_up = true;
6565 }
6566
6567 mutex_unlock(&ar->conf_mutex);
6568 return 0;
6569
6570err_stop:
6571 ath10k_vdev_stop(arvif);
6572 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006573 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006574
6575err:
6576 mutex_unlock(&ar->conf_mutex);
6577 return ret;
6578}
6579
6580static void
6581ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6582 struct ieee80211_vif *vif,
6583 struct ieee80211_chanctx_conf *ctx)
6584{
6585 struct ath10k *ar = hw->priv;
6586 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6587 int ret;
6588
6589 mutex_lock(&ar->conf_mutex);
6590
6591 ath10k_dbg(ar, ATH10K_DBG_MAC,
6592 "mac chanctx unassign ptr %p vdev_id %i\n",
6593 ctx, arvif->vdev_id);
6594
6595 WARN_ON(!arvif->is_started);
6596
6597 if (vif->type == NL80211_IFTYPE_MONITOR) {
6598 WARN_ON(!arvif->is_up);
6599
6600 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6601 if (ret)
6602 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6603 arvif->vdev_id, ret);
6604
6605 arvif->is_up = false;
6606 }
6607
6608 ret = ath10k_vdev_stop(arvif);
6609 if (ret)
6610 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6611 arvif->vdev_id, ret);
6612
6613 arvif->is_started = false;
6614
6615 mutex_unlock(&ar->conf_mutex);
6616}
6617
6618static int
6619ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6620 struct ieee80211_vif_chanctx_switch *vifs,
6621 int n_vifs,
6622 enum ieee80211_chanctx_switch_mode mode)
6623{
6624 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006625
6626 mutex_lock(&ar->conf_mutex);
6627
6628 ath10k_dbg(ar, ATH10K_DBG_MAC,
6629 "mac chanctx switch n_vifs %d mode %d\n",
6630 n_vifs, mode);
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006631 ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006632
6633 mutex_unlock(&ar->conf_mutex);
6634 return 0;
6635}
6636
Kalle Valo5e3dd152013-06-12 20:52:10 +03006637static const struct ieee80211_ops ath10k_ops = {
6638 .tx = ath10k_tx,
6639 .start = ath10k_start,
6640 .stop = ath10k_stop,
6641 .config = ath10k_config,
6642 .add_interface = ath10k_add_interface,
6643 .remove_interface = ath10k_remove_interface,
6644 .configure_filter = ath10k_configure_filter,
6645 .bss_info_changed = ath10k_bss_info_changed,
6646 .hw_scan = ath10k_hw_scan,
6647 .cancel_hw_scan = ath10k_cancel_hw_scan,
6648 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006649 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006650 .sta_state = ath10k_sta_state,
6651 .conf_tx = ath10k_conf_tx,
6652 .remain_on_channel = ath10k_remain_on_channel,
6653 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6654 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006655 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006656 .flush = ath10k_flush,
6657 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006658 .set_antenna = ath10k_set_antenna,
6659 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006660 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006661 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006662 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006663 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006664 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006665 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006666 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6667 .get_et_stats = ath10k_debug_get_et_stats,
6668 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006669 .add_chanctx = ath10k_mac_op_add_chanctx,
6670 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6671 .change_chanctx = ath10k_mac_op_change_chanctx,
6672 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6673 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6674 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006675
6676 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6677
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006678#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006679 .suspend = ath10k_wow_op_suspend,
6680 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006681#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006682#ifdef CONFIG_MAC80211_DEBUGFS
6683 .sta_add_debugfs = ath10k_sta_add_debugfs,
6684#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006685};
6686
Kalle Valo5e3dd152013-06-12 20:52:10 +03006687#define CHAN2G(_channel, _freq, _flags) { \
6688 .band = IEEE80211_BAND_2GHZ, \
6689 .hw_value = (_channel), \
6690 .center_freq = (_freq), \
6691 .flags = (_flags), \
6692 .max_antenna_gain = 0, \
6693 .max_power = 30, \
6694}
6695
6696#define CHAN5G(_channel, _freq, _flags) { \
6697 .band = IEEE80211_BAND_5GHZ, \
6698 .hw_value = (_channel), \
6699 .center_freq = (_freq), \
6700 .flags = (_flags), \
6701 .max_antenna_gain = 0, \
6702 .max_power = 30, \
6703}
6704
6705static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6706 CHAN2G(1, 2412, 0),
6707 CHAN2G(2, 2417, 0),
6708 CHAN2G(3, 2422, 0),
6709 CHAN2G(4, 2427, 0),
6710 CHAN2G(5, 2432, 0),
6711 CHAN2G(6, 2437, 0),
6712 CHAN2G(7, 2442, 0),
6713 CHAN2G(8, 2447, 0),
6714 CHAN2G(9, 2452, 0),
6715 CHAN2G(10, 2457, 0),
6716 CHAN2G(11, 2462, 0),
6717 CHAN2G(12, 2467, 0),
6718 CHAN2G(13, 2472, 0),
6719 CHAN2G(14, 2484, 0),
6720};
6721
6722static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006723 CHAN5G(36, 5180, 0),
6724 CHAN5G(40, 5200, 0),
6725 CHAN5G(44, 5220, 0),
6726 CHAN5G(48, 5240, 0),
6727 CHAN5G(52, 5260, 0),
6728 CHAN5G(56, 5280, 0),
6729 CHAN5G(60, 5300, 0),
6730 CHAN5G(64, 5320, 0),
6731 CHAN5G(100, 5500, 0),
6732 CHAN5G(104, 5520, 0),
6733 CHAN5G(108, 5540, 0),
6734 CHAN5G(112, 5560, 0),
6735 CHAN5G(116, 5580, 0),
6736 CHAN5G(120, 5600, 0),
6737 CHAN5G(124, 5620, 0),
6738 CHAN5G(128, 5640, 0),
6739 CHAN5G(132, 5660, 0),
6740 CHAN5G(136, 5680, 0),
6741 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006742 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006743 CHAN5G(149, 5745, 0),
6744 CHAN5G(153, 5765, 0),
6745 CHAN5G(157, 5785, 0),
6746 CHAN5G(161, 5805, 0),
6747 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006748};
6749
Michal Kaziore7b54192014-08-07 11:03:27 +02006750struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006751{
6752 struct ieee80211_hw *hw;
6753 struct ath10k *ar;
6754
Michal Kaziore7b54192014-08-07 11:03:27 +02006755 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006756 if (!hw)
6757 return NULL;
6758
6759 ar = hw->priv;
6760 ar->hw = hw;
6761
6762 return ar;
6763}
6764
6765void ath10k_mac_destroy(struct ath10k *ar)
6766{
6767 ieee80211_free_hw(ar->hw);
6768}
6769
6770static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6771 {
6772 .max = 8,
6773 .types = BIT(NL80211_IFTYPE_STATION)
6774 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006775 },
6776 {
6777 .max = 3,
6778 .types = BIT(NL80211_IFTYPE_P2P_GO)
6779 },
6780 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006781 .max = 1,
6782 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6783 },
6784 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006785 .max = 7,
6786 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006787#ifdef CONFIG_MAC80211_MESH
6788 | BIT(NL80211_IFTYPE_MESH_POINT)
6789#endif
Michal Kaziord531cb82013-07-31 10:55:13 +02006790 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006791};
6792
Bartosz Markowskif2595092013-12-10 16:20:39 +01006793static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006794 {
6795 .max = 8,
6796 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006797#ifdef CONFIG_MAC80211_MESH
6798 | BIT(NL80211_IFTYPE_MESH_POINT)
6799#endif
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006800 },
6801};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006802
6803static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6804 {
6805 .limits = ath10k_if_limits,
6806 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6807 .max_interfaces = 8,
6808 .num_different_channels = 1,
6809 .beacon_int_infra_match = true,
6810 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006811};
6812
6813static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006814 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006815 .limits = ath10k_10x_if_limits,
6816 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006817 .max_interfaces = 8,
6818 .num_different_channels = 1,
6819 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006820#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006821 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6822 BIT(NL80211_CHAN_WIDTH_20) |
6823 BIT(NL80211_CHAN_WIDTH_40) |
6824 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006825#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006826 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006827};
6828
Michal Kaziorcf327842015-03-31 10:26:25 +00006829static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6830 {
6831 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02006832 .types = BIT(NL80211_IFTYPE_STATION),
6833 },
6834 {
6835 .max = 2,
6836 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006837#ifdef CONFIG_MAC80211_MESH
6838 BIT(NL80211_IFTYPE_MESH_POINT) |
6839#endif
Michal Kaziorcf327842015-03-31 10:26:25 +00006840 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6841 BIT(NL80211_IFTYPE_P2P_GO),
6842 },
6843 {
6844 .max = 1,
6845 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6846 },
6847};
6848
Michal Kaziored25b112015-07-09 13:08:39 +02006849static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6850 {
6851 .max = 2,
6852 .types = BIT(NL80211_IFTYPE_STATION),
6853 },
6854 {
6855 .max = 2,
6856 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6857 },
6858 {
6859 .max = 1,
6860 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006861#ifdef CONFIG_MAC80211_MESH
6862 BIT(NL80211_IFTYPE_MESH_POINT) |
6863#endif
Michal Kaziored25b112015-07-09 13:08:39 +02006864 BIT(NL80211_IFTYPE_P2P_GO),
6865 },
6866 {
6867 .max = 1,
6868 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6869 },
6870};
6871
Michal Kaziorcf327842015-03-31 10:26:25 +00006872static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6873 {
6874 .max = 1,
6875 .types = BIT(NL80211_IFTYPE_STATION),
6876 },
6877 {
6878 .max = 1,
6879 .types = BIT(NL80211_IFTYPE_ADHOC),
6880 },
6881};
6882
6883/* FIXME: This is not thouroughly tested. These combinations may over- or
6884 * underestimate hw/fw capabilities.
6885 */
6886static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6887 {
6888 .limits = ath10k_tlv_if_limit,
6889 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02006890 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006891 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6892 },
6893 {
6894 .limits = ath10k_tlv_if_limit_ibss,
6895 .num_different_channels = 1,
6896 .max_interfaces = 2,
6897 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6898 },
6899};
6900
6901static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6902 {
6903 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02006904 .num_different_channels = 1,
6905 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006906 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6907 },
6908 {
Michal Kaziored25b112015-07-09 13:08:39 +02006909 .limits = ath10k_tlv_qcs_if_limit,
6910 .num_different_channels = 2,
6911 .max_interfaces = 4,
6912 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6913 },
6914 {
Michal Kaziorcf327842015-03-31 10:26:25 +00006915 .limits = ath10k_tlv_if_limit_ibss,
6916 .num_different_channels = 1,
6917 .max_interfaces = 2,
6918 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6919 },
6920};
6921
Raja Manicf36fef2015-06-22 20:22:25 +05306922static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6923 {
6924 .max = 1,
6925 .types = BIT(NL80211_IFTYPE_STATION),
6926 },
6927 {
6928 .max = 16,
6929 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006930#ifdef CONFIG_MAC80211_MESH
6931 | BIT(NL80211_IFTYPE_MESH_POINT)
6932#endif
Raja Manicf36fef2015-06-22 20:22:25 +05306933 },
6934};
6935
6936static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6937 {
6938 .limits = ath10k_10_4_if_limits,
6939 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6940 .max_interfaces = 16,
6941 .num_different_channels = 1,
6942 .beacon_int_infra_match = true,
6943#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6944 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6945 BIT(NL80211_CHAN_WIDTH_20) |
6946 BIT(NL80211_CHAN_WIDTH_40) |
6947 BIT(NL80211_CHAN_WIDTH_80),
6948#endif
6949 },
6950};
6951
Kalle Valo5e3dd152013-06-12 20:52:10 +03006952static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6953{
6954 struct ieee80211_sta_vht_cap vht_cap = {0};
6955 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006956 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006957 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006958
6959 vht_cap.vht_supported = 1;
6960 vht_cap.cap = ar->vht_cap_info;
6961
Michal Kaziorbc657a362015-02-26 11:11:22 +01006962 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6963 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
Bartosz Markowski707a0c82015-09-02 13:20:19 +02006964 val = ath10k_mac_get_vht_cap_bf_sts(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006965 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6966 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6967
6968 vht_cap.cap |= val;
6969 }
6970
6971 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6972 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02006973 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006974 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6975 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6976
6977 vht_cap.cap |= val;
6978 }
6979
Michal Kazior8865bee42013-07-24 12:36:46 +02006980 mcs_map = 0;
6981 for (i = 0; i < 8; i++) {
6982 if (i < ar->num_rf_chains)
6983 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6984 else
6985 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6986 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006987
6988 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6989 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6990
6991 return vht_cap;
6992}
6993
6994static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6995{
6996 int i;
6997 struct ieee80211_sta_ht_cap ht_cap = {0};
6998
6999 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
7000 return ht_cap;
7001
7002 ht_cap.ht_supported = 1;
7003 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7004 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
7005 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7006 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7007 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7008
7009 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
7010 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7011
7012 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
7013 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7014
7015 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
7016 u32 smps;
7017
7018 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
7019 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7020
7021 ht_cap.cap |= smps;
7022 }
7023
7024 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
7025 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7026
7027 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
7028 u32 stbc;
7029
7030 stbc = ar->ht_cap_info;
7031 stbc &= WMI_HT_CAP_RX_STBC;
7032 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7033 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7034 stbc &= IEEE80211_HT_CAP_RX_STBC;
7035
7036 ht_cap.cap |= stbc;
7037 }
7038
7039 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
7040 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7041
7042 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
7043 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7044
7045 /* max AMSDU is implicitly taken from vht_cap_info */
7046 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7047 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7048
Michal Kazior8865bee42013-07-24 12:36:46 +02007049 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03007050 ht_cap.mcs.rx_mask[i] = 0xFF;
7051
7052 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7053
7054 return ht_cap;
7055}
7056
Kalle Valo5e3dd152013-06-12 20:52:10 +03007057static void ath10k_get_arvif_iter(void *data, u8 *mac,
7058 struct ieee80211_vif *vif)
7059{
7060 struct ath10k_vif_iter *arvif_iter = data;
7061 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
7062
7063 if (arvif->vdev_id == arvif_iter->vdev_id)
7064 arvif_iter->arvif = arvif;
7065}
7066
7067struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
7068{
7069 struct ath10k_vif_iter arvif_iter;
7070 u32 flags;
7071
7072 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
7073 arvif_iter.vdev_id = vdev_id;
7074
7075 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
7076 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7077 flags,
7078 ath10k_get_arvif_iter,
7079 &arvif_iter);
7080 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007081 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007082 return NULL;
7083 }
7084
7085 return arvif_iter.arvif;
7086}
7087
7088int ath10k_mac_register(struct ath10k *ar)
7089{
Johannes Berg3cb10942015-01-22 21:38:45 +01007090 static const u32 cipher_suites[] = {
7091 WLAN_CIPHER_SUITE_WEP40,
7092 WLAN_CIPHER_SUITE_WEP104,
7093 WLAN_CIPHER_SUITE_TKIP,
7094 WLAN_CIPHER_SUITE_CCMP,
7095 WLAN_CIPHER_SUITE_AES_CMAC,
7096 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03007097 struct ieee80211_supported_band *band;
7098 struct ieee80211_sta_vht_cap vht_cap;
7099 struct ieee80211_sta_ht_cap ht_cap;
7100 void *channels;
7101 int ret;
7102
7103 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7104
7105 SET_IEEE80211_DEV(ar->hw, ar->dev);
7106
7107 ht_cap = ath10k_get_ht_cap(ar);
7108 vht_cap = ath10k_create_vht_cap(ar);
7109
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00007110 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
7111 ARRAY_SIZE(ath10k_5ghz_channels)) !=
7112 ATH10K_NUM_CHANS);
7113
Kalle Valo5e3dd152013-06-12 20:52:10 +03007114 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
7115 channels = kmemdup(ath10k_2ghz_channels,
7116 sizeof(ath10k_2ghz_channels),
7117 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02007118 if (!channels) {
7119 ret = -ENOMEM;
7120 goto err_free;
7121 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007122
7123 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
7124 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7125 band->channels = channels;
7126 band->n_bitrates = ath10k_g_rates_size;
7127 band->bitrates = ath10k_g_rates;
7128 band->ht_cap = ht_cap;
7129
Yanbo Lid68bb122015-01-23 08:18:20 +08007130 /* Enable the VHT support at 2.4 GHz */
7131 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007132
7133 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
7134 }
7135
7136 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7137 channels = kmemdup(ath10k_5ghz_channels,
7138 sizeof(ath10k_5ghz_channels),
7139 GFP_KERNEL);
7140 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007141 ret = -ENOMEM;
7142 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007143 }
7144
7145 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7146 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7147 band->channels = channels;
7148 band->n_bitrates = ath10k_a_rates_size;
7149 band->bitrates = ath10k_a_rates;
7150 band->ht_cap = ht_cap;
7151 band->vht_cap = vht_cap;
7152 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7153 }
7154
7155 ar->hw->wiphy->interface_modes =
7156 BIT(NL80211_IFTYPE_STATION) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007157 BIT(NL80211_IFTYPE_AP) |
7158 BIT(NL80211_IFTYPE_MESH_POINT);
Bartosz Markowskid3541812013-12-10 16:20:40 +01007159
Ben Greear46acf7b2014-05-16 17:15:38 +03007160 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
7161 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
7162
Bartosz Markowskid3541812013-12-10 16:20:40 +01007163 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7164 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007165 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007166 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7167 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007168
Johannes Berg30686bf2015-06-02 21:39:54 +02007169 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7170 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7171 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7172 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7173 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7174 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7175 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7176 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007177 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7178 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7179 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7180 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7181 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7182 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007183
David Liuccec9032015-07-24 20:25:32 +03007184 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7185 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7186
Eliad Peller0d8614b2014-09-10 14:07:36 +03007187 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007188 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007189
Kalle Valo5e3dd152013-06-12 20:52:10 +03007190 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007191 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007192
7193 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007194 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7195 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007196 }
7197
7198 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7199 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7200
7201 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007202 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007203
Kalle Valo5e3dd152013-06-12 20:52:10 +03007204 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7205
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007206 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7207 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7208
7209 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7210 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7211 * correct Probe Responses. This is more of a hack advert..
7212 */
7213 ar->hw->wiphy->probe_resp_offload |=
7214 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7215 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7216 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7217 }
7218
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007219 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7220 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7221
Kalle Valo5e3dd152013-06-12 20:52:10 +03007222 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007223 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007224 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7225
7226 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007227 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7228
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007229 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7230
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007231 ret = ath10k_wow_init(ar);
7232 if (ret) {
7233 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7234 goto err_free;
7235 }
7236
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007237 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7238
Kalle Valo5e3dd152013-06-12 20:52:10 +03007239 /*
7240 * on LL hardware queues are managed entirely by the FW
7241 * so we only advertise to mac we can do the queues thing
7242 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007243 ar->hw->queues = IEEE80211_MAX_QUEUES;
7244
7245 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7246 * something that vdev_ids can't reach so that we don't stop the queue
7247 * accidentally.
7248 */
7249 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007250
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007251 switch (ar->wmi.op_version) {
7252 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007253 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7254 ar->hw->wiphy->n_iface_combinations =
7255 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007256 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007257 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007258 case ATH10K_FW_WMI_OP_VERSION_TLV:
7259 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7260 ar->hw->wiphy->iface_combinations =
7261 ath10k_tlv_qcs_if_comb;
7262 ar->hw->wiphy->n_iface_combinations =
7263 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7264 } else {
7265 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7266 ar->hw->wiphy->n_iface_combinations =
7267 ARRAY_SIZE(ath10k_tlv_if_comb);
7268 }
7269 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7270 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007271 case ATH10K_FW_WMI_OP_VERSION_10_1:
7272 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007273 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007274 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7275 ar->hw->wiphy->n_iface_combinations =
7276 ARRAY_SIZE(ath10k_10x_if_comb);
7277 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307278 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307279 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7280 ar->hw->wiphy->n_iface_combinations =
7281 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307282 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007283 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7284 case ATH10K_FW_WMI_OP_VERSION_MAX:
7285 WARN_ON(1);
7286 ret = -EINVAL;
7287 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007288 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007289
David Liuccec9032015-07-24 20:25:32 +03007290 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7291 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007292
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007293 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7294 /* Init ath dfs pattern detector */
7295 ar->ath_common.debug_mask = ATH_DBG_DFS;
7296 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7297 NL80211_DFS_UNSET);
7298
7299 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007300 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007301 }
7302
Kalle Valo5e3dd152013-06-12 20:52:10 +03007303 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7304 ath10k_reg_notifier);
7305 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007306 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007307 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007308 }
7309
Johannes Berg3cb10942015-01-22 21:38:45 +01007310 ar->hw->wiphy->cipher_suites = cipher_suites;
7311 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7312
Kalle Valo5e3dd152013-06-12 20:52:10 +03007313 ret = ieee80211_register_hw(ar->hw);
7314 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007315 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007316 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007317 }
7318
7319 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7320 ret = regulatory_hint(ar->hw->wiphy,
7321 ar->ath_common.regulatory.alpha2);
7322 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007323 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007324 }
7325
7326 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007327
7328err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007329 ieee80211_unregister_hw(ar->hw);
Jeff Johnson0e339442015-10-08 09:15:53 -07007330
7331err_dfs_detector_exit:
7332 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7333 ar->dfs_detector->exit(ar->dfs_detector);
7334
Michal Kaziord6015b22013-07-22 14:13:30 +02007335err_free:
7336 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7337 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7338
Jeff Johnson0e339442015-10-08 09:15:53 -07007339 SET_IEEE80211_DEV(ar->hw, NULL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007340 return ret;
7341}
7342
7343void ath10k_mac_unregister(struct ath10k *ar)
7344{
7345 ieee80211_unregister_hw(ar->hw);
7346
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007347 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7348 ar->dfs_detector->exit(ar->dfs_detector);
7349
Kalle Valo5e3dd152013-06-12 20:52:10 +03007350 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7351 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7352
7353 SET_IEEE80211_DEV(ar->hw, NULL);
7354}