blob: 80efcc8debfec8157ea4daa1277296a5b9edd217 [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;
4214 case NL80211_IFTYPE_AP:
4215 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4216
4217 if (vif->p2p)
4218 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4219 break;
4220 case NL80211_IFTYPE_MONITOR:
4221 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4222 break;
4223 default:
4224 WARN_ON(1);
4225 break;
4226 }
4227
Michal Kazior96d828d2015-03-31 10:26:23 +00004228 /* Using vdev_id as queue number will make it very easy to do per-vif
4229 * tx queue locking. This shouldn't wrap due to interface combinations
4230 * but do a modulo for correctness sake and prevent using offchannel tx
4231 * queues for regular vif tx.
4232 */
4233 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4234 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4235 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4236
Michal Kazior64badcb2014-09-18 11:18:02 +03004237 /* Some firmware revisions don't wait for beacon tx completion before
4238 * sending another SWBA event. This could lead to hardware using old
4239 * (freed) beacon data in some cases, e.g. tx credit starvation
4240 * combined with missed TBTT. This is very very rare.
4241 *
4242 * On non-IOMMU-enabled hosts this could be a possible security issue
4243 * because hw could beacon some random data on the air. On
4244 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4245 * device would crash.
4246 *
4247 * Since there are no beacon tx completions (implicit nor explicit)
4248 * propagated to host the only workaround for this is to allocate a
4249 * DMA-coherent buffer for a lifetime of a vif and use it for all
4250 * beacon tx commands. Worst case for this approach is some beacons may
4251 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4252 */
4253 if (vif->type == NL80211_IFTYPE_ADHOC ||
4254 vif->type == NL80211_IFTYPE_AP) {
4255 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4256 IEEE80211_MAX_FRAME_LEN,
4257 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304258 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004259 if (!arvif->beacon_buf) {
4260 ret = -ENOMEM;
4261 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4262 ret);
4263 goto err;
4264 }
4265 }
David Liuccec9032015-07-24 20:25:32 +03004266 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4267 arvif->nohwcrypt = true;
4268
4269 if (arvif->nohwcrypt &&
4270 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4271 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4272 goto err;
4273 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004274
4275 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4276 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4277 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004278
4279 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4280 arvif->vdev_subtype, vif->addr);
4281 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004282 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004283 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004284 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004285 }
4286
Ben Greear16c11172014-09-23 14:17:16 -07004287 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004288 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004289
Michal Kazior46725b152015-01-28 09:57:49 +02004290 /* It makes no sense to have firmware do keepalives. mac80211 already
4291 * takes care of this with idle connection polling.
4292 */
4293 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004294 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004295 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004296 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004297 goto err_vdev_delete;
4298 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004299
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004300 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004301
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004302 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4303 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004304 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004305 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004306 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004307 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004308 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004309 goto err_vdev_delete;
4310 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004311
Ben Greear5572a952014-11-24 16:22:10 +02004312 if (ar->cfg_tx_chainmask) {
4313 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4314
4315 vdev_param = ar->wmi.vdev_param->nss;
4316 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4317 nss);
4318 if (ret) {
4319 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4320 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4321 ret);
4322 goto err_vdev_delete;
4323 }
4324 }
4325
Michal Kaziore57e0572015-03-24 13:14:03 +00004326 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4327 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004328 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4329 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004330 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004331 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004332 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004333 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004334 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004335 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004336
Michal Kaziore57e0572015-03-24 13:14:03 +00004337 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004338 ret = ath10k_mac_set_kickout(arvif);
4339 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004340 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004341 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004342 goto err_peer_delete;
4343 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004344 }
4345
4346 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4347 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4348 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4349 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4350 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004351 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004352 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004353 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004354 goto err_peer_delete;
4355 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004356
Michal Kazior9f9b5742014-12-12 12:41:36 +01004357 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004358 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004359 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004360 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004361 goto err_peer_delete;
4362 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004363
Michal Kazior9f9b5742014-12-12 12:41:36 +01004364 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004365 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004366 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004367 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004368 goto err_peer_delete;
4369 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004370 }
4371
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304372 ret = ath10k_mac_set_txbf_conf(arvif);
4373 if (ret) {
4374 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4375 arvif->vdev_id, ret);
4376 goto err_peer_delete;
4377 }
4378
Michal Kazior424121c2013-07-22 14:13:31 +02004379 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004380 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004381 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004382 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004383 goto err_peer_delete;
4384 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004385
Michal Kazior7d9d5582014-10-21 10:40:15 +03004386 arvif->txpower = vif->bss_conf.txpower;
4387 ret = ath10k_mac_txpower_recalc(ar);
4388 if (ret) {
4389 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4390 goto err_peer_delete;
4391 }
4392
Michal Kazior500ff9f2015-03-31 10:26:21 +00004393 if (vif->type == NL80211_IFTYPE_MONITOR) {
4394 ar->monitor_arvif = arvif;
4395 ret = ath10k_monitor_recalc(ar);
4396 if (ret) {
4397 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4398 goto err_peer_delete;
4399 }
4400 }
4401
Michal Kazior6d2d51e2015-08-07 09:08:21 +02004402 spin_lock_bh(&ar->htt.tx_lock);
4403 if (!ar->tx_paused)
4404 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4405 spin_unlock_bh(&ar->htt.tx_lock);
4406
Kalle Valo5e3dd152013-06-12 20:52:10 +03004407 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004408 return 0;
4409
4410err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004411 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4412 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004413 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4414
4415err_vdev_delete:
4416 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004417 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004418 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004419
4420err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004421 if (arvif->beacon_buf) {
4422 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4423 arvif->beacon_buf, arvif->beacon_paddr);
4424 arvif->beacon_buf = NULL;
4425 }
4426
Michal Kazior9dad14a2013-10-16 15:44:45 +03004427 mutex_unlock(&ar->conf_mutex);
4428
Kalle Valo5e3dd152013-06-12 20:52:10 +03004429 return ret;
4430}
4431
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004432static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4433{
4434 int i;
4435
4436 for (i = 0; i < BITS_PER_LONG; i++)
4437 ath10k_mac_vif_tx_unlock(arvif, i);
4438}
4439
Kalle Valo5e3dd152013-06-12 20:52:10 +03004440static void ath10k_remove_interface(struct ieee80211_hw *hw,
4441 struct ieee80211_vif *vif)
4442{
4443 struct ath10k *ar = hw->priv;
4444 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4445 int ret;
4446
Michal Kazior81a9a172015-03-05 16:02:17 +02004447 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004448 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004449
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304450 mutex_lock(&ar->conf_mutex);
4451
Michal Kaziored543882013-09-13 14:16:56 +02004452 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004453 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004454 spin_unlock_bh(&ar->data_lock);
4455
Simon Wunderlich855aed12014-08-02 09:12:54 +03004456 ret = ath10k_spectral_vif_stop(arvif);
4457 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004458 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004459 arvif->vdev_id, ret);
4460
Ben Greear16c11172014-09-23 14:17:16 -07004461 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004462 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004463
Michal Kaziore57e0572015-03-24 13:14:03 +00004464 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4465 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004466 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4467 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004468 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004469 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004470 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004471
4472 kfree(arvif->u.ap.noa_data);
4473 }
4474
Michal Kazior7aa7a722014-08-25 12:09:38 +02004475 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004476 arvif->vdev_id);
4477
Kalle Valo5e3dd152013-06-12 20:52:10 +03004478 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4479 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004480 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004481 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004482
Michal Kazior2c512052015-02-15 16:50:40 +02004483 /* Some firmware revisions don't notify host about self-peer removal
4484 * until after associated vdev is deleted.
4485 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004486 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4487 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004488 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4489 vif->addr);
4490 if (ret)
4491 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4492 arvif->vdev_id, ret);
4493
4494 spin_lock_bh(&ar->data_lock);
4495 ar->num_peers--;
4496 spin_unlock_bh(&ar->data_lock);
4497 }
4498
Kalle Valo5e3dd152013-06-12 20:52:10 +03004499 ath10k_peer_cleanup(ar, arvif->vdev_id);
4500
Michal Kazior500ff9f2015-03-31 10:26:21 +00004501 if (vif->type == NL80211_IFTYPE_MONITOR) {
4502 ar->monitor_arvif = NULL;
4503 ret = ath10k_monitor_recalc(ar);
4504 if (ret)
4505 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4506 }
4507
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004508 spin_lock_bh(&ar->htt.tx_lock);
4509 ath10k_mac_vif_tx_unlock_all(arvif);
4510 spin_unlock_bh(&ar->htt.tx_lock);
4511
Kalle Valo5e3dd152013-06-12 20:52:10 +03004512 mutex_unlock(&ar->conf_mutex);
4513}
4514
4515/*
4516 * FIXME: Has to be verified.
4517 */
4518#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004519 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004520 FIF_CONTROL | \
4521 FIF_PSPOLL | \
4522 FIF_OTHER_BSS | \
4523 FIF_BCN_PRBRESP_PROMISC | \
4524 FIF_PROBE_REQ | \
4525 FIF_FCSFAIL)
4526
4527static void ath10k_configure_filter(struct ieee80211_hw *hw,
4528 unsigned int changed_flags,
4529 unsigned int *total_flags,
4530 u64 multicast)
4531{
4532 struct ath10k *ar = hw->priv;
4533 int ret;
4534
4535 mutex_lock(&ar->conf_mutex);
4536
4537 changed_flags &= SUPPORTED_FILTERS;
4538 *total_flags &= SUPPORTED_FILTERS;
4539 ar->filter_flags = *total_flags;
4540
Michal Kazior19337472014-08-28 12:58:16 +02004541 ret = ath10k_monitor_recalc(ar);
4542 if (ret)
4543 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004544
4545 mutex_unlock(&ar->conf_mutex);
4546}
4547
4548static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4549 struct ieee80211_vif *vif,
4550 struct ieee80211_bss_conf *info,
4551 u32 changed)
4552{
4553 struct ath10k *ar = hw->priv;
4554 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4555 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004556 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004557
4558 mutex_lock(&ar->conf_mutex);
4559
4560 if (changed & BSS_CHANGED_IBSS)
4561 ath10k_control_ibss(arvif, info, vif->addr);
4562
4563 if (changed & BSS_CHANGED_BEACON_INT) {
4564 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004565 vdev_param = ar->wmi.vdev_param->beacon_interval;
4566 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004567 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004568 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004569 "mac vdev %d beacon_interval %d\n",
4570 arvif->vdev_id, arvif->beacon_interval);
4571
Kalle Valo5e3dd152013-06-12 20:52:10 +03004572 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004573 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004574 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004575 }
4576
4577 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004578 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004579 "vdev %d set beacon tx mode to staggered\n",
4580 arvif->vdev_id);
4581
Bartosz Markowski226a3392013-09-26 17:47:16 +02004582 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4583 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004584 WMI_BEACON_STAGGERED_MODE);
4585 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004586 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004587 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004588
4589 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4590 if (ret)
4591 ath10k_warn(ar, "failed to update beacon template: %d\n",
4592 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004593 }
4594
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004595 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4596 ret = ath10k_mac_setup_prb_tmpl(arvif);
4597 if (ret)
4598 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4599 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004600 }
4601
Michal Kaziorba2479f2015-01-24 12:14:51 +02004602 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004603 arvif->dtim_period = info->dtim_period;
4604
Michal Kazior7aa7a722014-08-25 12:09:38 +02004605 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004606 "mac vdev %d dtim_period %d\n",
4607 arvif->vdev_id, arvif->dtim_period);
4608
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004609 vdev_param = ar->wmi.vdev_param->dtim_period;
4610 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004611 arvif->dtim_period);
4612 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004613 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004614 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004615 }
4616
4617 if (changed & BSS_CHANGED_SSID &&
4618 vif->type == NL80211_IFTYPE_AP) {
4619 arvif->u.ap.ssid_len = info->ssid_len;
4620 if (info->ssid_len)
4621 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4622 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4623 }
4624
Michal Kazior077efc82014-10-21 10:10:29 +03004625 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4626 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004627
4628 if (changed & BSS_CHANGED_BEACON_ENABLED)
4629 ath10k_control_beaconing(arvif, info);
4630
4631 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004632 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004633 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004634 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004635
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004636 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004637 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004638 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004639 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004640
4641 vdev_param = ar->wmi.vdev_param->protection_mode;
4642 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4643 info->use_cts_prot ? 1 : 0);
4644 if (ret)
4645 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
4646 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004647 }
4648
4649 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004650 if (info->use_short_slot)
4651 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4652
4653 else
4654 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4655
Michal Kazior7aa7a722014-08-25 12:09:38 +02004656 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004657 arvif->vdev_id, slottime);
4658
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004659 vdev_param = ar->wmi.vdev_param->slot_time;
4660 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004661 slottime);
4662 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004663 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004664 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004665 }
4666
4667 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004668 if (info->use_short_preamble)
4669 preamble = WMI_VDEV_PREAMBLE_SHORT;
4670 else
4671 preamble = WMI_VDEV_PREAMBLE_LONG;
4672
Michal Kazior7aa7a722014-08-25 12:09:38 +02004673 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004674 "mac vdev %d preamble %dn",
4675 arvif->vdev_id, preamble);
4676
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004677 vdev_param = ar->wmi.vdev_param->preamble;
4678 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004679 preamble);
4680 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004681 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004682 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004683 }
4684
4685 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004686 if (info->assoc) {
4687 /* Workaround: Make sure monitor vdev is not running
4688 * when associating to prevent some firmware revisions
4689 * (e.g. 10.1 and 10.2) from crashing.
4690 */
4691 if (ar->monitor_started)
4692 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004693 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004694 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004695 } else {
4696 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004697 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004698 }
4699
Michal Kazior7d9d5582014-10-21 10:40:15 +03004700 if (changed & BSS_CHANGED_TXPOWER) {
4701 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4702 arvif->vdev_id, info->txpower);
4703
4704 arvif->txpower = info->txpower;
4705 ret = ath10k_mac_txpower_recalc(ar);
4706 if (ret)
4707 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4708 }
4709
Michal Kaziorbf14e652014-12-12 12:41:38 +01004710 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004711 arvif->ps = vif->bss_conf.ps;
4712
4713 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004714 if (ret)
4715 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4716 arvif->vdev_id, ret);
4717 }
4718
Kalle Valo5e3dd152013-06-12 20:52:10 +03004719 mutex_unlock(&ar->conf_mutex);
4720}
4721
4722static int ath10k_hw_scan(struct ieee80211_hw *hw,
4723 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004724 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004725{
4726 struct ath10k *ar = hw->priv;
4727 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004728 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004729 struct wmi_start_scan_arg arg;
4730 int ret = 0;
4731 int i;
4732
4733 mutex_lock(&ar->conf_mutex);
4734
4735 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004736 switch (ar->scan.state) {
4737 case ATH10K_SCAN_IDLE:
4738 reinit_completion(&ar->scan.started);
4739 reinit_completion(&ar->scan.completed);
4740 ar->scan.state = ATH10K_SCAN_STARTING;
4741 ar->scan.is_roc = false;
4742 ar->scan.vdev_id = arvif->vdev_id;
4743 ret = 0;
4744 break;
4745 case ATH10K_SCAN_STARTING:
4746 case ATH10K_SCAN_RUNNING:
4747 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004748 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004749 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004750 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004751 spin_unlock_bh(&ar->data_lock);
4752
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004753 if (ret)
4754 goto exit;
4755
Kalle Valo5e3dd152013-06-12 20:52:10 +03004756 memset(&arg, 0, sizeof(arg));
4757 ath10k_wmi_start_scan_init(ar, &arg);
4758 arg.vdev_id = arvif->vdev_id;
4759 arg.scan_id = ATH10K_SCAN_ID;
4760
Kalle Valo5e3dd152013-06-12 20:52:10 +03004761 if (req->ie_len) {
4762 arg.ie_len = req->ie_len;
4763 memcpy(arg.ie, req->ie, arg.ie_len);
4764 }
4765
4766 if (req->n_ssids) {
4767 arg.n_ssids = req->n_ssids;
4768 for (i = 0; i < arg.n_ssids; i++) {
4769 arg.ssids[i].len = req->ssids[i].ssid_len;
4770 arg.ssids[i].ssid = req->ssids[i].ssid;
4771 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004772 } else {
4773 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004774 }
4775
4776 if (req->n_channels) {
4777 arg.n_channels = req->n_channels;
4778 for (i = 0; i < arg.n_channels; i++)
4779 arg.channels[i] = req->channels[i]->center_freq;
4780 }
4781
4782 ret = ath10k_start_scan(ar, &arg);
4783 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004784 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004785 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004786 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004787 spin_unlock_bh(&ar->data_lock);
4788 }
4789
4790exit:
4791 mutex_unlock(&ar->conf_mutex);
4792 return ret;
4793}
4794
4795static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4796 struct ieee80211_vif *vif)
4797{
4798 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004799
4800 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004801 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004802 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004803
4804 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004805}
4806
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004807static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4808 struct ath10k_vif *arvif,
4809 enum set_key_cmd cmd,
4810 struct ieee80211_key_conf *key)
4811{
4812 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4813 int ret;
4814
4815 /* 10.1 firmware branch requires default key index to be set to group
4816 * key index after installing it. Otherwise FW/HW Txes corrupted
4817 * frames with multi-vif APs. This is not required for main firmware
4818 * branch (e.g. 636).
4819 *
Michal Kazior8461baf2015-04-10 13:23:22 +00004820 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4821 *
4822 * FIXME: It remains unknown if this is required for multi-vif STA
4823 * interfaces on 10.1.
4824 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004825
Michal Kazior8461baf2015-04-10 13:23:22 +00004826 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4827 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004828 return;
4829
4830 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4831 return;
4832
4833 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4834 return;
4835
4836 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4837 return;
4838
4839 if (cmd != SET_KEY)
4840 return;
4841
4842 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4843 key->keyidx);
4844 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004845 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004846 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004847}
4848
Kalle Valo5e3dd152013-06-12 20:52:10 +03004849static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4850 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4851 struct ieee80211_key_conf *key)
4852{
4853 struct ath10k *ar = hw->priv;
4854 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4855 struct ath10k_peer *peer;
4856 const u8 *peer_addr;
4857 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4858 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4859 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004860 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01004861 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004862 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004863
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004864 /* this one needs to be done in software */
4865 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4866 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004867
David Liuccec9032015-07-24 20:25:32 +03004868 if (arvif->nohwcrypt)
4869 return 1;
4870
Kalle Valo5e3dd152013-06-12 20:52:10 +03004871 if (key->keyidx > WMI_MAX_KEY_INDEX)
4872 return -ENOSPC;
4873
4874 mutex_lock(&ar->conf_mutex);
4875
4876 if (sta)
4877 peer_addr = sta->addr;
4878 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4879 peer_addr = vif->bss_conf.bssid;
4880 else
4881 peer_addr = vif->addr;
4882
4883 key->hw_key_idx = key->keyidx;
4884
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03004885 if (is_wep) {
4886 if (cmd == SET_KEY)
4887 arvif->wep_keys[key->keyidx] = key;
4888 else
4889 arvif->wep_keys[key->keyidx] = NULL;
4890 }
4891
Kalle Valo5e3dd152013-06-12 20:52:10 +03004892 /* the peer should not disappear in mid-way (unless FW goes awry) since
4893 * we already hold conf_mutex. we just make sure its there now. */
4894 spin_lock_bh(&ar->data_lock);
4895 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4896 spin_unlock_bh(&ar->data_lock);
4897
4898 if (!peer) {
4899 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004900 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004901 peer_addr);
4902 ret = -EOPNOTSUPP;
4903 goto exit;
4904 } else {
4905 /* if the peer doesn't exist there is no key to disable
4906 * anymore */
4907 goto exit;
4908 }
4909 }
4910
Michal Kazior7cc45732015-03-09 14:24:17 +01004911 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4912 flags |= WMI_KEY_PAIRWISE;
4913 else
4914 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004915
Kalle Valo5e3dd152013-06-12 20:52:10 +03004916 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004917 if (cmd == DISABLE_KEY)
4918 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004919
Michal Kaziorad325cb2015-02-18 14:02:27 +01004920 /* When WEP keys are uploaded it's possible that there are
4921 * stations associated already (e.g. when merging) without any
4922 * keys. Static WEP needs an explicit per-peer key upload.
4923 */
4924 if (vif->type == NL80211_IFTYPE_ADHOC &&
4925 cmd == SET_KEY)
4926 ath10k_mac_vif_update_wep_key(arvif, key);
4927
Michal Kazior370e5672015-02-18 14:02:26 +01004928 /* 802.1x never sets the def_wep_key_idx so each set_key()
4929 * call changes default tx key.
4930 *
4931 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4932 * after first set_key().
4933 */
4934 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4935 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004936 }
4937
Michal Kazior370e5672015-02-18 14:02:26 +01004938 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004939 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004940 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004941 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004942 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004943 goto exit;
4944 }
4945
Michal Kazior29a10002015-04-10 13:05:58 +00004946 /* mac80211 sets static WEP keys as groupwise while firmware requires
4947 * them to be installed twice as both pairwise and groupwise.
4948 */
4949 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4950 flags2 = flags;
4951 flags2 &= ~WMI_KEY_GROUP;
4952 flags2 |= WMI_KEY_PAIRWISE;
4953
4954 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4955 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004956 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004957 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4958 arvif->vdev_id, peer_addr, ret);
4959 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4960 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03004961 if (ret2) {
4962 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004963 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4964 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03004965 }
Michal Kazior29a10002015-04-10 13:05:58 +00004966 goto exit;
4967 }
4968 }
4969
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004970 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4971
Kalle Valo5e3dd152013-06-12 20:52:10 +03004972 spin_lock_bh(&ar->data_lock);
4973 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4974 if (peer && cmd == SET_KEY)
4975 peer->keys[key->keyidx] = key;
4976 else if (peer && cmd == DISABLE_KEY)
4977 peer->keys[key->keyidx] = NULL;
4978 else if (peer == NULL)
4979 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004980 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004981 spin_unlock_bh(&ar->data_lock);
4982
4983exit:
4984 mutex_unlock(&ar->conf_mutex);
4985 return ret;
4986}
4987
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004988static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
4989 struct ieee80211_vif *vif,
4990 int keyidx)
4991{
4992 struct ath10k *ar = hw->priv;
4993 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4994 int ret;
4995
4996 mutex_lock(&arvif->ar->conf_mutex);
4997
4998 if (arvif->ar->state != ATH10K_STATE_ON)
4999 goto unlock;
5000
5001 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5002 arvif->vdev_id, keyidx);
5003
5004 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5005 arvif->vdev_id,
5006 arvif->ar->wmi.vdev_param->def_keyid,
5007 keyidx);
5008
5009 if (ret) {
5010 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5011 arvif->vdev_id,
5012 ret);
5013 goto unlock;
5014 }
5015
5016 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01005017
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005018unlock:
5019 mutex_unlock(&arvif->ar->conf_mutex);
5020}
5021
Michal Kazior9797feb2014-02-14 14:49:48 +01005022static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5023{
5024 struct ath10k *ar;
5025 struct ath10k_vif *arvif;
5026 struct ath10k_sta *arsta;
5027 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005028 struct cfg80211_chan_def def;
5029 enum ieee80211_band band;
5030 const u8 *ht_mcs_mask;
5031 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005032 u32 changed, bw, nss, smps;
5033 int err;
5034
5035 arsta = container_of(wk, struct ath10k_sta, update_wk);
5036 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5037 arvif = arsta->arvif;
5038 ar = arvif->ar;
5039
Michal Kazior45c9abc2015-04-21 20:42:58 +03005040 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5041 return;
5042
5043 band = def.chan->band;
5044 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5045 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5046
Michal Kazior9797feb2014-02-14 14:49:48 +01005047 spin_lock_bh(&ar->data_lock);
5048
5049 changed = arsta->changed;
5050 arsta->changed = 0;
5051
5052 bw = arsta->bw;
5053 nss = arsta->nss;
5054 smps = arsta->smps;
5055
5056 spin_unlock_bh(&ar->data_lock);
5057
5058 mutex_lock(&ar->conf_mutex);
5059
Michal Kazior45c9abc2015-04-21 20:42:58 +03005060 nss = max_t(u32, 1, nss);
5061 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5062 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5063
Michal Kazior9797feb2014-02-14 14:49:48 +01005064 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005065 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005066 sta->addr, bw);
5067
5068 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5069 WMI_PEER_CHAN_WIDTH, bw);
5070 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005071 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005072 sta->addr, bw, err);
5073 }
5074
5075 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005076 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005077 sta->addr, nss);
5078
5079 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5080 WMI_PEER_NSS, nss);
5081 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005082 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005083 sta->addr, nss, err);
5084 }
5085
5086 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005087 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005088 sta->addr, smps);
5089
5090 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5091 WMI_PEER_SMPS_STATE, smps);
5092 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005093 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005094 sta->addr, smps, err);
5095 }
5096
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005097 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5098 changed & IEEE80211_RC_NSS_CHANGED) {
5099 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005100 sta->addr);
5101
Michal Kazior590922a2014-10-21 10:10:29 +03005102 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005103 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005104 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005105 sta->addr);
5106 }
5107
Michal Kazior9797feb2014-02-14 14:49:48 +01005108 mutex_unlock(&ar->conf_mutex);
5109}
5110
Marek Puzyniak7c354242015-03-30 09:51:52 +03005111static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5112 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005113{
5114 struct ath10k *ar = arvif->ar;
5115
5116 lockdep_assert_held(&ar->conf_mutex);
5117
Marek Puzyniak7c354242015-03-30 09:51:52 +03005118 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005119 return 0;
5120
5121 if (ar->num_stations >= ar->max_num_stations)
5122 return -ENOBUFS;
5123
5124 ar->num_stations++;
5125
5126 return 0;
5127}
5128
Marek Puzyniak7c354242015-03-30 09:51:52 +03005129static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5130 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005131{
5132 struct ath10k *ar = arvif->ar;
5133
5134 lockdep_assert_held(&ar->conf_mutex);
5135
Marek Puzyniak7c354242015-03-30 09:51:52 +03005136 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005137 return;
5138
5139 ar->num_stations--;
5140}
5141
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005142struct ath10k_mac_tdls_iter_data {
5143 u32 num_tdls_stations;
5144 struct ieee80211_vif *curr_vif;
5145};
5146
5147static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5148 struct ieee80211_sta *sta)
5149{
5150 struct ath10k_mac_tdls_iter_data *iter_data = data;
5151 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5152 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5153
5154 if (sta->tdls && sta_vif == iter_data->curr_vif)
5155 iter_data->num_tdls_stations++;
5156}
5157
5158static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5159 struct ieee80211_vif *vif)
5160{
5161 struct ath10k_mac_tdls_iter_data data = {};
5162
5163 data.curr_vif = vif;
5164
5165 ieee80211_iterate_stations_atomic(hw,
5166 ath10k_mac_tdls_vif_stations_count_iter,
5167 &data);
5168 return data.num_tdls_stations;
5169}
5170
5171static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5172 struct ieee80211_vif *vif)
5173{
5174 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5175 int *num_tdls_vifs = data;
5176
5177 if (vif->type != NL80211_IFTYPE_STATION)
5178 return;
5179
5180 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5181 (*num_tdls_vifs)++;
5182}
5183
5184static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5185{
5186 int num_tdls_vifs = 0;
5187
5188 ieee80211_iterate_active_interfaces_atomic(hw,
5189 IEEE80211_IFACE_ITER_NORMAL,
5190 ath10k_mac_tdls_vifs_count_iter,
5191 &num_tdls_vifs);
5192 return num_tdls_vifs;
5193}
5194
Kalle Valo5e3dd152013-06-12 20:52:10 +03005195static int ath10k_sta_state(struct ieee80211_hw *hw,
5196 struct ieee80211_vif *vif,
5197 struct ieee80211_sta *sta,
5198 enum ieee80211_sta_state old_state,
5199 enum ieee80211_sta_state new_state)
5200{
5201 struct ath10k *ar = hw->priv;
5202 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005203 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005204 int ret = 0;
5205
Michal Kazior76f90022014-02-25 09:29:57 +02005206 if (old_state == IEEE80211_STA_NOTEXIST &&
5207 new_state == IEEE80211_STA_NONE) {
5208 memset(arsta, 0, sizeof(*arsta));
5209 arsta->arvif = arvif;
5210 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5211 }
5212
Michal Kazior9797feb2014-02-14 14:49:48 +01005213 /* cancel must be done outside the mutex to avoid deadlock */
5214 if ((old_state == IEEE80211_STA_NONE &&
5215 new_state == IEEE80211_STA_NOTEXIST))
5216 cancel_work_sync(&arsta->update_wk);
5217
Kalle Valo5e3dd152013-06-12 20:52:10 +03005218 mutex_lock(&ar->conf_mutex);
5219
5220 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005221 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005222 /*
5223 * New station addition.
5224 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005225 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5226 u32 num_tdls_stations;
5227 u32 num_tdls_vifs;
5228
Michal Kaziorcfd10612014-11-25 15:16:05 +01005229 ath10k_dbg(ar, ATH10K_DBG_MAC,
5230 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5231 arvif->vdev_id, sta->addr,
5232 ar->num_stations + 1, ar->max_num_stations,
5233 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005234
Marek Puzyniak7c354242015-03-30 09:51:52 +03005235 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005236 if (ret) {
5237 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5238 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005239 goto exit;
5240 }
5241
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005242 if (sta->tdls)
5243 peer_type = WMI_PEER_TYPE_TDLS;
5244
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005245 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005246 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005247 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005248 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 -08005249 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005250 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005251 goto exit;
5252 }
Michal Kazior077efc82014-10-21 10:10:29 +03005253
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005254 if (!sta->tdls)
5255 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005256
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005257 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5258 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5259
5260 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5261 num_tdls_stations == 0) {
5262 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5263 arvif->vdev_id, ar->max_num_tdls_vdevs);
5264 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5265 ath10k_mac_dec_num_stations(arvif, sta);
5266 ret = -ENOBUFS;
5267 goto exit;
5268 }
5269
5270 if (num_tdls_stations == 0) {
5271 /* This is the first tdls peer in current vif */
5272 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5273
5274 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5275 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005276 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005277 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005278 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005279 ath10k_peer_delete(ar, arvif->vdev_id,
5280 sta->addr);
5281 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005282 goto exit;
5283 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005284 }
Michal Kazior077efc82014-10-21 10:10:29 +03005285
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005286 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5287 WMI_TDLS_PEER_STATE_PEERING);
5288 if (ret) {
5289 ath10k_warn(ar,
5290 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5291 sta->addr, arvif->vdev_id, ret);
5292 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5293 ath10k_mac_dec_num_stations(arvif, sta);
5294
5295 if (num_tdls_stations != 0)
5296 goto exit;
5297 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5298 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005299 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005300 } else if ((old_state == IEEE80211_STA_NONE &&
5301 new_state == IEEE80211_STA_NOTEXIST)) {
5302 /*
5303 * Existing station deletion.
5304 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005305 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005306 "mac vdev %d peer delete %pM (sta gone)\n",
5307 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005308
Kalle Valo5e3dd152013-06-12 20:52:10 +03005309 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5310 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005311 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005312 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005313
Marek Puzyniak7c354242015-03-30 09:51:52 +03005314 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005315
5316 if (!sta->tdls)
5317 goto exit;
5318
5319 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5320 goto exit;
5321
5322 /* This was the last tdls peer in current vif */
5323 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5324 WMI_TDLS_DISABLE);
5325 if (ret) {
5326 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5327 arvif->vdev_id, ret);
5328 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005329 } else if (old_state == IEEE80211_STA_AUTH &&
5330 new_state == IEEE80211_STA_ASSOC &&
5331 (vif->type == NL80211_IFTYPE_AP ||
5332 vif->type == NL80211_IFTYPE_ADHOC)) {
5333 /*
5334 * New association.
5335 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005336 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005337 sta->addr);
5338
Michal Kazior590922a2014-10-21 10:10:29 +03005339 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005340 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005341 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005342 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005343 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005344 new_state == IEEE80211_STA_AUTHORIZED &&
5345 sta->tdls) {
5346 /*
5347 * Tdls station authorized.
5348 */
5349 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5350 sta->addr);
5351
5352 ret = ath10k_station_assoc(ar, vif, sta, false);
5353 if (ret) {
5354 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5355 sta->addr, arvif->vdev_id, ret);
5356 goto exit;
5357 }
5358
5359 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5360 WMI_TDLS_PEER_STATE_CONNECTED);
5361 if (ret)
5362 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5363 sta->addr, arvif->vdev_id, ret);
5364 } else if (old_state == IEEE80211_STA_ASSOC &&
5365 new_state == IEEE80211_STA_AUTH &&
5366 (vif->type == NL80211_IFTYPE_AP ||
5367 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005368 /*
5369 * Disassociation.
5370 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005371 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005372 sta->addr);
5373
Michal Kazior590922a2014-10-21 10:10:29 +03005374 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005375 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005376 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005377 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005378 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005379exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005380 mutex_unlock(&ar->conf_mutex);
5381 return ret;
5382}
5383
5384static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005385 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005386{
5387 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005388 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5389 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005390 u32 value = 0;
5391 int ret = 0;
5392
Michal Kazior548db542013-07-05 16:15:15 +03005393 lockdep_assert_held(&ar->conf_mutex);
5394
Kalle Valo5e3dd152013-06-12 20:52:10 +03005395 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5396 return 0;
5397
5398 switch (ac) {
5399 case IEEE80211_AC_VO:
5400 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5401 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005402 prio = 7;
5403 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005404 break;
5405 case IEEE80211_AC_VI:
5406 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5407 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005408 prio = 5;
5409 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005410 break;
5411 case IEEE80211_AC_BE:
5412 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5413 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005414 prio = 2;
5415 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005416 break;
5417 case IEEE80211_AC_BK:
5418 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5419 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005420 prio = 0;
5421 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005422 break;
5423 }
5424
5425 if (enable)
5426 arvif->u.sta.uapsd |= value;
5427 else
5428 arvif->u.sta.uapsd &= ~value;
5429
5430 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5431 WMI_STA_PS_PARAM_UAPSD,
5432 arvif->u.sta.uapsd);
5433 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005434 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005435 goto exit;
5436 }
5437
5438 if (arvif->u.sta.uapsd)
5439 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5440 else
5441 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5442
5443 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5444 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5445 value);
5446 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005447 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005448
Michal Kazior9f9b5742014-12-12 12:41:36 +01005449 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5450 if (ret) {
5451 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5452 arvif->vdev_id, ret);
5453 return ret;
5454 }
5455
5456 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5457 if (ret) {
5458 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5459 arvif->vdev_id, ret);
5460 return ret;
5461 }
5462
Michal Kaziorb0e56152015-01-24 12:14:52 +02005463 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5464 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5465 /* Only userspace can make an educated decision when to send
5466 * trigger frame. The following effectively disables u-UAPSD
5467 * autotrigger in firmware (which is enabled by default
5468 * provided the autotrigger service is available).
5469 */
5470
5471 arg.wmm_ac = acc;
5472 arg.user_priority = prio;
5473 arg.service_interval = 0;
5474 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5475 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5476
5477 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5478 arvif->bssid, &arg, 1);
5479 if (ret) {
5480 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5481 ret);
5482 return ret;
5483 }
5484 }
5485
Kalle Valo5e3dd152013-06-12 20:52:10 +03005486exit:
5487 return ret;
5488}
5489
5490static int ath10k_conf_tx(struct ieee80211_hw *hw,
5491 struct ieee80211_vif *vif, u16 ac,
5492 const struct ieee80211_tx_queue_params *params)
5493{
5494 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005495 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005496 struct wmi_wmm_params_arg *p = NULL;
5497 int ret;
5498
5499 mutex_lock(&ar->conf_mutex);
5500
5501 switch (ac) {
5502 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005503 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005504 break;
5505 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005506 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005507 break;
5508 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005509 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005510 break;
5511 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005512 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005513 break;
5514 }
5515
5516 if (WARN_ON(!p)) {
5517 ret = -EINVAL;
5518 goto exit;
5519 }
5520
5521 p->cwmin = params->cw_min;
5522 p->cwmax = params->cw_max;
5523 p->aifs = params->aifs;
5524
5525 /*
5526 * The channel time duration programmed in the HW is in absolute
5527 * microseconds, while mac80211 gives the txop in units of
5528 * 32 microseconds.
5529 */
5530 p->txop = params->txop * 32;
5531
Michal Kazior7fc979a2015-01-28 09:57:28 +02005532 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5533 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5534 &arvif->wmm_params);
5535 if (ret) {
5536 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5537 arvif->vdev_id, ret);
5538 goto exit;
5539 }
5540 } else {
5541 /* This won't work well with multi-interface cases but it's
5542 * better than nothing.
5543 */
5544 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5545 if (ret) {
5546 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5547 goto exit;
5548 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005549 }
5550
5551 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5552 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005553 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005554
5555exit:
5556 mutex_unlock(&ar->conf_mutex);
5557 return ret;
5558}
5559
5560#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5561
5562static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5563 struct ieee80211_vif *vif,
5564 struct ieee80211_channel *chan,
5565 int duration,
5566 enum ieee80211_roc_type type)
5567{
5568 struct ath10k *ar = hw->priv;
5569 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5570 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005571 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005572 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005573
5574 mutex_lock(&ar->conf_mutex);
5575
5576 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005577 switch (ar->scan.state) {
5578 case ATH10K_SCAN_IDLE:
5579 reinit_completion(&ar->scan.started);
5580 reinit_completion(&ar->scan.completed);
5581 reinit_completion(&ar->scan.on_channel);
5582 ar->scan.state = ATH10K_SCAN_STARTING;
5583 ar->scan.is_roc = true;
5584 ar->scan.vdev_id = arvif->vdev_id;
5585 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005586 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005587 ret = 0;
5588 break;
5589 case ATH10K_SCAN_STARTING:
5590 case ATH10K_SCAN_RUNNING:
5591 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005592 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005593 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005594 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005595 spin_unlock_bh(&ar->data_lock);
5596
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005597 if (ret)
5598 goto exit;
5599
Michal Kaziorfcf98442015-03-31 11:03:47 +00005600 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005601
Kalle Valo5e3dd152013-06-12 20:52:10 +03005602 memset(&arg, 0, sizeof(arg));
5603 ath10k_wmi_start_scan_init(ar, &arg);
5604 arg.vdev_id = arvif->vdev_id;
5605 arg.scan_id = ATH10K_SCAN_ID;
5606 arg.n_channels = 1;
5607 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005608 arg.dwell_time_active = scan_time_msec;
5609 arg.dwell_time_passive = scan_time_msec;
5610 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005611 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5612 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005613 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005614
5615 ret = ath10k_start_scan(ar, &arg);
5616 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005617 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005618 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005619 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005620 spin_unlock_bh(&ar->data_lock);
5621 goto exit;
5622 }
5623
5624 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5625 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005626 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005627
5628 ret = ath10k_scan_stop(ar);
5629 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005630 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005631
Kalle Valo5e3dd152013-06-12 20:52:10 +03005632 ret = -ETIMEDOUT;
5633 goto exit;
5634 }
5635
Michal Kaziorfcf98442015-03-31 11:03:47 +00005636 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5637 msecs_to_jiffies(duration));
5638
Kalle Valo5e3dd152013-06-12 20:52:10 +03005639 ret = 0;
5640exit:
5641 mutex_unlock(&ar->conf_mutex);
5642 return ret;
5643}
5644
5645static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5646{
5647 struct ath10k *ar = hw->priv;
5648
5649 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005650
5651 spin_lock_bh(&ar->data_lock);
5652 ar->scan.roc_notify = false;
5653 spin_unlock_bh(&ar->data_lock);
5654
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005655 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005656
Kalle Valo5e3dd152013-06-12 20:52:10 +03005657 mutex_unlock(&ar->conf_mutex);
5658
Michal Kazior4eb2e162014-10-28 10:23:09 +01005659 cancel_delayed_work_sync(&ar->scan.timeout);
5660
Kalle Valo5e3dd152013-06-12 20:52:10 +03005661 return 0;
5662}
5663
5664/*
5665 * Both RTS and Fragmentation threshold are interface-specific
5666 * in ath10k, but device-specific in mac80211.
5667 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005668
5669static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5670{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005671 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005672 struct ath10k_vif *arvif;
5673 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005674
Michal Kaziorad088bf2013-10-16 15:44:46 +03005675 mutex_lock(&ar->conf_mutex);
5676 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005677 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005678 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005679
Michal Kaziorad088bf2013-10-16 15:44:46 +03005680 ret = ath10k_mac_set_rts(arvif, value);
5681 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005682 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005683 arvif->vdev_id, ret);
5684 break;
5685 }
5686 }
5687 mutex_unlock(&ar->conf_mutex);
5688
5689 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005690}
5691
Michal Kazior92092fe2015-08-03 11:16:43 +02005692static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5693{
5694 /* Even though there's a WMI enum for fragmentation threshold no known
5695 * firmware actually implements it. Moreover it is not possible to rely
5696 * frame fragmentation to mac80211 because firmware clears the "more
5697 * fragments" bit in frame control making it impossible for remote
5698 * devices to reassemble frames.
5699 *
5700 * Hence implement a dummy callback just to say fragmentation isn't
5701 * supported. This effectively prevents mac80211 from doing frame
5702 * fragmentation in software.
5703 */
5704 return -EOPNOTSUPP;
5705}
5706
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005707static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5708 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005709{
5710 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005711 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005712 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005713
5714 /* mac80211 doesn't care if we really xmit queued frames or not
5715 * we'll collect those frames either way if we stop/delete vdevs */
5716 if (drop)
5717 return;
5718
Michal Kazior548db542013-07-05 16:15:15 +03005719 mutex_lock(&ar->conf_mutex);
5720
Michal Kazioraffd3212013-07-16 09:54:35 +02005721 if (ar->state == ATH10K_STATE_WEDGED)
5722 goto skip;
5723
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005724 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005725 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005726
Michal Kazioredb82362013-07-05 16:15:14 +03005727 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005728 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005729 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005730
Michal Kazior7962b0d2014-10-28 10:34:38 +01005731 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5732 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5733 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005734
5735 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005736 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005737
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005738 if (time_left == 0 || skip)
5739 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5740 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005741
Michal Kazioraffd3212013-07-16 09:54:35 +02005742skip:
Michal Kazior548db542013-07-05 16:15:15 +03005743 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005744}
5745
5746/* TODO: Implement this function properly
5747 * For now it is needed to reply to Probe Requests in IBSS mode.
5748 * Propably we need this information from FW.
5749 */
5750static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5751{
5752 return 1;
5753}
5754
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005755static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5756 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005757{
5758 struct ath10k *ar = hw->priv;
5759
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005760 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5761 return;
5762
Michal Kazioraffd3212013-07-16 09:54:35 +02005763 mutex_lock(&ar->conf_mutex);
5764
5765 /* If device failed to restart it will be in a different state, e.g.
5766 * ATH10K_STATE_WEDGED */
5767 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005768 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005769 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005770 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005771 }
5772
5773 mutex_unlock(&ar->conf_mutex);
5774}
5775
Michal Kazior2e1dea42013-07-31 10:32:40 +02005776static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5777 struct survey_info *survey)
5778{
5779 struct ath10k *ar = hw->priv;
5780 struct ieee80211_supported_band *sband;
5781 struct survey_info *ar_survey = &ar->survey[idx];
5782 int ret = 0;
5783
5784 mutex_lock(&ar->conf_mutex);
5785
5786 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5787 if (sband && idx >= sband->n_channels) {
5788 idx -= sband->n_channels;
5789 sband = NULL;
5790 }
5791
5792 if (!sband)
5793 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5794
5795 if (!sband || idx >= sband->n_channels) {
5796 ret = -ENOENT;
5797 goto exit;
5798 }
5799
5800 spin_lock_bh(&ar->data_lock);
5801 memcpy(survey, ar_survey, sizeof(*survey));
5802 spin_unlock_bh(&ar->data_lock);
5803
5804 survey->channel = &sband->channels[idx];
5805
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005806 if (ar->rx_channel == survey->channel)
5807 survey->filled |= SURVEY_INFO_IN_USE;
5808
Michal Kazior2e1dea42013-07-31 10:32:40 +02005809exit:
5810 mutex_unlock(&ar->conf_mutex);
5811 return ret;
5812}
5813
Michal Kazior3ae54222015-03-31 10:49:20 +00005814static bool
5815ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5816 enum ieee80211_band band,
5817 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005818{
Michal Kazior3ae54222015-03-31 10:49:20 +00005819 int num_rates = 0;
5820 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005821
Michal Kazior3ae54222015-03-31 10:49:20 +00005822 num_rates += hweight32(mask->control[band].legacy);
5823
5824 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5825 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5826
5827 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5828 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5829
5830 return num_rates == 1;
5831}
5832
5833static bool
5834ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5835 enum ieee80211_band band,
5836 const struct cfg80211_bitrate_mask *mask,
5837 int *nss)
5838{
5839 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5840 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5841 u8 ht_nss_mask = 0;
5842 u8 vht_nss_mask = 0;
5843 int i;
5844
5845 if (mask->control[band].legacy)
5846 return false;
5847
5848 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5849 if (mask->control[band].ht_mcs[i] == 0)
5850 continue;
5851 else if (mask->control[band].ht_mcs[i] ==
5852 sband->ht_cap.mcs.rx_mask[i])
5853 ht_nss_mask |= BIT(i);
5854 else
5855 return false;
5856 }
5857
5858 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5859 if (mask->control[band].vht_mcs[i] == 0)
5860 continue;
5861 else if (mask->control[band].vht_mcs[i] ==
5862 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5863 vht_nss_mask |= BIT(i);
5864 else
5865 return false;
5866 }
5867
5868 if (ht_nss_mask != vht_nss_mask)
5869 return false;
5870
5871 if (ht_nss_mask == 0)
5872 return false;
5873
5874 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5875 return false;
5876
5877 *nss = fls(ht_nss_mask);
5878
5879 return true;
5880}
5881
5882static int
5883ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5884 enum ieee80211_band band,
5885 const struct cfg80211_bitrate_mask *mask,
5886 u8 *rate, u8 *nss)
5887{
5888 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5889 int rate_idx;
5890 int i;
5891 u16 bitrate;
5892 u8 preamble;
5893 u8 hw_rate;
5894
5895 if (hweight32(mask->control[band].legacy) == 1) {
5896 rate_idx = ffs(mask->control[band].legacy) - 1;
5897
5898 hw_rate = sband->bitrates[rate_idx].hw_value;
5899 bitrate = sband->bitrates[rate_idx].bitrate;
5900
5901 if (ath10k_mac_bitrate_is_cck(bitrate))
5902 preamble = WMI_RATE_PREAMBLE_CCK;
5903 else
5904 preamble = WMI_RATE_PREAMBLE_OFDM;
5905
5906 *nss = 1;
5907 *rate = preamble << 6 |
5908 (*nss - 1) << 4 |
5909 hw_rate << 0;
5910
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005911 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005912 }
5913
Michal Kazior3ae54222015-03-31 10:49:20 +00005914 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5915 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5916 *nss = i + 1;
5917 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5918 (*nss - 1) << 4 |
5919 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005920
Michal Kazior3ae54222015-03-31 10:49:20 +00005921 return 0;
5922 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005923 }
5924
Michal Kazior3ae54222015-03-31 10:49:20 +00005925 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5926 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5927 *nss = i + 1;
5928 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5929 (*nss - 1) << 4 |
5930 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005931
Michal Kazior3ae54222015-03-31 10:49:20 +00005932 return 0;
5933 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005934 }
5935
Michal Kazior3ae54222015-03-31 10:49:20 +00005936 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005937}
5938
Michal Kazior3ae54222015-03-31 10:49:20 +00005939static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5940 u8 rate, u8 nss, u8 sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005941{
5942 struct ath10k *ar = arvif->ar;
5943 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005944 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005945
Michal Kazior3ae54222015-03-31 10:49:20 +00005946 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005947
Michal Kazior3ae54222015-03-31 10:49:20 +00005948 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5949 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005950
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005951 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005952 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005953 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005954 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005955 rate, ret);
5956 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005957 }
5958
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005959 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005960 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005961 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005962 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5963 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005964 }
5965
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005966 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005967 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005968 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005969 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5970 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005971 }
5972
Michal Kazior3ae54222015-03-31 10:49:20 +00005973 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005974}
5975
Michal Kazior45c9abc2015-04-21 20:42:58 +03005976static bool
5977ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
5978 enum ieee80211_band band,
5979 const struct cfg80211_bitrate_mask *mask)
5980{
5981 int i;
5982 u16 vht_mcs;
5983
5984 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
5985 * to express all VHT MCS rate masks. Effectively only the following
5986 * ranges can be used: none, 0-7, 0-8 and 0-9.
5987 */
5988 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5989 vht_mcs = mask->control[band].vht_mcs[i];
5990
5991 switch (vht_mcs) {
5992 case 0:
5993 case BIT(8) - 1:
5994 case BIT(9) - 1:
5995 case BIT(10) - 1:
5996 break;
5997 default:
5998 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
5999 return false;
6000 }
6001 }
6002
6003 return true;
6004}
6005
6006static void ath10k_mac_set_bitrate_mask_iter(void *data,
6007 struct ieee80211_sta *sta)
6008{
6009 struct ath10k_vif *arvif = data;
6010 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6011 struct ath10k *ar = arvif->ar;
6012
6013 if (arsta->arvif != arvif)
6014 return;
6015
6016 spin_lock_bh(&ar->data_lock);
6017 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6018 spin_unlock_bh(&ar->data_lock);
6019
6020 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6021}
6022
Michal Kazior3ae54222015-03-31 10:49:20 +00006023static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6024 struct ieee80211_vif *vif,
6025 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006026{
6027 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006028 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006029 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006030 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006031 const u8 *ht_mcs_mask;
6032 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006033 u8 rate;
6034 u8 nss;
6035 u8 sgi;
6036 int single_nss;
6037 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006038
Michal Kazior500ff9f2015-03-31 10:26:21 +00006039 if (ath10k_mac_vif_chan(vif, &def))
6040 return -EPERM;
6041
Michal Kazior500ff9f2015-03-31 10:26:21 +00006042 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006043 ht_mcs_mask = mask->control[band].ht_mcs;
6044 vht_mcs_mask = mask->control[band].vht_mcs;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006045
Michal Kazior3ae54222015-03-31 10:49:20 +00006046 sgi = mask->control[band].gi;
6047 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006048 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006049
Michal Kazior3ae54222015-03-31 10:49:20 +00006050 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6051 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6052 &rate, &nss);
6053 if (ret) {
6054 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6055 arvif->vdev_id, ret);
6056 return ret;
6057 }
6058 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6059 &single_nss)) {
6060 rate = WMI_FIXED_RATE_NONE;
6061 nss = single_nss;
6062 } else {
6063 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006064 nss = min(ar->num_rf_chains,
6065 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6066 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6067
6068 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6069 return -EINVAL;
6070
6071 mutex_lock(&ar->conf_mutex);
6072
6073 arvif->bitrate_mask = *mask;
6074 ieee80211_iterate_stations_atomic(ar->hw,
6075 ath10k_mac_set_bitrate_mask_iter,
6076 arvif);
6077
6078 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006079 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006080
6081 mutex_lock(&ar->conf_mutex);
6082
Michal Kazior3ae54222015-03-31 10:49:20 +00006083 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006084 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006085 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6086 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006087 goto exit;
6088 }
6089
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006090exit:
6091 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006092
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006093 return ret;
6094}
6095
Michal Kazior9797feb2014-02-14 14:49:48 +01006096static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6097 struct ieee80211_vif *vif,
6098 struct ieee80211_sta *sta,
6099 u32 changed)
6100{
6101 struct ath10k *ar = hw->priv;
6102 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6103 u32 bw, smps;
6104
6105 spin_lock_bh(&ar->data_lock);
6106
Michal Kazior7aa7a722014-08-25 12:09:38 +02006107 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006108 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6109 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6110 sta->smps_mode);
6111
6112 if (changed & IEEE80211_RC_BW_CHANGED) {
6113 bw = WMI_PEER_CHWIDTH_20MHZ;
6114
6115 switch (sta->bandwidth) {
6116 case IEEE80211_STA_RX_BW_20:
6117 bw = WMI_PEER_CHWIDTH_20MHZ;
6118 break;
6119 case IEEE80211_STA_RX_BW_40:
6120 bw = WMI_PEER_CHWIDTH_40MHZ;
6121 break;
6122 case IEEE80211_STA_RX_BW_80:
6123 bw = WMI_PEER_CHWIDTH_80MHZ;
6124 break;
6125 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006126 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006127 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006128 bw = WMI_PEER_CHWIDTH_20MHZ;
6129 break;
6130 }
6131
6132 arsta->bw = bw;
6133 }
6134
6135 if (changed & IEEE80211_RC_NSS_CHANGED)
6136 arsta->nss = sta->rx_nss;
6137
6138 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6139 smps = WMI_PEER_SMPS_PS_NONE;
6140
6141 switch (sta->smps_mode) {
6142 case IEEE80211_SMPS_AUTOMATIC:
6143 case IEEE80211_SMPS_OFF:
6144 smps = WMI_PEER_SMPS_PS_NONE;
6145 break;
6146 case IEEE80211_SMPS_STATIC:
6147 smps = WMI_PEER_SMPS_STATIC;
6148 break;
6149 case IEEE80211_SMPS_DYNAMIC:
6150 smps = WMI_PEER_SMPS_DYNAMIC;
6151 break;
6152 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006153 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006154 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006155 smps = WMI_PEER_SMPS_PS_NONE;
6156 break;
6157 }
6158
6159 arsta->smps = smps;
6160 }
6161
Michal Kazior9797feb2014-02-14 14:49:48 +01006162 arsta->changed |= changed;
6163
6164 spin_unlock_bh(&ar->data_lock);
6165
6166 ieee80211_queue_work(hw, &arsta->update_wk);
6167}
6168
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006169static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6170{
6171 /*
6172 * FIXME: Return 0 for time being. Need to figure out whether FW
6173 * has the API to fetch 64-bit local TSF
6174 */
6175
6176 return 0;
6177}
6178
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006179static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6180 struct ieee80211_vif *vif,
6181 enum ieee80211_ampdu_mlme_action action,
6182 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6183 u8 buf_size)
6184{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006185 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006186 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6187
Michal Kazior7aa7a722014-08-25 12:09:38 +02006188 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 +02006189 arvif->vdev_id, sta->addr, tid, action);
6190
6191 switch (action) {
6192 case IEEE80211_AMPDU_RX_START:
6193 case IEEE80211_AMPDU_RX_STOP:
6194 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6195 * creation/removal. Do we need to verify this?
6196 */
6197 return 0;
6198 case IEEE80211_AMPDU_TX_START:
6199 case IEEE80211_AMPDU_TX_STOP_CONT:
6200 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6201 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6202 case IEEE80211_AMPDU_TX_OPERATIONAL:
6203 /* Firmware offloads Tx aggregation entirely so deny mac80211
6204 * Tx aggregation requests.
6205 */
6206 return -EOPNOTSUPP;
6207 }
6208
6209 return -EINVAL;
6210}
6211
Michal Kazior500ff9f2015-03-31 10:26:21 +00006212static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006213ath10k_mac_update_rx_channel(struct ath10k *ar,
6214 struct ieee80211_chanctx_conf *ctx,
6215 struct ieee80211_vif_chanctx_switch *vifs,
6216 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006217{
6218 struct cfg80211_chan_def *def = NULL;
6219
6220 /* Both locks are required because ar->rx_channel is modified. This
6221 * allows readers to hold either lock.
6222 */
6223 lockdep_assert_held(&ar->conf_mutex);
6224 lockdep_assert_held(&ar->data_lock);
6225
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006226 WARN_ON(ctx && vifs);
6227 WARN_ON(vifs && n_vifs != 1);
6228
Michal Kazior500ff9f2015-03-31 10:26:21 +00006229 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6230 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6231 * ppdu on Rx may reduce performance on low-end systems. It should be
6232 * possible to make tables/hashmaps to speed the lookup up (be vary of
6233 * cpu data cache lines though regarding sizes) but to keep the initial
6234 * implementation simple and less intrusive fallback to the slow lookup
6235 * only for multi-channel cases. Single-channel cases will remain to
6236 * use the old channel derival and thus performance should not be
6237 * affected much.
6238 */
6239 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006240 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006241 ieee80211_iter_chan_contexts_atomic(ar->hw,
6242 ath10k_mac_get_any_chandef_iter,
6243 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006244
6245 if (vifs)
6246 def = &vifs[0].new_ctx->def;
6247
Michal Kazior500ff9f2015-03-31 10:26:21 +00006248 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006249 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6250 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006251 } else {
6252 ar->rx_channel = NULL;
6253 }
6254 rcu_read_unlock();
6255}
6256
Michal Kazior500ff9f2015-03-31 10:26:21 +00006257static int
6258ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6259 struct ieee80211_chanctx_conf *ctx)
6260{
6261 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006262
6263 ath10k_dbg(ar, ATH10K_DBG_MAC,
6264 "mac chanctx add freq %hu width %d ptr %p\n",
6265 ctx->def.chan->center_freq, ctx->def.width, ctx);
6266
6267 mutex_lock(&ar->conf_mutex);
6268
6269 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006270 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006271 spin_unlock_bh(&ar->data_lock);
6272
6273 ath10k_recalc_radar_detection(ar);
6274 ath10k_monitor_recalc(ar);
6275
6276 mutex_unlock(&ar->conf_mutex);
6277
6278 return 0;
6279}
6280
6281static void
6282ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6283 struct ieee80211_chanctx_conf *ctx)
6284{
6285 struct ath10k *ar = hw->priv;
6286
6287 ath10k_dbg(ar, ATH10K_DBG_MAC,
6288 "mac chanctx remove freq %hu width %d ptr %p\n",
6289 ctx->def.chan->center_freq, ctx->def.width, ctx);
6290
6291 mutex_lock(&ar->conf_mutex);
6292
6293 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006294 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006295 spin_unlock_bh(&ar->data_lock);
6296
6297 ath10k_recalc_radar_detection(ar);
6298 ath10k_monitor_recalc(ar);
6299
6300 mutex_unlock(&ar->conf_mutex);
6301}
6302
6303static void
6304ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6305 struct ieee80211_chanctx_conf *ctx,
6306 u32 changed)
6307{
6308 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006309
6310 mutex_lock(&ar->conf_mutex);
6311
6312 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006313 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6314 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006315
6316 /* This shouldn't really happen because channel switching should use
6317 * switch_vif_chanctx().
6318 */
6319 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6320 goto unlock;
6321
Michal Kazior500ff9f2015-03-31 10:26:21 +00006322 ath10k_recalc_radar_detection(ar);
6323
6324 /* FIXME: How to configure Rx chains properly? */
6325
6326 /* No other actions are actually necessary. Firmware maintains channel
6327 * definitions per vdev internally and there's no host-side channel
6328 * context abstraction to configure, e.g. channel width.
6329 */
6330
6331unlock:
6332 mutex_unlock(&ar->conf_mutex);
6333}
6334
6335static int
6336ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6337 struct ieee80211_vif *vif,
6338 struct ieee80211_chanctx_conf *ctx)
6339{
6340 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006341 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6342 int ret;
6343
6344 mutex_lock(&ar->conf_mutex);
6345
6346 ath10k_dbg(ar, ATH10K_DBG_MAC,
6347 "mac chanctx assign ptr %p vdev_id %i\n",
6348 ctx, arvif->vdev_id);
6349
6350 if (WARN_ON(arvif->is_started)) {
6351 mutex_unlock(&ar->conf_mutex);
6352 return -EBUSY;
6353 }
6354
Michal Kazior089ab7a2015-06-03 12:16:55 +02006355 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006356 if (ret) {
6357 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6358 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006359 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006360 goto err;
6361 }
6362
6363 arvif->is_started = true;
6364
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006365 ret = ath10k_mac_vif_setup_ps(arvif);
6366 if (ret) {
6367 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6368 arvif->vdev_id, ret);
6369 goto err_stop;
6370 }
6371
Michal Kazior500ff9f2015-03-31 10:26:21 +00006372 if (vif->type == NL80211_IFTYPE_MONITOR) {
6373 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6374 if (ret) {
6375 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6376 arvif->vdev_id, ret);
6377 goto err_stop;
6378 }
6379
6380 arvif->is_up = true;
6381 }
6382
6383 mutex_unlock(&ar->conf_mutex);
6384 return 0;
6385
6386err_stop:
6387 ath10k_vdev_stop(arvif);
6388 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006389 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006390
6391err:
6392 mutex_unlock(&ar->conf_mutex);
6393 return ret;
6394}
6395
6396static void
6397ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6398 struct ieee80211_vif *vif,
6399 struct ieee80211_chanctx_conf *ctx)
6400{
6401 struct ath10k *ar = hw->priv;
6402 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6403 int ret;
6404
6405 mutex_lock(&ar->conf_mutex);
6406
6407 ath10k_dbg(ar, ATH10K_DBG_MAC,
6408 "mac chanctx unassign ptr %p vdev_id %i\n",
6409 ctx, arvif->vdev_id);
6410
6411 WARN_ON(!arvif->is_started);
6412
6413 if (vif->type == NL80211_IFTYPE_MONITOR) {
6414 WARN_ON(!arvif->is_up);
6415
6416 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6417 if (ret)
6418 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6419 arvif->vdev_id, ret);
6420
6421 arvif->is_up = false;
6422 }
6423
6424 ret = ath10k_vdev_stop(arvif);
6425 if (ret)
6426 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6427 arvif->vdev_id, ret);
6428
6429 arvif->is_started = false;
6430
6431 mutex_unlock(&ar->conf_mutex);
6432}
6433
6434static int
6435ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6436 struct ieee80211_vif_chanctx_switch *vifs,
6437 int n_vifs,
6438 enum ieee80211_chanctx_switch_mode mode)
6439{
6440 struct ath10k *ar = hw->priv;
6441 struct ath10k_vif *arvif;
Michal Kazior0e6eb412015-06-03 12:16:56 +02006442 int ret;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006443 int i;
6444
6445 mutex_lock(&ar->conf_mutex);
6446
6447 ath10k_dbg(ar, ATH10K_DBG_MAC,
6448 "mac chanctx switch n_vifs %d mode %d\n",
6449 n_vifs, mode);
6450
Michal Kazior0e6eb412015-06-03 12:16:56 +02006451 /* First stop monitor interface. Some FW versions crash if there's a
6452 * lone monitor interface.
6453 */
6454 if (ar->monitor_started)
6455 ath10k_monitor_stop(ar);
6456
Michal Kazior500ff9f2015-03-31 10:26:21 +00006457 for (i = 0; i < n_vifs; i++) {
6458 arvif = ath10k_vif_to_arvif(vifs[i].vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006459
6460 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006461 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
Michal Kazior500ff9f2015-03-31 10:26:21 +00006462 arvif->vdev_id,
6463 vifs[i].old_ctx->def.chan->center_freq,
6464 vifs[i].new_ctx->def.chan->center_freq,
6465 vifs[i].old_ctx->def.width,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006466 vifs[i].new_ctx->def.width);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006467
Michal Kazior0e6eb412015-06-03 12:16:56 +02006468 if (WARN_ON(!arvif->is_started))
6469 continue;
6470
6471 if (WARN_ON(!arvif->is_up))
6472 continue;
6473
6474 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6475 if (ret) {
6476 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6477 arvif->vdev_id, ret);
6478 continue;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006479 }
Michal Kazior500ff9f2015-03-31 10:26:21 +00006480 }
Michal Kazior0e6eb412015-06-03 12:16:56 +02006481
6482 /* All relevant vdevs are downed and associated channel resources
6483 * should be available for the channel switch now.
6484 */
6485
6486 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006487 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006488 spin_unlock_bh(&ar->data_lock);
6489
Michal Kazior0e6eb412015-06-03 12:16:56 +02006490 for (i = 0; i < n_vifs; i++) {
6491 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6492
6493 if (WARN_ON(!arvif->is_started))
6494 continue;
6495
6496 if (WARN_ON(!arvif->is_up))
6497 continue;
6498
6499 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6500 if (ret)
6501 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6502 ret);
6503
6504 ret = ath10k_mac_setup_prb_tmpl(arvif);
6505 if (ret)
6506 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6507 ret);
6508
6509 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6510 if (ret) {
6511 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6512 arvif->vdev_id, ret);
6513 continue;
6514 }
6515
6516 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6517 arvif->bssid);
6518 if (ret) {
6519 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6520 arvif->vdev_id, ret);
6521 continue;
6522 }
6523 }
6524
6525 ath10k_monitor_recalc(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006526
6527 mutex_unlock(&ar->conf_mutex);
6528 return 0;
6529}
6530
Kalle Valo5e3dd152013-06-12 20:52:10 +03006531static const struct ieee80211_ops ath10k_ops = {
6532 .tx = ath10k_tx,
6533 .start = ath10k_start,
6534 .stop = ath10k_stop,
6535 .config = ath10k_config,
6536 .add_interface = ath10k_add_interface,
6537 .remove_interface = ath10k_remove_interface,
6538 .configure_filter = ath10k_configure_filter,
6539 .bss_info_changed = ath10k_bss_info_changed,
6540 .hw_scan = ath10k_hw_scan,
6541 .cancel_hw_scan = ath10k_cancel_hw_scan,
6542 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006543 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006544 .sta_state = ath10k_sta_state,
6545 .conf_tx = ath10k_conf_tx,
6546 .remain_on_channel = ath10k_remain_on_channel,
6547 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6548 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006549 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006550 .flush = ath10k_flush,
6551 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006552 .set_antenna = ath10k_set_antenna,
6553 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006554 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006555 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006556 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006557 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006558 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006559 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006560 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6561 .get_et_stats = ath10k_debug_get_et_stats,
6562 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006563 .add_chanctx = ath10k_mac_op_add_chanctx,
6564 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6565 .change_chanctx = ath10k_mac_op_change_chanctx,
6566 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6567 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6568 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006569
6570 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6571
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006572#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006573 .suspend = ath10k_wow_op_suspend,
6574 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006575#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006576#ifdef CONFIG_MAC80211_DEBUGFS
6577 .sta_add_debugfs = ath10k_sta_add_debugfs,
6578#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006579};
6580
Kalle Valo5e3dd152013-06-12 20:52:10 +03006581#define CHAN2G(_channel, _freq, _flags) { \
6582 .band = IEEE80211_BAND_2GHZ, \
6583 .hw_value = (_channel), \
6584 .center_freq = (_freq), \
6585 .flags = (_flags), \
6586 .max_antenna_gain = 0, \
6587 .max_power = 30, \
6588}
6589
6590#define CHAN5G(_channel, _freq, _flags) { \
6591 .band = IEEE80211_BAND_5GHZ, \
6592 .hw_value = (_channel), \
6593 .center_freq = (_freq), \
6594 .flags = (_flags), \
6595 .max_antenna_gain = 0, \
6596 .max_power = 30, \
6597}
6598
6599static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6600 CHAN2G(1, 2412, 0),
6601 CHAN2G(2, 2417, 0),
6602 CHAN2G(3, 2422, 0),
6603 CHAN2G(4, 2427, 0),
6604 CHAN2G(5, 2432, 0),
6605 CHAN2G(6, 2437, 0),
6606 CHAN2G(7, 2442, 0),
6607 CHAN2G(8, 2447, 0),
6608 CHAN2G(9, 2452, 0),
6609 CHAN2G(10, 2457, 0),
6610 CHAN2G(11, 2462, 0),
6611 CHAN2G(12, 2467, 0),
6612 CHAN2G(13, 2472, 0),
6613 CHAN2G(14, 2484, 0),
6614};
6615
6616static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006617 CHAN5G(36, 5180, 0),
6618 CHAN5G(40, 5200, 0),
6619 CHAN5G(44, 5220, 0),
6620 CHAN5G(48, 5240, 0),
6621 CHAN5G(52, 5260, 0),
6622 CHAN5G(56, 5280, 0),
6623 CHAN5G(60, 5300, 0),
6624 CHAN5G(64, 5320, 0),
6625 CHAN5G(100, 5500, 0),
6626 CHAN5G(104, 5520, 0),
6627 CHAN5G(108, 5540, 0),
6628 CHAN5G(112, 5560, 0),
6629 CHAN5G(116, 5580, 0),
6630 CHAN5G(120, 5600, 0),
6631 CHAN5G(124, 5620, 0),
6632 CHAN5G(128, 5640, 0),
6633 CHAN5G(132, 5660, 0),
6634 CHAN5G(136, 5680, 0),
6635 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006636 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006637 CHAN5G(149, 5745, 0),
6638 CHAN5G(153, 5765, 0),
6639 CHAN5G(157, 5785, 0),
6640 CHAN5G(161, 5805, 0),
6641 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006642};
6643
Michal Kaziore7b54192014-08-07 11:03:27 +02006644struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006645{
6646 struct ieee80211_hw *hw;
6647 struct ath10k *ar;
6648
Michal Kaziore7b54192014-08-07 11:03:27 +02006649 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006650 if (!hw)
6651 return NULL;
6652
6653 ar = hw->priv;
6654 ar->hw = hw;
6655
6656 return ar;
6657}
6658
6659void ath10k_mac_destroy(struct ath10k *ar)
6660{
6661 ieee80211_free_hw(ar->hw);
6662}
6663
6664static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6665 {
6666 .max = 8,
6667 .types = BIT(NL80211_IFTYPE_STATION)
6668 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006669 },
6670 {
6671 .max = 3,
6672 .types = BIT(NL80211_IFTYPE_P2P_GO)
6673 },
6674 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006675 .max = 1,
6676 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6677 },
6678 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006679 .max = 7,
6680 .types = BIT(NL80211_IFTYPE_AP)
6681 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006682};
6683
Bartosz Markowskif2595092013-12-10 16:20:39 +01006684static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006685 {
6686 .max = 8,
6687 .types = BIT(NL80211_IFTYPE_AP)
6688 },
6689};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006690
6691static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6692 {
6693 .limits = ath10k_if_limits,
6694 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6695 .max_interfaces = 8,
6696 .num_different_channels = 1,
6697 .beacon_int_infra_match = true,
6698 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006699};
6700
6701static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006702 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006703 .limits = ath10k_10x_if_limits,
6704 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006705 .max_interfaces = 8,
6706 .num_different_channels = 1,
6707 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006708#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006709 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6710 BIT(NL80211_CHAN_WIDTH_20) |
6711 BIT(NL80211_CHAN_WIDTH_40) |
6712 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006713#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006714 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006715};
6716
Michal Kaziorcf327842015-03-31 10:26:25 +00006717static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6718 {
6719 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02006720 .types = BIT(NL80211_IFTYPE_STATION),
6721 },
6722 {
6723 .max = 2,
6724 .types = BIT(NL80211_IFTYPE_AP) |
Michal Kaziorcf327842015-03-31 10:26:25 +00006725 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6726 BIT(NL80211_IFTYPE_P2P_GO),
6727 },
6728 {
6729 .max = 1,
6730 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6731 },
6732};
6733
Michal Kaziored25b112015-07-09 13:08:39 +02006734static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6735 {
6736 .max = 2,
6737 .types = BIT(NL80211_IFTYPE_STATION),
6738 },
6739 {
6740 .max = 2,
6741 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6742 },
6743 {
6744 .max = 1,
6745 .types = BIT(NL80211_IFTYPE_AP) |
6746 BIT(NL80211_IFTYPE_P2P_GO),
6747 },
6748 {
6749 .max = 1,
6750 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6751 },
6752};
6753
Michal Kaziorcf327842015-03-31 10:26:25 +00006754static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6755 {
6756 .max = 1,
6757 .types = BIT(NL80211_IFTYPE_STATION),
6758 },
6759 {
6760 .max = 1,
6761 .types = BIT(NL80211_IFTYPE_ADHOC),
6762 },
6763};
6764
6765/* FIXME: This is not thouroughly tested. These combinations may over- or
6766 * underestimate hw/fw capabilities.
6767 */
6768static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6769 {
6770 .limits = ath10k_tlv_if_limit,
6771 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02006772 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006773 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6774 },
6775 {
6776 .limits = ath10k_tlv_if_limit_ibss,
6777 .num_different_channels = 1,
6778 .max_interfaces = 2,
6779 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6780 },
6781};
6782
6783static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6784 {
6785 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02006786 .num_different_channels = 1,
6787 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006788 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6789 },
6790 {
Michal Kaziored25b112015-07-09 13:08:39 +02006791 .limits = ath10k_tlv_qcs_if_limit,
6792 .num_different_channels = 2,
6793 .max_interfaces = 4,
6794 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6795 },
6796 {
Michal Kaziorcf327842015-03-31 10:26:25 +00006797 .limits = ath10k_tlv_if_limit_ibss,
6798 .num_different_channels = 1,
6799 .max_interfaces = 2,
6800 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6801 },
6802};
6803
Raja Manicf36fef2015-06-22 20:22:25 +05306804static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6805 {
6806 .max = 1,
6807 .types = BIT(NL80211_IFTYPE_STATION),
6808 },
6809 {
6810 .max = 16,
6811 .types = BIT(NL80211_IFTYPE_AP)
6812 },
6813};
6814
6815static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6816 {
6817 .limits = ath10k_10_4_if_limits,
6818 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6819 .max_interfaces = 16,
6820 .num_different_channels = 1,
6821 .beacon_int_infra_match = true,
6822#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6823 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6824 BIT(NL80211_CHAN_WIDTH_20) |
6825 BIT(NL80211_CHAN_WIDTH_40) |
6826 BIT(NL80211_CHAN_WIDTH_80),
6827#endif
6828 },
6829};
6830
Kalle Valo5e3dd152013-06-12 20:52:10 +03006831static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6832{
6833 struct ieee80211_sta_vht_cap vht_cap = {0};
6834 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006835 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006836 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006837
6838 vht_cap.vht_supported = 1;
6839 vht_cap.cap = ar->vht_cap_info;
6840
Michal Kaziorbc657a362015-02-26 11:11:22 +01006841 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6842 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
Bartosz Markowski707a0c82015-09-02 13:20:19 +02006843 val = ath10k_mac_get_vht_cap_bf_sts(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006844 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6845 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6846
6847 vht_cap.cap |= val;
6848 }
6849
6850 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6851 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02006852 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006853 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6854 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6855
6856 vht_cap.cap |= val;
6857 }
6858
Michal Kazior8865bee42013-07-24 12:36:46 +02006859 mcs_map = 0;
6860 for (i = 0; i < 8; i++) {
6861 if (i < ar->num_rf_chains)
6862 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6863 else
6864 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6865 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006866
6867 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6868 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6869
6870 return vht_cap;
6871}
6872
6873static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6874{
6875 int i;
6876 struct ieee80211_sta_ht_cap ht_cap = {0};
6877
6878 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6879 return ht_cap;
6880
6881 ht_cap.ht_supported = 1;
6882 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6883 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6884 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6885 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6886 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6887
6888 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6889 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6890
6891 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6892 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6893
6894 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6895 u32 smps;
6896
6897 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
6898 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6899
6900 ht_cap.cap |= smps;
6901 }
6902
6903 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6904 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6905
6906 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6907 u32 stbc;
6908
6909 stbc = ar->ht_cap_info;
6910 stbc &= WMI_HT_CAP_RX_STBC;
6911 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6912 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6913 stbc &= IEEE80211_HT_CAP_RX_STBC;
6914
6915 ht_cap.cap |= stbc;
6916 }
6917
6918 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6919 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6920
6921 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6922 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6923
6924 /* max AMSDU is implicitly taken from vht_cap_info */
6925 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6926 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6927
Michal Kazior8865bee42013-07-24 12:36:46 +02006928 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006929 ht_cap.mcs.rx_mask[i] = 0xFF;
6930
6931 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6932
6933 return ht_cap;
6934}
6935
Kalle Valo5e3dd152013-06-12 20:52:10 +03006936static void ath10k_get_arvif_iter(void *data, u8 *mac,
6937 struct ieee80211_vif *vif)
6938{
6939 struct ath10k_vif_iter *arvif_iter = data;
6940 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6941
6942 if (arvif->vdev_id == arvif_iter->vdev_id)
6943 arvif_iter->arvif = arvif;
6944}
6945
6946struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6947{
6948 struct ath10k_vif_iter arvif_iter;
6949 u32 flags;
6950
6951 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6952 arvif_iter.vdev_id = vdev_id;
6953
6954 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6955 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6956 flags,
6957 ath10k_get_arvif_iter,
6958 &arvif_iter);
6959 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006960 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006961 return NULL;
6962 }
6963
6964 return arvif_iter.arvif;
6965}
6966
6967int ath10k_mac_register(struct ath10k *ar)
6968{
Johannes Berg3cb10942015-01-22 21:38:45 +01006969 static const u32 cipher_suites[] = {
6970 WLAN_CIPHER_SUITE_WEP40,
6971 WLAN_CIPHER_SUITE_WEP104,
6972 WLAN_CIPHER_SUITE_TKIP,
6973 WLAN_CIPHER_SUITE_CCMP,
6974 WLAN_CIPHER_SUITE_AES_CMAC,
6975 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03006976 struct ieee80211_supported_band *band;
6977 struct ieee80211_sta_vht_cap vht_cap;
6978 struct ieee80211_sta_ht_cap ht_cap;
6979 void *channels;
6980 int ret;
6981
6982 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6983
6984 SET_IEEE80211_DEV(ar->hw, ar->dev);
6985
6986 ht_cap = ath10k_get_ht_cap(ar);
6987 vht_cap = ath10k_create_vht_cap(ar);
6988
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00006989 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
6990 ARRAY_SIZE(ath10k_5ghz_channels)) !=
6991 ATH10K_NUM_CHANS);
6992
Kalle Valo5e3dd152013-06-12 20:52:10 +03006993 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
6994 channels = kmemdup(ath10k_2ghz_channels,
6995 sizeof(ath10k_2ghz_channels),
6996 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02006997 if (!channels) {
6998 ret = -ENOMEM;
6999 goto err_free;
7000 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007001
7002 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
7003 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7004 band->channels = channels;
7005 band->n_bitrates = ath10k_g_rates_size;
7006 band->bitrates = ath10k_g_rates;
7007 band->ht_cap = ht_cap;
7008
Yanbo Lid68bb122015-01-23 08:18:20 +08007009 /* Enable the VHT support at 2.4 GHz */
7010 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007011
7012 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
7013 }
7014
7015 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7016 channels = kmemdup(ath10k_5ghz_channels,
7017 sizeof(ath10k_5ghz_channels),
7018 GFP_KERNEL);
7019 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007020 ret = -ENOMEM;
7021 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007022 }
7023
7024 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7025 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7026 band->channels = channels;
7027 band->n_bitrates = ath10k_a_rates_size;
7028 band->bitrates = ath10k_a_rates;
7029 band->ht_cap = ht_cap;
7030 band->vht_cap = vht_cap;
7031 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7032 }
7033
7034 ar->hw->wiphy->interface_modes =
7035 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007036 BIT(NL80211_IFTYPE_AP);
7037
Ben Greear46acf7b2014-05-16 17:15:38 +03007038 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
7039 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
7040
Bartosz Markowskid3541812013-12-10 16:20:40 +01007041 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7042 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007043 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007044 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7045 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007046
Johannes Berg30686bf2015-06-02 21:39:54 +02007047 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7048 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7049 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7050 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7051 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7052 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7053 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7054 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007055 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7056 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7057 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7058 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7059 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7060 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007061
David Liuccec9032015-07-24 20:25:32 +03007062 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7063 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7064
Eliad Peller0d8614b2014-09-10 14:07:36 +03007065 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007066 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007067
Kalle Valo5e3dd152013-06-12 20:52:10 +03007068 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007069 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007070
7071 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007072 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7073 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007074 }
7075
7076 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7077 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7078
7079 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007080 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007081
Kalle Valo5e3dd152013-06-12 20:52:10 +03007082 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7083
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007084 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7085 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7086
7087 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7088 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7089 * correct Probe Responses. This is more of a hack advert..
7090 */
7091 ar->hw->wiphy->probe_resp_offload |=
7092 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7093 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7094 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7095 }
7096
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007097 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7098 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7099
Kalle Valo5e3dd152013-06-12 20:52:10 +03007100 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007101 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007102 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7103
7104 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007105 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7106
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007107 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7108
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007109 ret = ath10k_wow_init(ar);
7110 if (ret) {
7111 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7112 goto err_free;
7113 }
7114
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007115 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7116
Kalle Valo5e3dd152013-06-12 20:52:10 +03007117 /*
7118 * on LL hardware queues are managed entirely by the FW
7119 * so we only advertise to mac we can do the queues thing
7120 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007121 ar->hw->queues = IEEE80211_MAX_QUEUES;
7122
7123 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7124 * something that vdev_ids can't reach so that we don't stop the queue
7125 * accidentally.
7126 */
7127 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007128
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007129 switch (ar->wmi.op_version) {
7130 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007131 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7132 ar->hw->wiphy->n_iface_combinations =
7133 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007134 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007135 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007136 case ATH10K_FW_WMI_OP_VERSION_TLV:
7137 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7138 ar->hw->wiphy->iface_combinations =
7139 ath10k_tlv_qcs_if_comb;
7140 ar->hw->wiphy->n_iface_combinations =
7141 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7142 } else {
7143 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7144 ar->hw->wiphy->n_iface_combinations =
7145 ARRAY_SIZE(ath10k_tlv_if_comb);
7146 }
7147 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7148 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007149 case ATH10K_FW_WMI_OP_VERSION_10_1:
7150 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007151 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007152 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7153 ar->hw->wiphy->n_iface_combinations =
7154 ARRAY_SIZE(ath10k_10x_if_comb);
7155 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307156 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307157 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7158 ar->hw->wiphy->n_iface_combinations =
7159 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307160 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007161 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7162 case ATH10K_FW_WMI_OP_VERSION_MAX:
7163 WARN_ON(1);
7164 ret = -EINVAL;
7165 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007166 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007167
David Liuccec9032015-07-24 20:25:32 +03007168 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7169 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007170
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007171 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7172 /* Init ath dfs pattern detector */
7173 ar->ath_common.debug_mask = ATH_DBG_DFS;
7174 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7175 NL80211_DFS_UNSET);
7176
7177 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007178 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007179 }
7180
Kalle Valo5e3dd152013-06-12 20:52:10 +03007181 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7182 ath10k_reg_notifier);
7183 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007184 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007185 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007186 }
7187
Johannes Berg3cb10942015-01-22 21:38:45 +01007188 ar->hw->wiphy->cipher_suites = cipher_suites;
7189 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7190
Kalle Valo5e3dd152013-06-12 20:52:10 +03007191 ret = ieee80211_register_hw(ar->hw);
7192 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007193 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007194 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007195 }
7196
7197 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7198 ret = regulatory_hint(ar->hw->wiphy,
7199 ar->ath_common.regulatory.alpha2);
7200 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007201 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007202 }
7203
7204 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007205
7206err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007207 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02007208err_free:
7209 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7210 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7211
Kalle Valo5e3dd152013-06-12 20:52:10 +03007212 return ret;
7213}
7214
7215void ath10k_mac_unregister(struct ath10k *ar)
7216{
7217 ieee80211_unregister_hw(ar->hw);
7218
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007219 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7220 ar->dfs_detector->exit(ar->dfs_detector);
7221
Kalle Valo5e3dd152013-06-12 20:52:10 +03007222 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7223 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7224
7225 SET_IEEE80211_DEV(ar->hw, NULL);
7226}