blob: 1cda4f9dd4531fb9b58364c4eada6d7ac363e802 [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
David Liuccec9032015-07-24 20:25:32 +0300200 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
201 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
202 }
203
Kalle Valo5e3dd152013-06-12 20:52:10 +0300204 if (cmd == DISABLE_KEY) {
205 arg.key_cipher = WMI_CIPHER_NONE;
206 arg.key_data = NULL;
207 }
208
209 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
210}
211
212static int ath10k_install_key(struct ath10k_vif *arvif,
213 struct ieee80211_key_conf *key,
214 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100215 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300216{
217 struct ath10k *ar = arvif->ar;
218 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300219 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300220
Michal Kazior548db542013-07-05 16:15:15 +0300221 lockdep_assert_held(&ar->conf_mutex);
222
Wolfram Sang16735d02013-11-14 14:32:02 -0800223 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300224
David Liuccec9032015-07-24 20:25:32 +0300225 if (arvif->nohwcrypt)
226 return 1;
227
Michal Kazior370e5672015-02-18 14:02:26 +0100228 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300229 if (ret)
230 return ret;
231
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300232 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
233 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300234 return -ETIMEDOUT;
235
236 return 0;
237}
238
239static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
240 const u8 *addr)
241{
242 struct ath10k *ar = arvif->ar;
243 struct ath10k_peer *peer;
244 int ret;
245 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100246 u32 flags;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300247
248 lockdep_assert_held(&ar->conf_mutex);
249
Michal Kazior8674d902015-08-13 14:10:46 +0200250 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
251 arvif->vif->type != NL80211_IFTYPE_ADHOC))
252 return -EINVAL;
253
Kalle Valo5e3dd152013-06-12 20:52:10 +0300254 spin_lock_bh(&ar->data_lock);
255 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
256 spin_unlock_bh(&ar->data_lock);
257
258 if (!peer)
259 return -ENOENT;
260
261 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
262 if (arvif->wep_keys[i] == NULL)
263 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100264
Michal Kazior8674d902015-08-13 14:10:46 +0200265 switch (arvif->vif->type) {
266 case NL80211_IFTYPE_AP:
267 flags = WMI_KEY_PAIRWISE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300268
Michal Kazior8674d902015-08-13 14:10:46 +0200269 if (arvif->def_wep_key_idx == i)
270 flags |= WMI_KEY_TX_USAGE;
Michal Kaziorce90b272015-04-10 13:23:21 +0000271
Michal Kazior8674d902015-08-13 14:10:46 +0200272 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
273 SET_KEY, addr, flags);
274 if (ret < 0)
275 return ret;
276 break;
277 case NL80211_IFTYPE_ADHOC:
278 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
279 SET_KEY, addr,
280 WMI_KEY_PAIRWISE);
281 if (ret < 0)
282 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300283
Michal Kazior8674d902015-08-13 14:10:46 +0200284 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
285 SET_KEY, addr, WMI_KEY_GROUP);
286 if (ret < 0)
287 return ret;
288 break;
289 default:
290 WARN_ON(1);
291 return -EINVAL;
292 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300293
Sujith Manoharanae167132014-11-25 11:46:59 +0530294 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300295 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530296 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300297 }
298
Michal Kaziorce90b272015-04-10 13:23:21 +0000299 /* In some cases (notably with static WEP IBSS with multiple keys)
300 * multicast Tx becomes broken. Both pairwise and groupwise keys are
301 * installed already. Using WMI_KEY_TX_USAGE in different combinations
302 * didn't seem help. Using def_keyid vdev parameter seems to be
303 * effective so use that.
304 *
305 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
306 */
Michal Kazior8674d902015-08-13 14:10:46 +0200307 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
308 return 0;
309
Michal Kaziorce90b272015-04-10 13:23:21 +0000310 if (arvif->def_wep_key_idx == -1)
311 return 0;
312
313 ret = ath10k_wmi_vdev_set_param(arvif->ar,
314 arvif->vdev_id,
315 arvif->ar->wmi.vdev_param->def_keyid,
316 arvif->def_wep_key_idx);
317 if (ret) {
318 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
319 arvif->vdev_id, ret);
320 return ret;
321 }
322
Kalle Valo5e3dd152013-06-12 20:52:10 +0300323 return 0;
324}
325
326static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
327 const u8 *addr)
328{
329 struct ath10k *ar = arvif->ar;
330 struct ath10k_peer *peer;
331 int first_errno = 0;
332 int ret;
333 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100334 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300335
336 lockdep_assert_held(&ar->conf_mutex);
337
338 spin_lock_bh(&ar->data_lock);
339 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
340 spin_unlock_bh(&ar->data_lock);
341
342 if (!peer)
343 return -ENOENT;
344
345 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
346 if (peer->keys[i] == NULL)
347 continue;
348
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200349 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300350 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100351 DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300352 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300353 first_errno = ret;
354
David Liuccec9032015-07-24 20:25:32 +0300355 if (ret < 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200356 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300357 i, ret);
358
Sujith Manoharanae167132014-11-25 11:46:59 +0530359 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300360 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530361 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300362 }
363
364 return first_errno;
365}
366
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530367bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
368 u8 keyidx)
369{
370 struct ath10k_peer *peer;
371 int i;
372
373 lockdep_assert_held(&ar->data_lock);
374
375 /* We don't know which vdev this peer belongs to,
376 * since WMI doesn't give us that information.
377 *
378 * FIXME: multi-bss needs to be handled.
379 */
380 peer = ath10k_peer_find(ar, 0, addr);
381 if (!peer)
382 return false;
383
384 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
385 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
386 return true;
387 }
388
389 return false;
390}
391
Kalle Valo5e3dd152013-06-12 20:52:10 +0300392static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
393 struct ieee80211_key_conf *key)
394{
395 struct ath10k *ar = arvif->ar;
396 struct ath10k_peer *peer;
397 u8 addr[ETH_ALEN];
398 int first_errno = 0;
399 int ret;
400 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100401 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300402
403 lockdep_assert_held(&ar->conf_mutex);
404
405 for (;;) {
406 /* since ath10k_install_key we can't hold data_lock all the
407 * time, so we try to remove the keys incrementally */
408 spin_lock_bh(&ar->data_lock);
409 i = 0;
410 list_for_each_entry(peer, &ar->peers, list) {
411 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
412 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300413 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300414 peer->keys[i] = NULL;
415 break;
416 }
417 }
418
419 if (i < ARRAY_SIZE(peer->keys))
420 break;
421 }
422 spin_unlock_bh(&ar->data_lock);
423
424 if (i == ARRAY_SIZE(peer->keys))
425 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200426 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100427 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300428 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300429 first_errno = ret;
430
431 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200432 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200433 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300434 }
435
436 return first_errno;
437}
438
Michal Kaziorad325cb2015-02-18 14:02:27 +0100439static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
440 struct ieee80211_key_conf *key)
441{
442 struct ath10k *ar = arvif->ar;
443 struct ath10k_peer *peer;
444 int ret;
445
446 lockdep_assert_held(&ar->conf_mutex);
447
448 list_for_each_entry(peer, &ar->peers, list) {
449 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
450 continue;
451
452 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
453 continue;
454
455 if (peer->keys[key->keyidx] == key)
456 continue;
457
458 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
459 arvif->vdev_id, key->keyidx);
460
461 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
462 if (ret) {
463 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
464 arvif->vdev_id, peer->addr, ret);
465 return ret;
466 }
467 }
468
469 return 0;
470}
471
Kalle Valo5e3dd152013-06-12 20:52:10 +0300472/*********************/
473/* General utilities */
474/*********************/
475
476static inline enum wmi_phy_mode
477chan_to_phymode(const struct cfg80211_chan_def *chandef)
478{
479 enum wmi_phy_mode phymode = MODE_UNKNOWN;
480
481 switch (chandef->chan->band) {
482 case IEEE80211_BAND_2GHZ:
483 switch (chandef->width) {
484 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800485 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
486 phymode = MODE_11B;
487 else
488 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300489 break;
490 case NL80211_CHAN_WIDTH_20:
491 phymode = MODE_11NG_HT20;
492 break;
493 case NL80211_CHAN_WIDTH_40:
494 phymode = MODE_11NG_HT40;
495 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400496 case NL80211_CHAN_WIDTH_5:
497 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300498 case NL80211_CHAN_WIDTH_80:
499 case NL80211_CHAN_WIDTH_80P80:
500 case NL80211_CHAN_WIDTH_160:
501 phymode = MODE_UNKNOWN;
502 break;
503 }
504 break;
505 case IEEE80211_BAND_5GHZ:
506 switch (chandef->width) {
507 case NL80211_CHAN_WIDTH_20_NOHT:
508 phymode = MODE_11A;
509 break;
510 case NL80211_CHAN_WIDTH_20:
511 phymode = MODE_11NA_HT20;
512 break;
513 case NL80211_CHAN_WIDTH_40:
514 phymode = MODE_11NA_HT40;
515 break;
516 case NL80211_CHAN_WIDTH_80:
517 phymode = MODE_11AC_VHT80;
518 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400519 case NL80211_CHAN_WIDTH_5:
520 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300521 case NL80211_CHAN_WIDTH_80P80:
522 case NL80211_CHAN_WIDTH_160:
523 phymode = MODE_UNKNOWN;
524 break;
525 }
526 break;
527 default:
528 break;
529 }
530
531 WARN_ON(phymode == MODE_UNKNOWN);
532 return phymode;
533}
534
535static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
536{
537/*
538 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
539 * 0 for no restriction
540 * 1 for 1/4 us
541 * 2 for 1/2 us
542 * 3 for 1 us
543 * 4 for 2 us
544 * 5 for 4 us
545 * 6 for 8 us
546 * 7 for 16 us
547 */
548 switch (mpdudensity) {
549 case 0:
550 return 0;
551 case 1:
552 case 2:
553 case 3:
554 /* Our lower layer calculations limit our precision to
555 1 microsecond */
556 return 1;
557 case 4:
558 return 2;
559 case 5:
560 return 4;
561 case 6:
562 return 8;
563 case 7:
564 return 16;
565 default:
566 return 0;
567 }
568}
569
Michal Kazior500ff9f2015-03-31 10:26:21 +0000570int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
571 struct cfg80211_chan_def *def)
572{
573 struct ieee80211_chanctx_conf *conf;
574
575 rcu_read_lock();
576 conf = rcu_dereference(vif->chanctx_conf);
577 if (!conf) {
578 rcu_read_unlock();
579 return -ENOENT;
580 }
581
582 *def = conf->def;
583 rcu_read_unlock();
584
585 return 0;
586}
587
588static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
589 struct ieee80211_chanctx_conf *conf,
590 void *data)
591{
592 int *num = data;
593
594 (*num)++;
595}
596
597static int ath10k_mac_num_chanctxs(struct ath10k *ar)
598{
599 int num = 0;
600
601 ieee80211_iter_chan_contexts_atomic(ar->hw,
602 ath10k_mac_num_chanctxs_iter,
603 &num);
604
605 return num;
606}
607
608static void
609ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
610 struct ieee80211_chanctx_conf *conf,
611 void *data)
612{
613 struct cfg80211_chan_def **def = data;
614
615 *def = &conf->def;
616}
617
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300618static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
619 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300620{
Michal Kaziore04cafb2015-08-05 12:15:24 +0200621 struct ath10k_vif *arvif;
622 int num_peers = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623 int ret;
624
625 lockdep_assert_held(&ar->conf_mutex);
626
Michal Kaziore04cafb2015-08-05 12:15:24 +0200627 num_peers = ar->num_peers;
628
629 /* Each vdev consumes a peer entry as well */
630 list_for_each_entry(arvif, &ar->arvifs, list)
631 num_peers++;
632
633 if (num_peers >= ar->max_num_peers)
Michal Kaziorcfd10612014-11-25 15:16:05 +0100634 return -ENOBUFS;
635
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300636 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800637 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200638 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200639 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300640 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800641 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300642
643 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800644 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200645 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200646 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300647 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800648 }
Michal Kazior292a7532014-11-25 15:16:04 +0100649
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100650 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300651
652 return 0;
653}
654
Kalle Valo5a13e762014-01-20 11:01:46 +0200655static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
656{
657 struct ath10k *ar = arvif->ar;
658 u32 param;
659 int ret;
660
661 param = ar->wmi.pdev_param->sta_kickout_th;
662 ret = ath10k_wmi_pdev_set_param(ar, param,
663 ATH10K_KICKOUT_THRESHOLD);
664 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200665 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200666 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200667 return ret;
668 }
669
670 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
671 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
672 ATH10K_KEEPALIVE_MIN_IDLE);
673 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200674 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200675 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200676 return ret;
677 }
678
679 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
680 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
681 ATH10K_KEEPALIVE_MAX_IDLE);
682 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200683 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200684 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200685 return ret;
686 }
687
688 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
689 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
690 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
691 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200692 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200693 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200694 return ret;
695 }
696
697 return 0;
698}
699
Vivek Natarajanacab6402014-11-26 09:06:12 +0200700static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200701{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200702 struct ath10k *ar = arvif->ar;
703 u32 vdev_param;
704
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200705 vdev_param = ar->wmi.vdev_param->rts_threshold;
706 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200707}
708
Kalle Valo5e3dd152013-06-12 20:52:10 +0300709static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
710{
711 int ret;
712
713 lockdep_assert_held(&ar->conf_mutex);
714
715 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
716 if (ret)
717 return ret;
718
719 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
720 if (ret)
721 return ret;
722
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100723 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100724
Kalle Valo5e3dd152013-06-12 20:52:10 +0300725 return 0;
726}
727
728static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
729{
730 struct ath10k_peer *peer, *tmp;
731
732 lockdep_assert_held(&ar->conf_mutex);
733
734 spin_lock_bh(&ar->data_lock);
735 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
736 if (peer->vdev_id != vdev_id)
737 continue;
738
Michal Kazior7aa7a722014-08-25 12:09:38 +0200739 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300740 peer->addr, vdev_id);
741
742 list_del(&peer->list);
743 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100744 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300745 }
746 spin_unlock_bh(&ar->data_lock);
747}
748
Michal Kaziora96d7742013-07-16 09:38:56 +0200749static void ath10k_peer_cleanup_all(struct ath10k *ar)
750{
751 struct ath10k_peer *peer, *tmp;
752
753 lockdep_assert_held(&ar->conf_mutex);
754
755 spin_lock_bh(&ar->data_lock);
756 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
757 list_del(&peer->list);
758 kfree(peer);
759 }
760 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100761
762 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100763 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200764}
765
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300766static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
767 struct ieee80211_sta *sta,
768 enum wmi_tdls_peer_state state)
769{
770 int ret;
771 struct wmi_tdls_peer_update_cmd_arg arg = {};
772 struct wmi_tdls_peer_capab_arg cap = {};
773 struct wmi_channel_arg chan_arg = {};
774
775 lockdep_assert_held(&ar->conf_mutex);
776
777 arg.vdev_id = vdev_id;
778 arg.peer_state = state;
779 ether_addr_copy(arg.addr, sta->addr);
780
781 cap.peer_max_sp = sta->max_sp;
782 cap.peer_uapsd_queues = sta->uapsd_queues;
783
784 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
785 !sta->tdls_initiator)
786 cap.is_peer_responder = 1;
787
788 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
789 if (ret) {
790 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
791 arg.addr, vdev_id, ret);
792 return ret;
793 }
794
795 return 0;
796}
797
Kalle Valo5e3dd152013-06-12 20:52:10 +0300798/************************/
799/* Interface management */
800/************************/
801
Michal Kazior64badcb2014-09-18 11:18:02 +0300802void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
803{
804 struct ath10k *ar = arvif->ar;
805
806 lockdep_assert_held(&ar->data_lock);
807
808 if (!arvif->beacon)
809 return;
810
811 if (!arvif->beacon_buf)
812 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
813 arvif->beacon->len, DMA_TO_DEVICE);
814
Michal Kazioraf213192015-01-29 14:29:52 +0200815 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
816 arvif->beacon_state != ATH10K_BEACON_SENT))
817 return;
818
Michal Kazior64badcb2014-09-18 11:18:02 +0300819 dev_kfree_skb_any(arvif->beacon);
820
821 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200822 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300823}
824
825static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
826{
827 struct ath10k *ar = arvif->ar;
828
829 lockdep_assert_held(&ar->data_lock);
830
831 ath10k_mac_vif_beacon_free(arvif);
832
833 if (arvif->beacon_buf) {
834 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
835 arvif->beacon_buf, arvif->beacon_paddr);
836 arvif->beacon_buf = NULL;
837 }
838}
839
Kalle Valo5e3dd152013-06-12 20:52:10 +0300840static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
841{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300842 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300843
Michal Kazior548db542013-07-05 16:15:15 +0300844 lockdep_assert_held(&ar->conf_mutex);
845
Michal Kazior7962b0d2014-10-28 10:34:38 +0100846 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
847 return -ESHUTDOWN;
848
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300849 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
850 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
851 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300852 return -ETIMEDOUT;
853
854 return 0;
855}
856
Michal Kazior1bbc0972014-04-08 09:45:47 +0300857static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300858{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000859 struct cfg80211_chan_def *chandef = NULL;
Maninder Singh19be9e92015-07-16 09:25:33 +0530860 struct ieee80211_channel *channel = NULL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300861 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300862 int ret = 0;
863
864 lockdep_assert_held(&ar->conf_mutex);
865
Michal Kazior500ff9f2015-03-31 10:26:21 +0000866 ieee80211_iter_chan_contexts_atomic(ar->hw,
867 ath10k_mac_get_any_chandef_iter,
868 &chandef);
869 if (WARN_ON_ONCE(!chandef))
870 return -ENOENT;
871
872 channel = chandef->chan;
873
Kalle Valo5e3dd152013-06-12 20:52:10 +0300874 arg.vdev_id = vdev_id;
875 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100876 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300877
878 /* TODO setup this dynamically, what in case we
879 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100880 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200881 arg.channel.chan_radar =
882 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300883
Michal Kazior89c5c842013-10-23 04:02:13 -0700884 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700885 arg.channel.max_power = channel->max_power * 2;
886 arg.channel.max_reg_power = channel->max_reg_power * 2;
887 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300888
Michal Kazior7962b0d2014-10-28 10:34:38 +0100889 reinit_completion(&ar->vdev_setup_done);
890
Kalle Valo5e3dd152013-06-12 20:52:10 +0300891 ret = ath10k_wmi_vdev_start(ar, &arg);
892 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200893 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200894 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300895 return ret;
896 }
897
898 ret = ath10k_vdev_setup_sync(ar);
899 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200900 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200901 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300902 return ret;
903 }
904
905 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
906 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200907 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200908 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300909 goto vdev_stop;
910 }
911
912 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300913
Michal Kazior7aa7a722014-08-25 12:09:38 +0200914 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300915 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300916 return 0;
917
918vdev_stop:
919 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
920 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200921 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200922 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300923
924 return ret;
925}
926
Michal Kazior1bbc0972014-04-08 09:45:47 +0300927static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300928{
929 int ret = 0;
930
931 lockdep_assert_held(&ar->conf_mutex);
932
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200933 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
934 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200935 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200936 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300937
Michal Kazior7962b0d2014-10-28 10:34:38 +0100938 reinit_completion(&ar->vdev_setup_done);
939
Kalle Valo5e3dd152013-06-12 20:52:10 +0300940 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
941 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200942 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200943 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300944
945 ret = ath10k_vdev_setup_sync(ar);
946 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200947 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200948 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300949
Michal Kazior7aa7a722014-08-25 12:09:38 +0200950 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300951 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300952 return ret;
953}
954
Michal Kazior1bbc0972014-04-08 09:45:47 +0300955static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300956{
957 int bit, ret = 0;
958
959 lockdep_assert_held(&ar->conf_mutex);
960
Ben Greeara9aefb32014-08-12 11:02:19 +0300961 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200962 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300963 return -ENOMEM;
964 }
965
Ben Greear16c11172014-09-23 14:17:16 -0700966 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300967
Ben Greear16c11172014-09-23 14:17:16 -0700968 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300969
970 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
971 WMI_VDEV_TYPE_MONITOR,
972 0, ar->mac_addr);
973 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200974 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200975 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300976 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300977 }
978
Ben Greear16c11172014-09-23 14:17:16 -0700979 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200980 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300981 ar->monitor_vdev_id);
982
Kalle Valo5e3dd152013-06-12 20:52:10 +0300983 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300984}
985
Michal Kazior1bbc0972014-04-08 09:45:47 +0300986static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300987{
988 int ret = 0;
989
990 lockdep_assert_held(&ar->conf_mutex);
991
Kalle Valo5e3dd152013-06-12 20:52:10 +0300992 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
993 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200994 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200995 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300996 return ret;
997 }
998
Ben Greear16c11172014-09-23 14:17:16 -0700999 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001000
Michal Kazior7aa7a722014-08-25 12:09:38 +02001001 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001002 ar->monitor_vdev_id);
1003 return ret;
1004}
1005
Michal Kazior1bbc0972014-04-08 09:45:47 +03001006static int ath10k_monitor_start(struct ath10k *ar)
1007{
1008 int ret;
1009
1010 lockdep_assert_held(&ar->conf_mutex);
1011
Michal Kazior1bbc0972014-04-08 09:45:47 +03001012 ret = ath10k_monitor_vdev_create(ar);
1013 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001014 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001015 return ret;
1016 }
1017
1018 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1019 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001020 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001021 ath10k_monitor_vdev_delete(ar);
1022 return ret;
1023 }
1024
1025 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001026 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +03001027
1028 return 0;
1029}
1030
Michal Kazior19337472014-08-28 12:58:16 +02001031static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001032{
1033 int ret;
1034
1035 lockdep_assert_held(&ar->conf_mutex);
1036
Michal Kazior1bbc0972014-04-08 09:45:47 +03001037 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001038 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001039 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001040 return ret;
1041 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001042
1043 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001044 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001045 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001046 return ret;
1047 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001048
1049 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001050 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001051
1052 return 0;
1053}
1054
Michal Kazior500ff9f2015-03-31 10:26:21 +00001055static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1056{
1057 int num_ctx;
1058
1059 /* At least one chanctx is required to derive a channel to start
1060 * monitor vdev on.
1061 */
1062 num_ctx = ath10k_mac_num_chanctxs(ar);
1063 if (num_ctx == 0)
1064 return false;
1065
1066 /* If there's already an existing special monitor interface then don't
1067 * bother creating another monitor vdev.
1068 */
1069 if (ar->monitor_arvif)
1070 return false;
1071
1072 return ar->monitor ||
Bob Copeland0d031c82015-09-09 12:47:34 -04001073 ar->filter_flags & FIF_OTHER_BSS ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001074 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1075}
1076
1077static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1078{
1079 int num_ctx;
1080
1081 num_ctx = ath10k_mac_num_chanctxs(ar);
1082
1083 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1084 * shouldn't allow this but make sure to prevent handling the following
1085 * case anyway since multi-channel DFS hasn't been tested at all.
1086 */
1087 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1088 return false;
1089
1090 return true;
1091}
1092
Michal Kazior19337472014-08-28 12:58:16 +02001093static int ath10k_monitor_recalc(struct ath10k *ar)
1094{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001095 bool needed;
1096 bool allowed;
1097 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001098
1099 lockdep_assert_held(&ar->conf_mutex);
1100
Michal Kazior500ff9f2015-03-31 10:26:21 +00001101 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1102 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001103
1104 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001105 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1106 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001107
Michal Kazior500ff9f2015-03-31 10:26:21 +00001108 if (WARN_ON(needed && !allowed)) {
1109 if (ar->monitor_started) {
1110 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1111
1112 ret = ath10k_monitor_stop(ar);
1113 if (ret)
1114 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", ret);
1115 /* 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 Kazior46725b152015-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;
2087 int i, n, max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002088 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002089
Michal Kazior548db542013-07-05 16:15:15 +03002090 lockdep_assert_held(&ar->conf_mutex);
2091
Michal Kazior45c9abc2015-04-21 20:42:58 +03002092 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2093 return;
2094
Kalle Valo5e3dd152013-06-12 20:52:10 +03002095 if (!ht_cap->ht_supported)
2096 return;
2097
Michal Kazior45c9abc2015-04-21 20:42:58 +03002098 band = def.chan->band;
2099 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2100 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2101
2102 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2103 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2104 return;
2105
Kalle Valo5e3dd152013-06-12 20:52:10 +03002106 arg->peer_flags |= WMI_PEER_HT;
2107 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2108 ht_cap->ampdu_factor)) - 1;
2109
2110 arg->peer_mpdu_density =
2111 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2112
2113 arg->peer_ht_caps = ht_cap->cap;
2114 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2115
2116 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2117 arg->peer_flags |= WMI_PEER_LDPC;
2118
2119 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2120 arg->peer_flags |= WMI_PEER_40MHZ;
2121 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2122 }
2123
Michal Kazior45c9abc2015-04-21 20:42:58 +03002124 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2125 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2126 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002127
Michal Kazior45c9abc2015-04-21 20:42:58 +03002128 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2129 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2130 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002131
2132 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2133 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2134 arg->peer_flags |= WMI_PEER_STBC;
2135 }
2136
2137 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002138 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2139 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2140 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2141 arg->peer_rate_caps |= stbc;
2142 arg->peer_flags |= WMI_PEER_STBC;
2143 }
2144
Kalle Valo5e3dd152013-06-12 20:52:10 +03002145 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2146 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2147 else if (ht_cap->mcs.rx_mask[1])
2148 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2149
Michal Kazior45c9abc2015-04-21 20:42:58 +03002150 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2151 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2152 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2153 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002154 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002155 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002156
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002157 /*
2158 * This is a workaround for HT-enabled STAs which break the spec
2159 * and have no HT capabilities RX mask (no HT RX MCS map).
2160 *
2161 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2162 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2163 *
2164 * Firmware asserts if such situation occurs.
2165 */
2166 if (n == 0) {
2167 arg->peer_ht_rates.num_rates = 8;
2168 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2169 arg->peer_ht_rates.rates[i] = i;
2170 } else {
2171 arg->peer_ht_rates.num_rates = n;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002172 arg->peer_num_spatial_streams = max_nss;
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002173 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002174
Michal Kazior7aa7a722014-08-25 12:09:38 +02002175 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002176 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002177 arg->peer_ht_rates.num_rates,
2178 arg->peer_num_spatial_streams);
2179}
2180
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002181static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2182 struct ath10k_vif *arvif,
2183 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002184{
2185 u32 uapsd = 0;
2186 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002187 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002188
Michal Kazior548db542013-07-05 16:15:15 +03002189 lockdep_assert_held(&ar->conf_mutex);
2190
Kalle Valo5e3dd152013-06-12 20:52:10 +03002191 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002192 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002193 sta->uapsd_queues, sta->max_sp);
2194
Kalle Valo5e3dd152013-06-12 20:52:10 +03002195 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2196 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2197 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2198 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2199 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2200 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2201 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2202 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2203 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2204 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2205 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2206 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2207
Kalle Valo5e3dd152013-06-12 20:52:10 +03002208 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2209 max_sp = sta->max_sp;
2210
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002211 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2212 sta->addr,
2213 WMI_AP_PS_PEER_PARAM_UAPSD,
2214 uapsd);
2215 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002216 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002217 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002218 return ret;
2219 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002220
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002221 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2222 sta->addr,
2223 WMI_AP_PS_PEER_PARAM_MAX_SP,
2224 max_sp);
2225 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002226 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002227 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002228 return ret;
2229 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002230
2231 /* TODO setup this based on STA listen interval and
2232 beacon interval. Currently we don't know
2233 sta->listen_interval - mac80211 patch required.
2234 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002235 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002236 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2237 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002238 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002239 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002240 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002241 return ret;
2242 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002243 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002244
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002245 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002246}
2247
Michal Kazior45c9abc2015-04-21 20:42:58 +03002248static u16
2249ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2250 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2251{
2252 int idx_limit;
2253 int nss;
2254 u16 mcs_map;
2255 u16 mcs;
2256
2257 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2258 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2259 vht_mcs_limit[nss];
2260
2261 if (mcs_map)
2262 idx_limit = fls(mcs_map) - 1;
2263 else
2264 idx_limit = -1;
2265
2266 switch (idx_limit) {
2267 case 0: /* fall through */
2268 case 1: /* fall through */
2269 case 2: /* fall through */
2270 case 3: /* fall through */
2271 case 4: /* fall through */
2272 case 5: /* fall through */
2273 case 6: /* fall through */
2274 default:
2275 /* see ath10k_mac_can_set_bitrate_mask() */
2276 WARN_ON(1);
2277 /* fall through */
2278 case -1:
2279 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2280 break;
2281 case 7:
2282 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2283 break;
2284 case 8:
2285 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2286 break;
2287 case 9:
2288 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2289 break;
2290 }
2291
2292 tx_mcs_set &= ~(0x3 << (nss * 2));
2293 tx_mcs_set |= mcs << (nss * 2);
2294 }
2295
2296 return tx_mcs_set;
2297}
2298
Kalle Valo5e3dd152013-06-12 20:52:10 +03002299static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002300 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002301 struct ieee80211_sta *sta,
2302 struct wmi_peer_assoc_complete_arg *arg)
2303{
2304 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002305 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002306 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002307 enum ieee80211_band band;
2308 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002309 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002310
Michal Kazior500ff9f2015-03-31 10:26:21 +00002311 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2312 return;
2313
Kalle Valo5e3dd152013-06-12 20:52:10 +03002314 if (!vht_cap->vht_supported)
2315 return;
2316
Michal Kazior45c9abc2015-04-21 20:42:58 +03002317 band = def.chan->band;
2318 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2319
2320 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2321 return;
2322
Kalle Valo5e3dd152013-06-12 20:52:10 +03002323 arg->peer_flags |= WMI_PEER_VHT;
Yanbo Lid68bb122015-01-23 08:18:20 +08002324
Michal Kazior500ff9f2015-03-31 10:26:21 +00002325 if (def.chan->band == IEEE80211_BAND_2GHZ)
Yanbo Lid68bb122015-01-23 08:18:20 +08002326 arg->peer_flags |= WMI_PEER_VHT_2G;
2327
Kalle Valo5e3dd152013-06-12 20:52:10 +03002328 arg->peer_vht_caps = vht_cap->cap;
2329
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002330 ampdu_factor = (vht_cap->cap &
2331 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2332 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2333
2334 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2335 * zero in VHT IE. Using it would result in degraded throughput.
2336 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2337 * it if VHT max_mpdu is smaller. */
2338 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2339 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2340 ampdu_factor)) - 1);
2341
Kalle Valo5e3dd152013-06-12 20:52:10 +03002342 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2343 arg->peer_flags |= WMI_PEER_80MHZ;
2344
2345 arg->peer_vht_rates.rx_max_rate =
2346 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2347 arg->peer_vht_rates.rx_mcs_set =
2348 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2349 arg->peer_vht_rates.tx_max_rate =
2350 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002351 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2352 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002353
Michal Kazior7aa7a722014-08-25 12:09:38 +02002354 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002355 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002356}
2357
2358static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002359 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002360 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002361 struct wmi_peer_assoc_complete_arg *arg)
2362{
Michal Kazior590922a2014-10-21 10:10:29 +03002363 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2364
Kalle Valo5e3dd152013-06-12 20:52:10 +03002365 switch (arvif->vdev_type) {
2366 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002367 if (sta->wme)
2368 arg->peer_flags |= WMI_PEER_QOS;
2369
2370 if (sta->wme && sta->uapsd_queues) {
2371 arg->peer_flags |= WMI_PEER_APSD;
2372 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2373 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002374 break;
2375 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002376 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002377 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002378 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002379 case WMI_VDEV_TYPE_IBSS:
2380 if (sta->wme)
2381 arg->peer_flags |= WMI_PEER_QOS;
2382 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002383 default:
2384 break;
2385 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002386
2387 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2388 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002389}
2390
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002391static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002392{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002393 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2394 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002395}
2396
Kalle Valo5e3dd152013-06-12 20:52:10 +03002397static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002398 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002399 struct ieee80211_sta *sta,
2400 struct wmi_peer_assoc_complete_arg *arg)
2401{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002402 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002403 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002404 enum ieee80211_band band;
2405 const u8 *ht_mcs_mask;
2406 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002407 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2408
Michal Kazior500ff9f2015-03-31 10:26:21 +00002409 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2410 return;
2411
Michal Kazior45c9abc2015-04-21 20:42:58 +03002412 band = def.chan->band;
2413 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2414 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2415
2416 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002417 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002418 if (sta->vht_cap.vht_supported &&
2419 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002420 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2421 phymode = MODE_11AC_VHT40;
2422 else
2423 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002424 } else if (sta->ht_cap.ht_supported &&
2425 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002426 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2427 phymode = MODE_11NG_HT40;
2428 else
2429 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002430 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002431 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002432 } else {
2433 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002434 }
2435
2436 break;
2437 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002438 /*
2439 * Check VHT first.
2440 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002441 if (sta->vht_cap.vht_supported &&
2442 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002443 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2444 phymode = MODE_11AC_VHT80;
2445 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2446 phymode = MODE_11AC_VHT40;
2447 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2448 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002449 } else if (sta->ht_cap.ht_supported &&
2450 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2451 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002452 phymode = MODE_11NA_HT40;
2453 else
2454 phymode = MODE_11NA_HT20;
2455 } else {
2456 phymode = MODE_11A;
2457 }
2458
2459 break;
2460 default:
2461 break;
2462 }
2463
Michal Kazior7aa7a722014-08-25 12:09:38 +02002464 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002465 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002466
Kalle Valo5e3dd152013-06-12 20:52:10 +03002467 arg->peer_phymode = phymode;
2468 WARN_ON(phymode == MODE_UNKNOWN);
2469}
2470
Kalle Valob9ada652013-10-16 15:44:46 +03002471static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002472 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002473 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002474 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002475{
Michal Kazior548db542013-07-05 16:15:15 +03002476 lockdep_assert_held(&ar->conf_mutex);
2477
Kalle Valob9ada652013-10-16 15:44:46 +03002478 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002479
Michal Kazior590922a2014-10-21 10:10:29 +03002480 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2481 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002482 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002483 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002484 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002485 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2486 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002487
Kalle Valob9ada652013-10-16 15:44:46 +03002488 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002489}
2490
Michal Kazior90046f52014-02-14 14:45:51 +01002491static const u32 ath10k_smps_map[] = {
2492 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2493 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2494 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2495 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2496};
2497
2498static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2499 const u8 *addr,
2500 const struct ieee80211_sta_ht_cap *ht_cap)
2501{
2502 int smps;
2503
2504 if (!ht_cap->ht_supported)
2505 return 0;
2506
2507 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2508 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2509
2510 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2511 return -EINVAL;
2512
2513 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2514 WMI_PEER_SMPS_STATE,
2515 ath10k_smps_map[smps]);
2516}
2517
Michal Kazior139e1702015-02-15 16:50:42 +02002518static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2519 struct ieee80211_vif *vif,
2520 struct ieee80211_sta_vht_cap vht_cap)
2521{
2522 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2523 int ret;
2524 u32 param;
2525 u32 value;
2526
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302527 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2528 return 0;
2529
Michal Kazior139e1702015-02-15 16:50:42 +02002530 if (!(ar->vht_cap_info &
2531 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2532 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2533 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2534 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2535 return 0;
2536
2537 param = ar->wmi.vdev_param->txbf;
2538 value = 0;
2539
2540 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2541 return 0;
2542
2543 /* The following logic is correct. If a remote STA advertises support
2544 * for being a beamformer then we should enable us being a beamformee.
2545 */
2546
2547 if (ar->vht_cap_info &
2548 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2549 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2550 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2551 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2552
2553 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2554 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2555 }
2556
2557 if (ar->vht_cap_info &
2558 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2559 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2560 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2561 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2562
2563 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2564 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2565 }
2566
2567 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2568 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2569
2570 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2571 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2572
2573 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2574 if (ret) {
2575 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2576 value, ret);
2577 return ret;
2578 }
2579
2580 return 0;
2581}
2582
Kalle Valo5e3dd152013-06-12 20:52:10 +03002583/* can be called only in mac80211 callbacks due to `key_count` usage */
2584static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2585 struct ieee80211_vif *vif,
2586 struct ieee80211_bss_conf *bss_conf)
2587{
2588 struct ath10k *ar = hw->priv;
2589 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002590 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002591 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002592 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002593 struct ieee80211_sta *ap_sta;
2594 int ret;
2595
Michal Kazior548db542013-07-05 16:15:15 +03002596 lockdep_assert_held(&ar->conf_mutex);
2597
Michal Kazior077efc82014-10-21 10:10:29 +03002598 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2599 arvif->vdev_id, arvif->bssid, arvif->aid);
2600
Kalle Valo5e3dd152013-06-12 20:52:10 +03002601 rcu_read_lock();
2602
2603 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2604 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002605 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002606 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002607 rcu_read_unlock();
2608 return;
2609 }
2610
Michal Kazior90046f52014-02-14 14:45:51 +01002611 /* ap_sta must be accessed only within rcu section which must be left
2612 * before calling ath10k_setup_peer_smps() which might sleep. */
2613 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002614 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002615
Michal Kazior590922a2014-10-21 10:10:29 +03002616 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002617 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002618 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002619 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002620 rcu_read_unlock();
2621 return;
2622 }
2623
2624 rcu_read_unlock();
2625
Kalle Valob9ada652013-10-16 15:44:46 +03002626 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2627 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002628 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002629 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002630 return;
2631 }
2632
Michal Kazior90046f52014-02-14 14:45:51 +01002633 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2634 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002635 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002636 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002637 return;
2638 }
2639
Michal Kazior139e1702015-02-15 16:50:42 +02002640 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2641 if (ret) {
2642 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2643 arvif->vdev_id, bss_conf->bssid, ret);
2644 return;
2645 }
2646
Michal Kazior7aa7a722014-08-25 12:09:38 +02002647 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002648 "mac vdev %d up (associated) bssid %pM aid %d\n",
2649 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2650
Michal Kazior077efc82014-10-21 10:10:29 +03002651 WARN_ON(arvif->is_up);
2652
Michal Kaziorc930f742014-01-23 11:38:25 +01002653 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002654 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002655
2656 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2657 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002658 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002659 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002660 return;
2661 }
2662
2663 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002664
2665 /* Workaround: Some firmware revisions (tested with qca6174
2666 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2667 * poked with peer param command.
2668 */
2669 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2670 WMI_PEER_DUMMY_VAR, 1);
2671 if (ret) {
2672 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2673 arvif->bssid, arvif->vdev_id, ret);
2674 return;
2675 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002676}
2677
Kalle Valo5e3dd152013-06-12 20:52:10 +03002678static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2679 struct ieee80211_vif *vif)
2680{
2681 struct ath10k *ar = hw->priv;
2682 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002683 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002684 int ret;
2685
Michal Kazior548db542013-07-05 16:15:15 +03002686 lockdep_assert_held(&ar->conf_mutex);
2687
Michal Kazior077efc82014-10-21 10:10:29 +03002688 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2689 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002690
Kalle Valo5e3dd152013-06-12 20:52:10 +03002691 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002692 if (ret)
2693 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2694 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002695
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002696 arvif->def_wep_key_idx = -1;
2697
Michal Kazior139e1702015-02-15 16:50:42 +02002698 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2699 if (ret) {
2700 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2701 arvif->vdev_id, ret);
2702 return;
2703 }
2704
Michal Kaziorc930f742014-01-23 11:38:25 +01002705 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002706
2707 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002708}
2709
Michal Kazior590922a2014-10-21 10:10:29 +03002710static int ath10k_station_assoc(struct ath10k *ar,
2711 struct ieee80211_vif *vif,
2712 struct ieee80211_sta *sta,
2713 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002714{
Michal Kazior590922a2014-10-21 10:10:29 +03002715 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002716 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002717 int ret = 0;
2718
Michal Kazior548db542013-07-05 16:15:15 +03002719 lockdep_assert_held(&ar->conf_mutex);
2720
Michal Kazior590922a2014-10-21 10:10:29 +03002721 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002722 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002723 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002724 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002725 return ret;
2726 }
2727
2728 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2729 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002730 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002731 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002732 return ret;
2733 }
2734
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002735 /* Re-assoc is run only to update supported rates for given station. It
2736 * doesn't make much sense to reconfigure the peer completely.
2737 */
2738 if (!reassoc) {
2739 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2740 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002741 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002742 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002743 arvif->vdev_id, ret);
2744 return ret;
2745 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002746
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002747 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2748 if (ret) {
2749 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2750 sta->addr, arvif->vdev_id, ret);
2751 return ret;
2752 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002753
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002754 if (!sta->wme) {
2755 arvif->num_legacy_stations++;
2756 ret = ath10k_recalc_rtscts_prot(arvif);
2757 if (ret) {
2758 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2759 arvif->vdev_id, ret);
2760 return ret;
2761 }
2762 }
2763
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002764 /* Plumb cached keys only for static WEP */
2765 if (arvif->def_wep_key_idx != -1) {
2766 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2767 if (ret) {
2768 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2769 arvif->vdev_id, ret);
2770 return ret;
2771 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002772 }
2773 }
2774
Kalle Valo5e3dd152013-06-12 20:52:10 +03002775 return ret;
2776}
2777
Michal Kazior590922a2014-10-21 10:10:29 +03002778static int ath10k_station_disassoc(struct ath10k *ar,
2779 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002780 struct ieee80211_sta *sta)
2781{
Michal Kazior590922a2014-10-21 10:10:29 +03002782 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002783 int ret = 0;
2784
2785 lockdep_assert_held(&ar->conf_mutex);
2786
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002787 if (!sta->wme) {
2788 arvif->num_legacy_stations--;
2789 ret = ath10k_recalc_rtscts_prot(arvif);
2790 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002791 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002792 arvif->vdev_id, ret);
2793 return ret;
2794 }
2795 }
2796
Kalle Valo5e3dd152013-06-12 20:52:10 +03002797 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2798 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002799 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002800 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002801 return ret;
2802 }
2803
2804 return ret;
2805}
2806
2807/**************/
2808/* Regulatory */
2809/**************/
2810
2811static int ath10k_update_channel_list(struct ath10k *ar)
2812{
2813 struct ieee80211_hw *hw = ar->hw;
2814 struct ieee80211_supported_band **bands;
2815 enum ieee80211_band band;
2816 struct ieee80211_channel *channel;
2817 struct wmi_scan_chan_list_arg arg = {0};
2818 struct wmi_channel_arg *ch;
2819 bool passive;
2820 int len;
2821 int ret;
2822 int i;
2823
Michal Kazior548db542013-07-05 16:15:15 +03002824 lockdep_assert_held(&ar->conf_mutex);
2825
Kalle Valo5e3dd152013-06-12 20:52:10 +03002826 bands = hw->wiphy->bands;
2827 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2828 if (!bands[band])
2829 continue;
2830
2831 for (i = 0; i < bands[band]->n_channels; i++) {
2832 if (bands[band]->channels[i].flags &
2833 IEEE80211_CHAN_DISABLED)
2834 continue;
2835
2836 arg.n_channels++;
2837 }
2838 }
2839
2840 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2841 arg.channels = kzalloc(len, GFP_KERNEL);
2842 if (!arg.channels)
2843 return -ENOMEM;
2844
2845 ch = arg.channels;
2846 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2847 if (!bands[band])
2848 continue;
2849
2850 for (i = 0; i < bands[band]->n_channels; i++) {
2851 channel = &bands[band]->channels[i];
2852
2853 if (channel->flags & IEEE80211_CHAN_DISABLED)
2854 continue;
2855
2856 ch->allow_ht = true;
2857
2858 /* FIXME: when should we really allow VHT? */
2859 ch->allow_vht = true;
2860
2861 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002862 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002863
2864 ch->ht40plus =
2865 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2866
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002867 ch->chan_radar =
2868 !!(channel->flags & IEEE80211_CHAN_RADAR);
2869
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002870 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002871 ch->passive = passive;
2872
2873 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002874 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002875 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002876 ch->max_power = channel->max_power * 2;
2877 ch->max_reg_power = channel->max_reg_power * 2;
2878 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002879 ch->reg_class_id = 0; /* FIXME */
2880
2881 /* FIXME: why use only legacy modes, why not any
2882 * HT/VHT modes? Would that even make any
2883 * difference? */
2884 if (channel->band == IEEE80211_BAND_2GHZ)
2885 ch->mode = MODE_11G;
2886 else
2887 ch->mode = MODE_11A;
2888
2889 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2890 continue;
2891
Michal Kazior7aa7a722014-08-25 12:09:38 +02002892 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002893 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2894 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002895 ch->freq, ch->max_power, ch->max_reg_power,
2896 ch->max_antenna_gain, ch->mode);
2897
2898 ch++;
2899 }
2900 }
2901
2902 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2903 kfree(arg.channels);
2904
2905 return ret;
2906}
2907
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002908static enum wmi_dfs_region
2909ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2910{
2911 switch (dfs_region) {
2912 case NL80211_DFS_UNSET:
2913 return WMI_UNINIT_DFS_DOMAIN;
2914 case NL80211_DFS_FCC:
2915 return WMI_FCC_DFS_DOMAIN;
2916 case NL80211_DFS_ETSI:
2917 return WMI_ETSI_DFS_DOMAIN;
2918 case NL80211_DFS_JP:
2919 return WMI_MKK4_DFS_DOMAIN;
2920 }
2921 return WMI_UNINIT_DFS_DOMAIN;
2922}
2923
Michal Kaziorf7843d72013-07-16 09:38:52 +02002924static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002925{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002926 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002927 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002928 enum wmi_dfs_region wmi_dfs_reg;
2929 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002930
Michal Kaziorf7843d72013-07-16 09:38:52 +02002931 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002932
2933 ret = ath10k_update_channel_list(ar);
2934 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002935 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002936
2937 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002938
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002939 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2940 nl_dfs_reg = ar->dfs_detector->region;
2941 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2942 } else {
2943 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2944 }
2945
Kalle Valo5e3dd152013-06-12 20:52:10 +03002946 /* Target allows setting up per-band regdomain but ath_common provides
2947 * a combined one only */
2948 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002949 regpair->reg_domain,
2950 regpair->reg_domain, /* 2ghz */
2951 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002952 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002953 regpair->reg_5ghz_ctl,
2954 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002955 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002956 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002957}
Michal Kazior548db542013-07-05 16:15:15 +03002958
Michal Kaziorf7843d72013-07-16 09:38:52 +02002959static void ath10k_reg_notifier(struct wiphy *wiphy,
2960 struct regulatory_request *request)
2961{
2962 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2963 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002964 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002965
2966 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2967
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002968 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002969 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002970 request->dfs_region);
2971 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2972 request->dfs_region);
2973 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002974 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002975 request->dfs_region);
2976 }
2977
Michal Kaziorf7843d72013-07-16 09:38:52 +02002978 mutex_lock(&ar->conf_mutex);
2979 if (ar->state == ATH10K_STATE_ON)
2980 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002981 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002982}
2983
2984/***************/
2985/* TX handlers */
2986/***************/
2987
Michal Kazior96d828d2015-03-31 10:26:23 +00002988void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2989{
2990 lockdep_assert_held(&ar->htt.tx_lock);
2991
2992 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2993 ar->tx_paused |= BIT(reason);
2994 ieee80211_stop_queues(ar->hw);
2995}
2996
2997static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2998 struct ieee80211_vif *vif)
2999{
3000 struct ath10k *ar = data;
3001 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3002
3003 if (arvif->tx_paused)
3004 return;
3005
3006 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3007}
3008
3009void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3010{
3011 lockdep_assert_held(&ar->htt.tx_lock);
3012
3013 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3014 ar->tx_paused &= ~BIT(reason);
3015
3016 if (ar->tx_paused)
3017 return;
3018
3019 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3020 IEEE80211_IFACE_ITER_RESUME_ALL,
3021 ath10k_mac_tx_unlock_iter,
3022 ar);
Michal Kazior3a73d1a2015-08-06 14:46:54 +02003023
3024 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
Michal Kazior96d828d2015-03-31 10:26:23 +00003025}
3026
3027void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3028{
3029 struct ath10k *ar = arvif->ar;
3030
3031 lockdep_assert_held(&ar->htt.tx_lock);
3032
3033 WARN_ON(reason >= BITS_PER_LONG);
3034 arvif->tx_paused |= BIT(reason);
3035 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3036}
3037
3038void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3039{
3040 struct ath10k *ar = arvif->ar;
3041
3042 lockdep_assert_held(&ar->htt.tx_lock);
3043
3044 WARN_ON(reason >= BITS_PER_LONG);
3045 arvif->tx_paused &= ~BIT(reason);
3046
3047 if (ar->tx_paused)
3048 return;
3049
3050 if (arvif->tx_paused)
3051 return;
3052
3053 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3054}
3055
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003056static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3057 enum wmi_tlv_tx_pause_id pause_id,
3058 enum wmi_tlv_tx_pause_action action)
3059{
3060 struct ath10k *ar = arvif->ar;
3061
3062 lockdep_assert_held(&ar->htt.tx_lock);
3063
Michal Kazioracd0b272015-07-09 13:08:38 +02003064 switch (action) {
3065 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3066 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003067 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003068 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3069 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3070 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003071 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003072 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3073 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003074 break;
3075 }
3076}
3077
3078struct ath10k_mac_tx_pause {
3079 u32 vdev_id;
3080 enum wmi_tlv_tx_pause_id pause_id;
3081 enum wmi_tlv_tx_pause_action action;
3082};
3083
3084static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3085 struct ieee80211_vif *vif)
3086{
3087 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3088 struct ath10k_mac_tx_pause *arg = data;
3089
Michal Kazioracd0b272015-07-09 13:08:38 +02003090 if (arvif->vdev_id != arg->vdev_id)
3091 return;
3092
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003093 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3094}
3095
Michal Kazioracd0b272015-07-09 13:08:38 +02003096void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3097 enum wmi_tlv_tx_pause_id pause_id,
3098 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003099{
3100 struct ath10k_mac_tx_pause arg = {
3101 .vdev_id = vdev_id,
3102 .pause_id = pause_id,
3103 .action = action,
3104 };
3105
3106 spin_lock_bh(&ar->htt.tx_lock);
3107 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3108 IEEE80211_IFACE_ITER_RESUME_ALL,
3109 ath10k_mac_handle_tx_pause_iter,
3110 &arg);
3111 spin_unlock_bh(&ar->htt.tx_lock);
3112}
3113
Michal Kazior42c3aa62013-10-02 11:03:38 +02003114static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3115{
3116 if (ieee80211_is_mgmt(hdr->frame_control))
3117 return HTT_DATA_TX_EXT_TID_MGMT;
3118
3119 if (!ieee80211_is_data_qos(hdr->frame_control))
3120 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3121
3122 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3123 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3124
3125 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3126}
3127
Michal Kazior2b37c292014-09-02 11:00:22 +03003128static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003129{
Michal Kazior2b37c292014-09-02 11:00:22 +03003130 if (vif)
3131 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003132
Michal Kazior1bbc0972014-04-08 09:45:47 +03003133 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003134 return ar->monitor_vdev_id;
3135
Michal Kazior7aa7a722014-08-25 12:09:38 +02003136 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003137 return 0;
3138}
3139
Michal Kaziord740d8f2015-03-30 09:51:51 +03003140static enum ath10k_hw_txrx_mode
3141ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003142 struct ieee80211_sta *sta, struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003143{
3144 const struct ieee80211_hdr *hdr = (void *)skb->data;
3145 __le16 fc = hdr->frame_control;
3146
3147 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3148 return ATH10K_HW_TXRX_RAW;
3149
3150 if (ieee80211_is_mgmt(fc))
3151 return ATH10K_HW_TXRX_MGMT;
3152
3153 /* Workaround:
3154 *
3155 * NullFunc frames are mostly used to ping if a client or AP are still
3156 * reachable and responsive. This implies tx status reports must be
3157 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3158 * come to a conclusion that the other end disappeared and tear down
3159 * BSS connection or it can never disconnect from BSS/client (which is
3160 * the case).
3161 *
3162 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3163 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3164 * which seems to deliver correct tx reports for NullFunc frames. The
3165 * downside of using it is it ignores client powersave state so it can
3166 * end up disconnecting sleeping clients in AP mode. It should fix STA
3167 * mode though because AP don't sleep.
3168 */
3169 if (ar->htt.target_version_major < 3 &&
3170 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3171 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3172 return ATH10K_HW_TXRX_MGMT;
3173
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003174 /* Workaround:
3175 *
3176 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3177 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3178 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003179 *
3180 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003181 */
3182 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3183 return ATH10K_HW_TXRX_ETHERNET;
3184
David Liuccec9032015-07-24 20:25:32 +03003185 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3186 return ATH10K_HW_TXRX_RAW;
3187
Michal Kaziord740d8f2015-03-30 09:51:51 +03003188 return ATH10K_HW_TXRX_NATIVE_WIFI;
3189}
3190
David Liuccec9032015-07-24 20:25:32 +03003191static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3192 struct sk_buff *skb) {
3193 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3194 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3195 IEEE80211_TX_CTL_INJECTED;
3196 if ((info->flags & mask) == mask)
3197 return false;
3198 if (vif)
3199 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3200 return true;
3201}
3202
Michal Kazior4b604552014-07-21 21:03:09 +03003203/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3204 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003205 */
Michal Kazior4b604552014-07-21 21:03:09 +03003206static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003207{
3208 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003209 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003210 u8 *qos_ctl;
3211
3212 if (!ieee80211_is_data_qos(hdr->frame_control))
3213 return;
3214
3215 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003216 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3217 skb->data, (void *)qos_ctl - (void *)skb->data);
3218 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003219
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003220 /* Some firmware revisions don't handle sending QoS NullFunc well.
3221 * These frames are mainly used for CQM purposes so it doesn't really
3222 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003223 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003224 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003225 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003226 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003227
3228 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003229}
3230
Michal Kaziord740d8f2015-03-30 09:51:51 +03003231static void ath10k_tx_h_8023(struct sk_buff *skb)
3232{
3233 struct ieee80211_hdr *hdr;
3234 struct rfc1042_hdr *rfc1042;
3235 struct ethhdr *eth;
3236 size_t hdrlen;
3237 u8 da[ETH_ALEN];
3238 u8 sa[ETH_ALEN];
3239 __be16 type;
3240
3241 hdr = (void *)skb->data;
3242 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3243 rfc1042 = (void *)skb->data + hdrlen;
3244
3245 ether_addr_copy(da, ieee80211_get_DA(hdr));
3246 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3247 type = rfc1042->snap_type;
3248
3249 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3250 skb_push(skb, sizeof(*eth));
3251
3252 eth = (void *)skb->data;
3253 ether_addr_copy(eth->h_dest, da);
3254 ether_addr_copy(eth->h_source, sa);
3255 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003256}
3257
Michal Kazior4b604552014-07-21 21:03:09 +03003258static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3259 struct ieee80211_vif *vif,
3260 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003261{
3262 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003263 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3264
3265 /* This is case only for P2P_GO */
3266 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3267 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3268 return;
3269
3270 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3271 spin_lock_bh(&ar->data_lock);
3272 if (arvif->u.ap.noa_data)
3273 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3274 GFP_ATOMIC))
3275 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3276 arvif->u.ap.noa_data,
3277 arvif->u.ap.noa_len);
3278 spin_unlock_bh(&ar->data_lock);
3279 }
3280}
3281
Michal Kazior8d6d3622014-11-24 14:58:31 +01003282static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3283{
3284 /* FIXME: Not really sure since when the behaviour changed. At some
3285 * point new firmware stopped requiring creation of peer entries for
3286 * offchannel tx (and actually creating them causes issues with wmi-htc
3287 * tx credit replenishment and reliability). Assuming it's at least 3.4
3288 * because that's when the `freq` was introduced to TX_FRM HTT command.
3289 */
3290 return !(ar->htt.target_version_major >= 3 &&
3291 ar->htt.target_version_minor >= 4);
3292}
3293
Michal Kaziord740d8f2015-03-30 09:51:51 +03003294static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003295{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003296 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003297 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003298
Michal Kaziord740d8f2015-03-30 09:51:51 +03003299 spin_lock_bh(&ar->data_lock);
3300
3301 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3302 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3303 ret = -ENOSPC;
3304 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003305 }
3306
Michal Kaziord740d8f2015-03-30 09:51:51 +03003307 __skb_queue_tail(q, skb);
3308 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3309
3310unlock:
3311 spin_unlock_bh(&ar->data_lock);
3312
3313 return ret;
3314}
3315
3316static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3317{
3318 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3319 struct ath10k_htt *htt = &ar->htt;
3320 int ret = 0;
3321
3322 switch (cb->txmode) {
3323 case ATH10K_HW_TXRX_RAW:
3324 case ATH10K_HW_TXRX_NATIVE_WIFI:
3325 case ATH10K_HW_TXRX_ETHERNET:
3326 ret = ath10k_htt_tx(htt, skb);
3327 break;
3328 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003329 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003330 ar->fw_features))
3331 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3332 else if (ar->htt.target_version_major >= 3)
3333 ret = ath10k_htt_tx(htt, skb);
3334 else
3335 ret = ath10k_htt_mgmt_tx(htt, skb);
3336 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003337 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003338
3339 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003340 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3341 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003342 ieee80211_free_txskb(ar->hw, skb);
3343 }
3344}
3345
3346void ath10k_offchan_tx_purge(struct ath10k *ar)
3347{
3348 struct sk_buff *skb;
3349
3350 for (;;) {
3351 skb = skb_dequeue(&ar->offchan_tx_queue);
3352 if (!skb)
3353 break;
3354
3355 ieee80211_free_txskb(ar->hw, skb);
3356 }
3357}
3358
3359void ath10k_offchan_tx_work(struct work_struct *work)
3360{
3361 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3362 struct ath10k_peer *peer;
3363 struct ieee80211_hdr *hdr;
3364 struct sk_buff *skb;
3365 const u8 *peer_addr;
3366 int vdev_id;
3367 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003368 unsigned long time_left;
Michal Kazioradaeed72015-08-05 12:15:23 +02003369 bool tmp_peer_created = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003370
3371 /* FW requirement: We must create a peer before FW will send out
3372 * an offchannel frame. Otherwise the frame will be stuck and
3373 * never transmitted. We delete the peer upon tx completion.
3374 * It is unlikely that a peer for offchannel tx will already be
3375 * present. However it may be in some rare cases so account for that.
3376 * Otherwise we might remove a legitimate peer and break stuff. */
3377
3378 for (;;) {
3379 skb = skb_dequeue(&ar->offchan_tx_queue);
3380 if (!skb)
3381 break;
3382
3383 mutex_lock(&ar->conf_mutex);
3384
Michal Kazior7aa7a722014-08-25 12:09:38 +02003385 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003386 skb);
3387
3388 hdr = (struct ieee80211_hdr *)skb->data;
3389 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003390 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003391
3392 spin_lock_bh(&ar->data_lock);
3393 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3394 spin_unlock_bh(&ar->data_lock);
3395
3396 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003397 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003398 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003399 peer_addr, vdev_id);
3400
3401 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003402 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3403 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003404 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003405 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003406 peer_addr, vdev_id, ret);
Michal Kazioradaeed72015-08-05 12:15:23 +02003407 tmp_peer_created = (ret == 0);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003408 }
3409
3410 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003411 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003412 ar->offchan_tx_skb = skb;
3413 spin_unlock_bh(&ar->data_lock);
3414
Michal Kaziord740d8f2015-03-30 09:51:51 +03003415 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003416
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003417 time_left =
3418 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3419 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003420 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003421 skb);
3422
Michal Kazioradaeed72015-08-05 12:15:23 +02003423 if (!peer && tmp_peer_created) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003424 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3425 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003426 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003427 peer_addr, vdev_id, ret);
3428 }
3429
3430 mutex_unlock(&ar->conf_mutex);
3431 }
3432}
3433
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003434void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3435{
3436 struct sk_buff *skb;
3437
3438 for (;;) {
3439 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3440 if (!skb)
3441 break;
3442
3443 ieee80211_free_txskb(ar->hw, skb);
3444 }
3445}
3446
3447void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3448{
3449 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3450 struct sk_buff *skb;
3451 int ret;
3452
3453 for (;;) {
3454 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3455 if (!skb)
3456 break;
3457
3458 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003459 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003460 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003461 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003462 ieee80211_free_txskb(ar->hw, skb);
3463 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003464 }
3465}
3466
Kalle Valo5e3dd152013-06-12 20:52:10 +03003467/************/
3468/* Scanning */
3469/************/
3470
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003471void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003472{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003473 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003474
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003475 switch (ar->scan.state) {
3476 case ATH10K_SCAN_IDLE:
3477 break;
3478 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003479 case ATH10K_SCAN_ABORTING:
3480 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003481 ieee80211_scan_completed(ar->hw,
3482 (ar->scan.state ==
3483 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003484 else if (ar->scan.roc_notify)
3485 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003486 /* fall through */
3487 case ATH10K_SCAN_STARTING:
3488 ar->scan.state = ATH10K_SCAN_IDLE;
3489 ar->scan_channel = NULL;
3490 ath10k_offchan_tx_purge(ar);
3491 cancel_delayed_work(&ar->scan.timeout);
3492 complete_all(&ar->scan.completed);
3493 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003494 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003495}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003496
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003497void ath10k_scan_finish(struct ath10k *ar)
3498{
3499 spin_lock_bh(&ar->data_lock);
3500 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003501 spin_unlock_bh(&ar->data_lock);
3502}
3503
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003504static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003505{
3506 struct wmi_stop_scan_arg arg = {
3507 .req_id = 1, /* FIXME */
3508 .req_type = WMI_SCAN_STOP_ONE,
3509 .u.scan_id = ATH10K_SCAN_ID,
3510 };
3511 int ret;
3512
3513 lockdep_assert_held(&ar->conf_mutex);
3514
Kalle Valo5e3dd152013-06-12 20:52:10 +03003515 ret = ath10k_wmi_stop_scan(ar, &arg);
3516 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003517 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003518 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003519 }
3520
Kalle Valo5e3dd152013-06-12 20:52:10 +03003521 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003522 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003523 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003524 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003525 } else if (ret > 0) {
3526 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003527 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003528
3529out:
3530 /* Scan state should be updated upon scan completion but in case
3531 * firmware fails to deliver the event (for whatever reason) it is
3532 * desired to clean up scan state anyway. Firmware may have just
3533 * dropped the scan completion event delivery due to transport pipe
3534 * being overflown with data and/or it can recover on its own before
3535 * next scan request is submitted.
3536 */
3537 spin_lock_bh(&ar->data_lock);
3538 if (ar->scan.state != ATH10K_SCAN_IDLE)
3539 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003540 spin_unlock_bh(&ar->data_lock);
3541
3542 return ret;
3543}
3544
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003545static void ath10k_scan_abort(struct ath10k *ar)
3546{
3547 int ret;
3548
3549 lockdep_assert_held(&ar->conf_mutex);
3550
3551 spin_lock_bh(&ar->data_lock);
3552
3553 switch (ar->scan.state) {
3554 case ATH10K_SCAN_IDLE:
3555 /* This can happen if timeout worker kicked in and called
3556 * abortion while scan completion was being processed.
3557 */
3558 break;
3559 case ATH10K_SCAN_STARTING:
3560 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003561 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003562 ath10k_scan_state_str(ar->scan.state),
3563 ar->scan.state);
3564 break;
3565 case ATH10K_SCAN_RUNNING:
3566 ar->scan.state = ATH10K_SCAN_ABORTING;
3567 spin_unlock_bh(&ar->data_lock);
3568
3569 ret = ath10k_scan_stop(ar);
3570 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003571 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003572
3573 spin_lock_bh(&ar->data_lock);
3574 break;
3575 }
3576
3577 spin_unlock_bh(&ar->data_lock);
3578}
3579
3580void ath10k_scan_timeout_work(struct work_struct *work)
3581{
3582 struct ath10k *ar = container_of(work, struct ath10k,
3583 scan.timeout.work);
3584
3585 mutex_lock(&ar->conf_mutex);
3586 ath10k_scan_abort(ar);
3587 mutex_unlock(&ar->conf_mutex);
3588}
3589
Kalle Valo5e3dd152013-06-12 20:52:10 +03003590static int ath10k_start_scan(struct ath10k *ar,
3591 const struct wmi_start_scan_arg *arg)
3592{
3593 int ret;
3594
3595 lockdep_assert_held(&ar->conf_mutex);
3596
3597 ret = ath10k_wmi_start_scan(ar, arg);
3598 if (ret)
3599 return ret;
3600
Kalle Valo5e3dd152013-06-12 20:52:10 +03003601 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3602 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003603 ret = ath10k_scan_stop(ar);
3604 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003605 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003606
3607 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003608 }
3609
Ben Greear2f9eec02015-02-15 16:50:38 +02003610 /* If we failed to start the scan, return error code at
3611 * this point. This is probably due to some issue in the
3612 * firmware, but no need to wedge the driver due to that...
3613 */
3614 spin_lock_bh(&ar->data_lock);
3615 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3616 spin_unlock_bh(&ar->data_lock);
3617 return -EINVAL;
3618 }
3619 spin_unlock_bh(&ar->data_lock);
3620
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003621 /* Add a 200ms margin to account for event/command processing */
3622 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3623 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03003624 return 0;
3625}
3626
3627/**********************/
3628/* mac80211 callbacks */
3629/**********************/
3630
3631static void ath10k_tx(struct ieee80211_hw *hw,
3632 struct ieee80211_tx_control *control,
3633 struct sk_buff *skb)
3634{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003635 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003636 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3637 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003638 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003639 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kaziord740d8f2015-03-30 09:51:51 +03003640 __le16 fc = hdr->frame_control;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003641
3642 /* We should disable CCK RATE due to P2P */
3643 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003644 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003645
Michal Kazior4b604552014-07-21 21:03:09 +03003646 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003647 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003648 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
David Liuccec9032015-07-24 20:25:32 +03003649 ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
Michal Kazior2b37c292014-09-02 11:00:22 +03003650 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003651 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003652 ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003653
Michal Kaziord740d8f2015-03-30 09:51:51 +03003654 switch (ATH10K_SKB_CB(skb)->txmode) {
3655 case ATH10K_HW_TXRX_MGMT:
3656 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003657 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003658 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3659 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003660 break;
3661 case ATH10K_HW_TXRX_ETHERNET:
3662 ath10k_tx_h_8023(skb);
3663 break;
3664 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003665 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3666 WARN_ON_ONCE(1);
3667 ieee80211_free_txskb(hw, skb);
3668 return;
3669 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003670 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003671
Kalle Valo5e3dd152013-06-12 20:52:10 +03003672 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3673 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003674 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003675 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003676 spin_unlock_bh(&ar->data_lock);
3677
Michal Kazior8d6d3622014-11-24 14:58:31 +01003678 if (ath10k_mac_need_offchan_tx_work(ar)) {
3679 ATH10K_SKB_CB(skb)->htt.freq = 0;
3680 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003681
Michal Kazior8d6d3622014-11-24 14:58:31 +01003682 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3683 skb);
3684
3685 skb_queue_tail(&ar->offchan_tx_queue, skb);
3686 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3687 return;
3688 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003689 }
3690
Michal Kaziord740d8f2015-03-30 09:51:51 +03003691 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003692}
3693
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003694/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003695void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003696{
3697 /* make sure rcu-protected mac80211 tx path itself is drained */
3698 synchronize_net();
3699
3700 ath10k_offchan_tx_purge(ar);
3701 ath10k_mgmt_over_wmi_tx_purge(ar);
3702
3703 cancel_work_sync(&ar->offchan_tx_work);
3704 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3705}
3706
Michal Kazioraffd3212013-07-16 09:54:35 +02003707void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003708{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003709 struct ath10k_vif *arvif;
3710
Michal Kazior818bdd12013-07-16 09:38:57 +02003711 lockdep_assert_held(&ar->conf_mutex);
3712
Michal Kazior19337472014-08-28 12:58:16 +02003713 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3714 ar->filter_flags = 0;
3715 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003716 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003717
3718 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003719 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003720
3721 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003722 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003723
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003724 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003725 ath10k_peer_cleanup_all(ar);
3726 ath10k_core_stop(ar);
3727 ath10k_hif_power_down(ar);
3728
3729 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003730 list_for_each_entry(arvif, &ar->arvifs, list)
3731 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003732 spin_unlock_bh(&ar->data_lock);
3733}
3734
Ben Greear46acf7b2014-05-16 17:15:38 +03003735static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3736{
3737 struct ath10k *ar = hw->priv;
3738
3739 mutex_lock(&ar->conf_mutex);
3740
3741 if (ar->cfg_tx_chainmask) {
3742 *tx_ant = ar->cfg_tx_chainmask;
3743 *rx_ant = ar->cfg_rx_chainmask;
3744 } else {
3745 *tx_ant = ar->supp_tx_chainmask;
3746 *rx_ant = ar->supp_rx_chainmask;
3747 }
3748
3749 mutex_unlock(&ar->conf_mutex);
3750
3751 return 0;
3752}
3753
Ben Greear5572a952014-11-24 16:22:10 +02003754static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3755{
3756 /* It is not clear that allowing gaps in chainmask
3757 * is helpful. Probably it will not do what user
3758 * is hoping for, so warn in that case.
3759 */
3760 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3761 return;
3762
3763 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3764 dbg, cm);
3765}
3766
Ben Greear46acf7b2014-05-16 17:15:38 +03003767static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3768{
3769 int ret;
3770
3771 lockdep_assert_held(&ar->conf_mutex);
3772
Ben Greear5572a952014-11-24 16:22:10 +02003773 ath10k_check_chain_mask(ar, tx_ant, "tx");
3774 ath10k_check_chain_mask(ar, rx_ant, "rx");
3775
Ben Greear46acf7b2014-05-16 17:15:38 +03003776 ar->cfg_tx_chainmask = tx_ant;
3777 ar->cfg_rx_chainmask = rx_ant;
3778
3779 if ((ar->state != ATH10K_STATE_ON) &&
3780 (ar->state != ATH10K_STATE_RESTARTED))
3781 return 0;
3782
3783 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3784 tx_ant);
3785 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003786 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003787 ret, tx_ant);
3788 return ret;
3789 }
3790
3791 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3792 rx_ant);
3793 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003794 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003795 ret, rx_ant);
3796 return ret;
3797 }
3798
3799 return 0;
3800}
3801
3802static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3803{
3804 struct ath10k *ar = hw->priv;
3805 int ret;
3806
3807 mutex_lock(&ar->conf_mutex);
3808 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3809 mutex_unlock(&ar->conf_mutex);
3810 return ret;
3811}
3812
Kalle Valo5e3dd152013-06-12 20:52:10 +03003813static int ath10k_start(struct ieee80211_hw *hw)
3814{
3815 struct ath10k *ar = hw->priv;
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003816 u32 burst_enable;
Michal Kazior818bdd12013-07-16 09:38:57 +02003817 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003818
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003819 /*
3820 * This makes sense only when restarting hw. It is harmless to call
3821 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3822 * commands will be submitted while restarting.
3823 */
3824 ath10k_drain_tx(ar);
3825
Michal Kazior548db542013-07-05 16:15:15 +03003826 mutex_lock(&ar->conf_mutex);
3827
Michal Kaziorc5058f52014-05-26 12:46:03 +03003828 switch (ar->state) {
3829 case ATH10K_STATE_OFF:
3830 ar->state = ATH10K_STATE_ON;
3831 break;
3832 case ATH10K_STATE_RESTARTING:
3833 ath10k_halt(ar);
3834 ar->state = ATH10K_STATE_RESTARTED;
3835 break;
3836 case ATH10K_STATE_ON:
3837 case ATH10K_STATE_RESTARTED:
3838 case ATH10K_STATE_WEDGED:
3839 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02003840 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03003841 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03003842 case ATH10K_STATE_UTF:
3843 ret = -EBUSY;
3844 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02003845 }
3846
3847 ret = ath10k_hif_power_up(ar);
3848 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003849 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003850 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02003851 }
3852
Kalle Valo43d2a302014-09-10 18:23:30 +03003853 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02003854 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003855 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003856 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02003857 }
3858
Bartosz Markowski226a3392013-09-26 17:47:16 +02003859 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003860 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003861 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003862 goto err_core_stop;
3863 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003864
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01003865 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003866 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003867 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003868 goto err_core_stop;
3869 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003870
Michal Kaziorcf327842015-03-31 10:26:25 +00003871 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3872 ret = ath10k_wmi_adaptive_qcs(ar, true);
3873 if (ret) {
3874 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3875 ret);
3876 goto err_core_stop;
3877 }
3878 }
3879
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003880 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
3881 burst_enable = ar->wmi.pdev_param->burst_enable;
3882 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
3883 if (ret) {
3884 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
3885 goto err_core_stop;
3886 }
3887 }
3888
Ben Greear46acf7b2014-05-16 17:15:38 +03003889 if (ar->cfg_tx_chainmask)
3890 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3891 ar->cfg_rx_chainmask);
3892
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003893 /*
3894 * By default FW set ARP frames ac to voice (6). In that case ARP
3895 * exchange is not working properly for UAPSD enabled AP. ARP requests
3896 * which arrives with access category 0 are processed by network stack
3897 * and send back with access category 0, but FW changes access category
3898 * to 6. Set ARP frames access category to best effort (0) solves
3899 * this problem.
3900 */
3901
3902 ret = ath10k_wmi_pdev_set_param(ar,
3903 ar->wmi.pdev_param->arp_ac_override, 0);
3904 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003905 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003906 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003907 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003908 }
3909
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05303910 ret = ath10k_wmi_pdev_set_param(ar,
3911 ar->wmi.pdev_param->ani_enable, 1);
3912 if (ret) {
3913 ath10k_warn(ar, "failed to enable ani by default: %d\n",
3914 ret);
3915 goto err_core_stop;
3916 }
3917
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05303918 ar->ani_enabled = true;
3919
Michal Kaziord6500972014-04-08 09:56:09 +03003920 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02003921 ath10k_regd_update(ar);
3922
Simon Wunderlich855aed12014-08-02 09:12:54 +03003923 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05303924 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03003925
Michal Kaziorae254432014-05-26 12:46:02 +03003926 mutex_unlock(&ar->conf_mutex);
3927 return 0;
3928
3929err_core_stop:
3930 ath10k_core_stop(ar);
3931
3932err_power_down:
3933 ath10k_hif_power_down(ar);
3934
3935err_off:
3936 ar->state = ATH10K_STATE_OFF;
3937
3938err:
Michal Kazior548db542013-07-05 16:15:15 +03003939 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01003940 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003941}
3942
3943static void ath10k_stop(struct ieee80211_hw *hw)
3944{
3945 struct ath10k *ar = hw->priv;
3946
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003947 ath10k_drain_tx(ar);
3948
Michal Kazior548db542013-07-05 16:15:15 +03003949 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003950 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02003951 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003952 ar->state = ATH10K_STATE_OFF;
3953 }
Michal Kazior548db542013-07-05 16:15:15 +03003954 mutex_unlock(&ar->conf_mutex);
3955
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003956 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02003957 cancel_work_sync(&ar->restart_work);
3958}
3959
Michal Kaziorad088bf2013-10-16 15:44:46 +03003960static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02003961{
Michal Kaziorad088bf2013-10-16 15:44:46 +03003962 struct ath10k_vif *arvif;
3963 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02003964
3965 lockdep_assert_held(&ar->conf_mutex);
3966
Michal Kaziorad088bf2013-10-16 15:44:46 +03003967 list_for_each_entry(arvif, &ar->arvifs, list) {
3968 ret = ath10k_mac_vif_setup_ps(arvif);
3969 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003970 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003971 break;
3972 }
3973 }
Michal Kazioraffd3212013-07-16 09:54:35 +02003974
Michal Kaziorad088bf2013-10-16 15:44:46 +03003975 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003976}
3977
Michal Kazior7d9d5582014-10-21 10:40:15 +03003978static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3979{
3980 int ret;
3981 u32 param;
3982
3983 lockdep_assert_held(&ar->conf_mutex);
3984
3985 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3986
3987 param = ar->wmi.pdev_param->txpower_limit2g;
3988 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3989 if (ret) {
3990 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3991 txpower, ret);
3992 return ret;
3993 }
3994
3995 param = ar->wmi.pdev_param->txpower_limit5g;
3996 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3997 if (ret) {
3998 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3999 txpower, ret);
4000 return ret;
4001 }
4002
4003 return 0;
4004}
4005
4006static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4007{
4008 struct ath10k_vif *arvif;
4009 int ret, txpower = -1;
4010
4011 lockdep_assert_held(&ar->conf_mutex);
4012
4013 list_for_each_entry(arvif, &ar->arvifs, list) {
4014 WARN_ON(arvif->txpower < 0);
4015
4016 if (txpower == -1)
4017 txpower = arvif->txpower;
4018 else
4019 txpower = min(txpower, arvif->txpower);
4020 }
4021
4022 if (WARN_ON(txpower == -1))
4023 return -EINVAL;
4024
4025 ret = ath10k_mac_txpower_setup(ar, txpower);
4026 if (ret) {
4027 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4028 txpower, ret);
4029 return ret;
4030 }
4031
4032 return 0;
4033}
4034
Kalle Valo5e3dd152013-06-12 20:52:10 +03004035static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4036{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004037 struct ath10k *ar = hw->priv;
4038 struct ieee80211_conf *conf = &hw->conf;
4039 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004040
4041 mutex_lock(&ar->conf_mutex);
4042
Michal Kazioraffd3212013-07-16 09:54:35 +02004043 if (changed & IEEE80211_CONF_CHANGE_PS)
4044 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004045
4046 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004047 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4048 ret = ath10k_monitor_recalc(ar);
4049 if (ret)
4050 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004051 }
4052
4053 mutex_unlock(&ar->conf_mutex);
4054 return ret;
4055}
4056
Ben Greear5572a952014-11-24 16:22:10 +02004057static u32 get_nss_from_chainmask(u16 chain_mask)
4058{
4059 if ((chain_mask & 0x15) == 0x15)
4060 return 4;
4061 else if ((chain_mask & 0x7) == 0x7)
4062 return 3;
4063 else if ((chain_mask & 0x3) == 0x3)
4064 return 2;
4065 return 1;
4066}
4067
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004068static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4069{
4070 int nsts = ar->vht_cap_info;
4071 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4072 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4073
4074 /* If firmware does not deliver to host number of space-time
4075 * streams supported, assume it support up to 4 BF STS and return
4076 * the value for VHT CAP: nsts-1)
4077 * */
4078 if (nsts == 0)
4079 return 3;
4080
4081 return nsts;
4082}
4083
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004084static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4085{
4086 int sound_dim = ar->vht_cap_info;
4087 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4088 sound_dim >>=IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4089
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 Kazior46725b152015-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 Kazior46725b152015-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",
4662 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
4806exit:
4807 mutex_unlock(&ar->conf_mutex);
4808 return ret;
4809}
4810
4811static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4812 struct ieee80211_vif *vif)
4813{
4814 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004815
4816 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004817 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004818 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004819
4820 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004821}
4822
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004823static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4824 struct ath10k_vif *arvif,
4825 enum set_key_cmd cmd,
4826 struct ieee80211_key_conf *key)
4827{
4828 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4829 int ret;
4830
4831 /* 10.1 firmware branch requires default key index to be set to group
4832 * key index after installing it. Otherwise FW/HW Txes corrupted
4833 * frames with multi-vif APs. This is not required for main firmware
4834 * branch (e.g. 636).
4835 *
Michal Kazior8461baf2015-04-10 13:23:22 +00004836 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4837 *
4838 * FIXME: It remains unknown if this is required for multi-vif STA
4839 * interfaces on 10.1.
4840 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004841
Michal Kazior8461baf2015-04-10 13:23:22 +00004842 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4843 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004844 return;
4845
4846 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4847 return;
4848
4849 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4850 return;
4851
4852 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4853 return;
4854
4855 if (cmd != SET_KEY)
4856 return;
4857
4858 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4859 key->keyidx);
4860 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004861 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004862 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004863}
4864
Kalle Valo5e3dd152013-06-12 20:52:10 +03004865static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4866 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4867 struct ieee80211_key_conf *key)
4868{
4869 struct ath10k *ar = hw->priv;
4870 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4871 struct ath10k_peer *peer;
4872 const u8 *peer_addr;
4873 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4874 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4875 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004876 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01004877 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004878 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004879
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004880 /* this one needs to be done in software */
4881 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4882 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004883
David Liuccec9032015-07-24 20:25:32 +03004884 if (arvif->nohwcrypt)
4885 return 1;
4886
Kalle Valo5e3dd152013-06-12 20:52:10 +03004887 if (key->keyidx > WMI_MAX_KEY_INDEX)
4888 return -ENOSPC;
4889
4890 mutex_lock(&ar->conf_mutex);
4891
4892 if (sta)
4893 peer_addr = sta->addr;
4894 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4895 peer_addr = vif->bss_conf.bssid;
4896 else
4897 peer_addr = vif->addr;
4898
4899 key->hw_key_idx = key->keyidx;
4900
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03004901 if (is_wep) {
4902 if (cmd == SET_KEY)
4903 arvif->wep_keys[key->keyidx] = key;
4904 else
4905 arvif->wep_keys[key->keyidx] = NULL;
4906 }
4907
Kalle Valo5e3dd152013-06-12 20:52:10 +03004908 /* the peer should not disappear in mid-way (unless FW goes awry) since
4909 * we already hold conf_mutex. we just make sure its there now. */
4910 spin_lock_bh(&ar->data_lock);
4911 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4912 spin_unlock_bh(&ar->data_lock);
4913
4914 if (!peer) {
4915 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004916 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004917 peer_addr);
4918 ret = -EOPNOTSUPP;
4919 goto exit;
4920 } else {
4921 /* if the peer doesn't exist there is no key to disable
4922 * anymore */
4923 goto exit;
4924 }
4925 }
4926
Michal Kazior7cc45732015-03-09 14:24:17 +01004927 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4928 flags |= WMI_KEY_PAIRWISE;
4929 else
4930 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004931
Kalle Valo5e3dd152013-06-12 20:52:10 +03004932 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004933 if (cmd == DISABLE_KEY)
4934 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004935
Michal Kaziorad325cb2015-02-18 14:02:27 +01004936 /* When WEP keys are uploaded it's possible that there are
4937 * stations associated already (e.g. when merging) without any
4938 * keys. Static WEP needs an explicit per-peer key upload.
4939 */
4940 if (vif->type == NL80211_IFTYPE_ADHOC &&
4941 cmd == SET_KEY)
4942 ath10k_mac_vif_update_wep_key(arvif, key);
4943
Michal Kazior370e5672015-02-18 14:02:26 +01004944 /* 802.1x never sets the def_wep_key_idx so each set_key()
4945 * call changes default tx key.
4946 *
4947 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4948 * after first set_key().
4949 */
4950 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4951 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004952 }
4953
Michal Kazior370e5672015-02-18 14:02:26 +01004954 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004955 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004956 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004957 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004958 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004959 goto exit;
4960 }
4961
Michal Kazior29a10002015-04-10 13:05:58 +00004962 /* mac80211 sets static WEP keys as groupwise while firmware requires
4963 * them to be installed twice as both pairwise and groupwise.
4964 */
4965 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4966 flags2 = flags;
4967 flags2 &= ~WMI_KEY_GROUP;
4968 flags2 |= WMI_KEY_PAIRWISE;
4969
4970 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4971 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004972 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004973 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4974 arvif->vdev_id, peer_addr, ret);
4975 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4976 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03004977 if (ret2) {
4978 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004979 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4980 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03004981 }
Michal Kazior29a10002015-04-10 13:05:58 +00004982 goto exit;
4983 }
4984 }
4985
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004986 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4987
Kalle Valo5e3dd152013-06-12 20:52:10 +03004988 spin_lock_bh(&ar->data_lock);
4989 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4990 if (peer && cmd == SET_KEY)
4991 peer->keys[key->keyidx] = key;
4992 else if (peer && cmd == DISABLE_KEY)
4993 peer->keys[key->keyidx] = NULL;
4994 else if (peer == NULL)
4995 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004996 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004997 spin_unlock_bh(&ar->data_lock);
4998
4999exit:
5000 mutex_unlock(&ar->conf_mutex);
5001 return ret;
5002}
5003
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005004static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
5005 struct ieee80211_vif *vif,
5006 int keyidx)
5007{
5008 struct ath10k *ar = hw->priv;
5009 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5010 int ret;
5011
5012 mutex_lock(&arvif->ar->conf_mutex);
5013
5014 if (arvif->ar->state != ATH10K_STATE_ON)
5015 goto unlock;
5016
5017 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5018 arvif->vdev_id, keyidx);
5019
5020 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5021 arvif->vdev_id,
5022 arvif->ar->wmi.vdev_param->def_keyid,
5023 keyidx);
5024
5025 if (ret) {
5026 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5027 arvif->vdev_id,
5028 ret);
5029 goto unlock;
5030 }
5031
5032 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01005033
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005034unlock:
5035 mutex_unlock(&arvif->ar->conf_mutex);
5036}
5037
Michal Kazior9797feb2014-02-14 14:49:48 +01005038static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5039{
5040 struct ath10k *ar;
5041 struct ath10k_vif *arvif;
5042 struct ath10k_sta *arsta;
5043 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005044 struct cfg80211_chan_def def;
5045 enum ieee80211_band band;
5046 const u8 *ht_mcs_mask;
5047 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005048 u32 changed, bw, nss, smps;
5049 int err;
5050
5051 arsta = container_of(wk, struct ath10k_sta, update_wk);
5052 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5053 arvif = arsta->arvif;
5054 ar = arvif->ar;
5055
Michal Kazior45c9abc2015-04-21 20:42:58 +03005056 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5057 return;
5058
5059 band = def.chan->band;
5060 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5061 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5062
Michal Kazior9797feb2014-02-14 14:49:48 +01005063 spin_lock_bh(&ar->data_lock);
5064
5065 changed = arsta->changed;
5066 arsta->changed = 0;
5067
5068 bw = arsta->bw;
5069 nss = arsta->nss;
5070 smps = arsta->smps;
5071
5072 spin_unlock_bh(&ar->data_lock);
5073
5074 mutex_lock(&ar->conf_mutex);
5075
Michal Kazior45c9abc2015-04-21 20:42:58 +03005076 nss = max_t(u32, 1, nss);
5077 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5078 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5079
Michal Kazior9797feb2014-02-14 14:49:48 +01005080 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005081 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005082 sta->addr, bw);
5083
5084 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5085 WMI_PEER_CHAN_WIDTH, bw);
5086 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005087 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005088 sta->addr, bw, err);
5089 }
5090
5091 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005092 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005093 sta->addr, nss);
5094
5095 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5096 WMI_PEER_NSS, nss);
5097 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005098 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005099 sta->addr, nss, err);
5100 }
5101
5102 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005103 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005104 sta->addr, smps);
5105
5106 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5107 WMI_PEER_SMPS_STATE, smps);
5108 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005109 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005110 sta->addr, smps, err);
5111 }
5112
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005113 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5114 changed & IEEE80211_RC_NSS_CHANGED) {
5115 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005116 sta->addr);
5117
Michal Kazior590922a2014-10-21 10:10:29 +03005118 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005119 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005120 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005121 sta->addr);
5122 }
5123
Michal Kazior9797feb2014-02-14 14:49:48 +01005124 mutex_unlock(&ar->conf_mutex);
5125}
5126
Marek Puzyniak7c354242015-03-30 09:51:52 +03005127static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5128 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005129{
5130 struct ath10k *ar = arvif->ar;
5131
5132 lockdep_assert_held(&ar->conf_mutex);
5133
Marek Puzyniak7c354242015-03-30 09:51:52 +03005134 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005135 return 0;
5136
5137 if (ar->num_stations >= ar->max_num_stations)
5138 return -ENOBUFS;
5139
5140 ar->num_stations++;
5141
5142 return 0;
5143}
5144
Marek Puzyniak7c354242015-03-30 09:51:52 +03005145static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5146 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005147{
5148 struct ath10k *ar = arvif->ar;
5149
5150 lockdep_assert_held(&ar->conf_mutex);
5151
Marek Puzyniak7c354242015-03-30 09:51:52 +03005152 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005153 return;
5154
5155 ar->num_stations--;
5156}
5157
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005158struct ath10k_mac_tdls_iter_data {
5159 u32 num_tdls_stations;
5160 struct ieee80211_vif *curr_vif;
5161};
5162
5163static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5164 struct ieee80211_sta *sta)
5165{
5166 struct ath10k_mac_tdls_iter_data *iter_data = data;
5167 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5168 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5169
5170 if (sta->tdls && sta_vif == iter_data->curr_vif)
5171 iter_data->num_tdls_stations++;
5172}
5173
5174static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5175 struct ieee80211_vif *vif)
5176{
5177 struct ath10k_mac_tdls_iter_data data = {};
5178
5179 data.curr_vif = vif;
5180
5181 ieee80211_iterate_stations_atomic(hw,
5182 ath10k_mac_tdls_vif_stations_count_iter,
5183 &data);
5184 return data.num_tdls_stations;
5185}
5186
5187static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5188 struct ieee80211_vif *vif)
5189{
5190 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5191 int *num_tdls_vifs = data;
5192
5193 if (vif->type != NL80211_IFTYPE_STATION)
5194 return;
5195
5196 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5197 (*num_tdls_vifs)++;
5198}
5199
5200static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5201{
5202 int num_tdls_vifs = 0;
5203
5204 ieee80211_iterate_active_interfaces_atomic(hw,
5205 IEEE80211_IFACE_ITER_NORMAL,
5206 ath10k_mac_tdls_vifs_count_iter,
5207 &num_tdls_vifs);
5208 return num_tdls_vifs;
5209}
5210
Kalle Valo5e3dd152013-06-12 20:52:10 +03005211static int ath10k_sta_state(struct ieee80211_hw *hw,
5212 struct ieee80211_vif *vif,
5213 struct ieee80211_sta *sta,
5214 enum ieee80211_sta_state old_state,
5215 enum ieee80211_sta_state new_state)
5216{
5217 struct ath10k *ar = hw->priv;
5218 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005219 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005220 int ret = 0;
5221
Michal Kazior76f90022014-02-25 09:29:57 +02005222 if (old_state == IEEE80211_STA_NOTEXIST &&
5223 new_state == IEEE80211_STA_NONE) {
5224 memset(arsta, 0, sizeof(*arsta));
5225 arsta->arvif = arvif;
5226 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5227 }
5228
Michal Kazior9797feb2014-02-14 14:49:48 +01005229 /* cancel must be done outside the mutex to avoid deadlock */
5230 if ((old_state == IEEE80211_STA_NONE &&
5231 new_state == IEEE80211_STA_NOTEXIST))
5232 cancel_work_sync(&arsta->update_wk);
5233
Kalle Valo5e3dd152013-06-12 20:52:10 +03005234 mutex_lock(&ar->conf_mutex);
5235
5236 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005237 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005238 /*
5239 * New station addition.
5240 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005241 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5242 u32 num_tdls_stations;
5243 u32 num_tdls_vifs;
5244
Michal Kaziorcfd10612014-11-25 15:16:05 +01005245 ath10k_dbg(ar, ATH10K_DBG_MAC,
5246 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5247 arvif->vdev_id, sta->addr,
5248 ar->num_stations + 1, ar->max_num_stations,
5249 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005250
Marek Puzyniak7c354242015-03-30 09:51:52 +03005251 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005252 if (ret) {
5253 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5254 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005255 goto exit;
5256 }
5257
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005258 if (sta->tdls)
5259 peer_type = WMI_PEER_TYPE_TDLS;
5260
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005261 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005262 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005263 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005264 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 -08005265 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005266 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005267 goto exit;
5268 }
Michal Kazior077efc82014-10-21 10:10:29 +03005269
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005270 if (!sta->tdls)
5271 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005272
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005273 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5274 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5275
5276 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5277 num_tdls_stations == 0) {
5278 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5279 arvif->vdev_id, ar->max_num_tdls_vdevs);
5280 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5281 ath10k_mac_dec_num_stations(arvif, sta);
5282 ret = -ENOBUFS;
5283 goto exit;
5284 }
5285
5286 if (num_tdls_stations == 0) {
5287 /* This is the first tdls peer in current vif */
5288 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5289
5290 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5291 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005292 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005293 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005294 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005295 ath10k_peer_delete(ar, arvif->vdev_id,
5296 sta->addr);
5297 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005298 goto exit;
5299 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005300 }
Michal Kazior077efc82014-10-21 10:10:29 +03005301
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005302 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5303 WMI_TDLS_PEER_STATE_PEERING);
5304 if (ret) {
5305 ath10k_warn(ar,
5306 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5307 sta->addr, arvif->vdev_id, ret);
5308 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5309 ath10k_mac_dec_num_stations(arvif, sta);
5310
5311 if (num_tdls_stations != 0)
5312 goto exit;
5313 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5314 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005315 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005316 } else if ((old_state == IEEE80211_STA_NONE &&
5317 new_state == IEEE80211_STA_NOTEXIST)) {
5318 /*
5319 * Existing station deletion.
5320 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005321 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005322 "mac vdev %d peer delete %pM (sta gone)\n",
5323 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005324
Kalle Valo5e3dd152013-06-12 20:52:10 +03005325 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5326 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005327 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005328 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005329
Marek Puzyniak7c354242015-03-30 09:51:52 +03005330 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005331
5332 if (!sta->tdls)
5333 goto exit;
5334
5335 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5336 goto exit;
5337
5338 /* This was the last tdls peer in current vif */
5339 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5340 WMI_TDLS_DISABLE);
5341 if (ret) {
5342 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5343 arvif->vdev_id, ret);
5344 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005345 } else if (old_state == IEEE80211_STA_AUTH &&
5346 new_state == IEEE80211_STA_ASSOC &&
5347 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005348 vif->type == NL80211_IFTYPE_MESH_POINT ||
Kalle Valo5e3dd152013-06-12 20:52:10 +03005349 vif->type == NL80211_IFTYPE_ADHOC)) {
5350 /*
5351 * New association.
5352 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005353 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005354 sta->addr);
5355
Michal Kazior590922a2014-10-21 10:10:29 +03005356 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005357 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005358 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005359 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005360 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005361 new_state == IEEE80211_STA_AUTHORIZED &&
5362 sta->tdls) {
5363 /*
5364 * Tdls station authorized.
5365 */
5366 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5367 sta->addr);
5368
5369 ret = ath10k_station_assoc(ar, vif, sta, false);
5370 if (ret) {
5371 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5372 sta->addr, arvif->vdev_id, ret);
5373 goto exit;
5374 }
5375
5376 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5377 WMI_TDLS_PEER_STATE_CONNECTED);
5378 if (ret)
5379 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5380 sta->addr, arvif->vdev_id, ret);
5381 } else if (old_state == IEEE80211_STA_ASSOC &&
5382 new_state == IEEE80211_STA_AUTH &&
5383 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005384 vif->type == NL80211_IFTYPE_MESH_POINT ||
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005385 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005386 /*
5387 * Disassociation.
5388 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005389 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005390 sta->addr);
5391
Michal Kazior590922a2014-10-21 10:10:29 +03005392 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005393 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005394 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005395 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005396 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005397exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005398 mutex_unlock(&ar->conf_mutex);
5399 return ret;
5400}
5401
5402static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005403 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005404{
5405 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005406 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5407 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005408 u32 value = 0;
5409 int ret = 0;
5410
Michal Kazior548db542013-07-05 16:15:15 +03005411 lockdep_assert_held(&ar->conf_mutex);
5412
Kalle Valo5e3dd152013-06-12 20:52:10 +03005413 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5414 return 0;
5415
5416 switch (ac) {
5417 case IEEE80211_AC_VO:
5418 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5419 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005420 prio = 7;
5421 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005422 break;
5423 case IEEE80211_AC_VI:
5424 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5425 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005426 prio = 5;
5427 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005428 break;
5429 case IEEE80211_AC_BE:
5430 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5431 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005432 prio = 2;
5433 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005434 break;
5435 case IEEE80211_AC_BK:
5436 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5437 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005438 prio = 0;
5439 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005440 break;
5441 }
5442
5443 if (enable)
5444 arvif->u.sta.uapsd |= value;
5445 else
5446 arvif->u.sta.uapsd &= ~value;
5447
5448 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5449 WMI_STA_PS_PARAM_UAPSD,
5450 arvif->u.sta.uapsd);
5451 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005452 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005453 goto exit;
5454 }
5455
5456 if (arvif->u.sta.uapsd)
5457 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5458 else
5459 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5460
5461 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5462 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5463 value);
5464 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005465 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005466
Michal Kazior9f9b5742014-12-12 12:41:36 +01005467 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5468 if (ret) {
5469 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5470 arvif->vdev_id, ret);
5471 return ret;
5472 }
5473
5474 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5475 if (ret) {
5476 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5477 arvif->vdev_id, ret);
5478 return ret;
5479 }
5480
Michal Kaziorb0e56152015-01-24 12:14:52 +02005481 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5482 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5483 /* Only userspace can make an educated decision when to send
5484 * trigger frame. The following effectively disables u-UAPSD
5485 * autotrigger in firmware (which is enabled by default
5486 * provided the autotrigger service is available).
5487 */
5488
5489 arg.wmm_ac = acc;
5490 arg.user_priority = prio;
5491 arg.service_interval = 0;
5492 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5493 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5494
5495 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5496 arvif->bssid, &arg, 1);
5497 if (ret) {
5498 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5499 ret);
5500 return ret;
5501 }
5502 }
5503
Kalle Valo5e3dd152013-06-12 20:52:10 +03005504exit:
5505 return ret;
5506}
5507
5508static int ath10k_conf_tx(struct ieee80211_hw *hw,
5509 struct ieee80211_vif *vif, u16 ac,
5510 const struct ieee80211_tx_queue_params *params)
5511{
5512 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005513 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005514 struct wmi_wmm_params_arg *p = NULL;
5515 int ret;
5516
5517 mutex_lock(&ar->conf_mutex);
5518
5519 switch (ac) {
5520 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005521 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005522 break;
5523 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005524 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005525 break;
5526 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005527 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005528 break;
5529 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005530 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005531 break;
5532 }
5533
5534 if (WARN_ON(!p)) {
5535 ret = -EINVAL;
5536 goto exit;
5537 }
5538
5539 p->cwmin = params->cw_min;
5540 p->cwmax = params->cw_max;
5541 p->aifs = params->aifs;
5542
5543 /*
5544 * The channel time duration programmed in the HW is in absolute
5545 * microseconds, while mac80211 gives the txop in units of
5546 * 32 microseconds.
5547 */
5548 p->txop = params->txop * 32;
5549
Michal Kazior7fc979a2015-01-28 09:57:28 +02005550 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5551 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5552 &arvif->wmm_params);
5553 if (ret) {
5554 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5555 arvif->vdev_id, ret);
5556 goto exit;
5557 }
5558 } else {
5559 /* This won't work well with multi-interface cases but it's
5560 * better than nothing.
5561 */
5562 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5563 if (ret) {
5564 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5565 goto exit;
5566 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005567 }
5568
5569 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5570 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005571 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005572
5573exit:
5574 mutex_unlock(&ar->conf_mutex);
5575 return ret;
5576}
5577
5578#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5579
5580static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5581 struct ieee80211_vif *vif,
5582 struct ieee80211_channel *chan,
5583 int duration,
5584 enum ieee80211_roc_type type)
5585{
5586 struct ath10k *ar = hw->priv;
5587 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5588 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005589 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005590 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005591
5592 mutex_lock(&ar->conf_mutex);
5593
5594 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005595 switch (ar->scan.state) {
5596 case ATH10K_SCAN_IDLE:
5597 reinit_completion(&ar->scan.started);
5598 reinit_completion(&ar->scan.completed);
5599 reinit_completion(&ar->scan.on_channel);
5600 ar->scan.state = ATH10K_SCAN_STARTING;
5601 ar->scan.is_roc = true;
5602 ar->scan.vdev_id = arvif->vdev_id;
5603 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005604 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005605 ret = 0;
5606 break;
5607 case ATH10K_SCAN_STARTING:
5608 case ATH10K_SCAN_RUNNING:
5609 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005610 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005611 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005612 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005613 spin_unlock_bh(&ar->data_lock);
5614
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005615 if (ret)
5616 goto exit;
5617
Michal Kaziorfcf98442015-03-31 11:03:47 +00005618 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005619
Kalle Valo5e3dd152013-06-12 20:52:10 +03005620 memset(&arg, 0, sizeof(arg));
5621 ath10k_wmi_start_scan_init(ar, &arg);
5622 arg.vdev_id = arvif->vdev_id;
5623 arg.scan_id = ATH10K_SCAN_ID;
5624 arg.n_channels = 1;
5625 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005626 arg.dwell_time_active = scan_time_msec;
5627 arg.dwell_time_passive = scan_time_msec;
5628 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005629 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5630 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005631 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005632
5633 ret = ath10k_start_scan(ar, &arg);
5634 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005635 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005636 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005637 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005638 spin_unlock_bh(&ar->data_lock);
5639 goto exit;
5640 }
5641
5642 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5643 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005644 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005645
5646 ret = ath10k_scan_stop(ar);
5647 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005648 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005649
Kalle Valo5e3dd152013-06-12 20:52:10 +03005650 ret = -ETIMEDOUT;
5651 goto exit;
5652 }
5653
Michal Kaziorfcf98442015-03-31 11:03:47 +00005654 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5655 msecs_to_jiffies(duration));
5656
Kalle Valo5e3dd152013-06-12 20:52:10 +03005657 ret = 0;
5658exit:
5659 mutex_unlock(&ar->conf_mutex);
5660 return ret;
5661}
5662
5663static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5664{
5665 struct ath10k *ar = hw->priv;
5666
5667 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005668
5669 spin_lock_bh(&ar->data_lock);
5670 ar->scan.roc_notify = false;
5671 spin_unlock_bh(&ar->data_lock);
5672
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005673 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005674
Kalle Valo5e3dd152013-06-12 20:52:10 +03005675 mutex_unlock(&ar->conf_mutex);
5676
Michal Kazior4eb2e162014-10-28 10:23:09 +01005677 cancel_delayed_work_sync(&ar->scan.timeout);
5678
Kalle Valo5e3dd152013-06-12 20:52:10 +03005679 return 0;
5680}
5681
5682/*
5683 * Both RTS and Fragmentation threshold are interface-specific
5684 * in ath10k, but device-specific in mac80211.
5685 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005686
5687static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5688{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005689 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005690 struct ath10k_vif *arvif;
5691 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005692
Michal Kaziorad088bf2013-10-16 15:44:46 +03005693 mutex_lock(&ar->conf_mutex);
5694 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005695 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005696 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005697
Michal Kaziorad088bf2013-10-16 15:44:46 +03005698 ret = ath10k_mac_set_rts(arvif, value);
5699 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005700 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005701 arvif->vdev_id, ret);
5702 break;
5703 }
5704 }
5705 mutex_unlock(&ar->conf_mutex);
5706
5707 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005708}
5709
Michal Kazior92092fe2015-08-03 11:16:43 +02005710static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5711{
5712 /* Even though there's a WMI enum for fragmentation threshold no known
5713 * firmware actually implements it. Moreover it is not possible to rely
5714 * frame fragmentation to mac80211 because firmware clears the "more
5715 * fragments" bit in frame control making it impossible for remote
5716 * devices to reassemble frames.
5717 *
5718 * Hence implement a dummy callback just to say fragmentation isn't
5719 * supported. This effectively prevents mac80211 from doing frame
5720 * fragmentation in software.
5721 */
5722 return -EOPNOTSUPP;
5723}
5724
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005725static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5726 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005727{
5728 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005729 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005730 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005731
5732 /* mac80211 doesn't care if we really xmit queued frames or not
5733 * we'll collect those frames either way if we stop/delete vdevs */
5734 if (drop)
5735 return;
5736
Michal Kazior548db542013-07-05 16:15:15 +03005737 mutex_lock(&ar->conf_mutex);
5738
Michal Kazioraffd3212013-07-16 09:54:35 +02005739 if (ar->state == ATH10K_STATE_WEDGED)
5740 goto skip;
5741
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005742 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005743 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005744
Michal Kazioredb82362013-07-05 16:15:14 +03005745 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005746 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005747 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005748
Michal Kazior7962b0d2014-10-28 10:34:38 +01005749 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5750 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5751 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005752
5753 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005754 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005755
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005756 if (time_left == 0 || skip)
5757 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5758 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005759
Michal Kazioraffd3212013-07-16 09:54:35 +02005760skip:
Michal Kazior548db542013-07-05 16:15:15 +03005761 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005762}
5763
5764/* TODO: Implement this function properly
5765 * For now it is needed to reply to Probe Requests in IBSS mode.
5766 * Propably we need this information from FW.
5767 */
5768static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5769{
5770 return 1;
5771}
5772
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005773static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5774 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005775{
5776 struct ath10k *ar = hw->priv;
5777
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005778 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5779 return;
5780
Michal Kazioraffd3212013-07-16 09:54:35 +02005781 mutex_lock(&ar->conf_mutex);
5782
5783 /* If device failed to restart it will be in a different state, e.g.
5784 * ATH10K_STATE_WEDGED */
5785 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005786 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005787 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005788 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005789 }
5790
5791 mutex_unlock(&ar->conf_mutex);
5792}
5793
Michal Kazior2e1dea42013-07-31 10:32:40 +02005794static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5795 struct survey_info *survey)
5796{
5797 struct ath10k *ar = hw->priv;
5798 struct ieee80211_supported_band *sband;
5799 struct survey_info *ar_survey = &ar->survey[idx];
5800 int ret = 0;
5801
5802 mutex_lock(&ar->conf_mutex);
5803
5804 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5805 if (sband && idx >= sband->n_channels) {
5806 idx -= sband->n_channels;
5807 sband = NULL;
5808 }
5809
5810 if (!sband)
5811 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5812
5813 if (!sband || idx >= sband->n_channels) {
5814 ret = -ENOENT;
5815 goto exit;
5816 }
5817
5818 spin_lock_bh(&ar->data_lock);
5819 memcpy(survey, ar_survey, sizeof(*survey));
5820 spin_unlock_bh(&ar->data_lock);
5821
5822 survey->channel = &sband->channels[idx];
5823
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005824 if (ar->rx_channel == survey->channel)
5825 survey->filled |= SURVEY_INFO_IN_USE;
5826
Michal Kazior2e1dea42013-07-31 10:32:40 +02005827exit:
5828 mutex_unlock(&ar->conf_mutex);
5829 return ret;
5830}
5831
Michal Kazior3ae54222015-03-31 10:49:20 +00005832static bool
5833ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5834 enum ieee80211_band band,
5835 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005836{
Michal Kazior3ae54222015-03-31 10:49:20 +00005837 int num_rates = 0;
5838 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005839
Michal Kazior3ae54222015-03-31 10:49:20 +00005840 num_rates += hweight32(mask->control[band].legacy);
5841
5842 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5843 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5844
5845 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5846 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5847
5848 return num_rates == 1;
5849}
5850
5851static bool
5852ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5853 enum ieee80211_band band,
5854 const struct cfg80211_bitrate_mask *mask,
5855 int *nss)
5856{
5857 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5858 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5859 u8 ht_nss_mask = 0;
5860 u8 vht_nss_mask = 0;
5861 int i;
5862
5863 if (mask->control[band].legacy)
5864 return false;
5865
5866 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5867 if (mask->control[band].ht_mcs[i] == 0)
5868 continue;
5869 else if (mask->control[band].ht_mcs[i] ==
5870 sband->ht_cap.mcs.rx_mask[i])
5871 ht_nss_mask |= BIT(i);
5872 else
5873 return false;
5874 }
5875
5876 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5877 if (mask->control[band].vht_mcs[i] == 0)
5878 continue;
5879 else if (mask->control[band].vht_mcs[i] ==
5880 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5881 vht_nss_mask |= BIT(i);
5882 else
5883 return false;
5884 }
5885
5886 if (ht_nss_mask != vht_nss_mask)
5887 return false;
5888
5889 if (ht_nss_mask == 0)
5890 return false;
5891
5892 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5893 return false;
5894
5895 *nss = fls(ht_nss_mask);
5896
5897 return true;
5898}
5899
5900static int
5901ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5902 enum ieee80211_band band,
5903 const struct cfg80211_bitrate_mask *mask,
5904 u8 *rate, u8 *nss)
5905{
5906 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5907 int rate_idx;
5908 int i;
5909 u16 bitrate;
5910 u8 preamble;
5911 u8 hw_rate;
5912
5913 if (hweight32(mask->control[band].legacy) == 1) {
5914 rate_idx = ffs(mask->control[band].legacy) - 1;
5915
5916 hw_rate = sband->bitrates[rate_idx].hw_value;
5917 bitrate = sband->bitrates[rate_idx].bitrate;
5918
5919 if (ath10k_mac_bitrate_is_cck(bitrate))
5920 preamble = WMI_RATE_PREAMBLE_CCK;
5921 else
5922 preamble = WMI_RATE_PREAMBLE_OFDM;
5923
5924 *nss = 1;
5925 *rate = preamble << 6 |
5926 (*nss - 1) << 4 |
5927 hw_rate << 0;
5928
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005929 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005930 }
5931
Michal Kazior3ae54222015-03-31 10:49:20 +00005932 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5933 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5934 *nss = i + 1;
5935 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5936 (*nss - 1) << 4 |
5937 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005938
Michal Kazior3ae54222015-03-31 10:49:20 +00005939 return 0;
5940 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005941 }
5942
Michal Kazior3ae54222015-03-31 10:49:20 +00005943 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5944 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5945 *nss = i + 1;
5946 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5947 (*nss - 1) << 4 |
5948 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005949
Michal Kazior3ae54222015-03-31 10:49:20 +00005950 return 0;
5951 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005952 }
5953
Michal Kazior3ae54222015-03-31 10:49:20 +00005954 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005955}
5956
Michal Kazior3ae54222015-03-31 10:49:20 +00005957static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5958 u8 rate, u8 nss, u8 sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005959{
5960 struct ath10k *ar = arvif->ar;
5961 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005962 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005963
Michal Kazior3ae54222015-03-31 10:49:20 +00005964 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005965
Michal Kazior3ae54222015-03-31 10:49:20 +00005966 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5967 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005968
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005969 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005970 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005971 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005972 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005973 rate, ret);
5974 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005975 }
5976
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005977 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005978 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005979 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005980 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5981 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005982 }
5983
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005984 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005985 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005986 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005987 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5988 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005989 }
5990
Michal Kazior3ae54222015-03-31 10:49:20 +00005991 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005992}
5993
Michal Kazior45c9abc2015-04-21 20:42:58 +03005994static bool
5995ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
5996 enum ieee80211_band band,
5997 const struct cfg80211_bitrate_mask *mask)
5998{
5999 int i;
6000 u16 vht_mcs;
6001
6002 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6003 * to express all VHT MCS rate masks. Effectively only the following
6004 * ranges can be used: none, 0-7, 0-8 and 0-9.
6005 */
6006 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6007 vht_mcs = mask->control[band].vht_mcs[i];
6008
6009 switch (vht_mcs) {
6010 case 0:
6011 case BIT(8) - 1:
6012 case BIT(9) - 1:
6013 case BIT(10) - 1:
6014 break;
6015 default:
6016 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6017 return false;
6018 }
6019 }
6020
6021 return true;
6022}
6023
6024static void ath10k_mac_set_bitrate_mask_iter(void *data,
6025 struct ieee80211_sta *sta)
6026{
6027 struct ath10k_vif *arvif = data;
6028 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6029 struct ath10k *ar = arvif->ar;
6030
6031 if (arsta->arvif != arvif)
6032 return;
6033
6034 spin_lock_bh(&ar->data_lock);
6035 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6036 spin_unlock_bh(&ar->data_lock);
6037
6038 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6039}
6040
Michal Kazior3ae54222015-03-31 10:49:20 +00006041static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6042 struct ieee80211_vif *vif,
6043 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006044{
6045 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006046 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006047 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006048 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006049 const u8 *ht_mcs_mask;
6050 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006051 u8 rate;
6052 u8 nss;
6053 u8 sgi;
6054 int single_nss;
6055 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006056
Michal Kazior500ff9f2015-03-31 10:26:21 +00006057 if (ath10k_mac_vif_chan(vif, &def))
6058 return -EPERM;
6059
Michal Kazior500ff9f2015-03-31 10:26:21 +00006060 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006061 ht_mcs_mask = mask->control[band].ht_mcs;
6062 vht_mcs_mask = mask->control[band].vht_mcs;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006063
Michal Kazior3ae54222015-03-31 10:49:20 +00006064 sgi = mask->control[band].gi;
6065 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006066 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006067
Michal Kazior3ae54222015-03-31 10:49:20 +00006068 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6069 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6070 &rate, &nss);
6071 if (ret) {
6072 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6073 arvif->vdev_id, ret);
6074 return ret;
6075 }
6076 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6077 &single_nss)) {
6078 rate = WMI_FIXED_RATE_NONE;
6079 nss = single_nss;
6080 } else {
6081 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006082 nss = min(ar->num_rf_chains,
6083 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6084 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6085
6086 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6087 return -EINVAL;
6088
6089 mutex_lock(&ar->conf_mutex);
6090
6091 arvif->bitrate_mask = *mask;
6092 ieee80211_iterate_stations_atomic(ar->hw,
6093 ath10k_mac_set_bitrate_mask_iter,
6094 arvif);
6095
6096 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006097 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006098
6099 mutex_lock(&ar->conf_mutex);
6100
Michal Kazior3ae54222015-03-31 10:49:20 +00006101 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006102 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006103 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6104 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006105 goto exit;
6106 }
6107
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006108exit:
6109 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006110
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006111 return ret;
6112}
6113
Michal Kazior9797feb2014-02-14 14:49:48 +01006114static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6115 struct ieee80211_vif *vif,
6116 struct ieee80211_sta *sta,
6117 u32 changed)
6118{
6119 struct ath10k *ar = hw->priv;
6120 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6121 u32 bw, smps;
6122
6123 spin_lock_bh(&ar->data_lock);
6124
Michal Kazior7aa7a722014-08-25 12:09:38 +02006125 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006126 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6127 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6128 sta->smps_mode);
6129
6130 if (changed & IEEE80211_RC_BW_CHANGED) {
6131 bw = WMI_PEER_CHWIDTH_20MHZ;
6132
6133 switch (sta->bandwidth) {
6134 case IEEE80211_STA_RX_BW_20:
6135 bw = WMI_PEER_CHWIDTH_20MHZ;
6136 break;
6137 case IEEE80211_STA_RX_BW_40:
6138 bw = WMI_PEER_CHWIDTH_40MHZ;
6139 break;
6140 case IEEE80211_STA_RX_BW_80:
6141 bw = WMI_PEER_CHWIDTH_80MHZ;
6142 break;
6143 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006144 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006145 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006146 bw = WMI_PEER_CHWIDTH_20MHZ;
6147 break;
6148 }
6149
6150 arsta->bw = bw;
6151 }
6152
6153 if (changed & IEEE80211_RC_NSS_CHANGED)
6154 arsta->nss = sta->rx_nss;
6155
6156 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6157 smps = WMI_PEER_SMPS_PS_NONE;
6158
6159 switch (sta->smps_mode) {
6160 case IEEE80211_SMPS_AUTOMATIC:
6161 case IEEE80211_SMPS_OFF:
6162 smps = WMI_PEER_SMPS_PS_NONE;
6163 break;
6164 case IEEE80211_SMPS_STATIC:
6165 smps = WMI_PEER_SMPS_STATIC;
6166 break;
6167 case IEEE80211_SMPS_DYNAMIC:
6168 smps = WMI_PEER_SMPS_DYNAMIC;
6169 break;
6170 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006171 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006172 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006173 smps = WMI_PEER_SMPS_PS_NONE;
6174 break;
6175 }
6176
6177 arsta->smps = smps;
6178 }
6179
Michal Kazior9797feb2014-02-14 14:49:48 +01006180 arsta->changed |= changed;
6181
6182 spin_unlock_bh(&ar->data_lock);
6183
6184 ieee80211_queue_work(hw, &arsta->update_wk);
6185}
6186
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006187static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6188{
6189 /*
6190 * FIXME: Return 0 for time being. Need to figure out whether FW
6191 * has the API to fetch 64-bit local TSF
6192 */
6193
6194 return 0;
6195}
6196
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006197static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6198 struct ieee80211_vif *vif,
6199 enum ieee80211_ampdu_mlme_action action,
6200 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6201 u8 buf_size)
6202{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006203 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006204 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6205
Michal Kazior7aa7a722014-08-25 12:09:38 +02006206 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 +02006207 arvif->vdev_id, sta->addr, tid, action);
6208
6209 switch (action) {
6210 case IEEE80211_AMPDU_RX_START:
6211 case IEEE80211_AMPDU_RX_STOP:
6212 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6213 * creation/removal. Do we need to verify this?
6214 */
6215 return 0;
6216 case IEEE80211_AMPDU_TX_START:
6217 case IEEE80211_AMPDU_TX_STOP_CONT:
6218 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6219 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6220 case IEEE80211_AMPDU_TX_OPERATIONAL:
6221 /* Firmware offloads Tx aggregation entirely so deny mac80211
6222 * Tx aggregation requests.
6223 */
6224 return -EOPNOTSUPP;
6225 }
6226
6227 return -EINVAL;
6228}
6229
Michal Kazior500ff9f2015-03-31 10:26:21 +00006230static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006231ath10k_mac_update_rx_channel(struct ath10k *ar,
6232 struct ieee80211_chanctx_conf *ctx,
6233 struct ieee80211_vif_chanctx_switch *vifs,
6234 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006235{
6236 struct cfg80211_chan_def *def = NULL;
6237
6238 /* Both locks are required because ar->rx_channel is modified. This
6239 * allows readers to hold either lock.
6240 */
6241 lockdep_assert_held(&ar->conf_mutex);
6242 lockdep_assert_held(&ar->data_lock);
6243
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006244 WARN_ON(ctx && vifs);
6245 WARN_ON(vifs && n_vifs != 1);
6246
Michal Kazior500ff9f2015-03-31 10:26:21 +00006247 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6248 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6249 * ppdu on Rx may reduce performance on low-end systems. It should be
6250 * possible to make tables/hashmaps to speed the lookup up (be vary of
6251 * cpu data cache lines though regarding sizes) but to keep the initial
6252 * implementation simple and less intrusive fallback to the slow lookup
6253 * only for multi-channel cases. Single-channel cases will remain to
6254 * use the old channel derival and thus performance should not be
6255 * affected much.
6256 */
6257 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006258 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006259 ieee80211_iter_chan_contexts_atomic(ar->hw,
6260 ath10k_mac_get_any_chandef_iter,
6261 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006262
6263 if (vifs)
6264 def = &vifs[0].new_ctx->def;
6265
Michal Kazior500ff9f2015-03-31 10:26:21 +00006266 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006267 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6268 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006269 } else {
6270 ar->rx_channel = NULL;
6271 }
6272 rcu_read_unlock();
6273}
6274
Michal Kazior500ff9f2015-03-31 10:26:21 +00006275static int
6276ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6277 struct ieee80211_chanctx_conf *ctx)
6278{
6279 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006280
6281 ath10k_dbg(ar, ATH10K_DBG_MAC,
6282 "mac chanctx add freq %hu width %d ptr %p\n",
6283 ctx->def.chan->center_freq, ctx->def.width, ctx);
6284
6285 mutex_lock(&ar->conf_mutex);
6286
6287 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006288 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006289 spin_unlock_bh(&ar->data_lock);
6290
6291 ath10k_recalc_radar_detection(ar);
6292 ath10k_monitor_recalc(ar);
6293
6294 mutex_unlock(&ar->conf_mutex);
6295
6296 return 0;
6297}
6298
6299static void
6300ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6301 struct ieee80211_chanctx_conf *ctx)
6302{
6303 struct ath10k *ar = hw->priv;
6304
6305 ath10k_dbg(ar, ATH10K_DBG_MAC,
6306 "mac chanctx remove freq %hu width %d ptr %p\n",
6307 ctx->def.chan->center_freq, ctx->def.width, ctx);
6308
6309 mutex_lock(&ar->conf_mutex);
6310
6311 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006312 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006313 spin_unlock_bh(&ar->data_lock);
6314
6315 ath10k_recalc_radar_detection(ar);
6316 ath10k_monitor_recalc(ar);
6317
6318 mutex_unlock(&ar->conf_mutex);
6319}
6320
6321static void
6322ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6323 struct ieee80211_chanctx_conf *ctx,
6324 u32 changed)
6325{
6326 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006327
6328 mutex_lock(&ar->conf_mutex);
6329
6330 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006331 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6332 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006333
6334 /* This shouldn't really happen because channel switching should use
6335 * switch_vif_chanctx().
6336 */
6337 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6338 goto unlock;
6339
Michal Kazior500ff9f2015-03-31 10:26:21 +00006340 ath10k_recalc_radar_detection(ar);
6341
6342 /* FIXME: How to configure Rx chains properly? */
6343
6344 /* No other actions are actually necessary. Firmware maintains channel
6345 * definitions per vdev internally and there's no host-side channel
6346 * context abstraction to configure, e.g. channel width.
6347 */
6348
6349unlock:
6350 mutex_unlock(&ar->conf_mutex);
6351}
6352
6353static int
6354ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6355 struct ieee80211_vif *vif,
6356 struct ieee80211_chanctx_conf *ctx)
6357{
6358 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006359 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6360 int ret;
6361
6362 mutex_lock(&ar->conf_mutex);
6363
6364 ath10k_dbg(ar, ATH10K_DBG_MAC,
6365 "mac chanctx assign ptr %p vdev_id %i\n",
6366 ctx, arvif->vdev_id);
6367
6368 if (WARN_ON(arvif->is_started)) {
6369 mutex_unlock(&ar->conf_mutex);
6370 return -EBUSY;
6371 }
6372
Michal Kazior089ab7a2015-06-03 12:16:55 +02006373 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006374 if (ret) {
6375 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6376 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006377 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006378 goto err;
6379 }
6380
6381 arvif->is_started = true;
6382
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006383 ret = ath10k_mac_vif_setup_ps(arvif);
6384 if (ret) {
6385 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6386 arvif->vdev_id, ret);
6387 goto err_stop;
6388 }
6389
Michal Kazior500ff9f2015-03-31 10:26:21 +00006390 if (vif->type == NL80211_IFTYPE_MONITOR) {
6391 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6392 if (ret) {
6393 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6394 arvif->vdev_id, ret);
6395 goto err_stop;
6396 }
6397
6398 arvif->is_up = true;
6399 }
6400
6401 mutex_unlock(&ar->conf_mutex);
6402 return 0;
6403
6404err_stop:
6405 ath10k_vdev_stop(arvif);
6406 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006407 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006408
6409err:
6410 mutex_unlock(&ar->conf_mutex);
6411 return ret;
6412}
6413
6414static void
6415ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6416 struct ieee80211_vif *vif,
6417 struct ieee80211_chanctx_conf *ctx)
6418{
6419 struct ath10k *ar = hw->priv;
6420 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6421 int ret;
6422
6423 mutex_lock(&ar->conf_mutex);
6424
6425 ath10k_dbg(ar, ATH10K_DBG_MAC,
6426 "mac chanctx unassign ptr %p vdev_id %i\n",
6427 ctx, arvif->vdev_id);
6428
6429 WARN_ON(!arvif->is_started);
6430
6431 if (vif->type == NL80211_IFTYPE_MONITOR) {
6432 WARN_ON(!arvif->is_up);
6433
6434 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6435 if (ret)
6436 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6437 arvif->vdev_id, ret);
6438
6439 arvif->is_up = false;
6440 }
6441
6442 ret = ath10k_vdev_stop(arvif);
6443 if (ret)
6444 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6445 arvif->vdev_id, ret);
6446
6447 arvif->is_started = false;
6448
6449 mutex_unlock(&ar->conf_mutex);
6450}
6451
6452static int
6453ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6454 struct ieee80211_vif_chanctx_switch *vifs,
6455 int n_vifs,
6456 enum ieee80211_chanctx_switch_mode mode)
6457{
6458 struct ath10k *ar = hw->priv;
6459 struct ath10k_vif *arvif;
Michal Kazior0e6eb412015-06-03 12:16:56 +02006460 int ret;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006461 int i;
6462
6463 mutex_lock(&ar->conf_mutex);
6464
6465 ath10k_dbg(ar, ATH10K_DBG_MAC,
6466 "mac chanctx switch n_vifs %d mode %d\n",
6467 n_vifs, mode);
6468
Michal Kazior0e6eb412015-06-03 12:16:56 +02006469 /* First stop monitor interface. Some FW versions crash if there's a
6470 * lone monitor interface.
6471 */
6472 if (ar->monitor_started)
6473 ath10k_monitor_stop(ar);
6474
Michal Kazior500ff9f2015-03-31 10:26:21 +00006475 for (i = 0; i < n_vifs; i++) {
6476 arvif = ath10k_vif_to_arvif(vifs[i].vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006477
6478 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006479 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
Michal Kazior500ff9f2015-03-31 10:26:21 +00006480 arvif->vdev_id,
6481 vifs[i].old_ctx->def.chan->center_freq,
6482 vifs[i].new_ctx->def.chan->center_freq,
6483 vifs[i].old_ctx->def.width,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006484 vifs[i].new_ctx->def.width);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006485
Michal Kazior0e6eb412015-06-03 12:16:56 +02006486 if (WARN_ON(!arvif->is_started))
6487 continue;
6488
6489 if (WARN_ON(!arvif->is_up))
6490 continue;
6491
6492 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6493 if (ret) {
6494 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6495 arvif->vdev_id, ret);
6496 continue;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006497 }
Michal Kazior500ff9f2015-03-31 10:26:21 +00006498 }
Michal Kazior0e6eb412015-06-03 12:16:56 +02006499
6500 /* All relevant vdevs are downed and associated channel resources
6501 * should be available for the channel switch now.
6502 */
6503
6504 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006505 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006506 spin_unlock_bh(&ar->data_lock);
6507
Michal Kazior0e6eb412015-06-03 12:16:56 +02006508 for (i = 0; i < n_vifs; i++) {
6509 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6510
6511 if (WARN_ON(!arvif->is_started))
6512 continue;
6513
6514 if (WARN_ON(!arvif->is_up))
6515 continue;
6516
6517 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6518 if (ret)
6519 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6520 ret);
6521
6522 ret = ath10k_mac_setup_prb_tmpl(arvif);
6523 if (ret)
6524 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6525 ret);
6526
6527 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6528 if (ret) {
6529 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6530 arvif->vdev_id, ret);
6531 continue;
6532 }
6533
6534 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6535 arvif->bssid);
6536 if (ret) {
6537 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6538 arvif->vdev_id, ret);
6539 continue;
6540 }
6541 }
6542
6543 ath10k_monitor_recalc(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006544
6545 mutex_unlock(&ar->conf_mutex);
6546 return 0;
6547}
6548
Kalle Valo5e3dd152013-06-12 20:52:10 +03006549static const struct ieee80211_ops ath10k_ops = {
6550 .tx = ath10k_tx,
6551 .start = ath10k_start,
6552 .stop = ath10k_stop,
6553 .config = ath10k_config,
6554 .add_interface = ath10k_add_interface,
6555 .remove_interface = ath10k_remove_interface,
6556 .configure_filter = ath10k_configure_filter,
6557 .bss_info_changed = ath10k_bss_info_changed,
6558 .hw_scan = ath10k_hw_scan,
6559 .cancel_hw_scan = ath10k_cancel_hw_scan,
6560 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006561 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006562 .sta_state = ath10k_sta_state,
6563 .conf_tx = ath10k_conf_tx,
6564 .remain_on_channel = ath10k_remain_on_channel,
6565 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6566 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006567 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006568 .flush = ath10k_flush,
6569 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006570 .set_antenna = ath10k_set_antenna,
6571 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006572 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006573 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006574 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006575 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006576 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006577 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006578 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6579 .get_et_stats = ath10k_debug_get_et_stats,
6580 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006581 .add_chanctx = ath10k_mac_op_add_chanctx,
6582 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6583 .change_chanctx = ath10k_mac_op_change_chanctx,
6584 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6585 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6586 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006587
6588 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6589
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006590#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006591 .suspend = ath10k_wow_op_suspend,
6592 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006593#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006594#ifdef CONFIG_MAC80211_DEBUGFS
6595 .sta_add_debugfs = ath10k_sta_add_debugfs,
6596#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006597};
6598
Kalle Valo5e3dd152013-06-12 20:52:10 +03006599#define CHAN2G(_channel, _freq, _flags) { \
6600 .band = IEEE80211_BAND_2GHZ, \
6601 .hw_value = (_channel), \
6602 .center_freq = (_freq), \
6603 .flags = (_flags), \
6604 .max_antenna_gain = 0, \
6605 .max_power = 30, \
6606}
6607
6608#define CHAN5G(_channel, _freq, _flags) { \
6609 .band = IEEE80211_BAND_5GHZ, \
6610 .hw_value = (_channel), \
6611 .center_freq = (_freq), \
6612 .flags = (_flags), \
6613 .max_antenna_gain = 0, \
6614 .max_power = 30, \
6615}
6616
6617static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6618 CHAN2G(1, 2412, 0),
6619 CHAN2G(2, 2417, 0),
6620 CHAN2G(3, 2422, 0),
6621 CHAN2G(4, 2427, 0),
6622 CHAN2G(5, 2432, 0),
6623 CHAN2G(6, 2437, 0),
6624 CHAN2G(7, 2442, 0),
6625 CHAN2G(8, 2447, 0),
6626 CHAN2G(9, 2452, 0),
6627 CHAN2G(10, 2457, 0),
6628 CHAN2G(11, 2462, 0),
6629 CHAN2G(12, 2467, 0),
6630 CHAN2G(13, 2472, 0),
6631 CHAN2G(14, 2484, 0),
6632};
6633
6634static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006635 CHAN5G(36, 5180, 0),
6636 CHAN5G(40, 5200, 0),
6637 CHAN5G(44, 5220, 0),
6638 CHAN5G(48, 5240, 0),
6639 CHAN5G(52, 5260, 0),
6640 CHAN5G(56, 5280, 0),
6641 CHAN5G(60, 5300, 0),
6642 CHAN5G(64, 5320, 0),
6643 CHAN5G(100, 5500, 0),
6644 CHAN5G(104, 5520, 0),
6645 CHAN5G(108, 5540, 0),
6646 CHAN5G(112, 5560, 0),
6647 CHAN5G(116, 5580, 0),
6648 CHAN5G(120, 5600, 0),
6649 CHAN5G(124, 5620, 0),
6650 CHAN5G(128, 5640, 0),
6651 CHAN5G(132, 5660, 0),
6652 CHAN5G(136, 5680, 0),
6653 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006654 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006655 CHAN5G(149, 5745, 0),
6656 CHAN5G(153, 5765, 0),
6657 CHAN5G(157, 5785, 0),
6658 CHAN5G(161, 5805, 0),
6659 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006660};
6661
Michal Kaziore7b54192014-08-07 11:03:27 +02006662struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006663{
6664 struct ieee80211_hw *hw;
6665 struct ath10k *ar;
6666
Michal Kaziore7b54192014-08-07 11:03:27 +02006667 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006668 if (!hw)
6669 return NULL;
6670
6671 ar = hw->priv;
6672 ar->hw = hw;
6673
6674 return ar;
6675}
6676
6677void ath10k_mac_destroy(struct ath10k *ar)
6678{
6679 ieee80211_free_hw(ar->hw);
6680}
6681
6682static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6683 {
6684 .max = 8,
6685 .types = BIT(NL80211_IFTYPE_STATION)
6686 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006687 },
6688 {
6689 .max = 3,
6690 .types = BIT(NL80211_IFTYPE_P2P_GO)
6691 },
6692 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006693 .max = 1,
6694 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6695 },
6696 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006697 .max = 7,
6698 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006699#ifdef CONFIG_MAC80211_MESH
6700 | BIT(NL80211_IFTYPE_MESH_POINT)
6701#endif
Michal Kaziord531cb82013-07-31 10:55:13 +02006702 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006703};
6704
Bartosz Markowskif2595092013-12-10 16:20:39 +01006705static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006706 {
6707 .max = 8,
6708 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006709#ifdef CONFIG_MAC80211_MESH
6710 | BIT(NL80211_IFTYPE_MESH_POINT)
6711#endif
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006712 },
6713};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006714
6715static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6716 {
6717 .limits = ath10k_if_limits,
6718 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6719 .max_interfaces = 8,
6720 .num_different_channels = 1,
6721 .beacon_int_infra_match = true,
6722 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006723};
6724
6725static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006726 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006727 .limits = ath10k_10x_if_limits,
6728 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006729 .max_interfaces = 8,
6730 .num_different_channels = 1,
6731 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006732#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006733 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6734 BIT(NL80211_CHAN_WIDTH_20) |
6735 BIT(NL80211_CHAN_WIDTH_40) |
6736 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006737#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006738 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006739};
6740
Michal Kaziorcf327842015-03-31 10:26:25 +00006741static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6742 {
6743 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02006744 .types = BIT(NL80211_IFTYPE_STATION),
6745 },
6746 {
6747 .max = 2,
6748 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006749#ifdef CONFIG_MAC80211_MESH
6750 BIT(NL80211_IFTYPE_MESH_POINT) |
6751#endif
Michal Kaziorcf327842015-03-31 10:26:25 +00006752 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6753 BIT(NL80211_IFTYPE_P2P_GO),
6754 },
6755 {
6756 .max = 1,
6757 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6758 },
6759};
6760
Michal Kaziored25b112015-07-09 13:08:39 +02006761static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6762 {
6763 .max = 2,
6764 .types = BIT(NL80211_IFTYPE_STATION),
6765 },
6766 {
6767 .max = 2,
6768 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6769 },
6770 {
6771 .max = 1,
6772 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006773#ifdef CONFIG_MAC80211_MESH
6774 BIT(NL80211_IFTYPE_MESH_POINT) |
6775#endif
Michal Kaziored25b112015-07-09 13:08:39 +02006776 BIT(NL80211_IFTYPE_P2P_GO),
6777 },
6778 {
6779 .max = 1,
6780 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6781 },
6782};
6783
Michal Kaziorcf327842015-03-31 10:26:25 +00006784static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6785 {
6786 .max = 1,
6787 .types = BIT(NL80211_IFTYPE_STATION),
6788 },
6789 {
6790 .max = 1,
6791 .types = BIT(NL80211_IFTYPE_ADHOC),
6792 },
6793};
6794
6795/* FIXME: This is not thouroughly tested. These combinations may over- or
6796 * underestimate hw/fw capabilities.
6797 */
6798static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6799 {
6800 .limits = ath10k_tlv_if_limit,
6801 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02006802 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006803 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6804 },
6805 {
6806 .limits = ath10k_tlv_if_limit_ibss,
6807 .num_different_channels = 1,
6808 .max_interfaces = 2,
6809 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6810 },
6811};
6812
6813static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6814 {
6815 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02006816 .num_different_channels = 1,
6817 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006818 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6819 },
6820 {
Michal Kaziored25b112015-07-09 13:08:39 +02006821 .limits = ath10k_tlv_qcs_if_limit,
6822 .num_different_channels = 2,
6823 .max_interfaces = 4,
6824 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6825 },
6826 {
Michal Kaziorcf327842015-03-31 10:26:25 +00006827 .limits = ath10k_tlv_if_limit_ibss,
6828 .num_different_channels = 1,
6829 .max_interfaces = 2,
6830 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6831 },
6832};
6833
Raja Manicf36fef2015-06-22 20:22:25 +05306834static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6835 {
6836 .max = 1,
6837 .types = BIT(NL80211_IFTYPE_STATION),
6838 },
6839 {
6840 .max = 16,
6841 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006842#ifdef CONFIG_MAC80211_MESH
6843 | BIT(NL80211_IFTYPE_MESH_POINT)
6844#endif
Raja Manicf36fef2015-06-22 20:22:25 +05306845 },
6846};
6847
6848static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6849 {
6850 .limits = ath10k_10_4_if_limits,
6851 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6852 .max_interfaces = 16,
6853 .num_different_channels = 1,
6854 .beacon_int_infra_match = true,
6855#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6856 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6857 BIT(NL80211_CHAN_WIDTH_20) |
6858 BIT(NL80211_CHAN_WIDTH_40) |
6859 BIT(NL80211_CHAN_WIDTH_80),
6860#endif
6861 },
6862};
6863
Kalle Valo5e3dd152013-06-12 20:52:10 +03006864static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6865{
6866 struct ieee80211_sta_vht_cap vht_cap = {0};
6867 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006868 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006869 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006870
6871 vht_cap.vht_supported = 1;
6872 vht_cap.cap = ar->vht_cap_info;
6873
Michal Kaziorbc657a362015-02-26 11:11:22 +01006874 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6875 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
Bartosz Markowski707a0c82015-09-02 13:20:19 +02006876 val = ath10k_mac_get_vht_cap_bf_sts(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006877 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6878 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6879
6880 vht_cap.cap |= val;
6881 }
6882
6883 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6884 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02006885 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006886 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6887 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6888
6889 vht_cap.cap |= val;
6890 }
6891
Michal Kazior8865bee42013-07-24 12:36:46 +02006892 mcs_map = 0;
6893 for (i = 0; i < 8; i++) {
6894 if (i < ar->num_rf_chains)
6895 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6896 else
6897 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6898 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006899
6900 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6901 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6902
6903 return vht_cap;
6904}
6905
6906static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6907{
6908 int i;
6909 struct ieee80211_sta_ht_cap ht_cap = {0};
6910
6911 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6912 return ht_cap;
6913
6914 ht_cap.ht_supported = 1;
6915 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6916 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6917 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6918 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6919 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6920
6921 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6922 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6923
6924 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6925 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6926
6927 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6928 u32 smps;
6929
6930 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
6931 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6932
6933 ht_cap.cap |= smps;
6934 }
6935
6936 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6937 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6938
6939 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6940 u32 stbc;
6941
6942 stbc = ar->ht_cap_info;
6943 stbc &= WMI_HT_CAP_RX_STBC;
6944 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6945 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6946 stbc &= IEEE80211_HT_CAP_RX_STBC;
6947
6948 ht_cap.cap |= stbc;
6949 }
6950
6951 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6952 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6953
6954 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6955 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6956
6957 /* max AMSDU is implicitly taken from vht_cap_info */
6958 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6959 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6960
Michal Kazior8865bee42013-07-24 12:36:46 +02006961 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006962 ht_cap.mcs.rx_mask[i] = 0xFF;
6963
6964 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6965
6966 return ht_cap;
6967}
6968
Kalle Valo5e3dd152013-06-12 20:52:10 +03006969static void ath10k_get_arvif_iter(void *data, u8 *mac,
6970 struct ieee80211_vif *vif)
6971{
6972 struct ath10k_vif_iter *arvif_iter = data;
6973 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6974
6975 if (arvif->vdev_id == arvif_iter->vdev_id)
6976 arvif_iter->arvif = arvif;
6977}
6978
6979struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6980{
6981 struct ath10k_vif_iter arvif_iter;
6982 u32 flags;
6983
6984 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6985 arvif_iter.vdev_id = vdev_id;
6986
6987 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6988 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6989 flags,
6990 ath10k_get_arvif_iter,
6991 &arvif_iter);
6992 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006993 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006994 return NULL;
6995 }
6996
6997 return arvif_iter.arvif;
6998}
6999
7000int ath10k_mac_register(struct ath10k *ar)
7001{
Johannes Berg3cb10942015-01-22 21:38:45 +01007002 static const u32 cipher_suites[] = {
7003 WLAN_CIPHER_SUITE_WEP40,
7004 WLAN_CIPHER_SUITE_WEP104,
7005 WLAN_CIPHER_SUITE_TKIP,
7006 WLAN_CIPHER_SUITE_CCMP,
7007 WLAN_CIPHER_SUITE_AES_CMAC,
7008 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03007009 struct ieee80211_supported_band *band;
7010 struct ieee80211_sta_vht_cap vht_cap;
7011 struct ieee80211_sta_ht_cap ht_cap;
7012 void *channels;
7013 int ret;
7014
7015 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7016
7017 SET_IEEE80211_DEV(ar->hw, ar->dev);
7018
7019 ht_cap = ath10k_get_ht_cap(ar);
7020 vht_cap = ath10k_create_vht_cap(ar);
7021
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00007022 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
7023 ARRAY_SIZE(ath10k_5ghz_channels)) !=
7024 ATH10K_NUM_CHANS);
7025
Kalle Valo5e3dd152013-06-12 20:52:10 +03007026 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
7027 channels = kmemdup(ath10k_2ghz_channels,
7028 sizeof(ath10k_2ghz_channels),
7029 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02007030 if (!channels) {
7031 ret = -ENOMEM;
7032 goto err_free;
7033 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007034
7035 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
7036 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7037 band->channels = channels;
7038 band->n_bitrates = ath10k_g_rates_size;
7039 band->bitrates = ath10k_g_rates;
7040 band->ht_cap = ht_cap;
7041
Yanbo Lid68bb122015-01-23 08:18:20 +08007042 /* Enable the VHT support at 2.4 GHz */
7043 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007044
7045 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
7046 }
7047
7048 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7049 channels = kmemdup(ath10k_5ghz_channels,
7050 sizeof(ath10k_5ghz_channels),
7051 GFP_KERNEL);
7052 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007053 ret = -ENOMEM;
7054 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007055 }
7056
7057 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7058 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7059 band->channels = channels;
7060 band->n_bitrates = ath10k_a_rates_size;
7061 band->bitrates = ath10k_a_rates;
7062 band->ht_cap = ht_cap;
7063 band->vht_cap = vht_cap;
7064 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7065 }
7066
7067 ar->hw->wiphy->interface_modes =
7068 BIT(NL80211_IFTYPE_STATION) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007069 BIT(NL80211_IFTYPE_AP) |
7070 BIT(NL80211_IFTYPE_MESH_POINT);
Bartosz Markowskid3541812013-12-10 16:20:40 +01007071
Ben Greear46acf7b2014-05-16 17:15:38 +03007072 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
7073 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
7074
Bartosz Markowskid3541812013-12-10 16:20:40 +01007075 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7076 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007077 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007078 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7079 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007080
Johannes Berg30686bf2015-06-02 21:39:54 +02007081 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7082 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7083 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7084 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7085 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7086 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7087 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7088 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007089 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7090 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7091 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7092 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7093 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7094 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007095
David Liuccec9032015-07-24 20:25:32 +03007096 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7097 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7098
Eliad Peller0d8614b2014-09-10 14:07:36 +03007099 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007100 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007101
Kalle Valo5e3dd152013-06-12 20:52:10 +03007102 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007103 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007104
7105 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007106 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7107 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007108 }
7109
7110 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7111 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7112
7113 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007114 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007115
Kalle Valo5e3dd152013-06-12 20:52:10 +03007116 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7117
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007118 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7119 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7120
7121 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7122 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7123 * correct Probe Responses. This is more of a hack advert..
7124 */
7125 ar->hw->wiphy->probe_resp_offload |=
7126 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7127 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7128 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7129 }
7130
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007131 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7132 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7133
Kalle Valo5e3dd152013-06-12 20:52:10 +03007134 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007135 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007136 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7137
7138 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007139 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7140
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007141 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7142
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007143 ret = ath10k_wow_init(ar);
7144 if (ret) {
7145 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7146 goto err_free;
7147 }
7148
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007149 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7150
Kalle Valo5e3dd152013-06-12 20:52:10 +03007151 /*
7152 * on LL hardware queues are managed entirely by the FW
7153 * so we only advertise to mac we can do the queues thing
7154 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007155 ar->hw->queues = IEEE80211_MAX_QUEUES;
7156
7157 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7158 * something that vdev_ids can't reach so that we don't stop the queue
7159 * accidentally.
7160 */
7161 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007162
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007163 switch (ar->wmi.op_version) {
7164 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007165 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7166 ar->hw->wiphy->n_iface_combinations =
7167 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007168 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007169 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007170 case ATH10K_FW_WMI_OP_VERSION_TLV:
7171 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7172 ar->hw->wiphy->iface_combinations =
7173 ath10k_tlv_qcs_if_comb;
7174 ar->hw->wiphy->n_iface_combinations =
7175 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7176 } else {
7177 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7178 ar->hw->wiphy->n_iface_combinations =
7179 ARRAY_SIZE(ath10k_tlv_if_comb);
7180 }
7181 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7182 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007183 case ATH10K_FW_WMI_OP_VERSION_10_1:
7184 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007185 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007186 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7187 ar->hw->wiphy->n_iface_combinations =
7188 ARRAY_SIZE(ath10k_10x_if_comb);
7189 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307190 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307191 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7192 ar->hw->wiphy->n_iface_combinations =
7193 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307194 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007195 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7196 case ATH10K_FW_WMI_OP_VERSION_MAX:
7197 WARN_ON(1);
7198 ret = -EINVAL;
7199 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007200 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007201
David Liuccec9032015-07-24 20:25:32 +03007202 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7203 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007204
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007205 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7206 /* Init ath dfs pattern detector */
7207 ar->ath_common.debug_mask = ATH_DBG_DFS;
7208 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7209 NL80211_DFS_UNSET);
7210
7211 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007212 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007213 }
7214
Kalle Valo5e3dd152013-06-12 20:52:10 +03007215 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7216 ath10k_reg_notifier);
7217 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007218 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007219 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007220 }
7221
Johannes Berg3cb10942015-01-22 21:38:45 +01007222 ar->hw->wiphy->cipher_suites = cipher_suites;
7223 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7224
Kalle Valo5e3dd152013-06-12 20:52:10 +03007225 ret = ieee80211_register_hw(ar->hw);
7226 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007227 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007228 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007229 }
7230
7231 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7232 ret = regulatory_hint(ar->hw->wiphy,
7233 ar->ath_common.regulatory.alpha2);
7234 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007235 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007236 }
7237
7238 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007239
7240err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007241 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02007242err_free:
7243 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7244 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7245
Kalle Valo5e3dd152013-06-12 20:52:10 +03007246 return ret;
7247}
7248
7249void ath10k_mac_unregister(struct ath10k *ar)
7250{
7251 ieee80211_unregister_hw(ar->hw);
7252
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007253 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7254 ar->dfs_detector->exit(ar->dfs_detector);
7255
Kalle Valo5e3dd152013-06-12 20:52:10 +03007256 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7257 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7258
7259 SET_IEEE80211_DEV(ar->hw, NULL);
7260}