blob: 3ecc448f8ed65703a0943a0a80dab51a78d80902 [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 ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001073 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1074}
1075
1076static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1077{
1078 int num_ctx;
1079
1080 num_ctx = ath10k_mac_num_chanctxs(ar);
1081
1082 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1083 * shouldn't allow this but make sure to prevent handling the following
1084 * case anyway since multi-channel DFS hasn't been tested at all.
1085 */
1086 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1087 return false;
1088
1089 return true;
1090}
1091
Michal Kazior19337472014-08-28 12:58:16 +02001092static int ath10k_monitor_recalc(struct ath10k *ar)
1093{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001094 bool needed;
1095 bool allowed;
1096 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001097
1098 lockdep_assert_held(&ar->conf_mutex);
1099
Michal Kazior500ff9f2015-03-31 10:26:21 +00001100 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1101 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001102
1103 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001104 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1105 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001106
Michal Kazior500ff9f2015-03-31 10:26:21 +00001107 if (WARN_ON(needed && !allowed)) {
1108 if (ar->monitor_started) {
1109 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1110
1111 ret = ath10k_monitor_stop(ar);
1112 if (ret)
1113 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", ret);
1114 /* not serious */
1115 }
1116
1117 return -EPERM;
1118 }
1119
1120 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001121 return 0;
1122
Michal Kazior500ff9f2015-03-31 10:26:21 +00001123 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001124 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001125 else
1126 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001127}
1128
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001129static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1130{
1131 struct ath10k *ar = arvif->ar;
1132 u32 vdev_param, rts_cts = 0;
1133
1134 lockdep_assert_held(&ar->conf_mutex);
1135
1136 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1137
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001138 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001139
1140 if (arvif->num_legacy_stations > 0)
1141 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1142 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001143 else
1144 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1145 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001146
1147 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1148 rts_cts);
1149}
1150
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001151static int ath10k_start_cac(struct ath10k *ar)
1152{
1153 int ret;
1154
1155 lockdep_assert_held(&ar->conf_mutex);
1156
1157 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1158
Michal Kazior19337472014-08-28 12:58:16 +02001159 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001160 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001161 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001162 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1163 return ret;
1164 }
1165
Michal Kazior7aa7a722014-08-25 12:09:38 +02001166 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001167 ar->monitor_vdev_id);
1168
1169 return 0;
1170}
1171
1172static int ath10k_stop_cac(struct ath10k *ar)
1173{
1174 lockdep_assert_held(&ar->conf_mutex);
1175
1176 /* CAC is not running - do nothing */
1177 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1178 return 0;
1179
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001180 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001181 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001182
Michal Kazior7aa7a722014-08-25 12:09:38 +02001183 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001184
1185 return 0;
1186}
1187
Michal Kazior500ff9f2015-03-31 10:26:21 +00001188static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1189 struct ieee80211_chanctx_conf *conf,
1190 void *data)
1191{
1192 bool *ret = data;
1193
1194 if (!*ret && conf->radar_enabled)
1195 *ret = true;
1196}
1197
1198static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1199{
1200 bool has_radar = false;
1201
1202 ieee80211_iter_chan_contexts_atomic(ar->hw,
1203 ath10k_mac_has_radar_iter,
1204 &has_radar);
1205
1206 return has_radar;
1207}
1208
Michal Kaziord6500972014-04-08 09:56:09 +03001209static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001210{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001211 int ret;
1212
1213 lockdep_assert_held(&ar->conf_mutex);
1214
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001215 ath10k_stop_cac(ar);
1216
Michal Kazior500ff9f2015-03-31 10:26:21 +00001217 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001218 return;
1219
Michal Kaziord6500972014-04-08 09:56:09 +03001220 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001221 return;
1222
1223 ret = ath10k_start_cac(ar);
1224 if (ret) {
1225 /*
1226 * Not possible to start CAC on current channel so starting
1227 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1228 * by indicating that radar was detected.
1229 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001230 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001231 ieee80211_radar_detected(ar->hw);
1232 }
1233}
1234
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301235static int ath10k_vdev_stop(struct ath10k_vif *arvif)
Michal Kazior72654fa2014-04-08 09:56:09 +03001236{
1237 struct ath10k *ar = arvif->ar;
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301238 int ret;
1239
1240 lockdep_assert_held(&ar->conf_mutex);
1241
1242 reinit_completion(&ar->vdev_setup_done);
1243
1244 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1245 if (ret) {
1246 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1247 arvif->vdev_id, ret);
1248 return ret;
1249 }
1250
1251 ret = ath10k_vdev_setup_sync(ar);
1252 if (ret) {
1253 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1254 arvif->vdev_id, ret);
1255 return ret;
1256 }
1257
1258 WARN_ON(ar->num_started_vdevs == 0);
1259
1260 if (ar->num_started_vdevs != 0) {
1261 ar->num_started_vdevs--;
1262 ath10k_recalc_radar_detection(ar);
1263 }
1264
1265 return ret;
1266}
1267
Michal Kazior500ff9f2015-03-31 10:26:21 +00001268static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1269 const struct cfg80211_chan_def *chandef,
1270 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001271{
1272 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001273 struct wmi_vdev_start_request_arg arg = {};
1274 int ret = 0;
1275
1276 lockdep_assert_held(&ar->conf_mutex);
1277
1278 reinit_completion(&ar->vdev_setup_done);
1279
1280 arg.vdev_id = arvif->vdev_id;
1281 arg.dtim_period = arvif->dtim_period;
1282 arg.bcn_intval = arvif->beacon_interval;
1283
1284 arg.channel.freq = chandef->chan->center_freq;
1285 arg.channel.band_center_freq1 = chandef->center_freq1;
1286 arg.channel.mode = chan_to_phymode(chandef);
1287
1288 arg.channel.min_power = 0;
1289 arg.channel.max_power = chandef->chan->max_power * 2;
1290 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1291 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1292
1293 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1294 arg.ssid = arvif->u.ap.ssid;
1295 arg.ssid_len = arvif->u.ap.ssid_len;
1296 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1297
1298 /* For now allow DFS for AP mode */
1299 arg.channel.chan_radar =
1300 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1301 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1302 arg.ssid = arvif->vif->bss_conf.ssid;
1303 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1304 }
1305
Michal Kazior7aa7a722014-08-25 12:09:38 +02001306 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001307 "mac vdev %d start center_freq %d phymode %s\n",
1308 arg.vdev_id, arg.channel.freq,
1309 ath10k_wmi_phymode_str(arg.channel.mode));
1310
Michal Kaziordc55e302014-07-29 12:53:36 +03001311 if (restart)
1312 ret = ath10k_wmi_vdev_restart(ar, &arg);
1313 else
1314 ret = ath10k_wmi_vdev_start(ar, &arg);
1315
Michal Kazior72654fa2014-04-08 09:56:09 +03001316 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001317 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001318 arg.vdev_id, ret);
1319 return ret;
1320 }
1321
1322 ret = ath10k_vdev_setup_sync(ar);
1323 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001324 ath10k_warn(ar,
1325 "failed to synchronize setup for vdev %i restart %d: %d\n",
1326 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001327 return ret;
1328 }
1329
Michal Kaziord6500972014-04-08 09:56:09 +03001330 ar->num_started_vdevs++;
1331 ath10k_recalc_radar_detection(ar);
1332
Michal Kazior72654fa2014-04-08 09:56:09 +03001333 return ret;
1334}
1335
Michal Kazior500ff9f2015-03-31 10:26:21 +00001336static int ath10k_vdev_start(struct ath10k_vif *arvif,
1337 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001338{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001339 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001340}
1341
Michal Kazior500ff9f2015-03-31 10:26:21 +00001342static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1343 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001344{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001345 return ath10k_vdev_start_restart(arvif, def, true);
Michal Kazior72654fa2014-04-08 09:56:09 +03001346}
1347
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001348static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1349 struct sk_buff *bcn)
1350{
1351 struct ath10k *ar = arvif->ar;
1352 struct ieee80211_mgmt *mgmt;
1353 const u8 *p2p_ie;
1354 int ret;
1355
1356 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1357 return 0;
1358
1359 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1360 return 0;
1361
1362 mgmt = (void *)bcn->data;
1363 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1364 mgmt->u.beacon.variable,
1365 bcn->len - (mgmt->u.beacon.variable -
1366 bcn->data));
1367 if (!p2p_ie)
1368 return -ENOENT;
1369
1370 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1371 if (ret) {
1372 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1373 arvif->vdev_id, ret);
1374 return ret;
1375 }
1376
1377 return 0;
1378}
1379
1380static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1381 u8 oui_type, size_t ie_offset)
1382{
1383 size_t len;
1384 const u8 *next;
1385 const u8 *end;
1386 u8 *ie;
1387
1388 if (WARN_ON(skb->len < ie_offset))
1389 return -EINVAL;
1390
1391 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1392 skb->data + ie_offset,
1393 skb->len - ie_offset);
1394 if (!ie)
1395 return -ENOENT;
1396
1397 len = ie[1] + 2;
1398 end = skb->data + skb->len;
1399 next = ie + len;
1400
1401 if (WARN_ON(next > end))
1402 return -EINVAL;
1403
1404 memmove(ie, next, end - next);
1405 skb_trim(skb, skb->len - len);
1406
1407 return 0;
1408}
1409
1410static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1411{
1412 struct ath10k *ar = arvif->ar;
1413 struct ieee80211_hw *hw = ar->hw;
1414 struct ieee80211_vif *vif = arvif->vif;
1415 struct ieee80211_mutable_offsets offs = {};
1416 struct sk_buff *bcn;
1417 int ret;
1418
1419 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1420 return 0;
1421
Michal Kazior81a9a172015-03-05 16:02:17 +02001422 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1423 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1424 return 0;
1425
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001426 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1427 if (!bcn) {
1428 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1429 return -EPERM;
1430 }
1431
1432 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1433 if (ret) {
1434 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1435 kfree_skb(bcn);
1436 return ret;
1437 }
1438
1439 /* P2P IE is inserted by firmware automatically (as configured above)
1440 * so remove it from the base beacon template to avoid duplicate P2P
1441 * IEs in beacon frames.
1442 */
1443 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1444 offsetof(struct ieee80211_mgmt,
1445 u.beacon.variable));
1446
1447 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1448 0, NULL, 0);
1449 kfree_skb(bcn);
1450
1451 if (ret) {
1452 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1453 ret);
1454 return ret;
1455 }
1456
1457 return 0;
1458}
1459
1460static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1461{
1462 struct ath10k *ar = arvif->ar;
1463 struct ieee80211_hw *hw = ar->hw;
1464 struct ieee80211_vif *vif = arvif->vif;
1465 struct sk_buff *prb;
1466 int ret;
1467
1468 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1469 return 0;
1470
Michal Kazior81a9a172015-03-05 16:02:17 +02001471 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1472 return 0;
1473
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001474 prb = ieee80211_proberesp_get(hw, vif);
1475 if (!prb) {
1476 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1477 return -EPERM;
1478 }
1479
1480 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1481 kfree_skb(prb);
1482
1483 if (ret) {
1484 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1485 ret);
1486 return ret;
1487 }
1488
1489 return 0;
1490}
1491
Michal Kazior500ff9f2015-03-31 10:26:21 +00001492static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1493{
1494 struct ath10k *ar = arvif->ar;
1495 struct cfg80211_chan_def def;
1496 int ret;
1497
1498 /* When originally vdev is started during assign_vif_chanctx() some
1499 * information is missing, notably SSID. Firmware revisions with beacon
1500 * offloading require the SSID to be provided during vdev (re)start to
1501 * handle hidden SSID properly.
1502 *
1503 * Vdev restart must be done after vdev has been both started and
1504 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1505 * deliver vdev restart response event causing timeouts during vdev
1506 * syncing in ath10k.
1507 *
1508 * Note: The vdev down/up and template reinstallation could be skipped
1509 * since only wmi-tlv firmware are known to have beacon offload and
1510 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1511 * response delivery. It's probably more robust to keep it as is.
1512 */
1513 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1514 return 0;
1515
1516 if (WARN_ON(!arvif->is_started))
1517 return -EINVAL;
1518
1519 if (WARN_ON(!arvif->is_up))
1520 return -EINVAL;
1521
1522 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1523 return -EINVAL;
1524
1525 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1526 if (ret) {
1527 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1528 arvif->vdev_id, ret);
1529 return ret;
1530 }
1531
1532 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1533 * firmware will crash upon vdev up.
1534 */
1535
1536 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1537 if (ret) {
1538 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1539 return ret;
1540 }
1541
1542 ret = ath10k_mac_setup_prb_tmpl(arvif);
1543 if (ret) {
1544 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1545 return ret;
1546 }
1547
1548 ret = ath10k_vdev_restart(arvif, &def);
1549 if (ret) {
1550 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1551 arvif->vdev_id, ret);
1552 return ret;
1553 }
1554
1555 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1556 arvif->bssid);
1557 if (ret) {
1558 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1559 arvif->vdev_id, ret);
1560 return ret;
1561 }
1562
1563 return 0;
1564}
1565
Kalle Valo5e3dd152013-06-12 20:52:10 +03001566static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001567 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001568{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001569 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001570 int ret = 0;
1571
Michal Kazior548db542013-07-05 16:15:15 +03001572 lockdep_assert_held(&arvif->ar->conf_mutex);
1573
Kalle Valo5e3dd152013-06-12 20:52:10 +03001574 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001575 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1576 if (ret)
1577 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1578 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001579
Michal Kaziorc930f742014-01-23 11:38:25 +01001580 arvif->is_up = false;
1581
Michal Kazior748afc42014-01-23 12:48:21 +01001582 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001583 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001584 spin_unlock_bh(&arvif->ar->data_lock);
1585
Kalle Valo5e3dd152013-06-12 20:52:10 +03001586 return;
1587 }
1588
1589 arvif->tx_seq_no = 0x1000;
1590
Michal Kaziorc930f742014-01-23 11:38:25 +01001591 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001592 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001593
1594 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1595 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001596 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001597 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001598 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001599 return;
1600 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001601
Michal Kaziorc930f742014-01-23 11:38:25 +01001602 arvif->is_up = true;
1603
Michal Kazior500ff9f2015-03-31 10:26:21 +00001604 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1605 if (ret) {
1606 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1607 arvif->vdev_id, ret);
1608 return;
1609 }
1610
Michal Kazior7aa7a722014-08-25 12:09:38 +02001611 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001612}
1613
1614static void ath10k_control_ibss(struct ath10k_vif *arvif,
1615 struct ieee80211_bss_conf *info,
1616 const u8 self_peer[ETH_ALEN])
1617{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001618 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001619 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001620 int ret = 0;
1621
Michal Kazior548db542013-07-05 16:15:15 +03001622 lockdep_assert_held(&arvif->ar->conf_mutex);
1623
Kalle Valo5e3dd152013-06-12 20:52:10 +03001624 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001625 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001626 return;
1627
Joe Perches93803b32015-03-02 19:54:49 -08001628 eth_zero_addr(arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001629
1630 return;
1631 }
1632
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001633 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1634 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001635 ATH10K_DEFAULT_ATIM);
1636 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001637 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001638 arvif->vdev_id, ret);
1639}
1640
Michal Kazior9f9b5742014-12-12 12:41:36 +01001641static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1642{
1643 struct ath10k *ar = arvif->ar;
1644 u32 param;
1645 u32 value;
1646 int ret;
1647
1648 lockdep_assert_held(&arvif->ar->conf_mutex);
1649
1650 if (arvif->u.sta.uapsd)
1651 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1652 else
1653 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1654
1655 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1656 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1657 if (ret) {
1658 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1659 value, arvif->vdev_id, ret);
1660 return ret;
1661 }
1662
1663 return 0;
1664}
1665
1666static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1667{
1668 struct ath10k *ar = arvif->ar;
1669 u32 param;
1670 u32 value;
1671 int ret;
1672
1673 lockdep_assert_held(&arvif->ar->conf_mutex);
1674
1675 if (arvif->u.sta.uapsd)
1676 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1677 else
1678 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1679
1680 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1681 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1682 param, value);
1683 if (ret) {
1684 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1685 value, arvif->vdev_id, ret);
1686 return ret;
1687 }
1688
1689 return 0;
1690}
1691
Michal Kazior424f2632015-07-09 13:08:35 +02001692static int ath10k_mac_num_vifs_started(struct ath10k *ar)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001693{
1694 struct ath10k_vif *arvif;
1695 int num = 0;
1696
1697 lockdep_assert_held(&ar->conf_mutex);
1698
1699 list_for_each_entry(arvif, &ar->arvifs, list)
Michal Kazior424f2632015-07-09 13:08:35 +02001700 if (arvif->is_started)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001701 num++;
1702
1703 return num;
1704}
1705
Michal Kaziorad088bf2013-10-16 15:44:46 +03001706static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001707{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001708 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001709 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001710 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001711 enum wmi_sta_powersave_param param;
1712 enum wmi_sta_ps_mode psmode;
1713 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001714 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001715 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001716
Michal Kazior548db542013-07-05 16:15:15 +03001717 lockdep_assert_held(&arvif->ar->conf_mutex);
1718
Michal Kaziorad088bf2013-10-16 15:44:46 +03001719 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1720 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001721
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001722 enable_ps = arvif->ps;
1723
Michal Kazior424f2632015-07-09 13:08:35 +02001724 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001725 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1726 ar->fw_features)) {
1727 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1728 arvif->vdev_id);
1729 enable_ps = false;
1730 }
1731
Janusz Dziedzic917826b2015-05-18 09:38:17 +00001732 if (!arvif->is_started) {
1733 /* mac80211 can update vif powersave state while disconnected.
1734 * Firmware doesn't behave nicely and consumes more power than
1735 * necessary if PS is disabled on a non-started vdev. Hence
1736 * force-enable PS for non-running vdevs.
1737 */
1738 psmode = WMI_STA_PS_MODE_ENABLED;
1739 } else if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001740 psmode = WMI_STA_PS_MODE_ENABLED;
1741 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1742
Michal Kazior526549a2014-12-12 12:41:37 +01001743 ps_timeout = conf->dynamic_ps_timeout;
1744 if (ps_timeout == 0) {
1745 /* Firmware doesn't like 0 */
1746 ps_timeout = ieee80211_tu_to_usec(
1747 vif->bss_conf.beacon_int) / 1000;
1748 }
1749
Michal Kaziorad088bf2013-10-16 15:44:46 +03001750 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001751 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001752 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001753 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001754 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001755 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001756 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001757 } else {
1758 psmode = WMI_STA_PS_MODE_DISABLED;
1759 }
1760
Michal Kazior7aa7a722014-08-25 12:09:38 +02001761 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001762 arvif->vdev_id, psmode ? "enable" : "disable");
1763
Michal Kaziorad088bf2013-10-16 15:44:46 +03001764 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1765 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001766 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001767 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001768 return ret;
1769 }
1770
1771 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001772}
1773
Michal Kazior46725b152015-01-28 09:57:49 +02001774static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1775{
1776 struct ath10k *ar = arvif->ar;
1777 struct wmi_sta_keepalive_arg arg = {};
1778 int ret;
1779
1780 lockdep_assert_held(&arvif->ar->conf_mutex);
1781
1782 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1783 return 0;
1784
1785 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1786 return 0;
1787
1788 /* Some firmware revisions have a bug and ignore the `enabled` field.
1789 * Instead use the interval to disable the keepalive.
1790 */
1791 arg.vdev_id = arvif->vdev_id;
1792 arg.enabled = 1;
1793 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1794 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1795
1796 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1797 if (ret) {
1798 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1799 arvif->vdev_id, ret);
1800 return ret;
1801 }
1802
1803 return 0;
1804}
1805
Michal Kazior81a9a172015-03-05 16:02:17 +02001806static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1807{
1808 struct ath10k *ar = arvif->ar;
1809 struct ieee80211_vif *vif = arvif->vif;
1810 int ret;
1811
Michal Kazior8513d952015-03-09 14:19:24 +01001812 lockdep_assert_held(&arvif->ar->conf_mutex);
1813
1814 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1815 return;
1816
Michal Kazior81a9a172015-03-05 16:02:17 +02001817 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1818 return;
1819
1820 if (!vif->csa_active)
1821 return;
1822
1823 if (!arvif->is_up)
1824 return;
1825
1826 if (!ieee80211_csa_is_complete(vif)) {
1827 ieee80211_csa_update_counter(vif);
1828
1829 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1830 if (ret)
1831 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1832 ret);
1833
1834 ret = ath10k_mac_setup_prb_tmpl(arvif);
1835 if (ret)
1836 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1837 ret);
1838 } else {
1839 ieee80211_csa_finish(vif);
1840 }
1841}
1842
1843static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1844{
1845 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1846 ap_csa_work);
1847 struct ath10k *ar = arvif->ar;
1848
1849 mutex_lock(&ar->conf_mutex);
1850 ath10k_mac_vif_ap_csa_count_down(arvif);
1851 mutex_unlock(&ar->conf_mutex);
1852}
1853
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001854static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1855 struct ieee80211_vif *vif)
1856{
1857 struct sk_buff *skb = data;
1858 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1859 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1860
1861 if (vif->type != NL80211_IFTYPE_STATION)
1862 return;
1863
1864 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1865 return;
1866
1867 cancel_delayed_work(&arvif->connection_loss_work);
1868}
1869
1870void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1871{
1872 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1873 IEEE80211_IFACE_ITER_NORMAL,
1874 ath10k_mac_handle_beacon_iter,
1875 skb);
1876}
1877
1878static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1879 struct ieee80211_vif *vif)
1880{
1881 u32 *vdev_id = data;
1882 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1883 struct ath10k *ar = arvif->ar;
1884 struct ieee80211_hw *hw = ar->hw;
1885
1886 if (arvif->vdev_id != *vdev_id)
1887 return;
1888
1889 if (!arvif->is_up)
1890 return;
1891
1892 ieee80211_beacon_loss(vif);
1893
1894 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1895 * (done by mac80211) succeeds but beacons do not resume then it
1896 * doesn't make sense to continue operation. Queue connection loss work
1897 * which can be cancelled when beacon is received.
1898 */
1899 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1900 ATH10K_CONNECTION_LOSS_HZ);
1901}
1902
1903void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1904{
1905 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1906 IEEE80211_IFACE_ITER_NORMAL,
1907 ath10k_mac_handle_beacon_miss_iter,
1908 &vdev_id);
1909}
1910
1911static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1912{
1913 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1914 connection_loss_work.work);
1915 struct ieee80211_vif *vif = arvif->vif;
1916
1917 if (!arvif->is_up)
1918 return;
1919
1920 ieee80211_connection_loss(vif);
1921}
1922
Kalle Valo5e3dd152013-06-12 20:52:10 +03001923/**********************/
1924/* Station management */
1925/**********************/
1926
Michal Kazior590922a2014-10-21 10:10:29 +03001927static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1928 struct ieee80211_vif *vif)
1929{
1930 /* Some firmware revisions have unstable STA powersave when listen
1931 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1932 * generate NullFunc frames properly even if buffered frames have been
1933 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1934 * buffered frames. Often pinging the device from AP would simply fail.
1935 *
1936 * As a workaround set it to 1.
1937 */
1938 if (vif->type == NL80211_IFTYPE_STATION)
1939 return 1;
1940
1941 return ar->hw->conf.listen_interval;
1942}
1943
Kalle Valo5e3dd152013-06-12 20:52:10 +03001944static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001945 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001946 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001947 struct wmi_peer_assoc_complete_arg *arg)
1948{
Michal Kazior590922a2014-10-21 10:10:29 +03001949 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001950 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001951
Michal Kazior548db542013-07-05 16:15:15 +03001952 lockdep_assert_held(&ar->conf_mutex);
1953
Michal Kaziorc51880e2015-03-30 09:51:57 +03001954 if (vif->type == NL80211_IFTYPE_STATION)
1955 aid = vif->bss_conf.aid;
1956 else
1957 aid = sta->aid;
1958
Kalle Valob25f32c2014-09-14 12:50:49 +03001959 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001960 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001961 arg->peer_aid = aid;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001962 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001963 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001964 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001965 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001966}
1967
1968static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001969 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001970 struct wmi_peer_assoc_complete_arg *arg)
1971{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001972 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001973 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001974 struct cfg80211_bss *bss;
1975 const u8 *rsnie = NULL;
1976 const u8 *wpaie = NULL;
1977
Michal Kazior548db542013-07-05 16:15:15 +03001978 lockdep_assert_held(&ar->conf_mutex);
1979
Michal Kazior500ff9f2015-03-31 10:26:21 +00001980 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1981 return;
1982
1983 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1984 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001985 if (bss) {
1986 const struct cfg80211_bss_ies *ies;
1987
1988 rcu_read_lock();
1989 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1990
1991 ies = rcu_dereference(bss->ies);
1992
1993 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001994 WLAN_OUI_TYPE_MICROSOFT_WPA,
1995 ies->data,
1996 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001997 rcu_read_unlock();
1998 cfg80211_put_bss(ar->hw->wiphy, bss);
1999 }
2000
2001 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2002 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002003 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002004 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
2005 }
2006
2007 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002008 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002009 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
2010 }
2011}
2012
2013static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002014 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002015 struct ieee80211_sta *sta,
2016 struct wmi_peer_assoc_complete_arg *arg)
2017{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002018 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002019 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002020 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002021 const struct ieee80211_supported_band *sband;
2022 const struct ieee80211_rate *rates;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002023 enum ieee80211_band band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002024 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03002025 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002026 int i;
2027
Michal Kazior548db542013-07-05 16:15:15 +03002028 lockdep_assert_held(&ar->conf_mutex);
2029
Michal Kazior500ff9f2015-03-31 10:26:21 +00002030 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2031 return;
2032
Michal Kazior45c9abc2015-04-21 20:42:58 +03002033 band = def.chan->band;
2034 sband = ar->hw->wiphy->bands[band];
2035 ratemask = sta->supp_rates[band];
2036 ratemask &= arvif->bitrate_mask.control[band].legacy;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002037 rates = sband->bitrates;
2038
2039 rateset->num_rates = 0;
2040
2041 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2042 if (!(ratemask & 1))
2043 continue;
2044
Michal Kazior486017c2015-03-30 09:51:54 +03002045 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2046 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002047 rateset->num_rates++;
2048 }
2049}
2050
Michal Kazior45c9abc2015-04-21 20:42:58 +03002051static bool
2052ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2053{
2054 int nss;
2055
2056 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2057 if (ht_mcs_mask[nss])
2058 return false;
2059
2060 return true;
2061}
2062
2063static bool
2064ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2065{
2066 int nss;
2067
2068 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2069 if (vht_mcs_mask[nss])
2070 return false;
2071
2072 return true;
2073}
2074
Kalle Valo5e3dd152013-06-12 20:52:10 +03002075static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
Michal Kazior45c9abc2015-04-21 20:42:58 +03002076 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002077 struct ieee80211_sta *sta,
2078 struct wmi_peer_assoc_complete_arg *arg)
2079{
2080 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002081 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2082 struct cfg80211_chan_def def;
2083 enum ieee80211_band band;
2084 const u8 *ht_mcs_mask;
2085 const u16 *vht_mcs_mask;
2086 int i, n, max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002087 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002088
Michal Kazior548db542013-07-05 16:15:15 +03002089 lockdep_assert_held(&ar->conf_mutex);
2090
Michal Kazior45c9abc2015-04-21 20:42:58 +03002091 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2092 return;
2093
Kalle Valo5e3dd152013-06-12 20:52:10 +03002094 if (!ht_cap->ht_supported)
2095 return;
2096
Michal Kazior45c9abc2015-04-21 20:42:58 +03002097 band = def.chan->band;
2098 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2099 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2100
2101 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2102 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2103 return;
2104
Kalle Valo5e3dd152013-06-12 20:52:10 +03002105 arg->peer_flags |= WMI_PEER_HT;
2106 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2107 ht_cap->ampdu_factor)) - 1;
2108
2109 arg->peer_mpdu_density =
2110 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2111
2112 arg->peer_ht_caps = ht_cap->cap;
2113 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2114
2115 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2116 arg->peer_flags |= WMI_PEER_LDPC;
2117
2118 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2119 arg->peer_flags |= WMI_PEER_40MHZ;
2120 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2121 }
2122
Michal Kazior45c9abc2015-04-21 20:42:58 +03002123 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2124 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2125 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002126
Michal Kazior45c9abc2015-04-21 20:42:58 +03002127 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2128 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2129 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002130
2131 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2132 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2133 arg->peer_flags |= WMI_PEER_STBC;
2134 }
2135
2136 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002137 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2138 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2139 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2140 arg->peer_rate_caps |= stbc;
2141 arg->peer_flags |= WMI_PEER_STBC;
2142 }
2143
Kalle Valo5e3dd152013-06-12 20:52:10 +03002144 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2145 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2146 else if (ht_cap->mcs.rx_mask[1])
2147 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2148
Michal Kazior45c9abc2015-04-21 20:42:58 +03002149 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2150 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2151 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2152 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002153 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002154 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002155
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002156 /*
2157 * This is a workaround for HT-enabled STAs which break the spec
2158 * and have no HT capabilities RX mask (no HT RX MCS map).
2159 *
2160 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2161 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2162 *
2163 * Firmware asserts if such situation occurs.
2164 */
2165 if (n == 0) {
2166 arg->peer_ht_rates.num_rates = 8;
2167 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2168 arg->peer_ht_rates.rates[i] = i;
2169 } else {
2170 arg->peer_ht_rates.num_rates = n;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002171 arg->peer_num_spatial_streams = max_nss;
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002172 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002173
Michal Kazior7aa7a722014-08-25 12:09:38 +02002174 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002175 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002176 arg->peer_ht_rates.num_rates,
2177 arg->peer_num_spatial_streams);
2178}
2179
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002180static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2181 struct ath10k_vif *arvif,
2182 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002183{
2184 u32 uapsd = 0;
2185 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002186 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002187
Michal Kazior548db542013-07-05 16:15:15 +03002188 lockdep_assert_held(&ar->conf_mutex);
2189
Kalle Valo5e3dd152013-06-12 20:52:10 +03002190 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002191 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002192 sta->uapsd_queues, sta->max_sp);
2193
Kalle Valo5e3dd152013-06-12 20:52:10 +03002194 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2195 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2196 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2197 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2198 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2199 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2200 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2201 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2202 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2203 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2204 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2205 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2206
Kalle Valo5e3dd152013-06-12 20:52:10 +03002207 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2208 max_sp = sta->max_sp;
2209
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002210 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2211 sta->addr,
2212 WMI_AP_PS_PEER_PARAM_UAPSD,
2213 uapsd);
2214 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002215 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002216 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002217 return ret;
2218 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002219
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002220 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2221 sta->addr,
2222 WMI_AP_PS_PEER_PARAM_MAX_SP,
2223 max_sp);
2224 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002225 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002226 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002227 return ret;
2228 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002229
2230 /* TODO setup this based on STA listen interval and
2231 beacon interval. Currently we don't know
2232 sta->listen_interval - mac80211 patch required.
2233 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002234 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002235 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2236 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002237 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002238 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002239 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002240 return ret;
2241 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002242 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002243
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002244 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002245}
2246
Michal Kazior45c9abc2015-04-21 20:42:58 +03002247static u16
2248ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2249 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2250{
2251 int idx_limit;
2252 int nss;
2253 u16 mcs_map;
2254 u16 mcs;
2255
2256 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2257 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2258 vht_mcs_limit[nss];
2259
2260 if (mcs_map)
2261 idx_limit = fls(mcs_map) - 1;
2262 else
2263 idx_limit = -1;
2264
2265 switch (idx_limit) {
2266 case 0: /* fall through */
2267 case 1: /* fall through */
2268 case 2: /* fall through */
2269 case 3: /* fall through */
2270 case 4: /* fall through */
2271 case 5: /* fall through */
2272 case 6: /* fall through */
2273 default:
2274 /* see ath10k_mac_can_set_bitrate_mask() */
2275 WARN_ON(1);
2276 /* fall through */
2277 case -1:
2278 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2279 break;
2280 case 7:
2281 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2282 break;
2283 case 8:
2284 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2285 break;
2286 case 9:
2287 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2288 break;
2289 }
2290
2291 tx_mcs_set &= ~(0x3 << (nss * 2));
2292 tx_mcs_set |= mcs << (nss * 2);
2293 }
2294
2295 return tx_mcs_set;
2296}
2297
Kalle Valo5e3dd152013-06-12 20:52:10 +03002298static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002299 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002300 struct ieee80211_sta *sta,
2301 struct wmi_peer_assoc_complete_arg *arg)
2302{
2303 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002304 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002305 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002306 enum ieee80211_band band;
2307 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002308 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002309
Michal Kazior500ff9f2015-03-31 10:26:21 +00002310 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2311 return;
2312
Kalle Valo5e3dd152013-06-12 20:52:10 +03002313 if (!vht_cap->vht_supported)
2314 return;
2315
Michal Kazior45c9abc2015-04-21 20:42:58 +03002316 band = def.chan->band;
2317 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2318
2319 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2320 return;
2321
Kalle Valo5e3dd152013-06-12 20:52:10 +03002322 arg->peer_flags |= WMI_PEER_VHT;
Yanbo Lid68bb122015-01-23 08:18:20 +08002323
Michal Kazior500ff9f2015-03-31 10:26:21 +00002324 if (def.chan->band == IEEE80211_BAND_2GHZ)
Yanbo Lid68bb122015-01-23 08:18:20 +08002325 arg->peer_flags |= WMI_PEER_VHT_2G;
2326
Kalle Valo5e3dd152013-06-12 20:52:10 +03002327 arg->peer_vht_caps = vht_cap->cap;
2328
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002329 ampdu_factor = (vht_cap->cap &
2330 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2331 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2332
2333 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2334 * zero in VHT IE. Using it would result in degraded throughput.
2335 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2336 * it if VHT max_mpdu is smaller. */
2337 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2338 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2339 ampdu_factor)) - 1);
2340
Kalle Valo5e3dd152013-06-12 20:52:10 +03002341 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2342 arg->peer_flags |= WMI_PEER_80MHZ;
2343
2344 arg->peer_vht_rates.rx_max_rate =
2345 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2346 arg->peer_vht_rates.rx_mcs_set =
2347 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2348 arg->peer_vht_rates.tx_max_rate =
2349 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002350 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2351 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002352
Michal Kazior7aa7a722014-08-25 12:09:38 +02002353 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002354 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002355}
2356
2357static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002358 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002359 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002360 struct wmi_peer_assoc_complete_arg *arg)
2361{
Michal Kazior590922a2014-10-21 10:10:29 +03002362 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2363
Kalle Valo5e3dd152013-06-12 20:52:10 +03002364 switch (arvif->vdev_type) {
2365 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002366 if (sta->wme)
2367 arg->peer_flags |= WMI_PEER_QOS;
2368
2369 if (sta->wme && sta->uapsd_queues) {
2370 arg->peer_flags |= WMI_PEER_APSD;
2371 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2372 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002373 break;
2374 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002375 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002376 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002377 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002378 case WMI_VDEV_TYPE_IBSS:
2379 if (sta->wme)
2380 arg->peer_flags |= WMI_PEER_QOS;
2381 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002382 default:
2383 break;
2384 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002385
2386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2387 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002388}
2389
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002390static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002391{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002392 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2393 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002394}
2395
Kalle Valo5e3dd152013-06-12 20:52:10 +03002396static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002397 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002398 struct ieee80211_sta *sta,
2399 struct wmi_peer_assoc_complete_arg *arg)
2400{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002401 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002402 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002403 enum ieee80211_band band;
2404 const u8 *ht_mcs_mask;
2405 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002406 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2407
Michal Kazior500ff9f2015-03-31 10:26:21 +00002408 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2409 return;
2410
Michal Kazior45c9abc2015-04-21 20:42:58 +03002411 band = def.chan->band;
2412 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2413 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2414
2415 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002416 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002417 if (sta->vht_cap.vht_supported &&
2418 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002419 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2420 phymode = MODE_11AC_VHT40;
2421 else
2422 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002423 } else if (sta->ht_cap.ht_supported &&
2424 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002425 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2426 phymode = MODE_11NG_HT40;
2427 else
2428 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002429 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002430 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002431 } else {
2432 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002433 }
2434
2435 break;
2436 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002437 /*
2438 * Check VHT first.
2439 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002440 if (sta->vht_cap.vht_supported &&
2441 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002442 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2443 phymode = MODE_11AC_VHT80;
2444 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2445 phymode = MODE_11AC_VHT40;
2446 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2447 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002448 } else if (sta->ht_cap.ht_supported &&
2449 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2450 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002451 phymode = MODE_11NA_HT40;
2452 else
2453 phymode = MODE_11NA_HT20;
2454 } else {
2455 phymode = MODE_11A;
2456 }
2457
2458 break;
2459 default:
2460 break;
2461 }
2462
Michal Kazior7aa7a722014-08-25 12:09:38 +02002463 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002464 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002465
Kalle Valo5e3dd152013-06-12 20:52:10 +03002466 arg->peer_phymode = phymode;
2467 WARN_ON(phymode == MODE_UNKNOWN);
2468}
2469
Kalle Valob9ada652013-10-16 15:44:46 +03002470static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002471 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002472 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002473 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002474{
Michal Kazior548db542013-07-05 16:15:15 +03002475 lockdep_assert_held(&ar->conf_mutex);
2476
Kalle Valob9ada652013-10-16 15:44:46 +03002477 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002478
Michal Kazior590922a2014-10-21 10:10:29 +03002479 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2480 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002481 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002482 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002483 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002484 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2485 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002486
Kalle Valob9ada652013-10-16 15:44:46 +03002487 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002488}
2489
Michal Kazior90046f52014-02-14 14:45:51 +01002490static const u32 ath10k_smps_map[] = {
2491 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2492 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2493 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2494 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2495};
2496
2497static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2498 const u8 *addr,
2499 const struct ieee80211_sta_ht_cap *ht_cap)
2500{
2501 int smps;
2502
2503 if (!ht_cap->ht_supported)
2504 return 0;
2505
2506 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2507 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2508
2509 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2510 return -EINVAL;
2511
2512 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2513 WMI_PEER_SMPS_STATE,
2514 ath10k_smps_map[smps]);
2515}
2516
Michal Kazior139e1702015-02-15 16:50:42 +02002517static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2518 struct ieee80211_vif *vif,
2519 struct ieee80211_sta_vht_cap vht_cap)
2520{
2521 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2522 int ret;
2523 u32 param;
2524 u32 value;
2525
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302526 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2527 return 0;
2528
Michal Kazior139e1702015-02-15 16:50:42 +02002529 if (!(ar->vht_cap_info &
2530 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2531 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2532 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2533 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2534 return 0;
2535
2536 param = ar->wmi.vdev_param->txbf;
2537 value = 0;
2538
2539 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2540 return 0;
2541
2542 /* The following logic is correct. If a remote STA advertises support
2543 * for being a beamformer then we should enable us being a beamformee.
2544 */
2545
2546 if (ar->vht_cap_info &
2547 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2548 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2549 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2550 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2551
2552 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2553 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2554 }
2555
2556 if (ar->vht_cap_info &
2557 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2558 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2559 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2560 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2561
2562 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2563 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2564 }
2565
2566 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2567 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2568
2569 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2570 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2571
2572 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2573 if (ret) {
2574 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2575 value, ret);
2576 return ret;
2577 }
2578
2579 return 0;
2580}
2581
Kalle Valo5e3dd152013-06-12 20:52:10 +03002582/* can be called only in mac80211 callbacks due to `key_count` usage */
2583static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2584 struct ieee80211_vif *vif,
2585 struct ieee80211_bss_conf *bss_conf)
2586{
2587 struct ath10k *ar = hw->priv;
2588 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002589 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002590 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002591 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002592 struct ieee80211_sta *ap_sta;
2593 int ret;
2594
Michal Kazior548db542013-07-05 16:15:15 +03002595 lockdep_assert_held(&ar->conf_mutex);
2596
Michal Kazior077efc82014-10-21 10:10:29 +03002597 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2598 arvif->vdev_id, arvif->bssid, arvif->aid);
2599
Kalle Valo5e3dd152013-06-12 20:52:10 +03002600 rcu_read_lock();
2601
2602 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2603 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002604 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002605 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002606 rcu_read_unlock();
2607 return;
2608 }
2609
Michal Kazior90046f52014-02-14 14:45:51 +01002610 /* ap_sta must be accessed only within rcu section which must be left
2611 * before calling ath10k_setup_peer_smps() which might sleep. */
2612 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002613 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002614
Michal Kazior590922a2014-10-21 10:10:29 +03002615 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002616 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002617 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002618 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002619 rcu_read_unlock();
2620 return;
2621 }
2622
2623 rcu_read_unlock();
2624
Kalle Valob9ada652013-10-16 15:44:46 +03002625 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2626 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002627 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002628 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002629 return;
2630 }
2631
Michal Kazior90046f52014-02-14 14:45:51 +01002632 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2633 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002634 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002635 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002636 return;
2637 }
2638
Michal Kazior139e1702015-02-15 16:50:42 +02002639 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2640 if (ret) {
2641 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2642 arvif->vdev_id, bss_conf->bssid, ret);
2643 return;
2644 }
2645
Michal Kazior7aa7a722014-08-25 12:09:38 +02002646 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002647 "mac vdev %d up (associated) bssid %pM aid %d\n",
2648 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2649
Michal Kazior077efc82014-10-21 10:10:29 +03002650 WARN_ON(arvif->is_up);
2651
Michal Kaziorc930f742014-01-23 11:38:25 +01002652 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002653 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002654
2655 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2656 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002657 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002658 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002659 return;
2660 }
2661
2662 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002663
2664 /* Workaround: Some firmware revisions (tested with qca6174
2665 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2666 * poked with peer param command.
2667 */
2668 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2669 WMI_PEER_DUMMY_VAR, 1);
2670 if (ret) {
2671 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2672 arvif->bssid, arvif->vdev_id, ret);
2673 return;
2674 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002675}
2676
Kalle Valo5e3dd152013-06-12 20:52:10 +03002677static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2678 struct ieee80211_vif *vif)
2679{
2680 struct ath10k *ar = hw->priv;
2681 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002682 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002683 int ret;
2684
Michal Kazior548db542013-07-05 16:15:15 +03002685 lockdep_assert_held(&ar->conf_mutex);
2686
Michal Kazior077efc82014-10-21 10:10:29 +03002687 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2688 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002689
Kalle Valo5e3dd152013-06-12 20:52:10 +03002690 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002691 if (ret)
2692 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2693 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002694
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002695 arvif->def_wep_key_idx = -1;
2696
Michal Kazior139e1702015-02-15 16:50:42 +02002697 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2698 if (ret) {
2699 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2700 arvif->vdev_id, ret);
2701 return;
2702 }
2703
Michal Kaziorc930f742014-01-23 11:38:25 +01002704 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002705
2706 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002707}
2708
Michal Kazior590922a2014-10-21 10:10:29 +03002709static int ath10k_station_assoc(struct ath10k *ar,
2710 struct ieee80211_vif *vif,
2711 struct ieee80211_sta *sta,
2712 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002713{
Michal Kazior590922a2014-10-21 10:10:29 +03002714 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002715 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002716 int ret = 0;
2717
Michal Kazior548db542013-07-05 16:15:15 +03002718 lockdep_assert_held(&ar->conf_mutex);
2719
Michal Kazior590922a2014-10-21 10:10:29 +03002720 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002721 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002722 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002723 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002724 return ret;
2725 }
2726
2727 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2728 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002729 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002730 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002731 return ret;
2732 }
2733
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002734 /* Re-assoc is run only to update supported rates for given station. It
2735 * doesn't make much sense to reconfigure the peer completely.
2736 */
2737 if (!reassoc) {
2738 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2739 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002740 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002741 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002742 arvif->vdev_id, ret);
2743 return ret;
2744 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002745
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002746 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2747 if (ret) {
2748 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2749 sta->addr, arvif->vdev_id, ret);
2750 return ret;
2751 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002752
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002753 if (!sta->wme) {
2754 arvif->num_legacy_stations++;
2755 ret = ath10k_recalc_rtscts_prot(arvif);
2756 if (ret) {
2757 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2758 arvif->vdev_id, ret);
2759 return ret;
2760 }
2761 }
2762
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002763 /* Plumb cached keys only for static WEP */
2764 if (arvif->def_wep_key_idx != -1) {
2765 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2766 if (ret) {
2767 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2768 arvif->vdev_id, ret);
2769 return ret;
2770 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002771 }
2772 }
2773
Kalle Valo5e3dd152013-06-12 20:52:10 +03002774 return ret;
2775}
2776
Michal Kazior590922a2014-10-21 10:10:29 +03002777static int ath10k_station_disassoc(struct ath10k *ar,
2778 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002779 struct ieee80211_sta *sta)
2780{
Michal Kazior590922a2014-10-21 10:10:29 +03002781 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002782 int ret = 0;
2783
2784 lockdep_assert_held(&ar->conf_mutex);
2785
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002786 if (!sta->wme) {
2787 arvif->num_legacy_stations--;
2788 ret = ath10k_recalc_rtscts_prot(arvif);
2789 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002790 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002791 arvif->vdev_id, ret);
2792 return ret;
2793 }
2794 }
2795
Kalle Valo5e3dd152013-06-12 20:52:10 +03002796 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2797 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002798 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002799 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002800 return ret;
2801 }
2802
2803 return ret;
2804}
2805
2806/**************/
2807/* Regulatory */
2808/**************/
2809
2810static int ath10k_update_channel_list(struct ath10k *ar)
2811{
2812 struct ieee80211_hw *hw = ar->hw;
2813 struct ieee80211_supported_band **bands;
2814 enum ieee80211_band band;
2815 struct ieee80211_channel *channel;
2816 struct wmi_scan_chan_list_arg arg = {0};
2817 struct wmi_channel_arg *ch;
2818 bool passive;
2819 int len;
2820 int ret;
2821 int i;
2822
Michal Kazior548db542013-07-05 16:15:15 +03002823 lockdep_assert_held(&ar->conf_mutex);
2824
Kalle Valo5e3dd152013-06-12 20:52:10 +03002825 bands = hw->wiphy->bands;
2826 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2827 if (!bands[band])
2828 continue;
2829
2830 for (i = 0; i < bands[band]->n_channels; i++) {
2831 if (bands[band]->channels[i].flags &
2832 IEEE80211_CHAN_DISABLED)
2833 continue;
2834
2835 arg.n_channels++;
2836 }
2837 }
2838
2839 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2840 arg.channels = kzalloc(len, GFP_KERNEL);
2841 if (!arg.channels)
2842 return -ENOMEM;
2843
2844 ch = arg.channels;
2845 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2846 if (!bands[band])
2847 continue;
2848
2849 for (i = 0; i < bands[band]->n_channels; i++) {
2850 channel = &bands[band]->channels[i];
2851
2852 if (channel->flags & IEEE80211_CHAN_DISABLED)
2853 continue;
2854
2855 ch->allow_ht = true;
2856
2857 /* FIXME: when should we really allow VHT? */
2858 ch->allow_vht = true;
2859
2860 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002861 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002862
2863 ch->ht40plus =
2864 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2865
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002866 ch->chan_radar =
2867 !!(channel->flags & IEEE80211_CHAN_RADAR);
2868
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002869 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002870 ch->passive = passive;
2871
2872 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002873 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002874 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002875 ch->max_power = channel->max_power * 2;
2876 ch->max_reg_power = channel->max_reg_power * 2;
2877 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002878 ch->reg_class_id = 0; /* FIXME */
2879
2880 /* FIXME: why use only legacy modes, why not any
2881 * HT/VHT modes? Would that even make any
2882 * difference? */
2883 if (channel->band == IEEE80211_BAND_2GHZ)
2884 ch->mode = MODE_11G;
2885 else
2886 ch->mode = MODE_11A;
2887
2888 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2889 continue;
2890
Michal Kazior7aa7a722014-08-25 12:09:38 +02002891 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002892 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2893 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002894 ch->freq, ch->max_power, ch->max_reg_power,
2895 ch->max_antenna_gain, ch->mode);
2896
2897 ch++;
2898 }
2899 }
2900
2901 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2902 kfree(arg.channels);
2903
2904 return ret;
2905}
2906
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002907static enum wmi_dfs_region
2908ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2909{
2910 switch (dfs_region) {
2911 case NL80211_DFS_UNSET:
2912 return WMI_UNINIT_DFS_DOMAIN;
2913 case NL80211_DFS_FCC:
2914 return WMI_FCC_DFS_DOMAIN;
2915 case NL80211_DFS_ETSI:
2916 return WMI_ETSI_DFS_DOMAIN;
2917 case NL80211_DFS_JP:
2918 return WMI_MKK4_DFS_DOMAIN;
2919 }
2920 return WMI_UNINIT_DFS_DOMAIN;
2921}
2922
Michal Kaziorf7843d72013-07-16 09:38:52 +02002923static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002924{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002925 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002926 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002927 enum wmi_dfs_region wmi_dfs_reg;
2928 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002929
Michal Kaziorf7843d72013-07-16 09:38:52 +02002930 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002931
2932 ret = ath10k_update_channel_list(ar);
2933 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002934 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002935
2936 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002937
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002938 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2939 nl_dfs_reg = ar->dfs_detector->region;
2940 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2941 } else {
2942 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2943 }
2944
Kalle Valo5e3dd152013-06-12 20:52:10 +03002945 /* Target allows setting up per-band regdomain but ath_common provides
2946 * a combined one only */
2947 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002948 regpair->reg_domain,
2949 regpair->reg_domain, /* 2ghz */
2950 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002951 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002952 regpair->reg_5ghz_ctl,
2953 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002954 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002955 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002956}
Michal Kazior548db542013-07-05 16:15:15 +03002957
Michal Kaziorf7843d72013-07-16 09:38:52 +02002958static void ath10k_reg_notifier(struct wiphy *wiphy,
2959 struct regulatory_request *request)
2960{
2961 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2962 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002963 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002964
2965 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2966
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002967 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002968 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002969 request->dfs_region);
2970 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2971 request->dfs_region);
2972 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002973 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002974 request->dfs_region);
2975 }
2976
Michal Kaziorf7843d72013-07-16 09:38:52 +02002977 mutex_lock(&ar->conf_mutex);
2978 if (ar->state == ATH10K_STATE_ON)
2979 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002980 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002981}
2982
2983/***************/
2984/* TX handlers */
2985/***************/
2986
Michal Kazior96d828d2015-03-31 10:26:23 +00002987void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2988{
2989 lockdep_assert_held(&ar->htt.tx_lock);
2990
2991 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2992 ar->tx_paused |= BIT(reason);
2993 ieee80211_stop_queues(ar->hw);
2994}
2995
2996static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2997 struct ieee80211_vif *vif)
2998{
2999 struct ath10k *ar = data;
3000 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3001
3002 if (arvif->tx_paused)
3003 return;
3004
3005 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3006}
3007
3008void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3009{
3010 lockdep_assert_held(&ar->htt.tx_lock);
3011
3012 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3013 ar->tx_paused &= ~BIT(reason);
3014
3015 if (ar->tx_paused)
3016 return;
3017
3018 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3019 IEEE80211_IFACE_ITER_RESUME_ALL,
3020 ath10k_mac_tx_unlock_iter,
3021 ar);
Michal Kazior3a73d1a2015-08-06 14:46:54 +02003022
3023 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
Michal Kazior96d828d2015-03-31 10:26:23 +00003024}
3025
3026void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3027{
3028 struct ath10k *ar = arvif->ar;
3029
3030 lockdep_assert_held(&ar->htt.tx_lock);
3031
3032 WARN_ON(reason >= BITS_PER_LONG);
3033 arvif->tx_paused |= BIT(reason);
3034 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3035}
3036
3037void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3038{
3039 struct ath10k *ar = arvif->ar;
3040
3041 lockdep_assert_held(&ar->htt.tx_lock);
3042
3043 WARN_ON(reason >= BITS_PER_LONG);
3044 arvif->tx_paused &= ~BIT(reason);
3045
3046 if (ar->tx_paused)
3047 return;
3048
3049 if (arvif->tx_paused)
3050 return;
3051
3052 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3053}
3054
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003055static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3056 enum wmi_tlv_tx_pause_id pause_id,
3057 enum wmi_tlv_tx_pause_action action)
3058{
3059 struct ath10k *ar = arvif->ar;
3060
3061 lockdep_assert_held(&ar->htt.tx_lock);
3062
Michal Kazioracd0b272015-07-09 13:08:38 +02003063 switch (action) {
3064 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3065 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003066 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003067 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3068 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3069 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003070 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003071 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3072 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003073 break;
3074 }
3075}
3076
3077struct ath10k_mac_tx_pause {
3078 u32 vdev_id;
3079 enum wmi_tlv_tx_pause_id pause_id;
3080 enum wmi_tlv_tx_pause_action action;
3081};
3082
3083static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3084 struct ieee80211_vif *vif)
3085{
3086 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3087 struct ath10k_mac_tx_pause *arg = data;
3088
Michal Kazioracd0b272015-07-09 13:08:38 +02003089 if (arvif->vdev_id != arg->vdev_id)
3090 return;
3091
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003092 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3093}
3094
Michal Kazioracd0b272015-07-09 13:08:38 +02003095void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3096 enum wmi_tlv_tx_pause_id pause_id,
3097 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003098{
3099 struct ath10k_mac_tx_pause arg = {
3100 .vdev_id = vdev_id,
3101 .pause_id = pause_id,
3102 .action = action,
3103 };
3104
3105 spin_lock_bh(&ar->htt.tx_lock);
3106 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3107 IEEE80211_IFACE_ITER_RESUME_ALL,
3108 ath10k_mac_handle_tx_pause_iter,
3109 &arg);
3110 spin_unlock_bh(&ar->htt.tx_lock);
3111}
3112
Michal Kazior42c3aa62013-10-02 11:03:38 +02003113static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3114{
3115 if (ieee80211_is_mgmt(hdr->frame_control))
3116 return HTT_DATA_TX_EXT_TID_MGMT;
3117
3118 if (!ieee80211_is_data_qos(hdr->frame_control))
3119 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3120
3121 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3122 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3123
3124 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3125}
3126
Michal Kazior2b37c292014-09-02 11:00:22 +03003127static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003128{
Michal Kazior2b37c292014-09-02 11:00:22 +03003129 if (vif)
3130 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003131
Michal Kazior1bbc0972014-04-08 09:45:47 +03003132 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003133 return ar->monitor_vdev_id;
3134
Michal Kazior7aa7a722014-08-25 12:09:38 +02003135 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003136 return 0;
3137}
3138
Michal Kaziord740d8f2015-03-30 09:51:51 +03003139static enum ath10k_hw_txrx_mode
3140ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003141 struct ieee80211_sta *sta, struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003142{
3143 const struct ieee80211_hdr *hdr = (void *)skb->data;
3144 __le16 fc = hdr->frame_control;
3145
3146 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3147 return ATH10K_HW_TXRX_RAW;
3148
3149 if (ieee80211_is_mgmt(fc))
3150 return ATH10K_HW_TXRX_MGMT;
3151
3152 /* Workaround:
3153 *
3154 * NullFunc frames are mostly used to ping if a client or AP are still
3155 * reachable and responsive. This implies tx status reports must be
3156 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3157 * come to a conclusion that the other end disappeared and tear down
3158 * BSS connection or it can never disconnect from BSS/client (which is
3159 * the case).
3160 *
3161 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3162 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3163 * which seems to deliver correct tx reports for NullFunc frames. The
3164 * downside of using it is it ignores client powersave state so it can
3165 * end up disconnecting sleeping clients in AP mode. It should fix STA
3166 * mode though because AP don't sleep.
3167 */
3168 if (ar->htt.target_version_major < 3 &&
3169 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3170 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3171 return ATH10K_HW_TXRX_MGMT;
3172
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003173 /* Workaround:
3174 *
3175 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3176 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3177 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003178 *
3179 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003180 */
3181 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3182 return ATH10K_HW_TXRX_ETHERNET;
3183
David Liuccec9032015-07-24 20:25:32 +03003184 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3185 return ATH10K_HW_TXRX_RAW;
3186
Michal Kaziord740d8f2015-03-30 09:51:51 +03003187 return ATH10K_HW_TXRX_NATIVE_WIFI;
3188}
3189
David Liuccec9032015-07-24 20:25:32 +03003190static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3191 struct sk_buff *skb) {
3192 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3193 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3194 IEEE80211_TX_CTL_INJECTED;
3195 if ((info->flags & mask) == mask)
3196 return false;
3197 if (vif)
3198 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3199 return true;
3200}
3201
Michal Kazior4b604552014-07-21 21:03:09 +03003202/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3203 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003204 */
Michal Kazior4b604552014-07-21 21:03:09 +03003205static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003206{
3207 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003208 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003209 u8 *qos_ctl;
3210
3211 if (!ieee80211_is_data_qos(hdr->frame_control))
3212 return;
3213
3214 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003215 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3216 skb->data, (void *)qos_ctl - (void *)skb->data);
3217 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003218
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003219 /* Some firmware revisions don't handle sending QoS NullFunc well.
3220 * These frames are mainly used for CQM purposes so it doesn't really
3221 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003222 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003223 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003224 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003225 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003226
3227 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003228}
3229
Michal Kaziord740d8f2015-03-30 09:51:51 +03003230static void ath10k_tx_h_8023(struct sk_buff *skb)
3231{
3232 struct ieee80211_hdr *hdr;
3233 struct rfc1042_hdr *rfc1042;
3234 struct ethhdr *eth;
3235 size_t hdrlen;
3236 u8 da[ETH_ALEN];
3237 u8 sa[ETH_ALEN];
3238 __be16 type;
3239
3240 hdr = (void *)skb->data;
3241 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3242 rfc1042 = (void *)skb->data + hdrlen;
3243
3244 ether_addr_copy(da, ieee80211_get_DA(hdr));
3245 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3246 type = rfc1042->snap_type;
3247
3248 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3249 skb_push(skb, sizeof(*eth));
3250
3251 eth = (void *)skb->data;
3252 ether_addr_copy(eth->h_dest, da);
3253 ether_addr_copy(eth->h_source, sa);
3254 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003255}
3256
Michal Kazior4b604552014-07-21 21:03:09 +03003257static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3258 struct ieee80211_vif *vif,
3259 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003260{
3261 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003262 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3263
3264 /* This is case only for P2P_GO */
3265 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3266 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3267 return;
3268
3269 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3270 spin_lock_bh(&ar->data_lock);
3271 if (arvif->u.ap.noa_data)
3272 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3273 GFP_ATOMIC))
3274 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3275 arvif->u.ap.noa_data,
3276 arvif->u.ap.noa_len);
3277 spin_unlock_bh(&ar->data_lock);
3278 }
3279}
3280
Michal Kazior8d6d3622014-11-24 14:58:31 +01003281static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3282{
3283 /* FIXME: Not really sure since when the behaviour changed. At some
3284 * point new firmware stopped requiring creation of peer entries for
3285 * offchannel tx (and actually creating them causes issues with wmi-htc
3286 * tx credit replenishment and reliability). Assuming it's at least 3.4
3287 * because that's when the `freq` was introduced to TX_FRM HTT command.
3288 */
3289 return !(ar->htt.target_version_major >= 3 &&
3290 ar->htt.target_version_minor >= 4);
3291}
3292
Michal Kaziord740d8f2015-03-30 09:51:51 +03003293static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003294{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003295 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003296 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003297
Michal Kaziord740d8f2015-03-30 09:51:51 +03003298 spin_lock_bh(&ar->data_lock);
3299
3300 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3301 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3302 ret = -ENOSPC;
3303 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003304 }
3305
Michal Kaziord740d8f2015-03-30 09:51:51 +03003306 __skb_queue_tail(q, skb);
3307 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3308
3309unlock:
3310 spin_unlock_bh(&ar->data_lock);
3311
3312 return ret;
3313}
3314
3315static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3316{
3317 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3318 struct ath10k_htt *htt = &ar->htt;
3319 int ret = 0;
3320
3321 switch (cb->txmode) {
3322 case ATH10K_HW_TXRX_RAW:
3323 case ATH10K_HW_TXRX_NATIVE_WIFI:
3324 case ATH10K_HW_TXRX_ETHERNET:
3325 ret = ath10k_htt_tx(htt, skb);
3326 break;
3327 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003328 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003329 ar->fw_features))
3330 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3331 else if (ar->htt.target_version_major >= 3)
3332 ret = ath10k_htt_tx(htt, skb);
3333 else
3334 ret = ath10k_htt_mgmt_tx(htt, skb);
3335 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003336 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003337
3338 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003339 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3340 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003341 ieee80211_free_txskb(ar->hw, skb);
3342 }
3343}
3344
3345void ath10k_offchan_tx_purge(struct ath10k *ar)
3346{
3347 struct sk_buff *skb;
3348
3349 for (;;) {
3350 skb = skb_dequeue(&ar->offchan_tx_queue);
3351 if (!skb)
3352 break;
3353
3354 ieee80211_free_txskb(ar->hw, skb);
3355 }
3356}
3357
3358void ath10k_offchan_tx_work(struct work_struct *work)
3359{
3360 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3361 struct ath10k_peer *peer;
3362 struct ieee80211_hdr *hdr;
3363 struct sk_buff *skb;
3364 const u8 *peer_addr;
3365 int vdev_id;
3366 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003367 unsigned long time_left;
Michal Kazioradaeed72015-08-05 12:15:23 +02003368 bool tmp_peer_created = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003369
3370 /* FW requirement: We must create a peer before FW will send out
3371 * an offchannel frame. Otherwise the frame will be stuck and
3372 * never transmitted. We delete the peer upon tx completion.
3373 * It is unlikely that a peer for offchannel tx will already be
3374 * present. However it may be in some rare cases so account for that.
3375 * Otherwise we might remove a legitimate peer and break stuff. */
3376
3377 for (;;) {
3378 skb = skb_dequeue(&ar->offchan_tx_queue);
3379 if (!skb)
3380 break;
3381
3382 mutex_lock(&ar->conf_mutex);
3383
Michal Kazior7aa7a722014-08-25 12:09:38 +02003384 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003385 skb);
3386
3387 hdr = (struct ieee80211_hdr *)skb->data;
3388 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003389 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003390
3391 spin_lock_bh(&ar->data_lock);
3392 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3393 spin_unlock_bh(&ar->data_lock);
3394
3395 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003396 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003397 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003398 peer_addr, vdev_id);
3399
3400 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003401 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3402 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003403 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003404 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003405 peer_addr, vdev_id, ret);
Michal Kazioradaeed72015-08-05 12:15:23 +02003406 tmp_peer_created = (ret == 0);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003407 }
3408
3409 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003410 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003411 ar->offchan_tx_skb = skb;
3412 spin_unlock_bh(&ar->data_lock);
3413
Michal Kaziord740d8f2015-03-30 09:51:51 +03003414 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003415
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003416 time_left =
3417 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3418 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003419 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003420 skb);
3421
Michal Kazioradaeed72015-08-05 12:15:23 +02003422 if (!peer && tmp_peer_created) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003423 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3424 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003425 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003426 peer_addr, vdev_id, ret);
3427 }
3428
3429 mutex_unlock(&ar->conf_mutex);
3430 }
3431}
3432
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003433void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3434{
3435 struct sk_buff *skb;
3436
3437 for (;;) {
3438 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3439 if (!skb)
3440 break;
3441
3442 ieee80211_free_txskb(ar->hw, skb);
3443 }
3444}
3445
3446void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3447{
3448 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3449 struct sk_buff *skb;
3450 int ret;
3451
3452 for (;;) {
3453 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3454 if (!skb)
3455 break;
3456
3457 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003458 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003459 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003460 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003461 ieee80211_free_txskb(ar->hw, skb);
3462 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003463 }
3464}
3465
Kalle Valo5e3dd152013-06-12 20:52:10 +03003466/************/
3467/* Scanning */
3468/************/
3469
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003470void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003471{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003472 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003473
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003474 switch (ar->scan.state) {
3475 case ATH10K_SCAN_IDLE:
3476 break;
3477 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003478 case ATH10K_SCAN_ABORTING:
3479 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003480 ieee80211_scan_completed(ar->hw,
3481 (ar->scan.state ==
3482 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003483 else if (ar->scan.roc_notify)
3484 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003485 /* fall through */
3486 case ATH10K_SCAN_STARTING:
3487 ar->scan.state = ATH10K_SCAN_IDLE;
3488 ar->scan_channel = NULL;
3489 ath10k_offchan_tx_purge(ar);
3490 cancel_delayed_work(&ar->scan.timeout);
3491 complete_all(&ar->scan.completed);
3492 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003493 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003494}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003495
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003496void ath10k_scan_finish(struct ath10k *ar)
3497{
3498 spin_lock_bh(&ar->data_lock);
3499 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003500 spin_unlock_bh(&ar->data_lock);
3501}
3502
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003503static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003504{
3505 struct wmi_stop_scan_arg arg = {
3506 .req_id = 1, /* FIXME */
3507 .req_type = WMI_SCAN_STOP_ONE,
3508 .u.scan_id = ATH10K_SCAN_ID,
3509 };
3510 int ret;
3511
3512 lockdep_assert_held(&ar->conf_mutex);
3513
Kalle Valo5e3dd152013-06-12 20:52:10 +03003514 ret = ath10k_wmi_stop_scan(ar, &arg);
3515 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003516 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003517 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003518 }
3519
Kalle Valo5e3dd152013-06-12 20:52:10 +03003520 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003521 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003522 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003523 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003524 } else if (ret > 0) {
3525 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003526 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003527
3528out:
3529 /* Scan state should be updated upon scan completion but in case
3530 * firmware fails to deliver the event (for whatever reason) it is
3531 * desired to clean up scan state anyway. Firmware may have just
3532 * dropped the scan completion event delivery due to transport pipe
3533 * being overflown with data and/or it can recover on its own before
3534 * next scan request is submitted.
3535 */
3536 spin_lock_bh(&ar->data_lock);
3537 if (ar->scan.state != ATH10K_SCAN_IDLE)
3538 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003539 spin_unlock_bh(&ar->data_lock);
3540
3541 return ret;
3542}
3543
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003544static void ath10k_scan_abort(struct ath10k *ar)
3545{
3546 int ret;
3547
3548 lockdep_assert_held(&ar->conf_mutex);
3549
3550 spin_lock_bh(&ar->data_lock);
3551
3552 switch (ar->scan.state) {
3553 case ATH10K_SCAN_IDLE:
3554 /* This can happen if timeout worker kicked in and called
3555 * abortion while scan completion was being processed.
3556 */
3557 break;
3558 case ATH10K_SCAN_STARTING:
3559 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003560 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003561 ath10k_scan_state_str(ar->scan.state),
3562 ar->scan.state);
3563 break;
3564 case ATH10K_SCAN_RUNNING:
3565 ar->scan.state = ATH10K_SCAN_ABORTING;
3566 spin_unlock_bh(&ar->data_lock);
3567
3568 ret = ath10k_scan_stop(ar);
3569 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003570 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003571
3572 spin_lock_bh(&ar->data_lock);
3573 break;
3574 }
3575
3576 spin_unlock_bh(&ar->data_lock);
3577}
3578
3579void ath10k_scan_timeout_work(struct work_struct *work)
3580{
3581 struct ath10k *ar = container_of(work, struct ath10k,
3582 scan.timeout.work);
3583
3584 mutex_lock(&ar->conf_mutex);
3585 ath10k_scan_abort(ar);
3586 mutex_unlock(&ar->conf_mutex);
3587}
3588
Kalle Valo5e3dd152013-06-12 20:52:10 +03003589static int ath10k_start_scan(struct ath10k *ar,
3590 const struct wmi_start_scan_arg *arg)
3591{
3592 int ret;
3593
3594 lockdep_assert_held(&ar->conf_mutex);
3595
3596 ret = ath10k_wmi_start_scan(ar, arg);
3597 if (ret)
3598 return ret;
3599
Kalle Valo5e3dd152013-06-12 20:52:10 +03003600 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3601 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003602 ret = ath10k_scan_stop(ar);
3603 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003604 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003605
3606 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003607 }
3608
Ben Greear2f9eec02015-02-15 16:50:38 +02003609 /* If we failed to start the scan, return error code at
3610 * this point. This is probably due to some issue in the
3611 * firmware, but no need to wedge the driver due to that...
3612 */
3613 spin_lock_bh(&ar->data_lock);
3614 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3615 spin_unlock_bh(&ar->data_lock);
3616 return -EINVAL;
3617 }
3618 spin_unlock_bh(&ar->data_lock);
3619
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003620 /* Add a 200ms margin to account for event/command processing */
3621 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3622 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03003623 return 0;
3624}
3625
3626/**********************/
3627/* mac80211 callbacks */
3628/**********************/
3629
3630static void ath10k_tx(struct ieee80211_hw *hw,
3631 struct ieee80211_tx_control *control,
3632 struct sk_buff *skb)
3633{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003634 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003635 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3636 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003637 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003638 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kaziord740d8f2015-03-30 09:51:51 +03003639 __le16 fc = hdr->frame_control;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003640
3641 /* We should disable CCK RATE due to P2P */
3642 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003643 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003644
Michal Kazior4b604552014-07-21 21:03:09 +03003645 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003646 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003647 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
David Liuccec9032015-07-24 20:25:32 +03003648 ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
Michal Kazior2b37c292014-09-02 11:00:22 +03003649 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003650 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003651 ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003652
Michal Kaziord740d8f2015-03-30 09:51:51 +03003653 switch (ATH10K_SKB_CB(skb)->txmode) {
3654 case ATH10K_HW_TXRX_MGMT:
3655 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003656 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003657 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3658 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003659 break;
3660 case ATH10K_HW_TXRX_ETHERNET:
3661 ath10k_tx_h_8023(skb);
3662 break;
3663 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003664 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3665 WARN_ON_ONCE(1);
3666 ieee80211_free_txskb(hw, skb);
3667 return;
3668 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003669 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003670
Kalle Valo5e3dd152013-06-12 20:52:10 +03003671 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3672 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003673 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003674 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003675 spin_unlock_bh(&ar->data_lock);
3676
Michal Kazior8d6d3622014-11-24 14:58:31 +01003677 if (ath10k_mac_need_offchan_tx_work(ar)) {
3678 ATH10K_SKB_CB(skb)->htt.freq = 0;
3679 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003680
Michal Kazior8d6d3622014-11-24 14:58:31 +01003681 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3682 skb);
3683
3684 skb_queue_tail(&ar->offchan_tx_queue, skb);
3685 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3686 return;
3687 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003688 }
3689
Michal Kaziord740d8f2015-03-30 09:51:51 +03003690 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003691}
3692
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003693/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003694void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003695{
3696 /* make sure rcu-protected mac80211 tx path itself is drained */
3697 synchronize_net();
3698
3699 ath10k_offchan_tx_purge(ar);
3700 ath10k_mgmt_over_wmi_tx_purge(ar);
3701
3702 cancel_work_sync(&ar->offchan_tx_work);
3703 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3704}
3705
Michal Kazioraffd3212013-07-16 09:54:35 +02003706void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003707{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003708 struct ath10k_vif *arvif;
3709
Michal Kazior818bdd12013-07-16 09:38:57 +02003710 lockdep_assert_held(&ar->conf_mutex);
3711
Michal Kazior19337472014-08-28 12:58:16 +02003712 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3713 ar->filter_flags = 0;
3714 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003715 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003716
3717 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003718 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003719
3720 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003721 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003722
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003723 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003724 ath10k_peer_cleanup_all(ar);
3725 ath10k_core_stop(ar);
3726 ath10k_hif_power_down(ar);
3727
3728 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003729 list_for_each_entry(arvif, &ar->arvifs, list)
3730 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003731 spin_unlock_bh(&ar->data_lock);
3732}
3733
Ben Greear46acf7b2014-05-16 17:15:38 +03003734static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3735{
3736 struct ath10k *ar = hw->priv;
3737
3738 mutex_lock(&ar->conf_mutex);
3739
3740 if (ar->cfg_tx_chainmask) {
3741 *tx_ant = ar->cfg_tx_chainmask;
3742 *rx_ant = ar->cfg_rx_chainmask;
3743 } else {
3744 *tx_ant = ar->supp_tx_chainmask;
3745 *rx_ant = ar->supp_rx_chainmask;
3746 }
3747
3748 mutex_unlock(&ar->conf_mutex);
3749
3750 return 0;
3751}
3752
Ben Greear5572a952014-11-24 16:22:10 +02003753static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3754{
3755 /* It is not clear that allowing gaps in chainmask
3756 * is helpful. Probably it will not do what user
3757 * is hoping for, so warn in that case.
3758 */
3759 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3760 return;
3761
3762 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3763 dbg, cm);
3764}
3765
Ben Greear46acf7b2014-05-16 17:15:38 +03003766static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3767{
3768 int ret;
3769
3770 lockdep_assert_held(&ar->conf_mutex);
3771
Ben Greear5572a952014-11-24 16:22:10 +02003772 ath10k_check_chain_mask(ar, tx_ant, "tx");
3773 ath10k_check_chain_mask(ar, rx_ant, "rx");
3774
Ben Greear46acf7b2014-05-16 17:15:38 +03003775 ar->cfg_tx_chainmask = tx_ant;
3776 ar->cfg_rx_chainmask = rx_ant;
3777
3778 if ((ar->state != ATH10K_STATE_ON) &&
3779 (ar->state != ATH10K_STATE_RESTARTED))
3780 return 0;
3781
3782 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3783 tx_ant);
3784 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003785 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003786 ret, tx_ant);
3787 return ret;
3788 }
3789
3790 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3791 rx_ant);
3792 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003793 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003794 ret, rx_ant);
3795 return ret;
3796 }
3797
3798 return 0;
3799}
3800
3801static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3802{
3803 struct ath10k *ar = hw->priv;
3804 int ret;
3805
3806 mutex_lock(&ar->conf_mutex);
3807 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3808 mutex_unlock(&ar->conf_mutex);
3809 return ret;
3810}
3811
Kalle Valo5e3dd152013-06-12 20:52:10 +03003812static int ath10k_start(struct ieee80211_hw *hw)
3813{
3814 struct ath10k *ar = hw->priv;
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003815 u32 burst_enable;
Michal Kazior818bdd12013-07-16 09:38:57 +02003816 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003817
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003818 /*
3819 * This makes sense only when restarting hw. It is harmless to call
3820 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3821 * commands will be submitted while restarting.
3822 */
3823 ath10k_drain_tx(ar);
3824
Michal Kazior548db542013-07-05 16:15:15 +03003825 mutex_lock(&ar->conf_mutex);
3826
Michal Kaziorc5058f52014-05-26 12:46:03 +03003827 switch (ar->state) {
3828 case ATH10K_STATE_OFF:
3829 ar->state = ATH10K_STATE_ON;
3830 break;
3831 case ATH10K_STATE_RESTARTING:
3832 ath10k_halt(ar);
3833 ar->state = ATH10K_STATE_RESTARTED;
3834 break;
3835 case ATH10K_STATE_ON:
3836 case ATH10K_STATE_RESTARTED:
3837 case ATH10K_STATE_WEDGED:
3838 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02003839 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03003840 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03003841 case ATH10K_STATE_UTF:
3842 ret = -EBUSY;
3843 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02003844 }
3845
3846 ret = ath10k_hif_power_up(ar);
3847 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003848 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003849 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02003850 }
3851
Kalle Valo43d2a302014-09-10 18:23:30 +03003852 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02003853 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003854 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003855 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02003856 }
3857
Bartosz Markowski226a3392013-09-26 17:47:16 +02003858 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003859 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003860 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003861 goto err_core_stop;
3862 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003863
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01003864 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003865 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003866 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003867 goto err_core_stop;
3868 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003869
Michal Kaziorcf327842015-03-31 10:26:25 +00003870 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3871 ret = ath10k_wmi_adaptive_qcs(ar, true);
3872 if (ret) {
3873 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3874 ret);
3875 goto err_core_stop;
3876 }
3877 }
3878
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003879 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
3880 burst_enable = ar->wmi.pdev_param->burst_enable;
3881 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
3882 if (ret) {
3883 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
3884 goto err_core_stop;
3885 }
3886 }
3887
Ben Greear46acf7b2014-05-16 17:15:38 +03003888 if (ar->cfg_tx_chainmask)
3889 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3890 ar->cfg_rx_chainmask);
3891
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003892 /*
3893 * By default FW set ARP frames ac to voice (6). In that case ARP
3894 * exchange is not working properly for UAPSD enabled AP. ARP requests
3895 * which arrives with access category 0 are processed by network stack
3896 * and send back with access category 0, but FW changes access category
3897 * to 6. Set ARP frames access category to best effort (0) solves
3898 * this problem.
3899 */
3900
3901 ret = ath10k_wmi_pdev_set_param(ar,
3902 ar->wmi.pdev_param->arp_ac_override, 0);
3903 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003904 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003905 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003906 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003907 }
3908
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05303909 ret = ath10k_wmi_pdev_set_param(ar,
3910 ar->wmi.pdev_param->ani_enable, 1);
3911 if (ret) {
3912 ath10k_warn(ar, "failed to enable ani by default: %d\n",
3913 ret);
3914 goto err_core_stop;
3915 }
3916
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05303917 ar->ani_enabled = true;
3918
Michal Kaziord6500972014-04-08 09:56:09 +03003919 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02003920 ath10k_regd_update(ar);
3921
Simon Wunderlich855aed12014-08-02 09:12:54 +03003922 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05303923 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03003924
Michal Kaziorae254432014-05-26 12:46:02 +03003925 mutex_unlock(&ar->conf_mutex);
3926 return 0;
3927
3928err_core_stop:
3929 ath10k_core_stop(ar);
3930
3931err_power_down:
3932 ath10k_hif_power_down(ar);
3933
3934err_off:
3935 ar->state = ATH10K_STATE_OFF;
3936
3937err:
Michal Kazior548db542013-07-05 16:15:15 +03003938 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01003939 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003940}
3941
3942static void ath10k_stop(struct ieee80211_hw *hw)
3943{
3944 struct ath10k *ar = hw->priv;
3945
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003946 ath10k_drain_tx(ar);
3947
Michal Kazior548db542013-07-05 16:15:15 +03003948 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003949 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02003950 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003951 ar->state = ATH10K_STATE_OFF;
3952 }
Michal Kazior548db542013-07-05 16:15:15 +03003953 mutex_unlock(&ar->conf_mutex);
3954
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003955 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02003956 cancel_work_sync(&ar->restart_work);
3957}
3958
Michal Kaziorad088bf2013-10-16 15:44:46 +03003959static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02003960{
Michal Kaziorad088bf2013-10-16 15:44:46 +03003961 struct ath10k_vif *arvif;
3962 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02003963
3964 lockdep_assert_held(&ar->conf_mutex);
3965
Michal Kaziorad088bf2013-10-16 15:44:46 +03003966 list_for_each_entry(arvif, &ar->arvifs, list) {
3967 ret = ath10k_mac_vif_setup_ps(arvif);
3968 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003969 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003970 break;
3971 }
3972 }
Michal Kazioraffd3212013-07-16 09:54:35 +02003973
Michal Kaziorad088bf2013-10-16 15:44:46 +03003974 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003975}
3976
Michal Kazior7d9d5582014-10-21 10:40:15 +03003977static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3978{
3979 int ret;
3980 u32 param;
3981
3982 lockdep_assert_held(&ar->conf_mutex);
3983
3984 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3985
3986 param = ar->wmi.pdev_param->txpower_limit2g;
3987 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3988 if (ret) {
3989 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3990 txpower, ret);
3991 return ret;
3992 }
3993
3994 param = ar->wmi.pdev_param->txpower_limit5g;
3995 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3996 if (ret) {
3997 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3998 txpower, ret);
3999 return ret;
4000 }
4001
4002 return 0;
4003}
4004
4005static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4006{
4007 struct ath10k_vif *arvif;
4008 int ret, txpower = -1;
4009
4010 lockdep_assert_held(&ar->conf_mutex);
4011
4012 list_for_each_entry(arvif, &ar->arvifs, list) {
4013 WARN_ON(arvif->txpower < 0);
4014
4015 if (txpower == -1)
4016 txpower = arvif->txpower;
4017 else
4018 txpower = min(txpower, arvif->txpower);
4019 }
4020
4021 if (WARN_ON(txpower == -1))
4022 return -EINVAL;
4023
4024 ret = ath10k_mac_txpower_setup(ar, txpower);
4025 if (ret) {
4026 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4027 txpower, ret);
4028 return ret;
4029 }
4030
4031 return 0;
4032}
4033
Kalle Valo5e3dd152013-06-12 20:52:10 +03004034static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4035{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004036 struct ath10k *ar = hw->priv;
4037 struct ieee80211_conf *conf = &hw->conf;
4038 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004039
4040 mutex_lock(&ar->conf_mutex);
4041
Michal Kazioraffd3212013-07-16 09:54:35 +02004042 if (changed & IEEE80211_CONF_CHANGE_PS)
4043 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004044
4045 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004046 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4047 ret = ath10k_monitor_recalc(ar);
4048 if (ret)
4049 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004050 }
4051
4052 mutex_unlock(&ar->conf_mutex);
4053 return ret;
4054}
4055
Ben Greear5572a952014-11-24 16:22:10 +02004056static u32 get_nss_from_chainmask(u16 chain_mask)
4057{
4058 if ((chain_mask & 0x15) == 0x15)
4059 return 4;
4060 else if ((chain_mask & 0x7) == 0x7)
4061 return 3;
4062 else if ((chain_mask & 0x3) == 0x3)
4063 return 2;
4064 return 1;
4065}
4066
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004067static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4068{
4069 int nsts = ar->vht_cap_info;
4070 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4071 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4072
4073 /* If firmware does not deliver to host number of space-time
4074 * streams supported, assume it support up to 4 BF STS and return
4075 * the value for VHT CAP: nsts-1)
4076 * */
4077 if (nsts == 0)
4078 return 3;
4079
4080 return nsts;
4081}
4082
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304083static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4084{
4085 u32 value = 0;
4086 struct ath10k *ar = arvif->ar;
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004087 int nsts;
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304088
4089 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4090 return 0;
4091
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004092 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304093 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4094 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004095 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304096
4097 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4098 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
4099 value |= SM((ar->num_rf_chains - 1), WMI_BF_SOUND_DIM_OFFSET);
4100
4101 if (!value)
4102 return 0;
4103
4104 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4105 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4106
4107 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4108 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4109 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4110
4111 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4112 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4113
4114 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4115 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4116 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4117
4118 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4119 ar->wmi.vdev_param->txbf, value);
4120}
4121
Kalle Valo5e3dd152013-06-12 20:52:10 +03004122/*
4123 * TODO:
4124 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4125 * because we will send mgmt frames without CCK. This requirement
4126 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4127 * in the TX packet.
4128 */
4129static int ath10k_add_interface(struct ieee80211_hw *hw,
4130 struct ieee80211_vif *vif)
4131{
4132 struct ath10k *ar = hw->priv;
4133 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4134 enum wmi_sta_powersave_param param;
4135 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004136 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004137 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004138 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004139 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004140
Johannes Berg848955c2014-11-11 12:48:42 +01004141 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4142
Kalle Valo5e3dd152013-06-12 20:52:10 +03004143 mutex_lock(&ar->conf_mutex);
4144
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004145 memset(arvif, 0, sizeof(*arvif));
4146
Kalle Valo5e3dd152013-06-12 20:52:10 +03004147 arvif->ar = ar;
4148 arvif->vif = vif;
4149
Ben Greeare63b33f2013-10-22 14:54:14 -07004150 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004151 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004152 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4153 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004154
Michal Kazior45c9abc2015-04-21 20:42:58 +03004155 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4156 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4157 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4158 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4159 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4160 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4161 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004162
Michal Kaziore04cafb2015-08-05 12:15:24 +02004163 if (ar->num_peers >= ar->max_num_peers) {
4164 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
Michal Kazior503422d2015-08-19 13:08:53 +02004165 ret = -ENOBUFS;
4166 goto err;
Michal Kaziore04cafb2015-08-05 12:15:24 +02004167 }
4168
Ben Greeara9aefb32014-08-12 11:02:19 +03004169 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004170 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004171 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004172 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004173 }
Ben Greear16c11172014-09-23 14:17:16 -07004174 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004175
Ben Greear16c11172014-09-23 14:17:16 -07004176 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4177 bit, ar->free_vdev_map);
4178
4179 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004180 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004181
Kalle Valo5e3dd152013-06-12 20:52:10 +03004182 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004183 case NL80211_IFTYPE_P2P_DEVICE:
4184 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4185 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4186 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004187 case NL80211_IFTYPE_UNSPECIFIED:
4188 case NL80211_IFTYPE_STATION:
4189 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4190 if (vif->p2p)
4191 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4192 break;
4193 case NL80211_IFTYPE_ADHOC:
4194 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4195 break;
4196 case NL80211_IFTYPE_AP:
4197 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4198
4199 if (vif->p2p)
4200 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4201 break;
4202 case NL80211_IFTYPE_MONITOR:
4203 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4204 break;
4205 default:
4206 WARN_ON(1);
4207 break;
4208 }
4209
Michal Kazior96d828d2015-03-31 10:26:23 +00004210 /* Using vdev_id as queue number will make it very easy to do per-vif
4211 * tx queue locking. This shouldn't wrap due to interface combinations
4212 * but do a modulo for correctness sake and prevent using offchannel tx
4213 * queues for regular vif tx.
4214 */
4215 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4216 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4217 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4218
Michal Kazior64badcb2014-09-18 11:18:02 +03004219 /* Some firmware revisions don't wait for beacon tx completion before
4220 * sending another SWBA event. This could lead to hardware using old
4221 * (freed) beacon data in some cases, e.g. tx credit starvation
4222 * combined with missed TBTT. This is very very rare.
4223 *
4224 * On non-IOMMU-enabled hosts this could be a possible security issue
4225 * because hw could beacon some random data on the air. On
4226 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4227 * device would crash.
4228 *
4229 * Since there are no beacon tx completions (implicit nor explicit)
4230 * propagated to host the only workaround for this is to allocate a
4231 * DMA-coherent buffer for a lifetime of a vif and use it for all
4232 * beacon tx commands. Worst case for this approach is some beacons may
4233 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4234 */
4235 if (vif->type == NL80211_IFTYPE_ADHOC ||
4236 vif->type == NL80211_IFTYPE_AP) {
4237 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4238 IEEE80211_MAX_FRAME_LEN,
4239 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304240 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004241 if (!arvif->beacon_buf) {
4242 ret = -ENOMEM;
4243 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4244 ret);
4245 goto err;
4246 }
4247 }
David Liuccec9032015-07-24 20:25:32 +03004248 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4249 arvif->nohwcrypt = true;
4250
4251 if (arvif->nohwcrypt &&
4252 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4253 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4254 goto err;
4255 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004256
4257 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4258 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4259 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004260
4261 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4262 arvif->vdev_subtype, vif->addr);
4263 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004264 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004265 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004266 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004267 }
4268
Ben Greear16c11172014-09-23 14:17:16 -07004269 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004270 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004271
Michal Kazior46725b152015-01-28 09:57:49 +02004272 /* It makes no sense to have firmware do keepalives. mac80211 already
4273 * takes care of this with idle connection polling.
4274 */
4275 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004276 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004277 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004278 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004279 goto err_vdev_delete;
4280 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004281
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004282 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004283
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004284 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4285 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004286 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004287 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004288 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004289 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004290 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004291 goto err_vdev_delete;
4292 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004293
Ben Greear5572a952014-11-24 16:22:10 +02004294 if (ar->cfg_tx_chainmask) {
4295 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4296
4297 vdev_param = ar->wmi.vdev_param->nss;
4298 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4299 nss);
4300 if (ret) {
4301 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4302 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4303 ret);
4304 goto err_vdev_delete;
4305 }
4306 }
4307
Michal Kaziore57e0572015-03-24 13:14:03 +00004308 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4309 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004310 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4311 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004312 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004313 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004314 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004315 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004316 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004317 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004318
Michal Kaziore57e0572015-03-24 13:14:03 +00004319 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004320 ret = ath10k_mac_set_kickout(arvif);
4321 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004322 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004323 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004324 goto err_peer_delete;
4325 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004326 }
4327
4328 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4329 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4330 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4331 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4332 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004333 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004334 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004335 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004336 goto err_peer_delete;
4337 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004338
Michal Kazior9f9b5742014-12-12 12:41:36 +01004339 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004340 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004341 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004342 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004343 goto err_peer_delete;
4344 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004345
Michal Kazior9f9b5742014-12-12 12:41:36 +01004346 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004347 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004348 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004349 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004350 goto err_peer_delete;
4351 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004352 }
4353
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304354 ret = ath10k_mac_set_txbf_conf(arvif);
4355 if (ret) {
4356 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4357 arvif->vdev_id, ret);
4358 goto err_peer_delete;
4359 }
4360
Michal Kazior424121c2013-07-22 14:13:31 +02004361 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004362 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004363 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004364 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004365 goto err_peer_delete;
4366 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004367
Michal Kazior7d9d5582014-10-21 10:40:15 +03004368 arvif->txpower = vif->bss_conf.txpower;
4369 ret = ath10k_mac_txpower_recalc(ar);
4370 if (ret) {
4371 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4372 goto err_peer_delete;
4373 }
4374
Michal Kazior500ff9f2015-03-31 10:26:21 +00004375 if (vif->type == NL80211_IFTYPE_MONITOR) {
4376 ar->monitor_arvif = arvif;
4377 ret = ath10k_monitor_recalc(ar);
4378 if (ret) {
4379 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4380 goto err_peer_delete;
4381 }
4382 }
4383
Michal Kazior6d2d51e2015-08-07 09:08:21 +02004384 spin_lock_bh(&ar->htt.tx_lock);
4385 if (!ar->tx_paused)
4386 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4387 spin_unlock_bh(&ar->htt.tx_lock);
4388
Kalle Valo5e3dd152013-06-12 20:52:10 +03004389 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004390 return 0;
4391
4392err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004393 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4394 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004395 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4396
4397err_vdev_delete:
4398 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004399 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004400 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004401
4402err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004403 if (arvif->beacon_buf) {
4404 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4405 arvif->beacon_buf, arvif->beacon_paddr);
4406 arvif->beacon_buf = NULL;
4407 }
4408
Michal Kazior9dad14a2013-10-16 15:44:45 +03004409 mutex_unlock(&ar->conf_mutex);
4410
Kalle Valo5e3dd152013-06-12 20:52:10 +03004411 return ret;
4412}
4413
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004414static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4415{
4416 int i;
4417
4418 for (i = 0; i < BITS_PER_LONG; i++)
4419 ath10k_mac_vif_tx_unlock(arvif, i);
4420}
4421
Kalle Valo5e3dd152013-06-12 20:52:10 +03004422static void ath10k_remove_interface(struct ieee80211_hw *hw,
4423 struct ieee80211_vif *vif)
4424{
4425 struct ath10k *ar = hw->priv;
4426 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4427 int ret;
4428
Michal Kazior81a9a172015-03-05 16:02:17 +02004429 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004430 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004431
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304432 mutex_lock(&ar->conf_mutex);
4433
Michal Kaziored543882013-09-13 14:16:56 +02004434 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004435 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004436 spin_unlock_bh(&ar->data_lock);
4437
Simon Wunderlich855aed12014-08-02 09:12:54 +03004438 ret = ath10k_spectral_vif_stop(arvif);
4439 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004440 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004441 arvif->vdev_id, ret);
4442
Ben Greear16c11172014-09-23 14:17:16 -07004443 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004444 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004445
Michal Kaziore57e0572015-03-24 13:14:03 +00004446 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4447 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004448 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4449 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004450 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004451 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004452 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004453
4454 kfree(arvif->u.ap.noa_data);
4455 }
4456
Michal Kazior7aa7a722014-08-25 12:09:38 +02004457 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004458 arvif->vdev_id);
4459
Kalle Valo5e3dd152013-06-12 20:52:10 +03004460 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4461 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004462 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004463 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004464
Michal Kazior2c512052015-02-15 16:50:40 +02004465 /* Some firmware revisions don't notify host about self-peer removal
4466 * until after associated vdev is deleted.
4467 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004468 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4469 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004470 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4471 vif->addr);
4472 if (ret)
4473 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4474 arvif->vdev_id, ret);
4475
4476 spin_lock_bh(&ar->data_lock);
4477 ar->num_peers--;
4478 spin_unlock_bh(&ar->data_lock);
4479 }
4480
Kalle Valo5e3dd152013-06-12 20:52:10 +03004481 ath10k_peer_cleanup(ar, arvif->vdev_id);
4482
Michal Kazior500ff9f2015-03-31 10:26:21 +00004483 if (vif->type == NL80211_IFTYPE_MONITOR) {
4484 ar->monitor_arvif = NULL;
4485 ret = ath10k_monitor_recalc(ar);
4486 if (ret)
4487 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4488 }
4489
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004490 spin_lock_bh(&ar->htt.tx_lock);
4491 ath10k_mac_vif_tx_unlock_all(arvif);
4492 spin_unlock_bh(&ar->htt.tx_lock);
4493
Kalle Valo5e3dd152013-06-12 20:52:10 +03004494 mutex_unlock(&ar->conf_mutex);
4495}
4496
4497/*
4498 * FIXME: Has to be verified.
4499 */
4500#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004501 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004502 FIF_CONTROL | \
4503 FIF_PSPOLL | \
4504 FIF_OTHER_BSS | \
4505 FIF_BCN_PRBRESP_PROMISC | \
4506 FIF_PROBE_REQ | \
4507 FIF_FCSFAIL)
4508
4509static void ath10k_configure_filter(struct ieee80211_hw *hw,
4510 unsigned int changed_flags,
4511 unsigned int *total_flags,
4512 u64 multicast)
4513{
4514 struct ath10k *ar = hw->priv;
4515 int ret;
4516
4517 mutex_lock(&ar->conf_mutex);
4518
4519 changed_flags &= SUPPORTED_FILTERS;
4520 *total_flags &= SUPPORTED_FILTERS;
4521 ar->filter_flags = *total_flags;
4522
Michal Kazior19337472014-08-28 12:58:16 +02004523 ret = ath10k_monitor_recalc(ar);
4524 if (ret)
4525 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004526
4527 mutex_unlock(&ar->conf_mutex);
4528}
4529
4530static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4531 struct ieee80211_vif *vif,
4532 struct ieee80211_bss_conf *info,
4533 u32 changed)
4534{
4535 struct ath10k *ar = hw->priv;
4536 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4537 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004538 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004539
4540 mutex_lock(&ar->conf_mutex);
4541
4542 if (changed & BSS_CHANGED_IBSS)
4543 ath10k_control_ibss(arvif, info, vif->addr);
4544
4545 if (changed & BSS_CHANGED_BEACON_INT) {
4546 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004547 vdev_param = ar->wmi.vdev_param->beacon_interval;
4548 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004549 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004550 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004551 "mac vdev %d beacon_interval %d\n",
4552 arvif->vdev_id, arvif->beacon_interval);
4553
Kalle Valo5e3dd152013-06-12 20:52:10 +03004554 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004555 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004556 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004557 }
4558
4559 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004560 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004561 "vdev %d set beacon tx mode to staggered\n",
4562 arvif->vdev_id);
4563
Bartosz Markowski226a3392013-09-26 17:47:16 +02004564 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4565 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004566 WMI_BEACON_STAGGERED_MODE);
4567 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004568 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004569 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004570
4571 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4572 if (ret)
4573 ath10k_warn(ar, "failed to update beacon template: %d\n",
4574 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004575 }
4576
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004577 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4578 ret = ath10k_mac_setup_prb_tmpl(arvif);
4579 if (ret)
4580 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4581 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004582 }
4583
Michal Kaziorba2479f2015-01-24 12:14:51 +02004584 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004585 arvif->dtim_period = info->dtim_period;
4586
Michal Kazior7aa7a722014-08-25 12:09:38 +02004587 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004588 "mac vdev %d dtim_period %d\n",
4589 arvif->vdev_id, arvif->dtim_period);
4590
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004591 vdev_param = ar->wmi.vdev_param->dtim_period;
4592 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004593 arvif->dtim_period);
4594 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004595 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004596 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004597 }
4598
4599 if (changed & BSS_CHANGED_SSID &&
4600 vif->type == NL80211_IFTYPE_AP) {
4601 arvif->u.ap.ssid_len = info->ssid_len;
4602 if (info->ssid_len)
4603 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4604 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4605 }
4606
Michal Kazior077efc82014-10-21 10:10:29 +03004607 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4608 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004609
4610 if (changed & BSS_CHANGED_BEACON_ENABLED)
4611 ath10k_control_beaconing(arvif, info);
4612
4613 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004614 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004615 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004616 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004617
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004618 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004619 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004620 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004621 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004622
4623 vdev_param = ar->wmi.vdev_param->protection_mode;
4624 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4625 info->use_cts_prot ? 1 : 0);
4626 if (ret)
4627 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
4628 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004629 }
4630
4631 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004632 if (info->use_short_slot)
4633 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4634
4635 else
4636 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4637
Michal Kazior7aa7a722014-08-25 12:09:38 +02004638 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004639 arvif->vdev_id, slottime);
4640
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004641 vdev_param = ar->wmi.vdev_param->slot_time;
4642 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004643 slottime);
4644 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004645 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004646 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004647 }
4648
4649 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004650 if (info->use_short_preamble)
4651 preamble = WMI_VDEV_PREAMBLE_SHORT;
4652 else
4653 preamble = WMI_VDEV_PREAMBLE_LONG;
4654
Michal Kazior7aa7a722014-08-25 12:09:38 +02004655 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004656 "mac vdev %d preamble %dn",
4657 arvif->vdev_id, preamble);
4658
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004659 vdev_param = ar->wmi.vdev_param->preamble;
4660 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004661 preamble);
4662 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004663 ath10k_warn(ar, "failed to set preamble 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_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004668 if (info->assoc) {
4669 /* Workaround: Make sure monitor vdev is not running
4670 * when associating to prevent some firmware revisions
4671 * (e.g. 10.1 and 10.2) from crashing.
4672 */
4673 if (ar->monitor_started)
4674 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004675 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004676 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004677 } else {
4678 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004679 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004680 }
4681
Michal Kazior7d9d5582014-10-21 10:40:15 +03004682 if (changed & BSS_CHANGED_TXPOWER) {
4683 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4684 arvif->vdev_id, info->txpower);
4685
4686 arvif->txpower = info->txpower;
4687 ret = ath10k_mac_txpower_recalc(ar);
4688 if (ret)
4689 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4690 }
4691
Michal Kaziorbf14e652014-12-12 12:41:38 +01004692 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004693 arvif->ps = vif->bss_conf.ps;
4694
4695 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004696 if (ret)
4697 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4698 arvif->vdev_id, ret);
4699 }
4700
Kalle Valo5e3dd152013-06-12 20:52:10 +03004701 mutex_unlock(&ar->conf_mutex);
4702}
4703
4704static int ath10k_hw_scan(struct ieee80211_hw *hw,
4705 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004706 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004707{
4708 struct ath10k *ar = hw->priv;
4709 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004710 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004711 struct wmi_start_scan_arg arg;
4712 int ret = 0;
4713 int i;
4714
4715 mutex_lock(&ar->conf_mutex);
4716
4717 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004718 switch (ar->scan.state) {
4719 case ATH10K_SCAN_IDLE:
4720 reinit_completion(&ar->scan.started);
4721 reinit_completion(&ar->scan.completed);
4722 ar->scan.state = ATH10K_SCAN_STARTING;
4723 ar->scan.is_roc = false;
4724 ar->scan.vdev_id = arvif->vdev_id;
4725 ret = 0;
4726 break;
4727 case ATH10K_SCAN_STARTING:
4728 case ATH10K_SCAN_RUNNING:
4729 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004730 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004731 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004732 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004733 spin_unlock_bh(&ar->data_lock);
4734
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004735 if (ret)
4736 goto exit;
4737
Kalle Valo5e3dd152013-06-12 20:52:10 +03004738 memset(&arg, 0, sizeof(arg));
4739 ath10k_wmi_start_scan_init(ar, &arg);
4740 arg.vdev_id = arvif->vdev_id;
4741 arg.scan_id = ATH10K_SCAN_ID;
4742
Kalle Valo5e3dd152013-06-12 20:52:10 +03004743 if (req->ie_len) {
4744 arg.ie_len = req->ie_len;
4745 memcpy(arg.ie, req->ie, arg.ie_len);
4746 }
4747
4748 if (req->n_ssids) {
4749 arg.n_ssids = req->n_ssids;
4750 for (i = 0; i < arg.n_ssids; i++) {
4751 arg.ssids[i].len = req->ssids[i].ssid_len;
4752 arg.ssids[i].ssid = req->ssids[i].ssid;
4753 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004754 } else {
4755 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004756 }
4757
4758 if (req->n_channels) {
4759 arg.n_channels = req->n_channels;
4760 for (i = 0; i < arg.n_channels; i++)
4761 arg.channels[i] = req->channels[i]->center_freq;
4762 }
4763
4764 ret = ath10k_start_scan(ar, &arg);
4765 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004766 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004767 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004768 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004769 spin_unlock_bh(&ar->data_lock);
4770 }
4771
4772exit:
4773 mutex_unlock(&ar->conf_mutex);
4774 return ret;
4775}
4776
4777static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4778 struct ieee80211_vif *vif)
4779{
4780 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004781
4782 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004783 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004784 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004785
4786 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004787}
4788
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004789static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4790 struct ath10k_vif *arvif,
4791 enum set_key_cmd cmd,
4792 struct ieee80211_key_conf *key)
4793{
4794 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4795 int ret;
4796
4797 /* 10.1 firmware branch requires default key index to be set to group
4798 * key index after installing it. Otherwise FW/HW Txes corrupted
4799 * frames with multi-vif APs. This is not required for main firmware
4800 * branch (e.g. 636).
4801 *
Michal Kazior8461baf2015-04-10 13:23:22 +00004802 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4803 *
4804 * FIXME: It remains unknown if this is required for multi-vif STA
4805 * interfaces on 10.1.
4806 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004807
Michal Kazior8461baf2015-04-10 13:23:22 +00004808 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4809 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004810 return;
4811
4812 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4813 return;
4814
4815 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4816 return;
4817
4818 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4819 return;
4820
4821 if (cmd != SET_KEY)
4822 return;
4823
4824 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4825 key->keyidx);
4826 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004827 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004828 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004829}
4830
Kalle Valo5e3dd152013-06-12 20:52:10 +03004831static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4832 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4833 struct ieee80211_key_conf *key)
4834{
4835 struct ath10k *ar = hw->priv;
4836 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4837 struct ath10k_peer *peer;
4838 const u8 *peer_addr;
4839 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4840 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4841 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004842 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01004843 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004844 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004845
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004846 /* this one needs to be done in software */
4847 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4848 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004849
David Liuccec9032015-07-24 20:25:32 +03004850 if (arvif->nohwcrypt)
4851 return 1;
4852
Kalle Valo5e3dd152013-06-12 20:52:10 +03004853 if (key->keyidx > WMI_MAX_KEY_INDEX)
4854 return -ENOSPC;
4855
4856 mutex_lock(&ar->conf_mutex);
4857
4858 if (sta)
4859 peer_addr = sta->addr;
4860 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4861 peer_addr = vif->bss_conf.bssid;
4862 else
4863 peer_addr = vif->addr;
4864
4865 key->hw_key_idx = key->keyidx;
4866
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03004867 if (is_wep) {
4868 if (cmd == SET_KEY)
4869 arvif->wep_keys[key->keyidx] = key;
4870 else
4871 arvif->wep_keys[key->keyidx] = NULL;
4872 }
4873
Kalle Valo5e3dd152013-06-12 20:52:10 +03004874 /* the peer should not disappear in mid-way (unless FW goes awry) since
4875 * we already hold conf_mutex. we just make sure its there now. */
4876 spin_lock_bh(&ar->data_lock);
4877 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4878 spin_unlock_bh(&ar->data_lock);
4879
4880 if (!peer) {
4881 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004882 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004883 peer_addr);
4884 ret = -EOPNOTSUPP;
4885 goto exit;
4886 } else {
4887 /* if the peer doesn't exist there is no key to disable
4888 * anymore */
4889 goto exit;
4890 }
4891 }
4892
Michal Kazior7cc45732015-03-09 14:24:17 +01004893 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4894 flags |= WMI_KEY_PAIRWISE;
4895 else
4896 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004897
Kalle Valo5e3dd152013-06-12 20:52:10 +03004898 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004899 if (cmd == DISABLE_KEY)
4900 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004901
Michal Kaziorad325cb2015-02-18 14:02:27 +01004902 /* When WEP keys are uploaded it's possible that there are
4903 * stations associated already (e.g. when merging) without any
4904 * keys. Static WEP needs an explicit per-peer key upload.
4905 */
4906 if (vif->type == NL80211_IFTYPE_ADHOC &&
4907 cmd == SET_KEY)
4908 ath10k_mac_vif_update_wep_key(arvif, key);
4909
Michal Kazior370e5672015-02-18 14:02:26 +01004910 /* 802.1x never sets the def_wep_key_idx so each set_key()
4911 * call changes default tx key.
4912 *
4913 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4914 * after first set_key().
4915 */
4916 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4917 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004918 }
4919
Michal Kazior370e5672015-02-18 14:02:26 +01004920 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004921 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004922 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004923 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004924 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004925 goto exit;
4926 }
4927
Michal Kazior29a10002015-04-10 13:05:58 +00004928 /* mac80211 sets static WEP keys as groupwise while firmware requires
4929 * them to be installed twice as both pairwise and groupwise.
4930 */
4931 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4932 flags2 = flags;
4933 flags2 &= ~WMI_KEY_GROUP;
4934 flags2 |= WMI_KEY_PAIRWISE;
4935
4936 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4937 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004938 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004939 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4940 arvif->vdev_id, peer_addr, ret);
4941 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4942 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03004943 if (ret2) {
4944 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004945 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4946 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03004947 }
Michal Kazior29a10002015-04-10 13:05:58 +00004948 goto exit;
4949 }
4950 }
4951
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004952 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4953
Kalle Valo5e3dd152013-06-12 20:52:10 +03004954 spin_lock_bh(&ar->data_lock);
4955 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4956 if (peer && cmd == SET_KEY)
4957 peer->keys[key->keyidx] = key;
4958 else if (peer && cmd == DISABLE_KEY)
4959 peer->keys[key->keyidx] = NULL;
4960 else if (peer == NULL)
4961 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004962 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004963 spin_unlock_bh(&ar->data_lock);
4964
4965exit:
4966 mutex_unlock(&ar->conf_mutex);
4967 return ret;
4968}
4969
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004970static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
4971 struct ieee80211_vif *vif,
4972 int keyidx)
4973{
4974 struct ath10k *ar = hw->priv;
4975 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4976 int ret;
4977
4978 mutex_lock(&arvif->ar->conf_mutex);
4979
4980 if (arvif->ar->state != ATH10K_STATE_ON)
4981 goto unlock;
4982
4983 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
4984 arvif->vdev_id, keyidx);
4985
4986 ret = ath10k_wmi_vdev_set_param(arvif->ar,
4987 arvif->vdev_id,
4988 arvif->ar->wmi.vdev_param->def_keyid,
4989 keyidx);
4990
4991 if (ret) {
4992 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
4993 arvif->vdev_id,
4994 ret);
4995 goto unlock;
4996 }
4997
4998 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01004999
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005000unlock:
5001 mutex_unlock(&arvif->ar->conf_mutex);
5002}
5003
Michal Kazior9797feb2014-02-14 14:49:48 +01005004static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5005{
5006 struct ath10k *ar;
5007 struct ath10k_vif *arvif;
5008 struct ath10k_sta *arsta;
5009 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005010 struct cfg80211_chan_def def;
5011 enum ieee80211_band band;
5012 const u8 *ht_mcs_mask;
5013 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005014 u32 changed, bw, nss, smps;
5015 int err;
5016
5017 arsta = container_of(wk, struct ath10k_sta, update_wk);
5018 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5019 arvif = arsta->arvif;
5020 ar = arvif->ar;
5021
Michal Kazior45c9abc2015-04-21 20:42:58 +03005022 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5023 return;
5024
5025 band = def.chan->band;
5026 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5027 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5028
Michal Kazior9797feb2014-02-14 14:49:48 +01005029 spin_lock_bh(&ar->data_lock);
5030
5031 changed = arsta->changed;
5032 arsta->changed = 0;
5033
5034 bw = arsta->bw;
5035 nss = arsta->nss;
5036 smps = arsta->smps;
5037
5038 spin_unlock_bh(&ar->data_lock);
5039
5040 mutex_lock(&ar->conf_mutex);
5041
Michal Kazior45c9abc2015-04-21 20:42:58 +03005042 nss = max_t(u32, 1, nss);
5043 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5044 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5045
Michal Kazior9797feb2014-02-14 14:49:48 +01005046 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005047 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005048 sta->addr, bw);
5049
5050 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5051 WMI_PEER_CHAN_WIDTH, bw);
5052 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005053 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005054 sta->addr, bw, err);
5055 }
5056
5057 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005058 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005059 sta->addr, nss);
5060
5061 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5062 WMI_PEER_NSS, nss);
5063 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005064 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005065 sta->addr, nss, err);
5066 }
5067
5068 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005069 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005070 sta->addr, smps);
5071
5072 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5073 WMI_PEER_SMPS_STATE, smps);
5074 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005075 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005076 sta->addr, smps, err);
5077 }
5078
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005079 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5080 changed & IEEE80211_RC_NSS_CHANGED) {
5081 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005082 sta->addr);
5083
Michal Kazior590922a2014-10-21 10:10:29 +03005084 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005085 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005086 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005087 sta->addr);
5088 }
5089
Michal Kazior9797feb2014-02-14 14:49:48 +01005090 mutex_unlock(&ar->conf_mutex);
5091}
5092
Marek Puzyniak7c354242015-03-30 09:51:52 +03005093static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5094 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005095{
5096 struct ath10k *ar = arvif->ar;
5097
5098 lockdep_assert_held(&ar->conf_mutex);
5099
Marek Puzyniak7c354242015-03-30 09:51:52 +03005100 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005101 return 0;
5102
5103 if (ar->num_stations >= ar->max_num_stations)
5104 return -ENOBUFS;
5105
5106 ar->num_stations++;
5107
5108 return 0;
5109}
5110
Marek Puzyniak7c354242015-03-30 09:51:52 +03005111static void ath10k_mac_dec_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;
5120
5121 ar->num_stations--;
5122}
5123
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005124struct ath10k_mac_tdls_iter_data {
5125 u32 num_tdls_stations;
5126 struct ieee80211_vif *curr_vif;
5127};
5128
5129static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5130 struct ieee80211_sta *sta)
5131{
5132 struct ath10k_mac_tdls_iter_data *iter_data = data;
5133 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5134 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5135
5136 if (sta->tdls && sta_vif == iter_data->curr_vif)
5137 iter_data->num_tdls_stations++;
5138}
5139
5140static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5141 struct ieee80211_vif *vif)
5142{
5143 struct ath10k_mac_tdls_iter_data data = {};
5144
5145 data.curr_vif = vif;
5146
5147 ieee80211_iterate_stations_atomic(hw,
5148 ath10k_mac_tdls_vif_stations_count_iter,
5149 &data);
5150 return data.num_tdls_stations;
5151}
5152
5153static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5154 struct ieee80211_vif *vif)
5155{
5156 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5157 int *num_tdls_vifs = data;
5158
5159 if (vif->type != NL80211_IFTYPE_STATION)
5160 return;
5161
5162 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5163 (*num_tdls_vifs)++;
5164}
5165
5166static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5167{
5168 int num_tdls_vifs = 0;
5169
5170 ieee80211_iterate_active_interfaces_atomic(hw,
5171 IEEE80211_IFACE_ITER_NORMAL,
5172 ath10k_mac_tdls_vifs_count_iter,
5173 &num_tdls_vifs);
5174 return num_tdls_vifs;
5175}
5176
Kalle Valo5e3dd152013-06-12 20:52:10 +03005177static int ath10k_sta_state(struct ieee80211_hw *hw,
5178 struct ieee80211_vif *vif,
5179 struct ieee80211_sta *sta,
5180 enum ieee80211_sta_state old_state,
5181 enum ieee80211_sta_state new_state)
5182{
5183 struct ath10k *ar = hw->priv;
5184 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005185 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005186 int ret = 0;
5187
Michal Kazior76f90022014-02-25 09:29:57 +02005188 if (old_state == IEEE80211_STA_NOTEXIST &&
5189 new_state == IEEE80211_STA_NONE) {
5190 memset(arsta, 0, sizeof(*arsta));
5191 arsta->arvif = arvif;
5192 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5193 }
5194
Michal Kazior9797feb2014-02-14 14:49:48 +01005195 /* cancel must be done outside the mutex to avoid deadlock */
5196 if ((old_state == IEEE80211_STA_NONE &&
5197 new_state == IEEE80211_STA_NOTEXIST))
5198 cancel_work_sync(&arsta->update_wk);
5199
Kalle Valo5e3dd152013-06-12 20:52:10 +03005200 mutex_lock(&ar->conf_mutex);
5201
5202 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005203 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005204 /*
5205 * New station addition.
5206 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005207 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5208 u32 num_tdls_stations;
5209 u32 num_tdls_vifs;
5210
Michal Kaziorcfd10612014-11-25 15:16:05 +01005211 ath10k_dbg(ar, ATH10K_DBG_MAC,
5212 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5213 arvif->vdev_id, sta->addr,
5214 ar->num_stations + 1, ar->max_num_stations,
5215 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005216
Marek Puzyniak7c354242015-03-30 09:51:52 +03005217 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005218 if (ret) {
5219 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5220 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005221 goto exit;
5222 }
5223
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005224 if (sta->tdls)
5225 peer_type = WMI_PEER_TYPE_TDLS;
5226
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005227 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005228 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005229 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005230 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 -08005231 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005232 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005233 goto exit;
5234 }
Michal Kazior077efc82014-10-21 10:10:29 +03005235
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005236 if (!sta->tdls)
5237 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005238
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005239 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5240 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5241
5242 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5243 num_tdls_stations == 0) {
5244 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5245 arvif->vdev_id, ar->max_num_tdls_vdevs);
5246 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5247 ath10k_mac_dec_num_stations(arvif, sta);
5248 ret = -ENOBUFS;
5249 goto exit;
5250 }
5251
5252 if (num_tdls_stations == 0) {
5253 /* This is the first tdls peer in current vif */
5254 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5255
5256 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5257 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005258 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005259 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005260 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005261 ath10k_peer_delete(ar, arvif->vdev_id,
5262 sta->addr);
5263 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005264 goto exit;
5265 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005266 }
Michal Kazior077efc82014-10-21 10:10:29 +03005267
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005268 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5269 WMI_TDLS_PEER_STATE_PEERING);
5270 if (ret) {
5271 ath10k_warn(ar,
5272 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5273 sta->addr, arvif->vdev_id, ret);
5274 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5275 ath10k_mac_dec_num_stations(arvif, sta);
5276
5277 if (num_tdls_stations != 0)
5278 goto exit;
5279 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5280 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005281 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005282 } else if ((old_state == IEEE80211_STA_NONE &&
5283 new_state == IEEE80211_STA_NOTEXIST)) {
5284 /*
5285 * Existing station deletion.
5286 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005287 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005288 "mac vdev %d peer delete %pM (sta gone)\n",
5289 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005290
Kalle Valo5e3dd152013-06-12 20:52:10 +03005291 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5292 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005293 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005294 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005295
Marek Puzyniak7c354242015-03-30 09:51:52 +03005296 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005297
5298 if (!sta->tdls)
5299 goto exit;
5300
5301 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5302 goto exit;
5303
5304 /* This was the last tdls peer in current vif */
5305 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5306 WMI_TDLS_DISABLE);
5307 if (ret) {
5308 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5309 arvif->vdev_id, ret);
5310 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005311 } else if (old_state == IEEE80211_STA_AUTH &&
5312 new_state == IEEE80211_STA_ASSOC &&
5313 (vif->type == NL80211_IFTYPE_AP ||
5314 vif->type == NL80211_IFTYPE_ADHOC)) {
5315 /*
5316 * New association.
5317 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005318 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005319 sta->addr);
5320
Michal Kazior590922a2014-10-21 10:10:29 +03005321 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005322 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005323 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005324 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005325 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005326 new_state == IEEE80211_STA_AUTHORIZED &&
5327 sta->tdls) {
5328 /*
5329 * Tdls station authorized.
5330 */
5331 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5332 sta->addr);
5333
5334 ret = ath10k_station_assoc(ar, vif, sta, false);
5335 if (ret) {
5336 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5337 sta->addr, arvif->vdev_id, ret);
5338 goto exit;
5339 }
5340
5341 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5342 WMI_TDLS_PEER_STATE_CONNECTED);
5343 if (ret)
5344 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5345 sta->addr, arvif->vdev_id, ret);
5346 } else if (old_state == IEEE80211_STA_ASSOC &&
5347 new_state == IEEE80211_STA_AUTH &&
5348 (vif->type == NL80211_IFTYPE_AP ||
5349 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005350 /*
5351 * Disassociation.
5352 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005353 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005354 sta->addr);
5355
Michal Kazior590922a2014-10-21 10:10:29 +03005356 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005357 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005358 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005359 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005360 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005361exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005362 mutex_unlock(&ar->conf_mutex);
5363 return ret;
5364}
5365
5366static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005367 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005368{
5369 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005370 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5371 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005372 u32 value = 0;
5373 int ret = 0;
5374
Michal Kazior548db542013-07-05 16:15:15 +03005375 lockdep_assert_held(&ar->conf_mutex);
5376
Kalle Valo5e3dd152013-06-12 20:52:10 +03005377 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5378 return 0;
5379
5380 switch (ac) {
5381 case IEEE80211_AC_VO:
5382 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5383 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005384 prio = 7;
5385 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005386 break;
5387 case IEEE80211_AC_VI:
5388 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5389 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005390 prio = 5;
5391 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005392 break;
5393 case IEEE80211_AC_BE:
5394 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5395 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005396 prio = 2;
5397 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005398 break;
5399 case IEEE80211_AC_BK:
5400 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5401 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005402 prio = 0;
5403 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005404 break;
5405 }
5406
5407 if (enable)
5408 arvif->u.sta.uapsd |= value;
5409 else
5410 arvif->u.sta.uapsd &= ~value;
5411
5412 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5413 WMI_STA_PS_PARAM_UAPSD,
5414 arvif->u.sta.uapsd);
5415 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005416 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005417 goto exit;
5418 }
5419
5420 if (arvif->u.sta.uapsd)
5421 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5422 else
5423 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5424
5425 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5426 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5427 value);
5428 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005429 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005430
Michal Kazior9f9b5742014-12-12 12:41:36 +01005431 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5432 if (ret) {
5433 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5434 arvif->vdev_id, ret);
5435 return ret;
5436 }
5437
5438 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5439 if (ret) {
5440 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5441 arvif->vdev_id, ret);
5442 return ret;
5443 }
5444
Michal Kaziorb0e56152015-01-24 12:14:52 +02005445 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5446 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5447 /* Only userspace can make an educated decision when to send
5448 * trigger frame. The following effectively disables u-UAPSD
5449 * autotrigger in firmware (which is enabled by default
5450 * provided the autotrigger service is available).
5451 */
5452
5453 arg.wmm_ac = acc;
5454 arg.user_priority = prio;
5455 arg.service_interval = 0;
5456 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5457 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5458
5459 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5460 arvif->bssid, &arg, 1);
5461 if (ret) {
5462 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5463 ret);
5464 return ret;
5465 }
5466 }
5467
Kalle Valo5e3dd152013-06-12 20:52:10 +03005468exit:
5469 return ret;
5470}
5471
5472static int ath10k_conf_tx(struct ieee80211_hw *hw,
5473 struct ieee80211_vif *vif, u16 ac,
5474 const struct ieee80211_tx_queue_params *params)
5475{
5476 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005477 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005478 struct wmi_wmm_params_arg *p = NULL;
5479 int ret;
5480
5481 mutex_lock(&ar->conf_mutex);
5482
5483 switch (ac) {
5484 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005485 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005486 break;
5487 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005488 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005489 break;
5490 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005491 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005492 break;
5493 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005494 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005495 break;
5496 }
5497
5498 if (WARN_ON(!p)) {
5499 ret = -EINVAL;
5500 goto exit;
5501 }
5502
5503 p->cwmin = params->cw_min;
5504 p->cwmax = params->cw_max;
5505 p->aifs = params->aifs;
5506
5507 /*
5508 * The channel time duration programmed in the HW is in absolute
5509 * microseconds, while mac80211 gives the txop in units of
5510 * 32 microseconds.
5511 */
5512 p->txop = params->txop * 32;
5513
Michal Kazior7fc979a2015-01-28 09:57:28 +02005514 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5515 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5516 &arvif->wmm_params);
5517 if (ret) {
5518 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5519 arvif->vdev_id, ret);
5520 goto exit;
5521 }
5522 } else {
5523 /* This won't work well with multi-interface cases but it's
5524 * better than nothing.
5525 */
5526 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5527 if (ret) {
5528 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5529 goto exit;
5530 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005531 }
5532
5533 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5534 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005535 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005536
5537exit:
5538 mutex_unlock(&ar->conf_mutex);
5539 return ret;
5540}
5541
5542#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5543
5544static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5545 struct ieee80211_vif *vif,
5546 struct ieee80211_channel *chan,
5547 int duration,
5548 enum ieee80211_roc_type type)
5549{
5550 struct ath10k *ar = hw->priv;
5551 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5552 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005553 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005554 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005555
5556 mutex_lock(&ar->conf_mutex);
5557
5558 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005559 switch (ar->scan.state) {
5560 case ATH10K_SCAN_IDLE:
5561 reinit_completion(&ar->scan.started);
5562 reinit_completion(&ar->scan.completed);
5563 reinit_completion(&ar->scan.on_channel);
5564 ar->scan.state = ATH10K_SCAN_STARTING;
5565 ar->scan.is_roc = true;
5566 ar->scan.vdev_id = arvif->vdev_id;
5567 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005568 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005569 ret = 0;
5570 break;
5571 case ATH10K_SCAN_STARTING:
5572 case ATH10K_SCAN_RUNNING:
5573 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005574 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005575 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005576 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005577 spin_unlock_bh(&ar->data_lock);
5578
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005579 if (ret)
5580 goto exit;
5581
Michal Kaziorfcf98442015-03-31 11:03:47 +00005582 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005583
Kalle Valo5e3dd152013-06-12 20:52:10 +03005584 memset(&arg, 0, sizeof(arg));
5585 ath10k_wmi_start_scan_init(ar, &arg);
5586 arg.vdev_id = arvif->vdev_id;
5587 arg.scan_id = ATH10K_SCAN_ID;
5588 arg.n_channels = 1;
5589 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005590 arg.dwell_time_active = scan_time_msec;
5591 arg.dwell_time_passive = scan_time_msec;
5592 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005593 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5594 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005595 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005596
5597 ret = ath10k_start_scan(ar, &arg);
5598 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005599 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005600 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005601 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005602 spin_unlock_bh(&ar->data_lock);
5603 goto exit;
5604 }
5605
5606 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5607 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005608 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005609
5610 ret = ath10k_scan_stop(ar);
5611 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005612 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005613
Kalle Valo5e3dd152013-06-12 20:52:10 +03005614 ret = -ETIMEDOUT;
5615 goto exit;
5616 }
5617
Michal Kaziorfcf98442015-03-31 11:03:47 +00005618 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5619 msecs_to_jiffies(duration));
5620
Kalle Valo5e3dd152013-06-12 20:52:10 +03005621 ret = 0;
5622exit:
5623 mutex_unlock(&ar->conf_mutex);
5624 return ret;
5625}
5626
5627static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5628{
5629 struct ath10k *ar = hw->priv;
5630
5631 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005632
5633 spin_lock_bh(&ar->data_lock);
5634 ar->scan.roc_notify = false;
5635 spin_unlock_bh(&ar->data_lock);
5636
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005637 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005638
Kalle Valo5e3dd152013-06-12 20:52:10 +03005639 mutex_unlock(&ar->conf_mutex);
5640
Michal Kazior4eb2e162014-10-28 10:23:09 +01005641 cancel_delayed_work_sync(&ar->scan.timeout);
5642
Kalle Valo5e3dd152013-06-12 20:52:10 +03005643 return 0;
5644}
5645
5646/*
5647 * Both RTS and Fragmentation threshold are interface-specific
5648 * in ath10k, but device-specific in mac80211.
5649 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005650
5651static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5652{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005653 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005654 struct ath10k_vif *arvif;
5655 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005656
Michal Kaziorad088bf2013-10-16 15:44:46 +03005657 mutex_lock(&ar->conf_mutex);
5658 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005659 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005660 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005661
Michal Kaziorad088bf2013-10-16 15:44:46 +03005662 ret = ath10k_mac_set_rts(arvif, value);
5663 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005664 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005665 arvif->vdev_id, ret);
5666 break;
5667 }
5668 }
5669 mutex_unlock(&ar->conf_mutex);
5670
5671 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005672}
5673
Michal Kazior92092fe2015-08-03 11:16:43 +02005674static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5675{
5676 /* Even though there's a WMI enum for fragmentation threshold no known
5677 * firmware actually implements it. Moreover it is not possible to rely
5678 * frame fragmentation to mac80211 because firmware clears the "more
5679 * fragments" bit in frame control making it impossible for remote
5680 * devices to reassemble frames.
5681 *
5682 * Hence implement a dummy callback just to say fragmentation isn't
5683 * supported. This effectively prevents mac80211 from doing frame
5684 * fragmentation in software.
5685 */
5686 return -EOPNOTSUPP;
5687}
5688
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005689static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5690 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005691{
5692 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005693 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005694 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005695
5696 /* mac80211 doesn't care if we really xmit queued frames or not
5697 * we'll collect those frames either way if we stop/delete vdevs */
5698 if (drop)
5699 return;
5700
Michal Kazior548db542013-07-05 16:15:15 +03005701 mutex_lock(&ar->conf_mutex);
5702
Michal Kazioraffd3212013-07-16 09:54:35 +02005703 if (ar->state == ATH10K_STATE_WEDGED)
5704 goto skip;
5705
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005706 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005707 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005708
Michal Kazioredb82362013-07-05 16:15:14 +03005709 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005710 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005711 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005712
Michal Kazior7962b0d2014-10-28 10:34:38 +01005713 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5714 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5715 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005716
5717 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005718 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005719
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005720 if (time_left == 0 || skip)
5721 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5722 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005723
Michal Kazioraffd3212013-07-16 09:54:35 +02005724skip:
Michal Kazior548db542013-07-05 16:15:15 +03005725 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005726}
5727
5728/* TODO: Implement this function properly
5729 * For now it is needed to reply to Probe Requests in IBSS mode.
5730 * Propably we need this information from FW.
5731 */
5732static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5733{
5734 return 1;
5735}
5736
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005737static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5738 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005739{
5740 struct ath10k *ar = hw->priv;
5741
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005742 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5743 return;
5744
Michal Kazioraffd3212013-07-16 09:54:35 +02005745 mutex_lock(&ar->conf_mutex);
5746
5747 /* If device failed to restart it will be in a different state, e.g.
5748 * ATH10K_STATE_WEDGED */
5749 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005750 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005751 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005752 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005753 }
5754
5755 mutex_unlock(&ar->conf_mutex);
5756}
5757
Michal Kazior2e1dea42013-07-31 10:32:40 +02005758static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5759 struct survey_info *survey)
5760{
5761 struct ath10k *ar = hw->priv;
5762 struct ieee80211_supported_band *sband;
5763 struct survey_info *ar_survey = &ar->survey[idx];
5764 int ret = 0;
5765
5766 mutex_lock(&ar->conf_mutex);
5767
5768 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5769 if (sband && idx >= sband->n_channels) {
5770 idx -= sband->n_channels;
5771 sband = NULL;
5772 }
5773
5774 if (!sband)
5775 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5776
5777 if (!sband || idx >= sband->n_channels) {
5778 ret = -ENOENT;
5779 goto exit;
5780 }
5781
5782 spin_lock_bh(&ar->data_lock);
5783 memcpy(survey, ar_survey, sizeof(*survey));
5784 spin_unlock_bh(&ar->data_lock);
5785
5786 survey->channel = &sband->channels[idx];
5787
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005788 if (ar->rx_channel == survey->channel)
5789 survey->filled |= SURVEY_INFO_IN_USE;
5790
Michal Kazior2e1dea42013-07-31 10:32:40 +02005791exit:
5792 mutex_unlock(&ar->conf_mutex);
5793 return ret;
5794}
5795
Michal Kazior3ae54222015-03-31 10:49:20 +00005796static bool
5797ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5798 enum ieee80211_band band,
5799 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005800{
Michal Kazior3ae54222015-03-31 10:49:20 +00005801 int num_rates = 0;
5802 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005803
Michal Kazior3ae54222015-03-31 10:49:20 +00005804 num_rates += hweight32(mask->control[band].legacy);
5805
5806 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5807 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5808
5809 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5810 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5811
5812 return num_rates == 1;
5813}
5814
5815static bool
5816ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5817 enum ieee80211_band band,
5818 const struct cfg80211_bitrate_mask *mask,
5819 int *nss)
5820{
5821 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5822 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5823 u8 ht_nss_mask = 0;
5824 u8 vht_nss_mask = 0;
5825 int i;
5826
5827 if (mask->control[band].legacy)
5828 return false;
5829
5830 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5831 if (mask->control[band].ht_mcs[i] == 0)
5832 continue;
5833 else if (mask->control[band].ht_mcs[i] ==
5834 sband->ht_cap.mcs.rx_mask[i])
5835 ht_nss_mask |= BIT(i);
5836 else
5837 return false;
5838 }
5839
5840 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5841 if (mask->control[band].vht_mcs[i] == 0)
5842 continue;
5843 else if (mask->control[band].vht_mcs[i] ==
5844 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5845 vht_nss_mask |= BIT(i);
5846 else
5847 return false;
5848 }
5849
5850 if (ht_nss_mask != vht_nss_mask)
5851 return false;
5852
5853 if (ht_nss_mask == 0)
5854 return false;
5855
5856 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5857 return false;
5858
5859 *nss = fls(ht_nss_mask);
5860
5861 return true;
5862}
5863
5864static int
5865ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5866 enum ieee80211_band band,
5867 const struct cfg80211_bitrate_mask *mask,
5868 u8 *rate, u8 *nss)
5869{
5870 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5871 int rate_idx;
5872 int i;
5873 u16 bitrate;
5874 u8 preamble;
5875 u8 hw_rate;
5876
5877 if (hweight32(mask->control[band].legacy) == 1) {
5878 rate_idx = ffs(mask->control[band].legacy) - 1;
5879
5880 hw_rate = sband->bitrates[rate_idx].hw_value;
5881 bitrate = sband->bitrates[rate_idx].bitrate;
5882
5883 if (ath10k_mac_bitrate_is_cck(bitrate))
5884 preamble = WMI_RATE_PREAMBLE_CCK;
5885 else
5886 preamble = WMI_RATE_PREAMBLE_OFDM;
5887
5888 *nss = 1;
5889 *rate = preamble << 6 |
5890 (*nss - 1) << 4 |
5891 hw_rate << 0;
5892
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005893 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005894 }
5895
Michal Kazior3ae54222015-03-31 10:49:20 +00005896 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5897 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5898 *nss = i + 1;
5899 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5900 (*nss - 1) << 4 |
5901 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005902
Michal Kazior3ae54222015-03-31 10:49:20 +00005903 return 0;
5904 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005905 }
5906
Michal Kazior3ae54222015-03-31 10:49:20 +00005907 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5908 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5909 *nss = i + 1;
5910 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5911 (*nss - 1) << 4 |
5912 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005913
Michal Kazior3ae54222015-03-31 10:49:20 +00005914 return 0;
5915 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005916 }
5917
Michal Kazior3ae54222015-03-31 10:49:20 +00005918 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005919}
5920
Michal Kazior3ae54222015-03-31 10:49:20 +00005921static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5922 u8 rate, u8 nss, u8 sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005923{
5924 struct ath10k *ar = arvif->ar;
5925 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005926 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005927
Michal Kazior3ae54222015-03-31 10:49:20 +00005928 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005929
Michal Kazior3ae54222015-03-31 10:49:20 +00005930 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5931 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005932
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005933 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005934 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005935 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005936 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005937 rate, ret);
5938 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005939 }
5940
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005941 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005942 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005943 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005944 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5945 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005946 }
5947
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005948 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005949 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005950 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005951 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5952 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005953 }
5954
Michal Kazior3ae54222015-03-31 10:49:20 +00005955 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005956}
5957
Michal Kazior45c9abc2015-04-21 20:42:58 +03005958static bool
5959ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
5960 enum ieee80211_band band,
5961 const struct cfg80211_bitrate_mask *mask)
5962{
5963 int i;
5964 u16 vht_mcs;
5965
5966 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
5967 * to express all VHT MCS rate masks. Effectively only the following
5968 * ranges can be used: none, 0-7, 0-8 and 0-9.
5969 */
5970 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5971 vht_mcs = mask->control[band].vht_mcs[i];
5972
5973 switch (vht_mcs) {
5974 case 0:
5975 case BIT(8) - 1:
5976 case BIT(9) - 1:
5977 case BIT(10) - 1:
5978 break;
5979 default:
5980 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
5981 return false;
5982 }
5983 }
5984
5985 return true;
5986}
5987
5988static void ath10k_mac_set_bitrate_mask_iter(void *data,
5989 struct ieee80211_sta *sta)
5990{
5991 struct ath10k_vif *arvif = data;
5992 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5993 struct ath10k *ar = arvif->ar;
5994
5995 if (arsta->arvif != arvif)
5996 return;
5997
5998 spin_lock_bh(&ar->data_lock);
5999 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6000 spin_unlock_bh(&ar->data_lock);
6001
6002 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6003}
6004
Michal Kazior3ae54222015-03-31 10:49:20 +00006005static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6006 struct ieee80211_vif *vif,
6007 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006008{
6009 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006010 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006011 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006012 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006013 const u8 *ht_mcs_mask;
6014 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006015 u8 rate;
6016 u8 nss;
6017 u8 sgi;
6018 int single_nss;
6019 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006020
Michal Kazior500ff9f2015-03-31 10:26:21 +00006021 if (ath10k_mac_vif_chan(vif, &def))
6022 return -EPERM;
6023
Michal Kazior500ff9f2015-03-31 10:26:21 +00006024 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006025 ht_mcs_mask = mask->control[band].ht_mcs;
6026 vht_mcs_mask = mask->control[band].vht_mcs;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006027
Michal Kazior3ae54222015-03-31 10:49:20 +00006028 sgi = mask->control[band].gi;
6029 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006030 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006031
Michal Kazior3ae54222015-03-31 10:49:20 +00006032 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6033 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6034 &rate, &nss);
6035 if (ret) {
6036 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6037 arvif->vdev_id, ret);
6038 return ret;
6039 }
6040 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6041 &single_nss)) {
6042 rate = WMI_FIXED_RATE_NONE;
6043 nss = single_nss;
6044 } else {
6045 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006046 nss = min(ar->num_rf_chains,
6047 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6048 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6049
6050 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6051 return -EINVAL;
6052
6053 mutex_lock(&ar->conf_mutex);
6054
6055 arvif->bitrate_mask = *mask;
6056 ieee80211_iterate_stations_atomic(ar->hw,
6057 ath10k_mac_set_bitrate_mask_iter,
6058 arvif);
6059
6060 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006061 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006062
6063 mutex_lock(&ar->conf_mutex);
6064
Michal Kazior3ae54222015-03-31 10:49:20 +00006065 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006066 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006067 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6068 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006069 goto exit;
6070 }
6071
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006072exit:
6073 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006074
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006075 return ret;
6076}
6077
Michal Kazior9797feb2014-02-14 14:49:48 +01006078static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6079 struct ieee80211_vif *vif,
6080 struct ieee80211_sta *sta,
6081 u32 changed)
6082{
6083 struct ath10k *ar = hw->priv;
6084 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6085 u32 bw, smps;
6086
6087 spin_lock_bh(&ar->data_lock);
6088
Michal Kazior7aa7a722014-08-25 12:09:38 +02006089 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006090 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6091 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6092 sta->smps_mode);
6093
6094 if (changed & IEEE80211_RC_BW_CHANGED) {
6095 bw = WMI_PEER_CHWIDTH_20MHZ;
6096
6097 switch (sta->bandwidth) {
6098 case IEEE80211_STA_RX_BW_20:
6099 bw = WMI_PEER_CHWIDTH_20MHZ;
6100 break;
6101 case IEEE80211_STA_RX_BW_40:
6102 bw = WMI_PEER_CHWIDTH_40MHZ;
6103 break;
6104 case IEEE80211_STA_RX_BW_80:
6105 bw = WMI_PEER_CHWIDTH_80MHZ;
6106 break;
6107 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006108 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006109 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006110 bw = WMI_PEER_CHWIDTH_20MHZ;
6111 break;
6112 }
6113
6114 arsta->bw = bw;
6115 }
6116
6117 if (changed & IEEE80211_RC_NSS_CHANGED)
6118 arsta->nss = sta->rx_nss;
6119
6120 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6121 smps = WMI_PEER_SMPS_PS_NONE;
6122
6123 switch (sta->smps_mode) {
6124 case IEEE80211_SMPS_AUTOMATIC:
6125 case IEEE80211_SMPS_OFF:
6126 smps = WMI_PEER_SMPS_PS_NONE;
6127 break;
6128 case IEEE80211_SMPS_STATIC:
6129 smps = WMI_PEER_SMPS_STATIC;
6130 break;
6131 case IEEE80211_SMPS_DYNAMIC:
6132 smps = WMI_PEER_SMPS_DYNAMIC;
6133 break;
6134 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006135 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006136 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006137 smps = WMI_PEER_SMPS_PS_NONE;
6138 break;
6139 }
6140
6141 arsta->smps = smps;
6142 }
6143
Michal Kazior9797feb2014-02-14 14:49:48 +01006144 arsta->changed |= changed;
6145
6146 spin_unlock_bh(&ar->data_lock);
6147
6148 ieee80211_queue_work(hw, &arsta->update_wk);
6149}
6150
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006151static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6152{
6153 /*
6154 * FIXME: Return 0 for time being. Need to figure out whether FW
6155 * has the API to fetch 64-bit local TSF
6156 */
6157
6158 return 0;
6159}
6160
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006161static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6162 struct ieee80211_vif *vif,
6163 enum ieee80211_ampdu_mlme_action action,
6164 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6165 u8 buf_size)
6166{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006167 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006168 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6169
Michal Kazior7aa7a722014-08-25 12:09:38 +02006170 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 +02006171 arvif->vdev_id, sta->addr, tid, action);
6172
6173 switch (action) {
6174 case IEEE80211_AMPDU_RX_START:
6175 case IEEE80211_AMPDU_RX_STOP:
6176 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6177 * creation/removal. Do we need to verify this?
6178 */
6179 return 0;
6180 case IEEE80211_AMPDU_TX_START:
6181 case IEEE80211_AMPDU_TX_STOP_CONT:
6182 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6183 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6184 case IEEE80211_AMPDU_TX_OPERATIONAL:
6185 /* Firmware offloads Tx aggregation entirely so deny mac80211
6186 * Tx aggregation requests.
6187 */
6188 return -EOPNOTSUPP;
6189 }
6190
6191 return -EINVAL;
6192}
6193
Michal Kazior500ff9f2015-03-31 10:26:21 +00006194static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006195ath10k_mac_update_rx_channel(struct ath10k *ar,
6196 struct ieee80211_chanctx_conf *ctx,
6197 struct ieee80211_vif_chanctx_switch *vifs,
6198 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006199{
6200 struct cfg80211_chan_def *def = NULL;
6201
6202 /* Both locks are required because ar->rx_channel is modified. This
6203 * allows readers to hold either lock.
6204 */
6205 lockdep_assert_held(&ar->conf_mutex);
6206 lockdep_assert_held(&ar->data_lock);
6207
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006208 WARN_ON(ctx && vifs);
6209 WARN_ON(vifs && n_vifs != 1);
6210
Michal Kazior500ff9f2015-03-31 10:26:21 +00006211 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6212 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6213 * ppdu on Rx may reduce performance on low-end systems. It should be
6214 * possible to make tables/hashmaps to speed the lookup up (be vary of
6215 * cpu data cache lines though regarding sizes) but to keep the initial
6216 * implementation simple and less intrusive fallback to the slow lookup
6217 * only for multi-channel cases. Single-channel cases will remain to
6218 * use the old channel derival and thus performance should not be
6219 * affected much.
6220 */
6221 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006222 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006223 ieee80211_iter_chan_contexts_atomic(ar->hw,
6224 ath10k_mac_get_any_chandef_iter,
6225 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006226
6227 if (vifs)
6228 def = &vifs[0].new_ctx->def;
6229
Michal Kazior500ff9f2015-03-31 10:26:21 +00006230 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006231 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6232 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006233 } else {
6234 ar->rx_channel = NULL;
6235 }
6236 rcu_read_unlock();
6237}
6238
Michal Kazior500ff9f2015-03-31 10:26:21 +00006239static int
6240ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6241 struct ieee80211_chanctx_conf *ctx)
6242{
6243 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006244
6245 ath10k_dbg(ar, ATH10K_DBG_MAC,
6246 "mac chanctx add freq %hu width %d ptr %p\n",
6247 ctx->def.chan->center_freq, ctx->def.width, ctx);
6248
6249 mutex_lock(&ar->conf_mutex);
6250
6251 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006252 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006253 spin_unlock_bh(&ar->data_lock);
6254
6255 ath10k_recalc_radar_detection(ar);
6256 ath10k_monitor_recalc(ar);
6257
6258 mutex_unlock(&ar->conf_mutex);
6259
6260 return 0;
6261}
6262
6263static void
6264ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6265 struct ieee80211_chanctx_conf *ctx)
6266{
6267 struct ath10k *ar = hw->priv;
6268
6269 ath10k_dbg(ar, ATH10K_DBG_MAC,
6270 "mac chanctx remove freq %hu width %d ptr %p\n",
6271 ctx->def.chan->center_freq, ctx->def.width, ctx);
6272
6273 mutex_lock(&ar->conf_mutex);
6274
6275 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006276 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006277 spin_unlock_bh(&ar->data_lock);
6278
6279 ath10k_recalc_radar_detection(ar);
6280 ath10k_monitor_recalc(ar);
6281
6282 mutex_unlock(&ar->conf_mutex);
6283}
6284
6285static void
6286ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6287 struct ieee80211_chanctx_conf *ctx,
6288 u32 changed)
6289{
6290 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006291
6292 mutex_lock(&ar->conf_mutex);
6293
6294 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006295 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6296 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006297
6298 /* This shouldn't really happen because channel switching should use
6299 * switch_vif_chanctx().
6300 */
6301 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6302 goto unlock;
6303
Michal Kazior500ff9f2015-03-31 10:26:21 +00006304 ath10k_recalc_radar_detection(ar);
6305
6306 /* FIXME: How to configure Rx chains properly? */
6307
6308 /* No other actions are actually necessary. Firmware maintains channel
6309 * definitions per vdev internally and there's no host-side channel
6310 * context abstraction to configure, e.g. channel width.
6311 */
6312
6313unlock:
6314 mutex_unlock(&ar->conf_mutex);
6315}
6316
6317static int
6318ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6319 struct ieee80211_vif *vif,
6320 struct ieee80211_chanctx_conf *ctx)
6321{
6322 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006323 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6324 int ret;
6325
6326 mutex_lock(&ar->conf_mutex);
6327
6328 ath10k_dbg(ar, ATH10K_DBG_MAC,
6329 "mac chanctx assign ptr %p vdev_id %i\n",
6330 ctx, arvif->vdev_id);
6331
6332 if (WARN_ON(arvif->is_started)) {
6333 mutex_unlock(&ar->conf_mutex);
6334 return -EBUSY;
6335 }
6336
Michal Kazior089ab7a2015-06-03 12:16:55 +02006337 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006338 if (ret) {
6339 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6340 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006341 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006342 goto err;
6343 }
6344
6345 arvif->is_started = true;
6346
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006347 ret = ath10k_mac_vif_setup_ps(arvif);
6348 if (ret) {
6349 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6350 arvif->vdev_id, ret);
6351 goto err_stop;
6352 }
6353
Michal Kazior500ff9f2015-03-31 10:26:21 +00006354 if (vif->type == NL80211_IFTYPE_MONITOR) {
6355 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6356 if (ret) {
6357 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6358 arvif->vdev_id, ret);
6359 goto err_stop;
6360 }
6361
6362 arvif->is_up = true;
6363 }
6364
6365 mutex_unlock(&ar->conf_mutex);
6366 return 0;
6367
6368err_stop:
6369 ath10k_vdev_stop(arvif);
6370 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006371 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006372
6373err:
6374 mutex_unlock(&ar->conf_mutex);
6375 return ret;
6376}
6377
6378static void
6379ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6380 struct ieee80211_vif *vif,
6381 struct ieee80211_chanctx_conf *ctx)
6382{
6383 struct ath10k *ar = hw->priv;
6384 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6385 int ret;
6386
6387 mutex_lock(&ar->conf_mutex);
6388
6389 ath10k_dbg(ar, ATH10K_DBG_MAC,
6390 "mac chanctx unassign ptr %p vdev_id %i\n",
6391 ctx, arvif->vdev_id);
6392
6393 WARN_ON(!arvif->is_started);
6394
6395 if (vif->type == NL80211_IFTYPE_MONITOR) {
6396 WARN_ON(!arvif->is_up);
6397
6398 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6399 if (ret)
6400 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6401 arvif->vdev_id, ret);
6402
6403 arvif->is_up = false;
6404 }
6405
6406 ret = ath10k_vdev_stop(arvif);
6407 if (ret)
6408 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6409 arvif->vdev_id, ret);
6410
6411 arvif->is_started = false;
6412
6413 mutex_unlock(&ar->conf_mutex);
6414}
6415
6416static int
6417ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6418 struct ieee80211_vif_chanctx_switch *vifs,
6419 int n_vifs,
6420 enum ieee80211_chanctx_switch_mode mode)
6421{
6422 struct ath10k *ar = hw->priv;
6423 struct ath10k_vif *arvif;
Michal Kazior0e6eb412015-06-03 12:16:56 +02006424 int ret;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006425 int i;
6426
6427 mutex_lock(&ar->conf_mutex);
6428
6429 ath10k_dbg(ar, ATH10K_DBG_MAC,
6430 "mac chanctx switch n_vifs %d mode %d\n",
6431 n_vifs, mode);
6432
Michal Kazior0e6eb412015-06-03 12:16:56 +02006433 /* First stop monitor interface. Some FW versions crash if there's a
6434 * lone monitor interface.
6435 */
6436 if (ar->monitor_started)
6437 ath10k_monitor_stop(ar);
6438
Michal Kazior500ff9f2015-03-31 10:26:21 +00006439 for (i = 0; i < n_vifs; i++) {
6440 arvif = ath10k_vif_to_arvif(vifs[i].vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006441
6442 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006443 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
Michal Kazior500ff9f2015-03-31 10:26:21 +00006444 arvif->vdev_id,
6445 vifs[i].old_ctx->def.chan->center_freq,
6446 vifs[i].new_ctx->def.chan->center_freq,
6447 vifs[i].old_ctx->def.width,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006448 vifs[i].new_ctx->def.width);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006449
Michal Kazior0e6eb412015-06-03 12:16:56 +02006450 if (WARN_ON(!arvif->is_started))
6451 continue;
6452
6453 if (WARN_ON(!arvif->is_up))
6454 continue;
6455
6456 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6457 if (ret) {
6458 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6459 arvif->vdev_id, ret);
6460 continue;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006461 }
Michal Kazior500ff9f2015-03-31 10:26:21 +00006462 }
Michal Kazior0e6eb412015-06-03 12:16:56 +02006463
6464 /* All relevant vdevs are downed and associated channel resources
6465 * should be available for the channel switch now.
6466 */
6467
6468 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006469 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006470 spin_unlock_bh(&ar->data_lock);
6471
Michal Kazior0e6eb412015-06-03 12:16:56 +02006472 for (i = 0; i < n_vifs; i++) {
6473 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6474
6475 if (WARN_ON(!arvif->is_started))
6476 continue;
6477
6478 if (WARN_ON(!arvif->is_up))
6479 continue;
6480
6481 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6482 if (ret)
6483 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6484 ret);
6485
6486 ret = ath10k_mac_setup_prb_tmpl(arvif);
6487 if (ret)
6488 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6489 ret);
6490
6491 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6492 if (ret) {
6493 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6494 arvif->vdev_id, ret);
6495 continue;
6496 }
6497
6498 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6499 arvif->bssid);
6500 if (ret) {
6501 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6502 arvif->vdev_id, ret);
6503 continue;
6504 }
6505 }
6506
6507 ath10k_monitor_recalc(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006508
6509 mutex_unlock(&ar->conf_mutex);
6510 return 0;
6511}
6512
Kalle Valo5e3dd152013-06-12 20:52:10 +03006513static const struct ieee80211_ops ath10k_ops = {
6514 .tx = ath10k_tx,
6515 .start = ath10k_start,
6516 .stop = ath10k_stop,
6517 .config = ath10k_config,
6518 .add_interface = ath10k_add_interface,
6519 .remove_interface = ath10k_remove_interface,
6520 .configure_filter = ath10k_configure_filter,
6521 .bss_info_changed = ath10k_bss_info_changed,
6522 .hw_scan = ath10k_hw_scan,
6523 .cancel_hw_scan = ath10k_cancel_hw_scan,
6524 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006525 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006526 .sta_state = ath10k_sta_state,
6527 .conf_tx = ath10k_conf_tx,
6528 .remain_on_channel = ath10k_remain_on_channel,
6529 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6530 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006531 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006532 .flush = ath10k_flush,
6533 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006534 .set_antenna = ath10k_set_antenna,
6535 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006536 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006537 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006538 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006539 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006540 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006541 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006542 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6543 .get_et_stats = ath10k_debug_get_et_stats,
6544 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006545 .add_chanctx = ath10k_mac_op_add_chanctx,
6546 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6547 .change_chanctx = ath10k_mac_op_change_chanctx,
6548 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6549 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6550 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006551
6552 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6553
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006554#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006555 .suspend = ath10k_wow_op_suspend,
6556 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006557#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006558#ifdef CONFIG_MAC80211_DEBUGFS
6559 .sta_add_debugfs = ath10k_sta_add_debugfs,
6560#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006561};
6562
Kalle Valo5e3dd152013-06-12 20:52:10 +03006563#define CHAN2G(_channel, _freq, _flags) { \
6564 .band = IEEE80211_BAND_2GHZ, \
6565 .hw_value = (_channel), \
6566 .center_freq = (_freq), \
6567 .flags = (_flags), \
6568 .max_antenna_gain = 0, \
6569 .max_power = 30, \
6570}
6571
6572#define CHAN5G(_channel, _freq, _flags) { \
6573 .band = IEEE80211_BAND_5GHZ, \
6574 .hw_value = (_channel), \
6575 .center_freq = (_freq), \
6576 .flags = (_flags), \
6577 .max_antenna_gain = 0, \
6578 .max_power = 30, \
6579}
6580
6581static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6582 CHAN2G(1, 2412, 0),
6583 CHAN2G(2, 2417, 0),
6584 CHAN2G(3, 2422, 0),
6585 CHAN2G(4, 2427, 0),
6586 CHAN2G(5, 2432, 0),
6587 CHAN2G(6, 2437, 0),
6588 CHAN2G(7, 2442, 0),
6589 CHAN2G(8, 2447, 0),
6590 CHAN2G(9, 2452, 0),
6591 CHAN2G(10, 2457, 0),
6592 CHAN2G(11, 2462, 0),
6593 CHAN2G(12, 2467, 0),
6594 CHAN2G(13, 2472, 0),
6595 CHAN2G(14, 2484, 0),
6596};
6597
6598static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006599 CHAN5G(36, 5180, 0),
6600 CHAN5G(40, 5200, 0),
6601 CHAN5G(44, 5220, 0),
6602 CHAN5G(48, 5240, 0),
6603 CHAN5G(52, 5260, 0),
6604 CHAN5G(56, 5280, 0),
6605 CHAN5G(60, 5300, 0),
6606 CHAN5G(64, 5320, 0),
6607 CHAN5G(100, 5500, 0),
6608 CHAN5G(104, 5520, 0),
6609 CHAN5G(108, 5540, 0),
6610 CHAN5G(112, 5560, 0),
6611 CHAN5G(116, 5580, 0),
6612 CHAN5G(120, 5600, 0),
6613 CHAN5G(124, 5620, 0),
6614 CHAN5G(128, 5640, 0),
6615 CHAN5G(132, 5660, 0),
6616 CHAN5G(136, 5680, 0),
6617 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006618 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006619 CHAN5G(149, 5745, 0),
6620 CHAN5G(153, 5765, 0),
6621 CHAN5G(157, 5785, 0),
6622 CHAN5G(161, 5805, 0),
6623 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006624};
6625
Michal Kaziore7b54192014-08-07 11:03:27 +02006626struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006627{
6628 struct ieee80211_hw *hw;
6629 struct ath10k *ar;
6630
Michal Kaziore7b54192014-08-07 11:03:27 +02006631 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006632 if (!hw)
6633 return NULL;
6634
6635 ar = hw->priv;
6636 ar->hw = hw;
6637
6638 return ar;
6639}
6640
6641void ath10k_mac_destroy(struct ath10k *ar)
6642{
6643 ieee80211_free_hw(ar->hw);
6644}
6645
6646static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6647 {
6648 .max = 8,
6649 .types = BIT(NL80211_IFTYPE_STATION)
6650 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006651 },
6652 {
6653 .max = 3,
6654 .types = BIT(NL80211_IFTYPE_P2P_GO)
6655 },
6656 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006657 .max = 1,
6658 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6659 },
6660 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006661 .max = 7,
6662 .types = BIT(NL80211_IFTYPE_AP)
6663 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006664};
6665
Bartosz Markowskif2595092013-12-10 16:20:39 +01006666static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006667 {
6668 .max = 8,
6669 .types = BIT(NL80211_IFTYPE_AP)
6670 },
6671};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006672
6673static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6674 {
6675 .limits = ath10k_if_limits,
6676 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6677 .max_interfaces = 8,
6678 .num_different_channels = 1,
6679 .beacon_int_infra_match = true,
6680 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006681};
6682
6683static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006684 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006685 .limits = ath10k_10x_if_limits,
6686 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006687 .max_interfaces = 8,
6688 .num_different_channels = 1,
6689 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006690#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006691 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6692 BIT(NL80211_CHAN_WIDTH_20) |
6693 BIT(NL80211_CHAN_WIDTH_40) |
6694 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006695#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006696 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006697};
6698
Michal Kaziorcf327842015-03-31 10:26:25 +00006699static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6700 {
6701 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02006702 .types = BIT(NL80211_IFTYPE_STATION),
6703 },
6704 {
6705 .max = 2,
6706 .types = BIT(NL80211_IFTYPE_AP) |
Michal Kaziorcf327842015-03-31 10:26:25 +00006707 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6708 BIT(NL80211_IFTYPE_P2P_GO),
6709 },
6710 {
6711 .max = 1,
6712 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6713 },
6714};
6715
Michal Kaziored25b112015-07-09 13:08:39 +02006716static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6717 {
6718 .max = 2,
6719 .types = BIT(NL80211_IFTYPE_STATION),
6720 },
6721 {
6722 .max = 2,
6723 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6724 },
6725 {
6726 .max = 1,
6727 .types = BIT(NL80211_IFTYPE_AP) |
6728 BIT(NL80211_IFTYPE_P2P_GO),
6729 },
6730 {
6731 .max = 1,
6732 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6733 },
6734};
6735
Michal Kaziorcf327842015-03-31 10:26:25 +00006736static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6737 {
6738 .max = 1,
6739 .types = BIT(NL80211_IFTYPE_STATION),
6740 },
6741 {
6742 .max = 1,
6743 .types = BIT(NL80211_IFTYPE_ADHOC),
6744 },
6745};
6746
6747/* FIXME: This is not thouroughly tested. These combinations may over- or
6748 * underestimate hw/fw capabilities.
6749 */
6750static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6751 {
6752 .limits = ath10k_tlv_if_limit,
6753 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02006754 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006755 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6756 },
6757 {
6758 .limits = ath10k_tlv_if_limit_ibss,
6759 .num_different_channels = 1,
6760 .max_interfaces = 2,
6761 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6762 },
6763};
6764
6765static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6766 {
6767 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02006768 .num_different_channels = 1,
6769 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006770 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6771 },
6772 {
Michal Kaziored25b112015-07-09 13:08:39 +02006773 .limits = ath10k_tlv_qcs_if_limit,
6774 .num_different_channels = 2,
6775 .max_interfaces = 4,
6776 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6777 },
6778 {
Michal Kaziorcf327842015-03-31 10:26:25 +00006779 .limits = ath10k_tlv_if_limit_ibss,
6780 .num_different_channels = 1,
6781 .max_interfaces = 2,
6782 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6783 },
6784};
6785
Raja Manicf36fef2015-06-22 20:22:25 +05306786static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6787 {
6788 .max = 1,
6789 .types = BIT(NL80211_IFTYPE_STATION),
6790 },
6791 {
6792 .max = 16,
6793 .types = BIT(NL80211_IFTYPE_AP)
6794 },
6795};
6796
6797static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6798 {
6799 .limits = ath10k_10_4_if_limits,
6800 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6801 .max_interfaces = 16,
6802 .num_different_channels = 1,
6803 .beacon_int_infra_match = true,
6804#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6805 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6806 BIT(NL80211_CHAN_WIDTH_20) |
6807 BIT(NL80211_CHAN_WIDTH_40) |
6808 BIT(NL80211_CHAN_WIDTH_80),
6809#endif
6810 },
6811};
6812
Kalle Valo5e3dd152013-06-12 20:52:10 +03006813static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6814{
6815 struct ieee80211_sta_vht_cap vht_cap = {0};
6816 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006817 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006818 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006819
6820 vht_cap.vht_supported = 1;
6821 vht_cap.cap = ar->vht_cap_info;
6822
Michal Kaziorbc657a362015-02-26 11:11:22 +01006823 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6824 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
Bartosz Markowski707a0c82015-09-02 13:20:19 +02006825 val = ath10k_mac_get_vht_cap_bf_sts(ar);
Michal Kaziorbc657a362015-02-26 11:11:22 +01006826 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6827 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6828
6829 vht_cap.cap |= val;
6830 }
6831
6832 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6833 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
6834 val = ar->num_rf_chains - 1;
6835 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6836 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6837
6838 vht_cap.cap |= val;
6839 }
6840
Michal Kazior8865bee42013-07-24 12:36:46 +02006841 mcs_map = 0;
6842 for (i = 0; i < 8; i++) {
6843 if (i < ar->num_rf_chains)
6844 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6845 else
6846 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6847 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006848
6849 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6850 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6851
6852 return vht_cap;
6853}
6854
6855static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6856{
6857 int i;
6858 struct ieee80211_sta_ht_cap ht_cap = {0};
6859
6860 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6861 return ht_cap;
6862
6863 ht_cap.ht_supported = 1;
6864 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6865 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6866 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6867 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6868 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6869
6870 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6871 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6872
6873 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6874 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6875
6876 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6877 u32 smps;
6878
6879 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
6880 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6881
6882 ht_cap.cap |= smps;
6883 }
6884
6885 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6886 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6887
6888 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6889 u32 stbc;
6890
6891 stbc = ar->ht_cap_info;
6892 stbc &= WMI_HT_CAP_RX_STBC;
6893 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6894 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6895 stbc &= IEEE80211_HT_CAP_RX_STBC;
6896
6897 ht_cap.cap |= stbc;
6898 }
6899
6900 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6901 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6902
6903 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6904 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6905
6906 /* max AMSDU is implicitly taken from vht_cap_info */
6907 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6908 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6909
Michal Kazior8865bee42013-07-24 12:36:46 +02006910 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006911 ht_cap.mcs.rx_mask[i] = 0xFF;
6912
6913 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6914
6915 return ht_cap;
6916}
6917
Kalle Valo5e3dd152013-06-12 20:52:10 +03006918static void ath10k_get_arvif_iter(void *data, u8 *mac,
6919 struct ieee80211_vif *vif)
6920{
6921 struct ath10k_vif_iter *arvif_iter = data;
6922 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6923
6924 if (arvif->vdev_id == arvif_iter->vdev_id)
6925 arvif_iter->arvif = arvif;
6926}
6927
6928struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6929{
6930 struct ath10k_vif_iter arvif_iter;
6931 u32 flags;
6932
6933 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6934 arvif_iter.vdev_id = vdev_id;
6935
6936 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6937 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6938 flags,
6939 ath10k_get_arvif_iter,
6940 &arvif_iter);
6941 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006942 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006943 return NULL;
6944 }
6945
6946 return arvif_iter.arvif;
6947}
6948
6949int ath10k_mac_register(struct ath10k *ar)
6950{
Johannes Berg3cb10942015-01-22 21:38:45 +01006951 static const u32 cipher_suites[] = {
6952 WLAN_CIPHER_SUITE_WEP40,
6953 WLAN_CIPHER_SUITE_WEP104,
6954 WLAN_CIPHER_SUITE_TKIP,
6955 WLAN_CIPHER_SUITE_CCMP,
6956 WLAN_CIPHER_SUITE_AES_CMAC,
6957 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03006958 struct ieee80211_supported_band *band;
6959 struct ieee80211_sta_vht_cap vht_cap;
6960 struct ieee80211_sta_ht_cap ht_cap;
6961 void *channels;
6962 int ret;
6963
6964 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6965
6966 SET_IEEE80211_DEV(ar->hw, ar->dev);
6967
6968 ht_cap = ath10k_get_ht_cap(ar);
6969 vht_cap = ath10k_create_vht_cap(ar);
6970
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00006971 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
6972 ARRAY_SIZE(ath10k_5ghz_channels)) !=
6973 ATH10K_NUM_CHANS);
6974
Kalle Valo5e3dd152013-06-12 20:52:10 +03006975 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
6976 channels = kmemdup(ath10k_2ghz_channels,
6977 sizeof(ath10k_2ghz_channels),
6978 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02006979 if (!channels) {
6980 ret = -ENOMEM;
6981 goto err_free;
6982 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006983
6984 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
6985 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
6986 band->channels = channels;
6987 band->n_bitrates = ath10k_g_rates_size;
6988 band->bitrates = ath10k_g_rates;
6989 band->ht_cap = ht_cap;
6990
Yanbo Lid68bb122015-01-23 08:18:20 +08006991 /* Enable the VHT support at 2.4 GHz */
6992 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006993
6994 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
6995 }
6996
6997 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
6998 channels = kmemdup(ath10k_5ghz_channels,
6999 sizeof(ath10k_5ghz_channels),
7000 GFP_KERNEL);
7001 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007002 ret = -ENOMEM;
7003 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007004 }
7005
7006 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7007 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7008 band->channels = channels;
7009 band->n_bitrates = ath10k_a_rates_size;
7010 band->bitrates = ath10k_a_rates;
7011 band->ht_cap = ht_cap;
7012 band->vht_cap = vht_cap;
7013 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7014 }
7015
7016 ar->hw->wiphy->interface_modes =
7017 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007018 BIT(NL80211_IFTYPE_AP);
7019
Ben Greear46acf7b2014-05-16 17:15:38 +03007020 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
7021 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
7022
Bartosz Markowskid3541812013-12-10 16:20:40 +01007023 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7024 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007025 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007026 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7027 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007028
Johannes Berg30686bf2015-06-02 21:39:54 +02007029 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7030 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7031 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7032 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7033 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7034 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7035 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7036 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007037 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7038 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7039 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7040 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7041 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7042 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007043
David Liuccec9032015-07-24 20:25:32 +03007044 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7045 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7046
Eliad Peller0d8614b2014-09-10 14:07:36 +03007047 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007048 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007049
Kalle Valo5e3dd152013-06-12 20:52:10 +03007050 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007051 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007052
7053 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007054 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7055 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007056 }
7057
7058 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7059 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7060
7061 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007062 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007063
Kalle Valo5e3dd152013-06-12 20:52:10 +03007064 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7065
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007066 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7067 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7068
7069 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7070 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7071 * correct Probe Responses. This is more of a hack advert..
7072 */
7073 ar->hw->wiphy->probe_resp_offload |=
7074 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7075 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7076 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7077 }
7078
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007079 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7080 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7081
Kalle Valo5e3dd152013-06-12 20:52:10 +03007082 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007083 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007084 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7085
7086 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007087 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7088
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007089 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7090
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007091 ret = ath10k_wow_init(ar);
7092 if (ret) {
7093 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7094 goto err_free;
7095 }
7096
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007097 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7098
Kalle Valo5e3dd152013-06-12 20:52:10 +03007099 /*
7100 * on LL hardware queues are managed entirely by the FW
7101 * so we only advertise to mac we can do the queues thing
7102 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007103 ar->hw->queues = IEEE80211_MAX_QUEUES;
7104
7105 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7106 * something that vdev_ids can't reach so that we don't stop the queue
7107 * accidentally.
7108 */
7109 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007110
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007111 switch (ar->wmi.op_version) {
7112 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007113 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7114 ar->hw->wiphy->n_iface_combinations =
7115 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007116 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007117 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007118 case ATH10K_FW_WMI_OP_VERSION_TLV:
7119 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7120 ar->hw->wiphy->iface_combinations =
7121 ath10k_tlv_qcs_if_comb;
7122 ar->hw->wiphy->n_iface_combinations =
7123 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7124 } else {
7125 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7126 ar->hw->wiphy->n_iface_combinations =
7127 ARRAY_SIZE(ath10k_tlv_if_comb);
7128 }
7129 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7130 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007131 case ATH10K_FW_WMI_OP_VERSION_10_1:
7132 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007133 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007134 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7135 ar->hw->wiphy->n_iface_combinations =
7136 ARRAY_SIZE(ath10k_10x_if_comb);
7137 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307138 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307139 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7140 ar->hw->wiphy->n_iface_combinations =
7141 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307142 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007143 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7144 case ATH10K_FW_WMI_OP_VERSION_MAX:
7145 WARN_ON(1);
7146 ret = -EINVAL;
7147 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007148 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007149
David Liuccec9032015-07-24 20:25:32 +03007150 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7151 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007152
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007153 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7154 /* Init ath dfs pattern detector */
7155 ar->ath_common.debug_mask = ATH_DBG_DFS;
7156 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7157 NL80211_DFS_UNSET);
7158
7159 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007160 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007161 }
7162
Kalle Valo5e3dd152013-06-12 20:52:10 +03007163 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7164 ath10k_reg_notifier);
7165 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007166 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007167 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007168 }
7169
Johannes Berg3cb10942015-01-22 21:38:45 +01007170 ar->hw->wiphy->cipher_suites = cipher_suites;
7171 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7172
Kalle Valo5e3dd152013-06-12 20:52:10 +03007173 ret = ieee80211_register_hw(ar->hw);
7174 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007175 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007176 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007177 }
7178
7179 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7180 ret = regulatory_hint(ar->hw->wiphy,
7181 ar->ath_common.regulatory.alpha2);
7182 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007183 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007184 }
7185
7186 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007187
7188err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007189 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02007190err_free:
7191 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7192 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7193
Kalle Valo5e3dd152013-06-12 20:52:10 +03007194 return ret;
7195}
7196
7197void ath10k_mac_unregister(struct ath10k *ar)
7198{
7199 ieee80211_unregister_hw(ar->hw);
7200
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007201 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7202 ar->dfs_detector->exit(ar->dfs_detector);
7203
Kalle Valo5e3dd152013-06-12 20:52:10 +03007204 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7205 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7206
7207 SET_IEEE80211_DEV(ar->hw, NULL);
7208}