blob: 53c627a58384b9497e12036eb2568e0727f6debd [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
250 spin_lock_bh(&ar->data_lock);
251 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
252 spin_unlock_bh(&ar->data_lock);
253
254 if (!peer)
255 return -ENOENT;
256
257 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
258 if (arvif->wep_keys[i] == NULL)
259 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100260
261 flags = 0;
262 flags |= WMI_KEY_PAIRWISE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300263
264 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
Michal Kaziorce90b272015-04-10 13:23:21 +0000265 addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300266 if (ret < 0)
Michal Kaziorce90b272015-04-10 13:23:21 +0000267 return ret;
268
269 flags = 0;
270 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300271
272 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
Michal Kazior370e5672015-02-18 14:02:26 +0100273 addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300274 if (ret < 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300275 return ret;
276
Sujith Manoharanae167132014-11-25 11:46:59 +0530277 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300278 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530279 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300280 }
281
Michal Kaziorce90b272015-04-10 13:23:21 +0000282 /* In some cases (notably with static WEP IBSS with multiple keys)
283 * multicast Tx becomes broken. Both pairwise and groupwise keys are
284 * installed already. Using WMI_KEY_TX_USAGE in different combinations
285 * didn't seem help. Using def_keyid vdev parameter seems to be
286 * effective so use that.
287 *
288 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
289 */
290 if (arvif->def_wep_key_idx == -1)
291 return 0;
292
293 ret = ath10k_wmi_vdev_set_param(arvif->ar,
294 arvif->vdev_id,
295 arvif->ar->wmi.vdev_param->def_keyid,
296 arvif->def_wep_key_idx);
297 if (ret) {
298 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
299 arvif->vdev_id, ret);
300 return ret;
301 }
302
Kalle Valo5e3dd152013-06-12 20:52:10 +0300303 return 0;
304}
305
306static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
307 const u8 *addr)
308{
309 struct ath10k *ar = arvif->ar;
310 struct ath10k_peer *peer;
311 int first_errno = 0;
312 int ret;
313 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100314 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300315
316 lockdep_assert_held(&ar->conf_mutex);
317
318 spin_lock_bh(&ar->data_lock);
319 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
320 spin_unlock_bh(&ar->data_lock);
321
322 if (!peer)
323 return -ENOENT;
324
325 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
326 if (peer->keys[i] == NULL)
327 continue;
328
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200329 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300330 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100331 DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300332 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300333 first_errno = ret;
334
David Liuccec9032015-07-24 20:25:32 +0300335 if (ret < 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200336 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300337 i, ret);
338
Sujith Manoharanae167132014-11-25 11:46:59 +0530339 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300340 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530341 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300342 }
343
344 return first_errno;
345}
346
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530347bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
348 u8 keyidx)
349{
350 struct ath10k_peer *peer;
351 int i;
352
353 lockdep_assert_held(&ar->data_lock);
354
355 /* We don't know which vdev this peer belongs to,
356 * since WMI doesn't give us that information.
357 *
358 * FIXME: multi-bss needs to be handled.
359 */
360 peer = ath10k_peer_find(ar, 0, addr);
361 if (!peer)
362 return false;
363
364 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
365 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
366 return true;
367 }
368
369 return false;
370}
371
Kalle Valo5e3dd152013-06-12 20:52:10 +0300372static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
373 struct ieee80211_key_conf *key)
374{
375 struct ath10k *ar = arvif->ar;
376 struct ath10k_peer *peer;
377 u8 addr[ETH_ALEN];
378 int first_errno = 0;
379 int ret;
380 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100381 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300382
383 lockdep_assert_held(&ar->conf_mutex);
384
385 for (;;) {
386 /* since ath10k_install_key we can't hold data_lock all the
387 * time, so we try to remove the keys incrementally */
388 spin_lock_bh(&ar->data_lock);
389 i = 0;
390 list_for_each_entry(peer, &ar->peers, list) {
391 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
392 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300393 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300394 peer->keys[i] = NULL;
395 break;
396 }
397 }
398
399 if (i < ARRAY_SIZE(peer->keys))
400 break;
401 }
402 spin_unlock_bh(&ar->data_lock);
403
404 if (i == ARRAY_SIZE(peer->keys))
405 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200406 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100407 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300408 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300409 first_errno = ret;
410
411 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200412 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200413 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300414 }
415
416 return first_errno;
417}
418
Michal Kaziorad325cb2015-02-18 14:02:27 +0100419static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
420 struct ieee80211_key_conf *key)
421{
422 struct ath10k *ar = arvif->ar;
423 struct ath10k_peer *peer;
424 int ret;
425
426 lockdep_assert_held(&ar->conf_mutex);
427
428 list_for_each_entry(peer, &ar->peers, list) {
429 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
430 continue;
431
432 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
433 continue;
434
435 if (peer->keys[key->keyidx] == key)
436 continue;
437
438 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
439 arvif->vdev_id, key->keyidx);
440
441 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
442 if (ret) {
443 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
444 arvif->vdev_id, peer->addr, ret);
445 return ret;
446 }
447 }
448
449 return 0;
450}
451
Kalle Valo5e3dd152013-06-12 20:52:10 +0300452/*********************/
453/* General utilities */
454/*********************/
455
456static inline enum wmi_phy_mode
457chan_to_phymode(const struct cfg80211_chan_def *chandef)
458{
459 enum wmi_phy_mode phymode = MODE_UNKNOWN;
460
461 switch (chandef->chan->band) {
462 case IEEE80211_BAND_2GHZ:
463 switch (chandef->width) {
464 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800465 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
466 phymode = MODE_11B;
467 else
468 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300469 break;
470 case NL80211_CHAN_WIDTH_20:
471 phymode = MODE_11NG_HT20;
472 break;
473 case NL80211_CHAN_WIDTH_40:
474 phymode = MODE_11NG_HT40;
475 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400476 case NL80211_CHAN_WIDTH_5:
477 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300478 case NL80211_CHAN_WIDTH_80:
479 case NL80211_CHAN_WIDTH_80P80:
480 case NL80211_CHAN_WIDTH_160:
481 phymode = MODE_UNKNOWN;
482 break;
483 }
484 break;
485 case IEEE80211_BAND_5GHZ:
486 switch (chandef->width) {
487 case NL80211_CHAN_WIDTH_20_NOHT:
488 phymode = MODE_11A;
489 break;
490 case NL80211_CHAN_WIDTH_20:
491 phymode = MODE_11NA_HT20;
492 break;
493 case NL80211_CHAN_WIDTH_40:
494 phymode = MODE_11NA_HT40;
495 break;
496 case NL80211_CHAN_WIDTH_80:
497 phymode = MODE_11AC_VHT80;
498 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400499 case NL80211_CHAN_WIDTH_5:
500 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300501 case NL80211_CHAN_WIDTH_80P80:
502 case NL80211_CHAN_WIDTH_160:
503 phymode = MODE_UNKNOWN;
504 break;
505 }
506 break;
507 default:
508 break;
509 }
510
511 WARN_ON(phymode == MODE_UNKNOWN);
512 return phymode;
513}
514
515static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
516{
517/*
518 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
519 * 0 for no restriction
520 * 1 for 1/4 us
521 * 2 for 1/2 us
522 * 3 for 1 us
523 * 4 for 2 us
524 * 5 for 4 us
525 * 6 for 8 us
526 * 7 for 16 us
527 */
528 switch (mpdudensity) {
529 case 0:
530 return 0;
531 case 1:
532 case 2:
533 case 3:
534 /* Our lower layer calculations limit our precision to
535 1 microsecond */
536 return 1;
537 case 4:
538 return 2;
539 case 5:
540 return 4;
541 case 6:
542 return 8;
543 case 7:
544 return 16;
545 default:
546 return 0;
547 }
548}
549
Michal Kazior500ff9f2015-03-31 10:26:21 +0000550int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
551 struct cfg80211_chan_def *def)
552{
553 struct ieee80211_chanctx_conf *conf;
554
555 rcu_read_lock();
556 conf = rcu_dereference(vif->chanctx_conf);
557 if (!conf) {
558 rcu_read_unlock();
559 return -ENOENT;
560 }
561
562 *def = conf->def;
563 rcu_read_unlock();
564
565 return 0;
566}
567
568static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
569 struct ieee80211_chanctx_conf *conf,
570 void *data)
571{
572 int *num = data;
573
574 (*num)++;
575}
576
577static int ath10k_mac_num_chanctxs(struct ath10k *ar)
578{
579 int num = 0;
580
581 ieee80211_iter_chan_contexts_atomic(ar->hw,
582 ath10k_mac_num_chanctxs_iter,
583 &num);
584
585 return num;
586}
587
588static void
589ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
590 struct ieee80211_chanctx_conf *conf,
591 void *data)
592{
593 struct cfg80211_chan_def **def = data;
594
595 *def = &conf->def;
596}
597
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300598static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
599 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300600{
601 int ret;
602
603 lockdep_assert_held(&ar->conf_mutex);
604
Michal Kaziorcfd10612014-11-25 15:16:05 +0100605 if (ar->num_peers >= ar->max_num_peers)
606 return -ENOBUFS;
607
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300608 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800609 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200610 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200611 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300612 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800613 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300614
615 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800616 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200617 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200618 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300619 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800620 }
Michal Kazior292a7532014-11-25 15:16:04 +0100621
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100622 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623
624 return 0;
625}
626
Kalle Valo5a13e762014-01-20 11:01:46 +0200627static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
628{
629 struct ath10k *ar = arvif->ar;
630 u32 param;
631 int ret;
632
633 param = ar->wmi.pdev_param->sta_kickout_th;
634 ret = ath10k_wmi_pdev_set_param(ar, param,
635 ATH10K_KICKOUT_THRESHOLD);
636 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200637 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200638 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200639 return ret;
640 }
641
642 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
643 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
644 ATH10K_KEEPALIVE_MIN_IDLE);
645 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200646 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200647 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200648 return ret;
649 }
650
651 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
652 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
653 ATH10K_KEEPALIVE_MAX_IDLE);
654 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200655 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200656 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200657 return ret;
658 }
659
660 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
661 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
662 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
663 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200664 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200665 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200666 return ret;
667 }
668
669 return 0;
670}
671
Vivek Natarajanacab6402014-11-26 09:06:12 +0200672static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200673{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200674 struct ath10k *ar = arvif->ar;
675 u32 vdev_param;
676
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200677 vdev_param = ar->wmi.vdev_param->rts_threshold;
678 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200679}
680
Kalle Valo5e3dd152013-06-12 20:52:10 +0300681static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
682{
683 int ret;
684
685 lockdep_assert_held(&ar->conf_mutex);
686
687 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
688 if (ret)
689 return ret;
690
691 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
692 if (ret)
693 return ret;
694
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100695 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100696
Kalle Valo5e3dd152013-06-12 20:52:10 +0300697 return 0;
698}
699
700static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
701{
702 struct ath10k_peer *peer, *tmp;
703
704 lockdep_assert_held(&ar->conf_mutex);
705
706 spin_lock_bh(&ar->data_lock);
707 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
708 if (peer->vdev_id != vdev_id)
709 continue;
710
Michal Kazior7aa7a722014-08-25 12:09:38 +0200711 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300712 peer->addr, vdev_id);
713
714 list_del(&peer->list);
715 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100716 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300717 }
718 spin_unlock_bh(&ar->data_lock);
719}
720
Michal Kaziora96d7742013-07-16 09:38:56 +0200721static void ath10k_peer_cleanup_all(struct ath10k *ar)
722{
723 struct ath10k_peer *peer, *tmp;
724
725 lockdep_assert_held(&ar->conf_mutex);
726
727 spin_lock_bh(&ar->data_lock);
728 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
729 list_del(&peer->list);
730 kfree(peer);
731 }
732 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100733
734 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100735 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200736}
737
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300738static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
739 struct ieee80211_sta *sta,
740 enum wmi_tdls_peer_state state)
741{
742 int ret;
743 struct wmi_tdls_peer_update_cmd_arg arg = {};
744 struct wmi_tdls_peer_capab_arg cap = {};
745 struct wmi_channel_arg chan_arg = {};
746
747 lockdep_assert_held(&ar->conf_mutex);
748
749 arg.vdev_id = vdev_id;
750 arg.peer_state = state;
751 ether_addr_copy(arg.addr, sta->addr);
752
753 cap.peer_max_sp = sta->max_sp;
754 cap.peer_uapsd_queues = sta->uapsd_queues;
755
756 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
757 !sta->tdls_initiator)
758 cap.is_peer_responder = 1;
759
760 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
761 if (ret) {
762 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
763 arg.addr, vdev_id, ret);
764 return ret;
765 }
766
767 return 0;
768}
769
Kalle Valo5e3dd152013-06-12 20:52:10 +0300770/************************/
771/* Interface management */
772/************************/
773
Michal Kazior64badcb2014-09-18 11:18:02 +0300774void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
775{
776 struct ath10k *ar = arvif->ar;
777
778 lockdep_assert_held(&ar->data_lock);
779
780 if (!arvif->beacon)
781 return;
782
783 if (!arvif->beacon_buf)
784 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
785 arvif->beacon->len, DMA_TO_DEVICE);
786
Michal Kazioraf213192015-01-29 14:29:52 +0200787 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
788 arvif->beacon_state != ATH10K_BEACON_SENT))
789 return;
790
Michal Kazior64badcb2014-09-18 11:18:02 +0300791 dev_kfree_skb_any(arvif->beacon);
792
793 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200794 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300795}
796
797static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
798{
799 struct ath10k *ar = arvif->ar;
800
801 lockdep_assert_held(&ar->data_lock);
802
803 ath10k_mac_vif_beacon_free(arvif);
804
805 if (arvif->beacon_buf) {
806 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
807 arvif->beacon_buf, arvif->beacon_paddr);
808 arvif->beacon_buf = NULL;
809 }
810}
811
Kalle Valo5e3dd152013-06-12 20:52:10 +0300812static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
813{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300814 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300815
Michal Kazior548db542013-07-05 16:15:15 +0300816 lockdep_assert_held(&ar->conf_mutex);
817
Michal Kazior7962b0d2014-10-28 10:34:38 +0100818 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
819 return -ESHUTDOWN;
820
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300821 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
822 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
823 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300824 return -ETIMEDOUT;
825
826 return 0;
827}
828
Michal Kazior1bbc0972014-04-08 09:45:47 +0300829static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300830{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000831 struct cfg80211_chan_def *chandef = NULL;
Maninder Singh19be9e92015-07-16 09:25:33 +0530832 struct ieee80211_channel *channel = NULL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300833 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300834 int ret = 0;
835
836 lockdep_assert_held(&ar->conf_mutex);
837
Michal Kazior500ff9f2015-03-31 10:26:21 +0000838 ieee80211_iter_chan_contexts_atomic(ar->hw,
839 ath10k_mac_get_any_chandef_iter,
840 &chandef);
841 if (WARN_ON_ONCE(!chandef))
842 return -ENOENT;
843
844 channel = chandef->chan;
845
Kalle Valo5e3dd152013-06-12 20:52:10 +0300846 arg.vdev_id = vdev_id;
847 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100848 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300849
850 /* TODO setup this dynamically, what in case we
851 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100852 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200853 arg.channel.chan_radar =
854 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300855
Michal Kazior89c5c842013-10-23 04:02:13 -0700856 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700857 arg.channel.max_power = channel->max_power * 2;
858 arg.channel.max_reg_power = channel->max_reg_power * 2;
859 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300860
Michal Kazior7962b0d2014-10-28 10:34:38 +0100861 reinit_completion(&ar->vdev_setup_done);
862
Kalle Valo5e3dd152013-06-12 20:52:10 +0300863 ret = ath10k_wmi_vdev_start(ar, &arg);
864 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200865 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200866 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300867 return ret;
868 }
869
870 ret = ath10k_vdev_setup_sync(ar);
871 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200872 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200873 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300874 return ret;
875 }
876
877 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
878 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200879 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200880 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300881 goto vdev_stop;
882 }
883
884 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300885
Michal Kazior7aa7a722014-08-25 12:09:38 +0200886 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300887 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300888 return 0;
889
890vdev_stop:
891 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
892 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200893 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200894 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300895
896 return ret;
897}
898
Michal Kazior1bbc0972014-04-08 09:45:47 +0300899static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300900{
901 int ret = 0;
902
903 lockdep_assert_held(&ar->conf_mutex);
904
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200905 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
906 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200907 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200908 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300909
Michal Kazior7962b0d2014-10-28 10:34:38 +0100910 reinit_completion(&ar->vdev_setup_done);
911
Kalle Valo5e3dd152013-06-12 20:52:10 +0300912 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
913 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200914 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200915 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300916
917 ret = ath10k_vdev_setup_sync(ar);
918 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200919 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200920 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300921
Michal Kazior7aa7a722014-08-25 12:09:38 +0200922 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300923 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300924 return ret;
925}
926
Michal Kazior1bbc0972014-04-08 09:45:47 +0300927static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300928{
929 int bit, ret = 0;
930
931 lockdep_assert_held(&ar->conf_mutex);
932
Ben Greeara9aefb32014-08-12 11:02:19 +0300933 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200934 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300935 return -ENOMEM;
936 }
937
Ben Greear16c11172014-09-23 14:17:16 -0700938 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300939
Ben Greear16c11172014-09-23 14:17:16 -0700940 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300941
942 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
943 WMI_VDEV_TYPE_MONITOR,
944 0, ar->mac_addr);
945 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200946 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200947 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300948 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300949 }
950
Ben Greear16c11172014-09-23 14:17:16 -0700951 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200952 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300953 ar->monitor_vdev_id);
954
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300956}
957
Michal Kazior1bbc0972014-04-08 09:45:47 +0300958static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300959{
960 int ret = 0;
961
962 lockdep_assert_held(&ar->conf_mutex);
963
Kalle Valo5e3dd152013-06-12 20:52:10 +0300964 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
965 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200966 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200967 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300968 return ret;
969 }
970
Ben Greear16c11172014-09-23 14:17:16 -0700971 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300972
Michal Kazior7aa7a722014-08-25 12:09:38 +0200973 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300974 ar->monitor_vdev_id);
975 return ret;
976}
977
Michal Kazior1bbc0972014-04-08 09:45:47 +0300978static int ath10k_monitor_start(struct ath10k *ar)
979{
980 int ret;
981
982 lockdep_assert_held(&ar->conf_mutex);
983
Michal Kazior1bbc0972014-04-08 09:45:47 +0300984 ret = ath10k_monitor_vdev_create(ar);
985 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200986 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300987 return ret;
988 }
989
990 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
991 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200992 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300993 ath10k_monitor_vdev_delete(ar);
994 return ret;
995 }
996
997 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200998 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +0300999
1000 return 0;
1001}
1002
Michal Kazior19337472014-08-28 12:58:16 +02001003static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001004{
1005 int ret;
1006
1007 lockdep_assert_held(&ar->conf_mutex);
1008
Michal Kazior1bbc0972014-04-08 09:45:47 +03001009 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001010 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001011 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001012 return ret;
1013 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001014
1015 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001016 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001017 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001018 return ret;
1019 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001020
1021 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001022 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001023
1024 return 0;
1025}
1026
Michal Kazior500ff9f2015-03-31 10:26:21 +00001027static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1028{
1029 int num_ctx;
1030
1031 /* At least one chanctx is required to derive a channel to start
1032 * monitor vdev on.
1033 */
1034 num_ctx = ath10k_mac_num_chanctxs(ar);
1035 if (num_ctx == 0)
1036 return false;
1037
1038 /* If there's already an existing special monitor interface then don't
1039 * bother creating another monitor vdev.
1040 */
1041 if (ar->monitor_arvif)
1042 return false;
1043
1044 return ar->monitor ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001045 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1046}
1047
1048static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1049{
1050 int num_ctx;
1051
1052 num_ctx = ath10k_mac_num_chanctxs(ar);
1053
1054 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1055 * shouldn't allow this but make sure to prevent handling the following
1056 * case anyway since multi-channel DFS hasn't been tested at all.
1057 */
1058 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1059 return false;
1060
1061 return true;
1062}
1063
Michal Kazior19337472014-08-28 12:58:16 +02001064static int ath10k_monitor_recalc(struct ath10k *ar)
1065{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001066 bool needed;
1067 bool allowed;
1068 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001069
1070 lockdep_assert_held(&ar->conf_mutex);
1071
Michal Kazior500ff9f2015-03-31 10:26:21 +00001072 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1073 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001074
1075 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001076 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1077 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001078
Michal Kazior500ff9f2015-03-31 10:26:21 +00001079 if (WARN_ON(needed && !allowed)) {
1080 if (ar->monitor_started) {
1081 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1082
1083 ret = ath10k_monitor_stop(ar);
1084 if (ret)
1085 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", ret);
1086 /* not serious */
1087 }
1088
1089 return -EPERM;
1090 }
1091
1092 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001093 return 0;
1094
Michal Kazior500ff9f2015-03-31 10:26:21 +00001095 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001096 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001097 else
1098 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001099}
1100
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001101static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1102{
1103 struct ath10k *ar = arvif->ar;
1104 u32 vdev_param, rts_cts = 0;
1105
1106 lockdep_assert_held(&ar->conf_mutex);
1107
1108 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1109
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001110 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001111
1112 if (arvif->num_legacy_stations > 0)
1113 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1114 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001115 else
1116 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1117 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001118
1119 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1120 rts_cts);
1121}
1122
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001123static int ath10k_start_cac(struct ath10k *ar)
1124{
1125 int ret;
1126
1127 lockdep_assert_held(&ar->conf_mutex);
1128
1129 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1130
Michal Kazior19337472014-08-28 12:58:16 +02001131 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001132 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001133 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001134 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1135 return ret;
1136 }
1137
Michal Kazior7aa7a722014-08-25 12:09:38 +02001138 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001139 ar->monitor_vdev_id);
1140
1141 return 0;
1142}
1143
1144static int ath10k_stop_cac(struct ath10k *ar)
1145{
1146 lockdep_assert_held(&ar->conf_mutex);
1147
1148 /* CAC is not running - do nothing */
1149 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1150 return 0;
1151
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001152 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001153 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001154
Michal Kazior7aa7a722014-08-25 12:09:38 +02001155 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001156
1157 return 0;
1158}
1159
Michal Kazior500ff9f2015-03-31 10:26:21 +00001160static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1161 struct ieee80211_chanctx_conf *conf,
1162 void *data)
1163{
1164 bool *ret = data;
1165
1166 if (!*ret && conf->radar_enabled)
1167 *ret = true;
1168}
1169
1170static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1171{
1172 bool has_radar = false;
1173
1174 ieee80211_iter_chan_contexts_atomic(ar->hw,
1175 ath10k_mac_has_radar_iter,
1176 &has_radar);
1177
1178 return has_radar;
1179}
1180
Michal Kaziord6500972014-04-08 09:56:09 +03001181static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001182{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001183 int ret;
1184
1185 lockdep_assert_held(&ar->conf_mutex);
1186
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001187 ath10k_stop_cac(ar);
1188
Michal Kazior500ff9f2015-03-31 10:26:21 +00001189 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001190 return;
1191
Michal Kaziord6500972014-04-08 09:56:09 +03001192 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001193 return;
1194
1195 ret = ath10k_start_cac(ar);
1196 if (ret) {
1197 /*
1198 * Not possible to start CAC on current channel so starting
1199 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1200 * by indicating that radar was detected.
1201 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001202 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001203 ieee80211_radar_detected(ar->hw);
1204 }
1205}
1206
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301207static int ath10k_vdev_stop(struct ath10k_vif *arvif)
Michal Kazior72654fa2014-04-08 09:56:09 +03001208{
1209 struct ath10k *ar = arvif->ar;
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301210 int ret;
1211
1212 lockdep_assert_held(&ar->conf_mutex);
1213
1214 reinit_completion(&ar->vdev_setup_done);
1215
1216 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1217 if (ret) {
1218 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1219 arvif->vdev_id, ret);
1220 return ret;
1221 }
1222
1223 ret = ath10k_vdev_setup_sync(ar);
1224 if (ret) {
1225 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1226 arvif->vdev_id, ret);
1227 return ret;
1228 }
1229
1230 WARN_ON(ar->num_started_vdevs == 0);
1231
1232 if (ar->num_started_vdevs != 0) {
1233 ar->num_started_vdevs--;
1234 ath10k_recalc_radar_detection(ar);
1235 }
1236
1237 return ret;
1238}
1239
Michal Kazior500ff9f2015-03-31 10:26:21 +00001240static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1241 const struct cfg80211_chan_def *chandef,
1242 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001243{
1244 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001245 struct wmi_vdev_start_request_arg arg = {};
1246 int ret = 0;
1247
1248 lockdep_assert_held(&ar->conf_mutex);
1249
1250 reinit_completion(&ar->vdev_setup_done);
1251
1252 arg.vdev_id = arvif->vdev_id;
1253 arg.dtim_period = arvif->dtim_period;
1254 arg.bcn_intval = arvif->beacon_interval;
1255
1256 arg.channel.freq = chandef->chan->center_freq;
1257 arg.channel.band_center_freq1 = chandef->center_freq1;
1258 arg.channel.mode = chan_to_phymode(chandef);
1259
1260 arg.channel.min_power = 0;
1261 arg.channel.max_power = chandef->chan->max_power * 2;
1262 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1263 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1264
1265 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1266 arg.ssid = arvif->u.ap.ssid;
1267 arg.ssid_len = arvif->u.ap.ssid_len;
1268 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1269
1270 /* For now allow DFS for AP mode */
1271 arg.channel.chan_radar =
1272 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1273 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1274 arg.ssid = arvif->vif->bss_conf.ssid;
1275 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1276 }
1277
Michal Kazior7aa7a722014-08-25 12:09:38 +02001278 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001279 "mac vdev %d start center_freq %d phymode %s\n",
1280 arg.vdev_id, arg.channel.freq,
1281 ath10k_wmi_phymode_str(arg.channel.mode));
1282
Michal Kaziordc55e302014-07-29 12:53:36 +03001283 if (restart)
1284 ret = ath10k_wmi_vdev_restart(ar, &arg);
1285 else
1286 ret = ath10k_wmi_vdev_start(ar, &arg);
1287
Michal Kazior72654fa2014-04-08 09:56:09 +03001288 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001289 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001290 arg.vdev_id, ret);
1291 return ret;
1292 }
1293
1294 ret = ath10k_vdev_setup_sync(ar);
1295 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001296 ath10k_warn(ar,
1297 "failed to synchronize setup for vdev %i restart %d: %d\n",
1298 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001299 return ret;
1300 }
1301
Michal Kaziord6500972014-04-08 09:56:09 +03001302 ar->num_started_vdevs++;
1303 ath10k_recalc_radar_detection(ar);
1304
Michal Kazior72654fa2014-04-08 09:56:09 +03001305 return ret;
1306}
1307
Michal Kazior500ff9f2015-03-31 10:26:21 +00001308static int ath10k_vdev_start(struct ath10k_vif *arvif,
1309 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001310{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001311 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001312}
1313
Michal Kazior500ff9f2015-03-31 10:26:21 +00001314static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1315 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001316{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001317 return ath10k_vdev_start_restart(arvif, def, true);
Michal Kazior72654fa2014-04-08 09:56:09 +03001318}
1319
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001320static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1321 struct sk_buff *bcn)
1322{
1323 struct ath10k *ar = arvif->ar;
1324 struct ieee80211_mgmt *mgmt;
1325 const u8 *p2p_ie;
1326 int ret;
1327
1328 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1329 return 0;
1330
1331 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1332 return 0;
1333
1334 mgmt = (void *)bcn->data;
1335 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1336 mgmt->u.beacon.variable,
1337 bcn->len - (mgmt->u.beacon.variable -
1338 bcn->data));
1339 if (!p2p_ie)
1340 return -ENOENT;
1341
1342 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1343 if (ret) {
1344 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1345 arvif->vdev_id, ret);
1346 return ret;
1347 }
1348
1349 return 0;
1350}
1351
1352static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1353 u8 oui_type, size_t ie_offset)
1354{
1355 size_t len;
1356 const u8 *next;
1357 const u8 *end;
1358 u8 *ie;
1359
1360 if (WARN_ON(skb->len < ie_offset))
1361 return -EINVAL;
1362
1363 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1364 skb->data + ie_offset,
1365 skb->len - ie_offset);
1366 if (!ie)
1367 return -ENOENT;
1368
1369 len = ie[1] + 2;
1370 end = skb->data + skb->len;
1371 next = ie + len;
1372
1373 if (WARN_ON(next > end))
1374 return -EINVAL;
1375
1376 memmove(ie, next, end - next);
1377 skb_trim(skb, skb->len - len);
1378
1379 return 0;
1380}
1381
1382static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1383{
1384 struct ath10k *ar = arvif->ar;
1385 struct ieee80211_hw *hw = ar->hw;
1386 struct ieee80211_vif *vif = arvif->vif;
1387 struct ieee80211_mutable_offsets offs = {};
1388 struct sk_buff *bcn;
1389 int ret;
1390
1391 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1392 return 0;
1393
Michal Kazior81a9a172015-03-05 16:02:17 +02001394 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1395 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1396 return 0;
1397
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001398 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1399 if (!bcn) {
1400 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1401 return -EPERM;
1402 }
1403
1404 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1405 if (ret) {
1406 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1407 kfree_skb(bcn);
1408 return ret;
1409 }
1410
1411 /* P2P IE is inserted by firmware automatically (as configured above)
1412 * so remove it from the base beacon template to avoid duplicate P2P
1413 * IEs in beacon frames.
1414 */
1415 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1416 offsetof(struct ieee80211_mgmt,
1417 u.beacon.variable));
1418
1419 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1420 0, NULL, 0);
1421 kfree_skb(bcn);
1422
1423 if (ret) {
1424 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1425 ret);
1426 return ret;
1427 }
1428
1429 return 0;
1430}
1431
1432static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1433{
1434 struct ath10k *ar = arvif->ar;
1435 struct ieee80211_hw *hw = ar->hw;
1436 struct ieee80211_vif *vif = arvif->vif;
1437 struct sk_buff *prb;
1438 int ret;
1439
1440 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1441 return 0;
1442
Michal Kazior81a9a172015-03-05 16:02:17 +02001443 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1444 return 0;
1445
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001446 prb = ieee80211_proberesp_get(hw, vif);
1447 if (!prb) {
1448 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1449 return -EPERM;
1450 }
1451
1452 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1453 kfree_skb(prb);
1454
1455 if (ret) {
1456 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1457 ret);
1458 return ret;
1459 }
1460
1461 return 0;
1462}
1463
Michal Kazior500ff9f2015-03-31 10:26:21 +00001464static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1465{
1466 struct ath10k *ar = arvif->ar;
1467 struct cfg80211_chan_def def;
1468 int ret;
1469
1470 /* When originally vdev is started during assign_vif_chanctx() some
1471 * information is missing, notably SSID. Firmware revisions with beacon
1472 * offloading require the SSID to be provided during vdev (re)start to
1473 * handle hidden SSID properly.
1474 *
1475 * Vdev restart must be done after vdev has been both started and
1476 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1477 * deliver vdev restart response event causing timeouts during vdev
1478 * syncing in ath10k.
1479 *
1480 * Note: The vdev down/up and template reinstallation could be skipped
1481 * since only wmi-tlv firmware are known to have beacon offload and
1482 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1483 * response delivery. It's probably more robust to keep it as is.
1484 */
1485 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1486 return 0;
1487
1488 if (WARN_ON(!arvif->is_started))
1489 return -EINVAL;
1490
1491 if (WARN_ON(!arvif->is_up))
1492 return -EINVAL;
1493
1494 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1495 return -EINVAL;
1496
1497 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1498 if (ret) {
1499 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1500 arvif->vdev_id, ret);
1501 return ret;
1502 }
1503
1504 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1505 * firmware will crash upon vdev up.
1506 */
1507
1508 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1509 if (ret) {
1510 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1511 return ret;
1512 }
1513
1514 ret = ath10k_mac_setup_prb_tmpl(arvif);
1515 if (ret) {
1516 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1517 return ret;
1518 }
1519
1520 ret = ath10k_vdev_restart(arvif, &def);
1521 if (ret) {
1522 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1523 arvif->vdev_id, ret);
1524 return ret;
1525 }
1526
1527 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1528 arvif->bssid);
1529 if (ret) {
1530 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1531 arvif->vdev_id, ret);
1532 return ret;
1533 }
1534
1535 return 0;
1536}
1537
Kalle Valo5e3dd152013-06-12 20:52:10 +03001538static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001539 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001540{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001541 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001542 int ret = 0;
1543
Michal Kazior548db542013-07-05 16:15:15 +03001544 lockdep_assert_held(&arvif->ar->conf_mutex);
1545
Kalle Valo5e3dd152013-06-12 20:52:10 +03001546 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001547 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1548 if (ret)
1549 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1550 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001551
Michal Kaziorc930f742014-01-23 11:38:25 +01001552 arvif->is_up = false;
1553
Michal Kazior748afc42014-01-23 12:48:21 +01001554 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001555 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001556 spin_unlock_bh(&arvif->ar->data_lock);
1557
Kalle Valo5e3dd152013-06-12 20:52:10 +03001558 return;
1559 }
1560
1561 arvif->tx_seq_no = 0x1000;
1562
Michal Kaziorc930f742014-01-23 11:38:25 +01001563 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001564 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001565
1566 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1567 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001568 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001569 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001570 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001571 return;
1572 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001573
Michal Kaziorc930f742014-01-23 11:38:25 +01001574 arvif->is_up = true;
1575
Michal Kazior500ff9f2015-03-31 10:26:21 +00001576 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1577 if (ret) {
1578 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1579 arvif->vdev_id, ret);
1580 return;
1581 }
1582
Michal Kazior7aa7a722014-08-25 12:09:38 +02001583 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001584}
1585
1586static void ath10k_control_ibss(struct ath10k_vif *arvif,
1587 struct ieee80211_bss_conf *info,
1588 const u8 self_peer[ETH_ALEN])
1589{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001590 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001591 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001592 int ret = 0;
1593
Michal Kazior548db542013-07-05 16:15:15 +03001594 lockdep_assert_held(&arvif->ar->conf_mutex);
1595
Kalle Valo5e3dd152013-06-12 20:52:10 +03001596 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001597 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001598 return;
1599
Joe Perches93803b32015-03-02 19:54:49 -08001600 eth_zero_addr(arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001601
1602 return;
1603 }
1604
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001605 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1606 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001607 ATH10K_DEFAULT_ATIM);
1608 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001609 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001610 arvif->vdev_id, ret);
1611}
1612
Michal Kazior9f9b5742014-12-12 12:41:36 +01001613static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1614{
1615 struct ath10k *ar = arvif->ar;
1616 u32 param;
1617 u32 value;
1618 int ret;
1619
1620 lockdep_assert_held(&arvif->ar->conf_mutex);
1621
1622 if (arvif->u.sta.uapsd)
1623 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1624 else
1625 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1626
1627 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1628 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1629 if (ret) {
1630 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1631 value, arvif->vdev_id, ret);
1632 return ret;
1633 }
1634
1635 return 0;
1636}
1637
1638static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1639{
1640 struct ath10k *ar = arvif->ar;
1641 u32 param;
1642 u32 value;
1643 int ret;
1644
1645 lockdep_assert_held(&arvif->ar->conf_mutex);
1646
1647 if (arvif->u.sta.uapsd)
1648 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1649 else
1650 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1651
1652 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1653 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1654 param, value);
1655 if (ret) {
1656 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1657 value, arvif->vdev_id, ret);
1658 return ret;
1659 }
1660
1661 return 0;
1662}
1663
Michal Kazior424f2632015-07-09 13:08:35 +02001664static int ath10k_mac_num_vifs_started(struct ath10k *ar)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001665{
1666 struct ath10k_vif *arvif;
1667 int num = 0;
1668
1669 lockdep_assert_held(&ar->conf_mutex);
1670
1671 list_for_each_entry(arvif, &ar->arvifs, list)
Michal Kazior424f2632015-07-09 13:08:35 +02001672 if (arvif->is_started)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001673 num++;
1674
1675 return num;
1676}
1677
Michal Kaziorad088bf2013-10-16 15:44:46 +03001678static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001679{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001680 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001681 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001682 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001683 enum wmi_sta_powersave_param param;
1684 enum wmi_sta_ps_mode psmode;
1685 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001686 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001687 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001688
Michal Kazior548db542013-07-05 16:15:15 +03001689 lockdep_assert_held(&arvif->ar->conf_mutex);
1690
Michal Kaziorad088bf2013-10-16 15:44:46 +03001691 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1692 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001693
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001694 enable_ps = arvif->ps;
1695
Michal Kazior424f2632015-07-09 13:08:35 +02001696 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001697 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1698 ar->fw_features)) {
1699 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1700 arvif->vdev_id);
1701 enable_ps = false;
1702 }
1703
Janusz Dziedzic917826b2015-05-18 09:38:17 +00001704 if (!arvif->is_started) {
1705 /* mac80211 can update vif powersave state while disconnected.
1706 * Firmware doesn't behave nicely and consumes more power than
1707 * necessary if PS is disabled on a non-started vdev. Hence
1708 * force-enable PS for non-running vdevs.
1709 */
1710 psmode = WMI_STA_PS_MODE_ENABLED;
1711 } else if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001712 psmode = WMI_STA_PS_MODE_ENABLED;
1713 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1714
Michal Kazior526549a2014-12-12 12:41:37 +01001715 ps_timeout = conf->dynamic_ps_timeout;
1716 if (ps_timeout == 0) {
1717 /* Firmware doesn't like 0 */
1718 ps_timeout = ieee80211_tu_to_usec(
1719 vif->bss_conf.beacon_int) / 1000;
1720 }
1721
Michal Kaziorad088bf2013-10-16 15:44:46 +03001722 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001723 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001724 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001725 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001726 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001727 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001728 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001729 } else {
1730 psmode = WMI_STA_PS_MODE_DISABLED;
1731 }
1732
Michal Kazior7aa7a722014-08-25 12:09:38 +02001733 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001734 arvif->vdev_id, psmode ? "enable" : "disable");
1735
Michal Kaziorad088bf2013-10-16 15:44:46 +03001736 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1737 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001738 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001739 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001740 return ret;
1741 }
1742
1743 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001744}
1745
Michal Kazior46725b152015-01-28 09:57:49 +02001746static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1747{
1748 struct ath10k *ar = arvif->ar;
1749 struct wmi_sta_keepalive_arg arg = {};
1750 int ret;
1751
1752 lockdep_assert_held(&arvif->ar->conf_mutex);
1753
1754 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1755 return 0;
1756
1757 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1758 return 0;
1759
1760 /* Some firmware revisions have a bug and ignore the `enabled` field.
1761 * Instead use the interval to disable the keepalive.
1762 */
1763 arg.vdev_id = arvif->vdev_id;
1764 arg.enabled = 1;
1765 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1766 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1767
1768 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1769 if (ret) {
1770 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1771 arvif->vdev_id, ret);
1772 return ret;
1773 }
1774
1775 return 0;
1776}
1777
Michal Kazior81a9a172015-03-05 16:02:17 +02001778static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1779{
1780 struct ath10k *ar = arvif->ar;
1781 struct ieee80211_vif *vif = arvif->vif;
1782 int ret;
1783
Michal Kazior8513d952015-03-09 14:19:24 +01001784 lockdep_assert_held(&arvif->ar->conf_mutex);
1785
1786 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1787 return;
1788
Michal Kazior81a9a172015-03-05 16:02:17 +02001789 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1790 return;
1791
1792 if (!vif->csa_active)
1793 return;
1794
1795 if (!arvif->is_up)
1796 return;
1797
1798 if (!ieee80211_csa_is_complete(vif)) {
1799 ieee80211_csa_update_counter(vif);
1800
1801 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1802 if (ret)
1803 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1804 ret);
1805
1806 ret = ath10k_mac_setup_prb_tmpl(arvif);
1807 if (ret)
1808 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1809 ret);
1810 } else {
1811 ieee80211_csa_finish(vif);
1812 }
1813}
1814
1815static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1816{
1817 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1818 ap_csa_work);
1819 struct ath10k *ar = arvif->ar;
1820
1821 mutex_lock(&ar->conf_mutex);
1822 ath10k_mac_vif_ap_csa_count_down(arvif);
1823 mutex_unlock(&ar->conf_mutex);
1824}
1825
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001826static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1827 struct ieee80211_vif *vif)
1828{
1829 struct sk_buff *skb = data;
1830 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1831 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1832
1833 if (vif->type != NL80211_IFTYPE_STATION)
1834 return;
1835
1836 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1837 return;
1838
1839 cancel_delayed_work(&arvif->connection_loss_work);
1840}
1841
1842void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1843{
1844 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1845 IEEE80211_IFACE_ITER_NORMAL,
1846 ath10k_mac_handle_beacon_iter,
1847 skb);
1848}
1849
1850static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1851 struct ieee80211_vif *vif)
1852{
1853 u32 *vdev_id = data;
1854 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1855 struct ath10k *ar = arvif->ar;
1856 struct ieee80211_hw *hw = ar->hw;
1857
1858 if (arvif->vdev_id != *vdev_id)
1859 return;
1860
1861 if (!arvif->is_up)
1862 return;
1863
1864 ieee80211_beacon_loss(vif);
1865
1866 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1867 * (done by mac80211) succeeds but beacons do not resume then it
1868 * doesn't make sense to continue operation. Queue connection loss work
1869 * which can be cancelled when beacon is received.
1870 */
1871 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1872 ATH10K_CONNECTION_LOSS_HZ);
1873}
1874
1875void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1876{
1877 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1878 IEEE80211_IFACE_ITER_NORMAL,
1879 ath10k_mac_handle_beacon_miss_iter,
1880 &vdev_id);
1881}
1882
1883static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1884{
1885 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1886 connection_loss_work.work);
1887 struct ieee80211_vif *vif = arvif->vif;
1888
1889 if (!arvif->is_up)
1890 return;
1891
1892 ieee80211_connection_loss(vif);
1893}
1894
Kalle Valo5e3dd152013-06-12 20:52:10 +03001895/**********************/
1896/* Station management */
1897/**********************/
1898
Michal Kazior590922a2014-10-21 10:10:29 +03001899static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1900 struct ieee80211_vif *vif)
1901{
1902 /* Some firmware revisions have unstable STA powersave when listen
1903 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1904 * generate NullFunc frames properly even if buffered frames have been
1905 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1906 * buffered frames. Often pinging the device from AP would simply fail.
1907 *
1908 * As a workaround set it to 1.
1909 */
1910 if (vif->type == NL80211_IFTYPE_STATION)
1911 return 1;
1912
1913 return ar->hw->conf.listen_interval;
1914}
1915
Kalle Valo5e3dd152013-06-12 20:52:10 +03001916static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001917 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001918 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001919 struct wmi_peer_assoc_complete_arg *arg)
1920{
Michal Kazior590922a2014-10-21 10:10:29 +03001921 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001922 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001923
Michal Kazior548db542013-07-05 16:15:15 +03001924 lockdep_assert_held(&ar->conf_mutex);
1925
Michal Kaziorc51880e2015-03-30 09:51:57 +03001926 if (vif->type == NL80211_IFTYPE_STATION)
1927 aid = vif->bss_conf.aid;
1928 else
1929 aid = sta->aid;
1930
Kalle Valob25f32c2014-09-14 12:50:49 +03001931 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001932 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001933 arg->peer_aid = aid;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001934 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001935 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001936 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001937 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001938}
1939
1940static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001941 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001942 struct wmi_peer_assoc_complete_arg *arg)
1943{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001944 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001945 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001946 struct cfg80211_bss *bss;
1947 const u8 *rsnie = NULL;
1948 const u8 *wpaie = NULL;
1949
Michal Kazior548db542013-07-05 16:15:15 +03001950 lockdep_assert_held(&ar->conf_mutex);
1951
Michal Kazior500ff9f2015-03-31 10:26:21 +00001952 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1953 return;
1954
1955 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1956 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001957 if (bss) {
1958 const struct cfg80211_bss_ies *ies;
1959
1960 rcu_read_lock();
1961 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1962
1963 ies = rcu_dereference(bss->ies);
1964
1965 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001966 WLAN_OUI_TYPE_MICROSOFT_WPA,
1967 ies->data,
1968 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001969 rcu_read_unlock();
1970 cfg80211_put_bss(ar->hw->wiphy, bss);
1971 }
1972
1973 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1974 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001975 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001976 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1977 }
1978
1979 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001980 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001981 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1982 }
1983}
1984
1985static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001986 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001987 struct ieee80211_sta *sta,
1988 struct wmi_peer_assoc_complete_arg *arg)
1989{
Michal Kazior45c9abc2015-04-21 20:42:58 +03001990 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001991 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001992 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001993 const struct ieee80211_supported_band *sband;
1994 const struct ieee80211_rate *rates;
Michal Kazior45c9abc2015-04-21 20:42:58 +03001995 enum ieee80211_band band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001996 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03001997 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001998 int i;
1999
Michal Kazior548db542013-07-05 16:15:15 +03002000 lockdep_assert_held(&ar->conf_mutex);
2001
Michal Kazior500ff9f2015-03-31 10:26:21 +00002002 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2003 return;
2004
Michal Kazior45c9abc2015-04-21 20:42:58 +03002005 band = def.chan->band;
2006 sband = ar->hw->wiphy->bands[band];
2007 ratemask = sta->supp_rates[band];
2008 ratemask &= arvif->bitrate_mask.control[band].legacy;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002009 rates = sband->bitrates;
2010
2011 rateset->num_rates = 0;
2012
2013 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2014 if (!(ratemask & 1))
2015 continue;
2016
Michal Kazior486017c2015-03-30 09:51:54 +03002017 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2018 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002019 rateset->num_rates++;
2020 }
2021}
2022
Michal Kazior45c9abc2015-04-21 20:42:58 +03002023static bool
2024ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2025{
2026 int nss;
2027
2028 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2029 if (ht_mcs_mask[nss])
2030 return false;
2031
2032 return true;
2033}
2034
2035static bool
2036ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2037{
2038 int nss;
2039
2040 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2041 if (vht_mcs_mask[nss])
2042 return false;
2043
2044 return true;
2045}
2046
Kalle Valo5e3dd152013-06-12 20:52:10 +03002047static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
Michal Kazior45c9abc2015-04-21 20:42:58 +03002048 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002049 struct ieee80211_sta *sta,
2050 struct wmi_peer_assoc_complete_arg *arg)
2051{
2052 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002053 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2054 struct cfg80211_chan_def def;
2055 enum ieee80211_band band;
2056 const u8 *ht_mcs_mask;
2057 const u16 *vht_mcs_mask;
2058 int i, n, max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002059 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002060
Michal Kazior548db542013-07-05 16:15:15 +03002061 lockdep_assert_held(&ar->conf_mutex);
2062
Michal Kazior45c9abc2015-04-21 20:42:58 +03002063 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2064 return;
2065
Kalle Valo5e3dd152013-06-12 20:52:10 +03002066 if (!ht_cap->ht_supported)
2067 return;
2068
Michal Kazior45c9abc2015-04-21 20:42:58 +03002069 band = def.chan->band;
2070 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2071 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2072
2073 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2074 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2075 return;
2076
Kalle Valo5e3dd152013-06-12 20:52:10 +03002077 arg->peer_flags |= WMI_PEER_HT;
2078 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2079 ht_cap->ampdu_factor)) - 1;
2080
2081 arg->peer_mpdu_density =
2082 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2083
2084 arg->peer_ht_caps = ht_cap->cap;
2085 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2086
2087 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2088 arg->peer_flags |= WMI_PEER_LDPC;
2089
2090 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2091 arg->peer_flags |= WMI_PEER_40MHZ;
2092 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2093 }
2094
Michal Kazior45c9abc2015-04-21 20:42:58 +03002095 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2096 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2097 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002098
Michal Kazior45c9abc2015-04-21 20:42:58 +03002099 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2100 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2101 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002102
2103 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2104 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2105 arg->peer_flags |= WMI_PEER_STBC;
2106 }
2107
2108 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002109 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2110 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2111 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2112 arg->peer_rate_caps |= stbc;
2113 arg->peer_flags |= WMI_PEER_STBC;
2114 }
2115
Kalle Valo5e3dd152013-06-12 20:52:10 +03002116 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2117 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2118 else if (ht_cap->mcs.rx_mask[1])
2119 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2120
Michal Kazior45c9abc2015-04-21 20:42:58 +03002121 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2122 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2123 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2124 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002125 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002126 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002127
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002128 /*
2129 * This is a workaround for HT-enabled STAs which break the spec
2130 * and have no HT capabilities RX mask (no HT RX MCS map).
2131 *
2132 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2133 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2134 *
2135 * Firmware asserts if such situation occurs.
2136 */
2137 if (n == 0) {
2138 arg->peer_ht_rates.num_rates = 8;
2139 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2140 arg->peer_ht_rates.rates[i] = i;
2141 } else {
2142 arg->peer_ht_rates.num_rates = n;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002143 arg->peer_num_spatial_streams = max_nss;
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002144 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002145
Michal Kazior7aa7a722014-08-25 12:09:38 +02002146 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002147 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002148 arg->peer_ht_rates.num_rates,
2149 arg->peer_num_spatial_streams);
2150}
2151
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002152static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2153 struct ath10k_vif *arvif,
2154 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002155{
2156 u32 uapsd = 0;
2157 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002158 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002159
Michal Kazior548db542013-07-05 16:15:15 +03002160 lockdep_assert_held(&ar->conf_mutex);
2161
Kalle Valo5e3dd152013-06-12 20:52:10 +03002162 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002163 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002164 sta->uapsd_queues, sta->max_sp);
2165
Kalle Valo5e3dd152013-06-12 20:52:10 +03002166 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2167 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2168 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2169 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2170 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2171 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2172 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2173 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2174 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2175 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2176 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2177 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2178
Kalle Valo5e3dd152013-06-12 20:52:10 +03002179 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2180 max_sp = sta->max_sp;
2181
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002182 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2183 sta->addr,
2184 WMI_AP_PS_PEER_PARAM_UAPSD,
2185 uapsd);
2186 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002187 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002188 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002189 return ret;
2190 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002191
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002192 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2193 sta->addr,
2194 WMI_AP_PS_PEER_PARAM_MAX_SP,
2195 max_sp);
2196 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002197 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002198 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002199 return ret;
2200 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002201
2202 /* TODO setup this based on STA listen interval and
2203 beacon interval. Currently we don't know
2204 sta->listen_interval - mac80211 patch required.
2205 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002206 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002207 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2208 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002209 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002210 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002211 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002212 return ret;
2213 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002214 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002215
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002216 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002217}
2218
Michal Kazior45c9abc2015-04-21 20:42:58 +03002219static u16
2220ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2221 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2222{
2223 int idx_limit;
2224 int nss;
2225 u16 mcs_map;
2226 u16 mcs;
2227
2228 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2229 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2230 vht_mcs_limit[nss];
2231
2232 if (mcs_map)
2233 idx_limit = fls(mcs_map) - 1;
2234 else
2235 idx_limit = -1;
2236
2237 switch (idx_limit) {
2238 case 0: /* fall through */
2239 case 1: /* fall through */
2240 case 2: /* fall through */
2241 case 3: /* fall through */
2242 case 4: /* fall through */
2243 case 5: /* fall through */
2244 case 6: /* fall through */
2245 default:
2246 /* see ath10k_mac_can_set_bitrate_mask() */
2247 WARN_ON(1);
2248 /* fall through */
2249 case -1:
2250 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2251 break;
2252 case 7:
2253 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2254 break;
2255 case 8:
2256 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2257 break;
2258 case 9:
2259 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2260 break;
2261 }
2262
2263 tx_mcs_set &= ~(0x3 << (nss * 2));
2264 tx_mcs_set |= mcs << (nss * 2);
2265 }
2266
2267 return tx_mcs_set;
2268}
2269
Kalle Valo5e3dd152013-06-12 20:52:10 +03002270static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002271 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002272 struct ieee80211_sta *sta,
2273 struct wmi_peer_assoc_complete_arg *arg)
2274{
2275 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002276 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002277 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002278 enum ieee80211_band band;
2279 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002280 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002281
Michal Kazior500ff9f2015-03-31 10:26:21 +00002282 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2283 return;
2284
Kalle Valo5e3dd152013-06-12 20:52:10 +03002285 if (!vht_cap->vht_supported)
2286 return;
2287
Michal Kazior45c9abc2015-04-21 20:42:58 +03002288 band = def.chan->band;
2289 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2290
2291 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2292 return;
2293
Kalle Valo5e3dd152013-06-12 20:52:10 +03002294 arg->peer_flags |= WMI_PEER_VHT;
Yanbo Lid68bb122015-01-23 08:18:20 +08002295
Michal Kazior500ff9f2015-03-31 10:26:21 +00002296 if (def.chan->band == IEEE80211_BAND_2GHZ)
Yanbo Lid68bb122015-01-23 08:18:20 +08002297 arg->peer_flags |= WMI_PEER_VHT_2G;
2298
Kalle Valo5e3dd152013-06-12 20:52:10 +03002299 arg->peer_vht_caps = vht_cap->cap;
2300
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002301 ampdu_factor = (vht_cap->cap &
2302 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2303 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2304
2305 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2306 * zero in VHT IE. Using it would result in degraded throughput.
2307 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2308 * it if VHT max_mpdu is smaller. */
2309 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2310 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2311 ampdu_factor)) - 1);
2312
Kalle Valo5e3dd152013-06-12 20:52:10 +03002313 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2314 arg->peer_flags |= WMI_PEER_80MHZ;
2315
2316 arg->peer_vht_rates.rx_max_rate =
2317 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2318 arg->peer_vht_rates.rx_mcs_set =
2319 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2320 arg->peer_vht_rates.tx_max_rate =
2321 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002322 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2323 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002324
Michal Kazior7aa7a722014-08-25 12:09:38 +02002325 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002326 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002327}
2328
2329static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002330 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002331 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002332 struct wmi_peer_assoc_complete_arg *arg)
2333{
Michal Kazior590922a2014-10-21 10:10:29 +03002334 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2335
Kalle Valo5e3dd152013-06-12 20:52:10 +03002336 switch (arvif->vdev_type) {
2337 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002338 if (sta->wme)
2339 arg->peer_flags |= WMI_PEER_QOS;
2340
2341 if (sta->wme && sta->uapsd_queues) {
2342 arg->peer_flags |= WMI_PEER_APSD;
2343 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2344 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002345 break;
2346 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002347 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002348 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002349 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002350 case WMI_VDEV_TYPE_IBSS:
2351 if (sta->wme)
2352 arg->peer_flags |= WMI_PEER_QOS;
2353 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002354 default:
2355 break;
2356 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002357
2358 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2359 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002360}
2361
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002362static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002363{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002364 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2365 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002366}
2367
Kalle Valo5e3dd152013-06-12 20:52:10 +03002368static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002369 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002370 struct ieee80211_sta *sta,
2371 struct wmi_peer_assoc_complete_arg *arg)
2372{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002373 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002374 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002375 enum ieee80211_band band;
2376 const u8 *ht_mcs_mask;
2377 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002378 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2379
Michal Kazior500ff9f2015-03-31 10:26:21 +00002380 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2381 return;
2382
Michal Kazior45c9abc2015-04-21 20:42:58 +03002383 band = def.chan->band;
2384 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2385 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2386
2387 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002388 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002389 if (sta->vht_cap.vht_supported &&
2390 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002391 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2392 phymode = MODE_11AC_VHT40;
2393 else
2394 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002395 } else if (sta->ht_cap.ht_supported &&
2396 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002397 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2398 phymode = MODE_11NG_HT40;
2399 else
2400 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002401 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002402 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002403 } else {
2404 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002405 }
2406
2407 break;
2408 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002409 /*
2410 * Check VHT first.
2411 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002412 if (sta->vht_cap.vht_supported &&
2413 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002414 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2415 phymode = MODE_11AC_VHT80;
2416 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2417 phymode = MODE_11AC_VHT40;
2418 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2419 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002420 } else if (sta->ht_cap.ht_supported &&
2421 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2422 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002423 phymode = MODE_11NA_HT40;
2424 else
2425 phymode = MODE_11NA_HT20;
2426 } else {
2427 phymode = MODE_11A;
2428 }
2429
2430 break;
2431 default:
2432 break;
2433 }
2434
Michal Kazior7aa7a722014-08-25 12:09:38 +02002435 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002436 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002437
Kalle Valo5e3dd152013-06-12 20:52:10 +03002438 arg->peer_phymode = phymode;
2439 WARN_ON(phymode == MODE_UNKNOWN);
2440}
2441
Kalle Valob9ada652013-10-16 15:44:46 +03002442static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002443 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002444 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002445 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002446{
Michal Kazior548db542013-07-05 16:15:15 +03002447 lockdep_assert_held(&ar->conf_mutex);
2448
Kalle Valob9ada652013-10-16 15:44:46 +03002449 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002450
Michal Kazior590922a2014-10-21 10:10:29 +03002451 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2452 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002453 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002454 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002455 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002456 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2457 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002458
Kalle Valob9ada652013-10-16 15:44:46 +03002459 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002460}
2461
Michal Kazior90046f52014-02-14 14:45:51 +01002462static const u32 ath10k_smps_map[] = {
2463 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2464 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2465 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2466 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2467};
2468
2469static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2470 const u8 *addr,
2471 const struct ieee80211_sta_ht_cap *ht_cap)
2472{
2473 int smps;
2474
2475 if (!ht_cap->ht_supported)
2476 return 0;
2477
2478 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2479 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2480
2481 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2482 return -EINVAL;
2483
2484 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2485 WMI_PEER_SMPS_STATE,
2486 ath10k_smps_map[smps]);
2487}
2488
Michal Kazior139e1702015-02-15 16:50:42 +02002489static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2490 struct ieee80211_vif *vif,
2491 struct ieee80211_sta_vht_cap vht_cap)
2492{
2493 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2494 int ret;
2495 u32 param;
2496 u32 value;
2497
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302498 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2499 return 0;
2500
Michal Kazior139e1702015-02-15 16:50:42 +02002501 if (!(ar->vht_cap_info &
2502 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2503 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2504 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2505 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2506 return 0;
2507
2508 param = ar->wmi.vdev_param->txbf;
2509 value = 0;
2510
2511 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2512 return 0;
2513
2514 /* The following logic is correct. If a remote STA advertises support
2515 * for being a beamformer then we should enable us being a beamformee.
2516 */
2517
2518 if (ar->vht_cap_info &
2519 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2520 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2521 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2522 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2523
2524 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2525 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2526 }
2527
2528 if (ar->vht_cap_info &
2529 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2530 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2531 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2532 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2533
2534 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2535 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2536 }
2537
2538 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2539 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2540
2541 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2542 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2543
2544 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2545 if (ret) {
2546 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2547 value, ret);
2548 return ret;
2549 }
2550
2551 return 0;
2552}
2553
Kalle Valo5e3dd152013-06-12 20:52:10 +03002554/* can be called only in mac80211 callbacks due to `key_count` usage */
2555static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2556 struct ieee80211_vif *vif,
2557 struct ieee80211_bss_conf *bss_conf)
2558{
2559 struct ath10k *ar = hw->priv;
2560 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002561 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002562 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002563 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002564 struct ieee80211_sta *ap_sta;
2565 int ret;
2566
Michal Kazior548db542013-07-05 16:15:15 +03002567 lockdep_assert_held(&ar->conf_mutex);
2568
Michal Kazior077efc82014-10-21 10:10:29 +03002569 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2570 arvif->vdev_id, arvif->bssid, arvif->aid);
2571
Kalle Valo5e3dd152013-06-12 20:52:10 +03002572 rcu_read_lock();
2573
2574 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2575 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002576 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002577 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002578 rcu_read_unlock();
2579 return;
2580 }
2581
Michal Kazior90046f52014-02-14 14:45:51 +01002582 /* ap_sta must be accessed only within rcu section which must be left
2583 * before calling ath10k_setup_peer_smps() which might sleep. */
2584 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002585 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002586
Michal Kazior590922a2014-10-21 10:10:29 +03002587 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002588 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002589 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002590 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002591 rcu_read_unlock();
2592 return;
2593 }
2594
2595 rcu_read_unlock();
2596
Kalle Valob9ada652013-10-16 15:44:46 +03002597 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2598 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002599 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002600 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002601 return;
2602 }
2603
Michal Kazior90046f52014-02-14 14:45:51 +01002604 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2605 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002606 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002607 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002608 return;
2609 }
2610
Michal Kazior139e1702015-02-15 16:50:42 +02002611 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2612 if (ret) {
2613 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2614 arvif->vdev_id, bss_conf->bssid, ret);
2615 return;
2616 }
2617
Michal Kazior7aa7a722014-08-25 12:09:38 +02002618 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002619 "mac vdev %d up (associated) bssid %pM aid %d\n",
2620 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2621
Michal Kazior077efc82014-10-21 10:10:29 +03002622 WARN_ON(arvif->is_up);
2623
Michal Kaziorc930f742014-01-23 11:38:25 +01002624 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002625 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002626
2627 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2628 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002629 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002630 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002631 return;
2632 }
2633
2634 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002635
2636 /* Workaround: Some firmware revisions (tested with qca6174
2637 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2638 * poked with peer param command.
2639 */
2640 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2641 WMI_PEER_DUMMY_VAR, 1);
2642 if (ret) {
2643 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2644 arvif->bssid, arvif->vdev_id, ret);
2645 return;
2646 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002647}
2648
Kalle Valo5e3dd152013-06-12 20:52:10 +03002649static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2650 struct ieee80211_vif *vif)
2651{
2652 struct ath10k *ar = hw->priv;
2653 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002654 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002655 int ret;
2656
Michal Kazior548db542013-07-05 16:15:15 +03002657 lockdep_assert_held(&ar->conf_mutex);
2658
Michal Kazior077efc82014-10-21 10:10:29 +03002659 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2660 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002661
Kalle Valo5e3dd152013-06-12 20:52:10 +03002662 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002663 if (ret)
2664 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2665 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002666
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002667 arvif->def_wep_key_idx = -1;
2668
Michal Kazior139e1702015-02-15 16:50:42 +02002669 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2670 if (ret) {
2671 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2672 arvif->vdev_id, ret);
2673 return;
2674 }
2675
Michal Kaziorc930f742014-01-23 11:38:25 +01002676 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002677
2678 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002679}
2680
Michal Kazior590922a2014-10-21 10:10:29 +03002681static int ath10k_station_assoc(struct ath10k *ar,
2682 struct ieee80211_vif *vif,
2683 struct ieee80211_sta *sta,
2684 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002685{
Michal Kazior590922a2014-10-21 10:10:29 +03002686 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002687 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002688 int ret = 0;
2689
Michal Kazior548db542013-07-05 16:15:15 +03002690 lockdep_assert_held(&ar->conf_mutex);
2691
Michal Kazior590922a2014-10-21 10:10:29 +03002692 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002693 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002694 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002695 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002696 return ret;
2697 }
2698
2699 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2700 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002701 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002702 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002703 return ret;
2704 }
2705
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002706 /* Re-assoc is run only to update supported rates for given station. It
2707 * doesn't make much sense to reconfigure the peer completely.
2708 */
2709 if (!reassoc) {
2710 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2711 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002712 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002713 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002714 arvif->vdev_id, ret);
2715 return ret;
2716 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002717
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002718 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2719 if (ret) {
2720 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2721 sta->addr, arvif->vdev_id, ret);
2722 return ret;
2723 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002724
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002725 if (!sta->wme) {
2726 arvif->num_legacy_stations++;
2727 ret = ath10k_recalc_rtscts_prot(arvif);
2728 if (ret) {
2729 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2730 arvif->vdev_id, ret);
2731 return ret;
2732 }
2733 }
2734
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002735 /* Plumb cached keys only for static WEP */
2736 if (arvif->def_wep_key_idx != -1) {
2737 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2738 if (ret) {
2739 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2740 arvif->vdev_id, ret);
2741 return ret;
2742 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002743 }
2744 }
2745
Kalle Valo5e3dd152013-06-12 20:52:10 +03002746 return ret;
2747}
2748
Michal Kazior590922a2014-10-21 10:10:29 +03002749static int ath10k_station_disassoc(struct ath10k *ar,
2750 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002751 struct ieee80211_sta *sta)
2752{
Michal Kazior590922a2014-10-21 10:10:29 +03002753 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002754 int ret = 0;
2755
2756 lockdep_assert_held(&ar->conf_mutex);
2757
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002758 if (!sta->wme) {
2759 arvif->num_legacy_stations--;
2760 ret = ath10k_recalc_rtscts_prot(arvif);
2761 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002762 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002763 arvif->vdev_id, ret);
2764 return ret;
2765 }
2766 }
2767
Kalle Valo5e3dd152013-06-12 20:52:10 +03002768 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2769 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002770 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002771 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002772 return ret;
2773 }
2774
2775 return ret;
2776}
2777
2778/**************/
2779/* Regulatory */
2780/**************/
2781
2782static int ath10k_update_channel_list(struct ath10k *ar)
2783{
2784 struct ieee80211_hw *hw = ar->hw;
2785 struct ieee80211_supported_band **bands;
2786 enum ieee80211_band band;
2787 struct ieee80211_channel *channel;
2788 struct wmi_scan_chan_list_arg arg = {0};
2789 struct wmi_channel_arg *ch;
2790 bool passive;
2791 int len;
2792 int ret;
2793 int i;
2794
Michal Kazior548db542013-07-05 16:15:15 +03002795 lockdep_assert_held(&ar->conf_mutex);
2796
Kalle Valo5e3dd152013-06-12 20:52:10 +03002797 bands = hw->wiphy->bands;
2798 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2799 if (!bands[band])
2800 continue;
2801
2802 for (i = 0; i < bands[band]->n_channels; i++) {
2803 if (bands[band]->channels[i].flags &
2804 IEEE80211_CHAN_DISABLED)
2805 continue;
2806
2807 arg.n_channels++;
2808 }
2809 }
2810
2811 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2812 arg.channels = kzalloc(len, GFP_KERNEL);
2813 if (!arg.channels)
2814 return -ENOMEM;
2815
2816 ch = arg.channels;
2817 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2818 if (!bands[band])
2819 continue;
2820
2821 for (i = 0; i < bands[band]->n_channels; i++) {
2822 channel = &bands[band]->channels[i];
2823
2824 if (channel->flags & IEEE80211_CHAN_DISABLED)
2825 continue;
2826
2827 ch->allow_ht = true;
2828
2829 /* FIXME: when should we really allow VHT? */
2830 ch->allow_vht = true;
2831
2832 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002833 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002834
2835 ch->ht40plus =
2836 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2837
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002838 ch->chan_radar =
2839 !!(channel->flags & IEEE80211_CHAN_RADAR);
2840
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002841 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002842 ch->passive = passive;
2843
2844 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002845 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002846 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002847 ch->max_power = channel->max_power * 2;
2848 ch->max_reg_power = channel->max_reg_power * 2;
2849 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002850 ch->reg_class_id = 0; /* FIXME */
2851
2852 /* FIXME: why use only legacy modes, why not any
2853 * HT/VHT modes? Would that even make any
2854 * difference? */
2855 if (channel->band == IEEE80211_BAND_2GHZ)
2856 ch->mode = MODE_11G;
2857 else
2858 ch->mode = MODE_11A;
2859
2860 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2861 continue;
2862
Michal Kazior7aa7a722014-08-25 12:09:38 +02002863 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002864 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2865 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002866 ch->freq, ch->max_power, ch->max_reg_power,
2867 ch->max_antenna_gain, ch->mode);
2868
2869 ch++;
2870 }
2871 }
2872
2873 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2874 kfree(arg.channels);
2875
2876 return ret;
2877}
2878
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002879static enum wmi_dfs_region
2880ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2881{
2882 switch (dfs_region) {
2883 case NL80211_DFS_UNSET:
2884 return WMI_UNINIT_DFS_DOMAIN;
2885 case NL80211_DFS_FCC:
2886 return WMI_FCC_DFS_DOMAIN;
2887 case NL80211_DFS_ETSI:
2888 return WMI_ETSI_DFS_DOMAIN;
2889 case NL80211_DFS_JP:
2890 return WMI_MKK4_DFS_DOMAIN;
2891 }
2892 return WMI_UNINIT_DFS_DOMAIN;
2893}
2894
Michal Kaziorf7843d72013-07-16 09:38:52 +02002895static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002896{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002897 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002898 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002899 enum wmi_dfs_region wmi_dfs_reg;
2900 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002901
Michal Kaziorf7843d72013-07-16 09:38:52 +02002902 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002903
2904 ret = ath10k_update_channel_list(ar);
2905 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002906 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002907
2908 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002909
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002910 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2911 nl_dfs_reg = ar->dfs_detector->region;
2912 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2913 } else {
2914 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2915 }
2916
Kalle Valo5e3dd152013-06-12 20:52:10 +03002917 /* Target allows setting up per-band regdomain but ath_common provides
2918 * a combined one only */
2919 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002920 regpair->reg_domain,
2921 regpair->reg_domain, /* 2ghz */
2922 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002923 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002924 regpair->reg_5ghz_ctl,
2925 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002926 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002927 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002928}
Michal Kazior548db542013-07-05 16:15:15 +03002929
Michal Kaziorf7843d72013-07-16 09:38:52 +02002930static void ath10k_reg_notifier(struct wiphy *wiphy,
2931 struct regulatory_request *request)
2932{
2933 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2934 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002935 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002936
2937 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2938
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002939 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002940 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002941 request->dfs_region);
2942 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2943 request->dfs_region);
2944 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002945 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002946 request->dfs_region);
2947 }
2948
Michal Kaziorf7843d72013-07-16 09:38:52 +02002949 mutex_lock(&ar->conf_mutex);
2950 if (ar->state == ATH10K_STATE_ON)
2951 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002952 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002953}
2954
2955/***************/
2956/* TX handlers */
2957/***************/
2958
Michal Kazior96d828d2015-03-31 10:26:23 +00002959void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2960{
2961 lockdep_assert_held(&ar->htt.tx_lock);
2962
2963 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2964 ar->tx_paused |= BIT(reason);
2965 ieee80211_stop_queues(ar->hw);
2966}
2967
2968static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2969 struct ieee80211_vif *vif)
2970{
2971 struct ath10k *ar = data;
2972 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2973
2974 if (arvif->tx_paused)
2975 return;
2976
2977 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
2978}
2979
2980void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
2981{
2982 lockdep_assert_held(&ar->htt.tx_lock);
2983
2984 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2985 ar->tx_paused &= ~BIT(reason);
2986
2987 if (ar->tx_paused)
2988 return;
2989
2990 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2991 IEEE80211_IFACE_ITER_RESUME_ALL,
2992 ath10k_mac_tx_unlock_iter,
2993 ar);
2994}
2995
2996void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
2997{
2998 struct ath10k *ar = arvif->ar;
2999
3000 lockdep_assert_held(&ar->htt.tx_lock);
3001
3002 WARN_ON(reason >= BITS_PER_LONG);
3003 arvif->tx_paused |= BIT(reason);
3004 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3005}
3006
3007void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3008{
3009 struct ath10k *ar = arvif->ar;
3010
3011 lockdep_assert_held(&ar->htt.tx_lock);
3012
3013 WARN_ON(reason >= BITS_PER_LONG);
3014 arvif->tx_paused &= ~BIT(reason);
3015
3016 if (ar->tx_paused)
3017 return;
3018
3019 if (arvif->tx_paused)
3020 return;
3021
3022 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3023}
3024
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003025static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3026 enum wmi_tlv_tx_pause_id pause_id,
3027 enum wmi_tlv_tx_pause_action action)
3028{
3029 struct ath10k *ar = arvif->ar;
3030
3031 lockdep_assert_held(&ar->htt.tx_lock);
3032
Michal Kazioracd0b272015-07-09 13:08:38 +02003033 switch (action) {
3034 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3035 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003036 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003037 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3038 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3039 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003040 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003041 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3042 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003043 break;
3044 }
3045}
3046
3047struct ath10k_mac_tx_pause {
3048 u32 vdev_id;
3049 enum wmi_tlv_tx_pause_id pause_id;
3050 enum wmi_tlv_tx_pause_action action;
3051};
3052
3053static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3054 struct ieee80211_vif *vif)
3055{
3056 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3057 struct ath10k_mac_tx_pause *arg = data;
3058
Michal Kazioracd0b272015-07-09 13:08:38 +02003059 if (arvif->vdev_id != arg->vdev_id)
3060 return;
3061
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003062 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3063}
3064
Michal Kazioracd0b272015-07-09 13:08:38 +02003065void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3066 enum wmi_tlv_tx_pause_id pause_id,
3067 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003068{
3069 struct ath10k_mac_tx_pause arg = {
3070 .vdev_id = vdev_id,
3071 .pause_id = pause_id,
3072 .action = action,
3073 };
3074
3075 spin_lock_bh(&ar->htt.tx_lock);
3076 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3077 IEEE80211_IFACE_ITER_RESUME_ALL,
3078 ath10k_mac_handle_tx_pause_iter,
3079 &arg);
3080 spin_unlock_bh(&ar->htt.tx_lock);
3081}
3082
Michal Kazior42c3aa62013-10-02 11:03:38 +02003083static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3084{
3085 if (ieee80211_is_mgmt(hdr->frame_control))
3086 return HTT_DATA_TX_EXT_TID_MGMT;
3087
3088 if (!ieee80211_is_data_qos(hdr->frame_control))
3089 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3090
3091 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3092 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3093
3094 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3095}
3096
Michal Kazior2b37c292014-09-02 11:00:22 +03003097static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003098{
Michal Kazior2b37c292014-09-02 11:00:22 +03003099 if (vif)
3100 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003101
Michal Kazior1bbc0972014-04-08 09:45:47 +03003102 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003103 return ar->monitor_vdev_id;
3104
Michal Kazior7aa7a722014-08-25 12:09:38 +02003105 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003106 return 0;
3107}
3108
Michal Kaziord740d8f2015-03-30 09:51:51 +03003109static enum ath10k_hw_txrx_mode
3110ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003111 struct ieee80211_sta *sta, struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003112{
3113 const struct ieee80211_hdr *hdr = (void *)skb->data;
3114 __le16 fc = hdr->frame_control;
3115
3116 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3117 return ATH10K_HW_TXRX_RAW;
3118
3119 if (ieee80211_is_mgmt(fc))
3120 return ATH10K_HW_TXRX_MGMT;
3121
3122 /* Workaround:
3123 *
3124 * NullFunc frames are mostly used to ping if a client or AP are still
3125 * reachable and responsive. This implies tx status reports must be
3126 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3127 * come to a conclusion that the other end disappeared and tear down
3128 * BSS connection or it can never disconnect from BSS/client (which is
3129 * the case).
3130 *
3131 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3132 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3133 * which seems to deliver correct tx reports for NullFunc frames. The
3134 * downside of using it is it ignores client powersave state so it can
3135 * end up disconnecting sleeping clients in AP mode. It should fix STA
3136 * mode though because AP don't sleep.
3137 */
3138 if (ar->htt.target_version_major < 3 &&
3139 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3140 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3141 return ATH10K_HW_TXRX_MGMT;
3142
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003143 /* Workaround:
3144 *
3145 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3146 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3147 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003148 *
3149 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003150 */
3151 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3152 return ATH10K_HW_TXRX_ETHERNET;
3153
David Liuccec9032015-07-24 20:25:32 +03003154 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3155 return ATH10K_HW_TXRX_RAW;
3156
Michal Kaziord740d8f2015-03-30 09:51:51 +03003157 return ATH10K_HW_TXRX_NATIVE_WIFI;
3158}
3159
David Liuccec9032015-07-24 20:25:32 +03003160static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3161 struct sk_buff *skb) {
3162 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3163 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3164 IEEE80211_TX_CTL_INJECTED;
3165 if ((info->flags & mask) == mask)
3166 return false;
3167 if (vif)
3168 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
3169 return true;
3170}
3171
Michal Kazior4b604552014-07-21 21:03:09 +03003172/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3173 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003174 */
Michal Kazior4b604552014-07-21 21:03:09 +03003175static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003176{
3177 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003178 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003179 u8 *qos_ctl;
3180
3181 if (!ieee80211_is_data_qos(hdr->frame_control))
3182 return;
3183
3184 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003185 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3186 skb->data, (void *)qos_ctl - (void *)skb->data);
3187 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003188
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003189 /* Some firmware revisions don't handle sending QoS NullFunc well.
3190 * These frames are mainly used for CQM purposes so it doesn't really
3191 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003192 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003193 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003194 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003195 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003196
3197 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003198}
3199
Michal Kaziord740d8f2015-03-30 09:51:51 +03003200static void ath10k_tx_h_8023(struct sk_buff *skb)
3201{
3202 struct ieee80211_hdr *hdr;
3203 struct rfc1042_hdr *rfc1042;
3204 struct ethhdr *eth;
3205 size_t hdrlen;
3206 u8 da[ETH_ALEN];
3207 u8 sa[ETH_ALEN];
3208 __be16 type;
3209
3210 hdr = (void *)skb->data;
3211 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3212 rfc1042 = (void *)skb->data + hdrlen;
3213
3214 ether_addr_copy(da, ieee80211_get_DA(hdr));
3215 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3216 type = rfc1042->snap_type;
3217
3218 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3219 skb_push(skb, sizeof(*eth));
3220
3221 eth = (void *)skb->data;
3222 ether_addr_copy(eth->h_dest, da);
3223 ether_addr_copy(eth->h_source, sa);
3224 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003225}
3226
Michal Kazior4b604552014-07-21 21:03:09 +03003227static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3228 struct ieee80211_vif *vif,
3229 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003230{
3231 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003232 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3233
3234 /* This is case only for P2P_GO */
3235 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3236 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3237 return;
3238
3239 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3240 spin_lock_bh(&ar->data_lock);
3241 if (arvif->u.ap.noa_data)
3242 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3243 GFP_ATOMIC))
3244 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3245 arvif->u.ap.noa_data,
3246 arvif->u.ap.noa_len);
3247 spin_unlock_bh(&ar->data_lock);
3248 }
3249}
3250
Michal Kazior8d6d3622014-11-24 14:58:31 +01003251static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3252{
3253 /* FIXME: Not really sure since when the behaviour changed. At some
3254 * point new firmware stopped requiring creation of peer entries for
3255 * offchannel tx (and actually creating them causes issues with wmi-htc
3256 * tx credit replenishment and reliability). Assuming it's at least 3.4
3257 * because that's when the `freq` was introduced to TX_FRM HTT command.
3258 */
3259 return !(ar->htt.target_version_major >= 3 &&
3260 ar->htt.target_version_minor >= 4);
3261}
3262
Michal Kaziord740d8f2015-03-30 09:51:51 +03003263static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003264{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003265 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003266 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003267
Michal Kaziord740d8f2015-03-30 09:51:51 +03003268 spin_lock_bh(&ar->data_lock);
3269
3270 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3271 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3272 ret = -ENOSPC;
3273 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003274 }
3275
Michal Kaziord740d8f2015-03-30 09:51:51 +03003276 __skb_queue_tail(q, skb);
3277 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3278
3279unlock:
3280 spin_unlock_bh(&ar->data_lock);
3281
3282 return ret;
3283}
3284
3285static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3286{
3287 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3288 struct ath10k_htt *htt = &ar->htt;
3289 int ret = 0;
3290
3291 switch (cb->txmode) {
3292 case ATH10K_HW_TXRX_RAW:
3293 case ATH10K_HW_TXRX_NATIVE_WIFI:
3294 case ATH10K_HW_TXRX_ETHERNET:
3295 ret = ath10k_htt_tx(htt, skb);
3296 break;
3297 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003298 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003299 ar->fw_features))
3300 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3301 else if (ar->htt.target_version_major >= 3)
3302 ret = ath10k_htt_tx(htt, skb);
3303 else
3304 ret = ath10k_htt_mgmt_tx(htt, skb);
3305 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003306 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003307
3308 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003309 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3310 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003311 ieee80211_free_txskb(ar->hw, skb);
3312 }
3313}
3314
3315void ath10k_offchan_tx_purge(struct ath10k *ar)
3316{
3317 struct sk_buff *skb;
3318
3319 for (;;) {
3320 skb = skb_dequeue(&ar->offchan_tx_queue);
3321 if (!skb)
3322 break;
3323
3324 ieee80211_free_txskb(ar->hw, skb);
3325 }
3326}
3327
3328void ath10k_offchan_tx_work(struct work_struct *work)
3329{
3330 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3331 struct ath10k_peer *peer;
3332 struct ieee80211_hdr *hdr;
3333 struct sk_buff *skb;
3334 const u8 *peer_addr;
3335 int vdev_id;
3336 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003337 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003338
3339 /* FW requirement: We must create a peer before FW will send out
3340 * an offchannel frame. Otherwise the frame will be stuck and
3341 * never transmitted. We delete the peer upon tx completion.
3342 * It is unlikely that a peer for offchannel tx will already be
3343 * present. However it may be in some rare cases so account for that.
3344 * Otherwise we might remove a legitimate peer and break stuff. */
3345
3346 for (;;) {
3347 skb = skb_dequeue(&ar->offchan_tx_queue);
3348 if (!skb)
3349 break;
3350
3351 mutex_lock(&ar->conf_mutex);
3352
Michal Kazior7aa7a722014-08-25 12:09:38 +02003353 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003354 skb);
3355
3356 hdr = (struct ieee80211_hdr *)skb->data;
3357 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003358 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003359
3360 spin_lock_bh(&ar->data_lock);
3361 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3362 spin_unlock_bh(&ar->data_lock);
3363
3364 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003365 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003366 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003367 peer_addr, vdev_id);
3368
3369 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003370 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3371 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003372 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003373 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003374 peer_addr, vdev_id, ret);
3375 }
3376
3377 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003378 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003379 ar->offchan_tx_skb = skb;
3380 spin_unlock_bh(&ar->data_lock);
3381
Michal Kaziord740d8f2015-03-30 09:51:51 +03003382 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003383
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003384 time_left =
3385 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3386 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003387 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003388 skb);
3389
3390 if (!peer) {
3391 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3392 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003393 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003394 peer_addr, vdev_id, ret);
3395 }
3396
3397 mutex_unlock(&ar->conf_mutex);
3398 }
3399}
3400
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003401void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3402{
3403 struct sk_buff *skb;
3404
3405 for (;;) {
3406 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3407 if (!skb)
3408 break;
3409
3410 ieee80211_free_txskb(ar->hw, skb);
3411 }
3412}
3413
3414void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3415{
3416 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3417 struct sk_buff *skb;
3418 int ret;
3419
3420 for (;;) {
3421 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3422 if (!skb)
3423 break;
3424
3425 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003426 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003427 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003428 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003429 ieee80211_free_txskb(ar->hw, skb);
3430 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003431 }
3432}
3433
Kalle Valo5e3dd152013-06-12 20:52:10 +03003434/************/
3435/* Scanning */
3436/************/
3437
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003438void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003439{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003440 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003441
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003442 switch (ar->scan.state) {
3443 case ATH10K_SCAN_IDLE:
3444 break;
3445 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003446 case ATH10K_SCAN_ABORTING:
3447 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003448 ieee80211_scan_completed(ar->hw,
3449 (ar->scan.state ==
3450 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003451 else if (ar->scan.roc_notify)
3452 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003453 /* fall through */
3454 case ATH10K_SCAN_STARTING:
3455 ar->scan.state = ATH10K_SCAN_IDLE;
3456 ar->scan_channel = NULL;
3457 ath10k_offchan_tx_purge(ar);
3458 cancel_delayed_work(&ar->scan.timeout);
3459 complete_all(&ar->scan.completed);
3460 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003461 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003462}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003463
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003464void ath10k_scan_finish(struct ath10k *ar)
3465{
3466 spin_lock_bh(&ar->data_lock);
3467 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003468 spin_unlock_bh(&ar->data_lock);
3469}
3470
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003471static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003472{
3473 struct wmi_stop_scan_arg arg = {
3474 .req_id = 1, /* FIXME */
3475 .req_type = WMI_SCAN_STOP_ONE,
3476 .u.scan_id = ATH10K_SCAN_ID,
3477 };
3478 int ret;
3479
3480 lockdep_assert_held(&ar->conf_mutex);
3481
Kalle Valo5e3dd152013-06-12 20:52:10 +03003482 ret = ath10k_wmi_stop_scan(ar, &arg);
3483 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003484 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003485 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003486 }
3487
Kalle Valo5e3dd152013-06-12 20:52:10 +03003488 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003489 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003490 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003491 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003492 } else if (ret > 0) {
3493 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003494 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003495
3496out:
3497 /* Scan state should be updated upon scan completion but in case
3498 * firmware fails to deliver the event (for whatever reason) it is
3499 * desired to clean up scan state anyway. Firmware may have just
3500 * dropped the scan completion event delivery due to transport pipe
3501 * being overflown with data and/or it can recover on its own before
3502 * next scan request is submitted.
3503 */
3504 spin_lock_bh(&ar->data_lock);
3505 if (ar->scan.state != ATH10K_SCAN_IDLE)
3506 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003507 spin_unlock_bh(&ar->data_lock);
3508
3509 return ret;
3510}
3511
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003512static void ath10k_scan_abort(struct ath10k *ar)
3513{
3514 int ret;
3515
3516 lockdep_assert_held(&ar->conf_mutex);
3517
3518 spin_lock_bh(&ar->data_lock);
3519
3520 switch (ar->scan.state) {
3521 case ATH10K_SCAN_IDLE:
3522 /* This can happen if timeout worker kicked in and called
3523 * abortion while scan completion was being processed.
3524 */
3525 break;
3526 case ATH10K_SCAN_STARTING:
3527 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003528 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003529 ath10k_scan_state_str(ar->scan.state),
3530 ar->scan.state);
3531 break;
3532 case ATH10K_SCAN_RUNNING:
3533 ar->scan.state = ATH10K_SCAN_ABORTING;
3534 spin_unlock_bh(&ar->data_lock);
3535
3536 ret = ath10k_scan_stop(ar);
3537 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003538 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003539
3540 spin_lock_bh(&ar->data_lock);
3541 break;
3542 }
3543
3544 spin_unlock_bh(&ar->data_lock);
3545}
3546
3547void ath10k_scan_timeout_work(struct work_struct *work)
3548{
3549 struct ath10k *ar = container_of(work, struct ath10k,
3550 scan.timeout.work);
3551
3552 mutex_lock(&ar->conf_mutex);
3553 ath10k_scan_abort(ar);
3554 mutex_unlock(&ar->conf_mutex);
3555}
3556
Kalle Valo5e3dd152013-06-12 20:52:10 +03003557static int ath10k_start_scan(struct ath10k *ar,
3558 const struct wmi_start_scan_arg *arg)
3559{
3560 int ret;
3561
3562 lockdep_assert_held(&ar->conf_mutex);
3563
3564 ret = ath10k_wmi_start_scan(ar, arg);
3565 if (ret)
3566 return ret;
3567
Kalle Valo5e3dd152013-06-12 20:52:10 +03003568 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3569 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003570 ret = ath10k_scan_stop(ar);
3571 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003572 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003573
3574 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003575 }
3576
Ben Greear2f9eec02015-02-15 16:50:38 +02003577 /* If we failed to start the scan, return error code at
3578 * this point. This is probably due to some issue in the
3579 * firmware, but no need to wedge the driver due to that...
3580 */
3581 spin_lock_bh(&ar->data_lock);
3582 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3583 spin_unlock_bh(&ar->data_lock);
3584 return -EINVAL;
3585 }
3586 spin_unlock_bh(&ar->data_lock);
3587
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003588 /* Add a 200ms margin to account for event/command processing */
3589 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3590 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03003591 return 0;
3592}
3593
3594/**********************/
3595/* mac80211 callbacks */
3596/**********************/
3597
3598static void ath10k_tx(struct ieee80211_hw *hw,
3599 struct ieee80211_tx_control *control,
3600 struct sk_buff *skb)
3601{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003602 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003603 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3604 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003605 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003606 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kaziord740d8f2015-03-30 09:51:51 +03003607 __le16 fc = hdr->frame_control;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003608
3609 /* We should disable CCK RATE due to P2P */
3610 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003611 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003612
Michal Kazior4b604552014-07-21 21:03:09 +03003613 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003614 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003615 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
David Liuccec9032015-07-24 20:25:32 +03003616 ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
Michal Kazior2b37c292014-09-02 11:00:22 +03003617 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003618 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003619 ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003620
Michal Kaziord740d8f2015-03-30 09:51:51 +03003621 switch (ATH10K_SKB_CB(skb)->txmode) {
3622 case ATH10K_HW_TXRX_MGMT:
3623 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003624 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003625 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3626 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003627 break;
3628 case ATH10K_HW_TXRX_ETHERNET:
3629 ath10k_tx_h_8023(skb);
3630 break;
3631 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003632 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3633 WARN_ON_ONCE(1);
3634 ieee80211_free_txskb(hw, skb);
3635 return;
3636 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003637 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003638
Kalle Valo5e3dd152013-06-12 20:52:10 +03003639 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3640 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003641 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003642 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003643 spin_unlock_bh(&ar->data_lock);
3644
Michal Kazior8d6d3622014-11-24 14:58:31 +01003645 if (ath10k_mac_need_offchan_tx_work(ar)) {
3646 ATH10K_SKB_CB(skb)->htt.freq = 0;
3647 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003648
Michal Kazior8d6d3622014-11-24 14:58:31 +01003649 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3650 skb);
3651
3652 skb_queue_tail(&ar->offchan_tx_queue, skb);
3653 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3654 return;
3655 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003656 }
3657
Michal Kaziord740d8f2015-03-30 09:51:51 +03003658 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003659}
3660
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003661/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003662void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003663{
3664 /* make sure rcu-protected mac80211 tx path itself is drained */
3665 synchronize_net();
3666
3667 ath10k_offchan_tx_purge(ar);
3668 ath10k_mgmt_over_wmi_tx_purge(ar);
3669
3670 cancel_work_sync(&ar->offchan_tx_work);
3671 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3672}
3673
Michal Kazioraffd3212013-07-16 09:54:35 +02003674void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003675{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003676 struct ath10k_vif *arvif;
3677
Michal Kazior818bdd12013-07-16 09:38:57 +02003678 lockdep_assert_held(&ar->conf_mutex);
3679
Michal Kazior19337472014-08-28 12:58:16 +02003680 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3681 ar->filter_flags = 0;
3682 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003683 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003684
3685 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003686 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003687
3688 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003689 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003690
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003691 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003692 ath10k_peer_cleanup_all(ar);
3693 ath10k_core_stop(ar);
3694 ath10k_hif_power_down(ar);
3695
3696 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003697 list_for_each_entry(arvif, &ar->arvifs, list)
3698 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003699 spin_unlock_bh(&ar->data_lock);
3700}
3701
Ben Greear46acf7b2014-05-16 17:15:38 +03003702static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3703{
3704 struct ath10k *ar = hw->priv;
3705
3706 mutex_lock(&ar->conf_mutex);
3707
3708 if (ar->cfg_tx_chainmask) {
3709 *tx_ant = ar->cfg_tx_chainmask;
3710 *rx_ant = ar->cfg_rx_chainmask;
3711 } else {
3712 *tx_ant = ar->supp_tx_chainmask;
3713 *rx_ant = ar->supp_rx_chainmask;
3714 }
3715
3716 mutex_unlock(&ar->conf_mutex);
3717
3718 return 0;
3719}
3720
Ben Greear5572a952014-11-24 16:22:10 +02003721static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3722{
3723 /* It is not clear that allowing gaps in chainmask
3724 * is helpful. Probably it will not do what user
3725 * is hoping for, so warn in that case.
3726 */
3727 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3728 return;
3729
3730 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3731 dbg, cm);
3732}
3733
Ben Greear46acf7b2014-05-16 17:15:38 +03003734static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3735{
3736 int ret;
3737
3738 lockdep_assert_held(&ar->conf_mutex);
3739
Ben Greear5572a952014-11-24 16:22:10 +02003740 ath10k_check_chain_mask(ar, tx_ant, "tx");
3741 ath10k_check_chain_mask(ar, rx_ant, "rx");
3742
Ben Greear46acf7b2014-05-16 17:15:38 +03003743 ar->cfg_tx_chainmask = tx_ant;
3744 ar->cfg_rx_chainmask = rx_ant;
3745
3746 if ((ar->state != ATH10K_STATE_ON) &&
3747 (ar->state != ATH10K_STATE_RESTARTED))
3748 return 0;
3749
3750 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3751 tx_ant);
3752 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003753 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003754 ret, tx_ant);
3755 return ret;
3756 }
3757
3758 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3759 rx_ant);
3760 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003761 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003762 ret, rx_ant);
3763 return ret;
3764 }
3765
3766 return 0;
3767}
3768
3769static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3770{
3771 struct ath10k *ar = hw->priv;
3772 int ret;
3773
3774 mutex_lock(&ar->conf_mutex);
3775 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3776 mutex_unlock(&ar->conf_mutex);
3777 return ret;
3778}
3779
Kalle Valo5e3dd152013-06-12 20:52:10 +03003780static int ath10k_start(struct ieee80211_hw *hw)
3781{
3782 struct ath10k *ar = hw->priv;
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003783 u32 burst_enable;
Michal Kazior818bdd12013-07-16 09:38:57 +02003784 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003785
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003786 /*
3787 * This makes sense only when restarting hw. It is harmless to call
3788 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3789 * commands will be submitted while restarting.
3790 */
3791 ath10k_drain_tx(ar);
3792
Michal Kazior548db542013-07-05 16:15:15 +03003793 mutex_lock(&ar->conf_mutex);
3794
Michal Kaziorc5058f52014-05-26 12:46:03 +03003795 switch (ar->state) {
3796 case ATH10K_STATE_OFF:
3797 ar->state = ATH10K_STATE_ON;
3798 break;
3799 case ATH10K_STATE_RESTARTING:
3800 ath10k_halt(ar);
3801 ar->state = ATH10K_STATE_RESTARTED;
3802 break;
3803 case ATH10K_STATE_ON:
3804 case ATH10K_STATE_RESTARTED:
3805 case ATH10K_STATE_WEDGED:
3806 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02003807 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03003808 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03003809 case ATH10K_STATE_UTF:
3810 ret = -EBUSY;
3811 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02003812 }
3813
3814 ret = ath10k_hif_power_up(ar);
3815 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003816 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003817 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02003818 }
3819
Kalle Valo43d2a302014-09-10 18:23:30 +03003820 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02003821 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003822 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003823 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02003824 }
3825
Bartosz Markowski226a3392013-09-26 17:47:16 +02003826 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003827 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003828 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003829 goto err_core_stop;
3830 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003831
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01003832 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003833 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003834 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003835 goto err_core_stop;
3836 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003837
Michal Kaziorcf327842015-03-31 10:26:25 +00003838 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3839 ret = ath10k_wmi_adaptive_qcs(ar, true);
3840 if (ret) {
3841 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3842 ret);
3843 goto err_core_stop;
3844 }
3845 }
3846
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03003847 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
3848 burst_enable = ar->wmi.pdev_param->burst_enable;
3849 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
3850 if (ret) {
3851 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
3852 goto err_core_stop;
3853 }
3854 }
3855
Ben Greear46acf7b2014-05-16 17:15:38 +03003856 if (ar->cfg_tx_chainmask)
3857 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3858 ar->cfg_rx_chainmask);
3859
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003860 /*
3861 * By default FW set ARP frames ac to voice (6). In that case ARP
3862 * exchange is not working properly for UAPSD enabled AP. ARP requests
3863 * which arrives with access category 0 are processed by network stack
3864 * and send back with access category 0, but FW changes access category
3865 * to 6. Set ARP frames access category to best effort (0) solves
3866 * this problem.
3867 */
3868
3869 ret = ath10k_wmi_pdev_set_param(ar,
3870 ar->wmi.pdev_param->arp_ac_override, 0);
3871 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003872 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003873 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003874 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003875 }
3876
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05303877 ret = ath10k_wmi_pdev_set_param(ar,
3878 ar->wmi.pdev_param->ani_enable, 1);
3879 if (ret) {
3880 ath10k_warn(ar, "failed to enable ani by default: %d\n",
3881 ret);
3882 goto err_core_stop;
3883 }
3884
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05303885 ar->ani_enabled = true;
3886
Michal Kaziord6500972014-04-08 09:56:09 +03003887 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02003888 ath10k_regd_update(ar);
3889
Simon Wunderlich855aed12014-08-02 09:12:54 +03003890 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05303891 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03003892
Michal Kaziorae254432014-05-26 12:46:02 +03003893 mutex_unlock(&ar->conf_mutex);
3894 return 0;
3895
3896err_core_stop:
3897 ath10k_core_stop(ar);
3898
3899err_power_down:
3900 ath10k_hif_power_down(ar);
3901
3902err_off:
3903 ar->state = ATH10K_STATE_OFF;
3904
3905err:
Michal Kazior548db542013-07-05 16:15:15 +03003906 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01003907 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003908}
3909
3910static void ath10k_stop(struct ieee80211_hw *hw)
3911{
3912 struct ath10k *ar = hw->priv;
3913
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003914 ath10k_drain_tx(ar);
3915
Michal Kazior548db542013-07-05 16:15:15 +03003916 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003917 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02003918 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003919 ar->state = ATH10K_STATE_OFF;
3920 }
Michal Kazior548db542013-07-05 16:15:15 +03003921 mutex_unlock(&ar->conf_mutex);
3922
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003923 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02003924 cancel_work_sync(&ar->restart_work);
3925}
3926
Michal Kaziorad088bf2013-10-16 15:44:46 +03003927static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02003928{
Michal Kaziorad088bf2013-10-16 15:44:46 +03003929 struct ath10k_vif *arvif;
3930 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02003931
3932 lockdep_assert_held(&ar->conf_mutex);
3933
Michal Kaziorad088bf2013-10-16 15:44:46 +03003934 list_for_each_entry(arvif, &ar->arvifs, list) {
3935 ret = ath10k_mac_vif_setup_ps(arvif);
3936 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003937 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003938 break;
3939 }
3940 }
Michal Kazioraffd3212013-07-16 09:54:35 +02003941
Michal Kaziorad088bf2013-10-16 15:44:46 +03003942 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003943}
3944
Michal Kazior7d9d5582014-10-21 10:40:15 +03003945static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3946{
3947 int ret;
3948 u32 param;
3949
3950 lockdep_assert_held(&ar->conf_mutex);
3951
3952 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3953
3954 param = ar->wmi.pdev_param->txpower_limit2g;
3955 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3956 if (ret) {
3957 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3958 txpower, ret);
3959 return ret;
3960 }
3961
3962 param = ar->wmi.pdev_param->txpower_limit5g;
3963 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3964 if (ret) {
3965 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3966 txpower, ret);
3967 return ret;
3968 }
3969
3970 return 0;
3971}
3972
3973static int ath10k_mac_txpower_recalc(struct ath10k *ar)
3974{
3975 struct ath10k_vif *arvif;
3976 int ret, txpower = -1;
3977
3978 lockdep_assert_held(&ar->conf_mutex);
3979
3980 list_for_each_entry(arvif, &ar->arvifs, list) {
3981 WARN_ON(arvif->txpower < 0);
3982
3983 if (txpower == -1)
3984 txpower = arvif->txpower;
3985 else
3986 txpower = min(txpower, arvif->txpower);
3987 }
3988
3989 if (WARN_ON(txpower == -1))
3990 return -EINVAL;
3991
3992 ret = ath10k_mac_txpower_setup(ar, txpower);
3993 if (ret) {
3994 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
3995 txpower, ret);
3996 return ret;
3997 }
3998
3999 return 0;
4000}
4001
Kalle Valo5e3dd152013-06-12 20:52:10 +03004002static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4003{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004004 struct ath10k *ar = hw->priv;
4005 struct ieee80211_conf *conf = &hw->conf;
4006 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004007
4008 mutex_lock(&ar->conf_mutex);
4009
Michal Kazioraffd3212013-07-16 09:54:35 +02004010 if (changed & IEEE80211_CONF_CHANGE_PS)
4011 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004012
4013 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004014 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4015 ret = ath10k_monitor_recalc(ar);
4016 if (ret)
4017 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004018 }
4019
4020 mutex_unlock(&ar->conf_mutex);
4021 return ret;
4022}
4023
Ben Greear5572a952014-11-24 16:22:10 +02004024static u32 get_nss_from_chainmask(u16 chain_mask)
4025{
4026 if ((chain_mask & 0x15) == 0x15)
4027 return 4;
4028 else if ((chain_mask & 0x7) == 0x7)
4029 return 3;
4030 else if ((chain_mask & 0x3) == 0x3)
4031 return 2;
4032 return 1;
4033}
4034
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304035static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4036{
4037 u32 value = 0;
4038 struct ath10k *ar = arvif->ar;
4039
4040 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4041 return 0;
4042
4043 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4044 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
4045 value |= SM((ar->num_rf_chains - 1), WMI_TXBF_STS_CAP_OFFSET);
4046
4047 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4048 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
4049 value |= SM((ar->num_rf_chains - 1), WMI_BF_SOUND_DIM_OFFSET);
4050
4051 if (!value)
4052 return 0;
4053
4054 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4055 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4056
4057 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4058 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4059 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4060
4061 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4062 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4063
4064 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4065 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4066 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4067
4068 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4069 ar->wmi.vdev_param->txbf, value);
4070}
4071
Kalle Valo5e3dd152013-06-12 20:52:10 +03004072/*
4073 * TODO:
4074 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4075 * because we will send mgmt frames without CCK. This requirement
4076 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4077 * in the TX packet.
4078 */
4079static int ath10k_add_interface(struct ieee80211_hw *hw,
4080 struct ieee80211_vif *vif)
4081{
4082 struct ath10k *ar = hw->priv;
4083 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4084 enum wmi_sta_powersave_param param;
4085 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004086 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004087 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004088 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004089 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004090
Johannes Berg848955c2014-11-11 12:48:42 +01004091 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4092
Kalle Valo5e3dd152013-06-12 20:52:10 +03004093 mutex_lock(&ar->conf_mutex);
4094
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004095 memset(arvif, 0, sizeof(*arvif));
4096
Kalle Valo5e3dd152013-06-12 20:52:10 +03004097 arvif->ar = ar;
4098 arvif->vif = vif;
4099
Ben Greeare63b33f2013-10-22 14:54:14 -07004100 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004101 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004102 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4103 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004104
Michal Kazior45c9abc2015-04-21 20:42:58 +03004105 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4106 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4107 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4108 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4109 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4110 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4111 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004112
Ben Greeara9aefb32014-08-12 11:02:19 +03004113 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004114 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004115 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004116 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004117 }
Ben Greear16c11172014-09-23 14:17:16 -07004118 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004119
Ben Greear16c11172014-09-23 14:17:16 -07004120 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4121 bit, ar->free_vdev_map);
4122
4123 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004124 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004125
Kalle Valo5e3dd152013-06-12 20:52:10 +03004126 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004127 case NL80211_IFTYPE_P2P_DEVICE:
4128 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4129 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4130 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004131 case NL80211_IFTYPE_UNSPECIFIED:
4132 case NL80211_IFTYPE_STATION:
4133 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4134 if (vif->p2p)
4135 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4136 break;
4137 case NL80211_IFTYPE_ADHOC:
4138 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4139 break;
4140 case NL80211_IFTYPE_AP:
4141 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4142
4143 if (vif->p2p)
4144 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4145 break;
4146 case NL80211_IFTYPE_MONITOR:
4147 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4148 break;
4149 default:
4150 WARN_ON(1);
4151 break;
4152 }
4153
Michal Kazior96d828d2015-03-31 10:26:23 +00004154 /* Using vdev_id as queue number will make it very easy to do per-vif
4155 * tx queue locking. This shouldn't wrap due to interface combinations
4156 * but do a modulo for correctness sake and prevent using offchannel tx
4157 * queues for regular vif tx.
4158 */
4159 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4160 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4161 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4162
Michal Kazior64badcb2014-09-18 11:18:02 +03004163 /* Some firmware revisions don't wait for beacon tx completion before
4164 * sending another SWBA event. This could lead to hardware using old
4165 * (freed) beacon data in some cases, e.g. tx credit starvation
4166 * combined with missed TBTT. This is very very rare.
4167 *
4168 * On non-IOMMU-enabled hosts this could be a possible security issue
4169 * because hw could beacon some random data on the air. On
4170 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4171 * device would crash.
4172 *
4173 * Since there are no beacon tx completions (implicit nor explicit)
4174 * propagated to host the only workaround for this is to allocate a
4175 * DMA-coherent buffer for a lifetime of a vif and use it for all
4176 * beacon tx commands. Worst case for this approach is some beacons may
4177 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4178 */
4179 if (vif->type == NL80211_IFTYPE_ADHOC ||
4180 vif->type == NL80211_IFTYPE_AP) {
4181 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4182 IEEE80211_MAX_FRAME_LEN,
4183 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304184 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004185 if (!arvif->beacon_buf) {
4186 ret = -ENOMEM;
4187 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4188 ret);
4189 goto err;
4190 }
4191 }
David Liuccec9032015-07-24 20:25:32 +03004192 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4193 arvif->nohwcrypt = true;
4194
4195 if (arvif->nohwcrypt &&
4196 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4197 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4198 goto err;
4199 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004200
4201 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4202 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4203 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004204
4205 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4206 arvif->vdev_subtype, vif->addr);
4207 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004208 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004209 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004210 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004211 }
4212
Ben Greear16c11172014-09-23 14:17:16 -07004213 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004214 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004215
Michal Kazior46725b152015-01-28 09:57:49 +02004216 /* It makes no sense to have firmware do keepalives. mac80211 already
4217 * takes care of this with idle connection polling.
4218 */
4219 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004220 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004221 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004222 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004223 goto err_vdev_delete;
4224 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004225
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004226 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004227
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004228 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4229 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004230 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004231 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004232 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004233 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004234 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004235 goto err_vdev_delete;
4236 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004237
Ben Greear5572a952014-11-24 16:22:10 +02004238 if (ar->cfg_tx_chainmask) {
4239 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4240
4241 vdev_param = ar->wmi.vdev_param->nss;
4242 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4243 nss);
4244 if (ret) {
4245 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4246 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4247 ret);
4248 goto err_vdev_delete;
4249 }
4250 }
4251
Michal Kaziore57e0572015-03-24 13:14:03 +00004252 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4253 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004254 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4255 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004256 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004257 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004258 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004259 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004260 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004261 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004262
Michal Kaziore57e0572015-03-24 13:14:03 +00004263 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004264 ret = ath10k_mac_set_kickout(arvif);
4265 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004266 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004267 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004268 goto err_peer_delete;
4269 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004270 }
4271
4272 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4273 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4274 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4275 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4276 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004277 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004278 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004279 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004280 goto err_peer_delete;
4281 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004282
Michal Kazior9f9b5742014-12-12 12:41:36 +01004283 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004284 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004285 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004286 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004287 goto err_peer_delete;
4288 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004289
Michal Kazior9f9b5742014-12-12 12:41:36 +01004290 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004291 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004292 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004293 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004294 goto err_peer_delete;
4295 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004296 }
4297
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304298 ret = ath10k_mac_set_txbf_conf(arvif);
4299 if (ret) {
4300 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4301 arvif->vdev_id, ret);
4302 goto err_peer_delete;
4303 }
4304
Michal Kazior424121c2013-07-22 14:13:31 +02004305 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004306 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004307 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004308 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004309 goto err_peer_delete;
4310 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004311
Michal Kazior7d9d5582014-10-21 10:40:15 +03004312 arvif->txpower = vif->bss_conf.txpower;
4313 ret = ath10k_mac_txpower_recalc(ar);
4314 if (ret) {
4315 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4316 goto err_peer_delete;
4317 }
4318
Michal Kazior500ff9f2015-03-31 10:26:21 +00004319 if (vif->type == NL80211_IFTYPE_MONITOR) {
4320 ar->monitor_arvif = arvif;
4321 ret = ath10k_monitor_recalc(ar);
4322 if (ret) {
4323 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4324 goto err_peer_delete;
4325 }
4326 }
4327
Kalle Valo5e3dd152013-06-12 20:52:10 +03004328 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004329 return 0;
4330
4331err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004332 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4333 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004334 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4335
4336err_vdev_delete:
4337 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004338 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004339 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004340
4341err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004342 if (arvif->beacon_buf) {
4343 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4344 arvif->beacon_buf, arvif->beacon_paddr);
4345 arvif->beacon_buf = NULL;
4346 }
4347
Michal Kazior9dad14a2013-10-16 15:44:45 +03004348 mutex_unlock(&ar->conf_mutex);
4349
Kalle Valo5e3dd152013-06-12 20:52:10 +03004350 return ret;
4351}
4352
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004353static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4354{
4355 int i;
4356
4357 for (i = 0; i < BITS_PER_LONG; i++)
4358 ath10k_mac_vif_tx_unlock(arvif, i);
4359}
4360
Kalle Valo5e3dd152013-06-12 20:52:10 +03004361static void ath10k_remove_interface(struct ieee80211_hw *hw,
4362 struct ieee80211_vif *vif)
4363{
4364 struct ath10k *ar = hw->priv;
4365 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4366 int ret;
4367
Michal Kazior81a9a172015-03-05 16:02:17 +02004368 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004369 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004370
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304371 mutex_lock(&ar->conf_mutex);
4372
Michal Kaziored543882013-09-13 14:16:56 +02004373 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004374 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004375 spin_unlock_bh(&ar->data_lock);
4376
Simon Wunderlich855aed12014-08-02 09:12:54 +03004377 ret = ath10k_spectral_vif_stop(arvif);
4378 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004379 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004380 arvif->vdev_id, ret);
4381
Ben Greear16c11172014-09-23 14:17:16 -07004382 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004383 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004384
Michal Kaziore57e0572015-03-24 13:14:03 +00004385 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4386 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004387 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4388 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004389 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004390 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004391 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004392
4393 kfree(arvif->u.ap.noa_data);
4394 }
4395
Michal Kazior7aa7a722014-08-25 12:09:38 +02004396 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004397 arvif->vdev_id);
4398
Kalle Valo5e3dd152013-06-12 20:52:10 +03004399 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4400 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004401 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004402 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004403
Michal Kazior2c512052015-02-15 16:50:40 +02004404 /* Some firmware revisions don't notify host about self-peer removal
4405 * until after associated vdev is deleted.
4406 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004407 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4408 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004409 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4410 vif->addr);
4411 if (ret)
4412 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4413 arvif->vdev_id, ret);
4414
4415 spin_lock_bh(&ar->data_lock);
4416 ar->num_peers--;
4417 spin_unlock_bh(&ar->data_lock);
4418 }
4419
Kalle Valo5e3dd152013-06-12 20:52:10 +03004420 ath10k_peer_cleanup(ar, arvif->vdev_id);
4421
Michal Kazior500ff9f2015-03-31 10:26:21 +00004422 if (vif->type == NL80211_IFTYPE_MONITOR) {
4423 ar->monitor_arvif = NULL;
4424 ret = ath10k_monitor_recalc(ar);
4425 if (ret)
4426 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4427 }
4428
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004429 spin_lock_bh(&ar->htt.tx_lock);
4430 ath10k_mac_vif_tx_unlock_all(arvif);
4431 spin_unlock_bh(&ar->htt.tx_lock);
4432
Kalle Valo5e3dd152013-06-12 20:52:10 +03004433 mutex_unlock(&ar->conf_mutex);
4434}
4435
4436/*
4437 * FIXME: Has to be verified.
4438 */
4439#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004440 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004441 FIF_CONTROL | \
4442 FIF_PSPOLL | \
4443 FIF_OTHER_BSS | \
4444 FIF_BCN_PRBRESP_PROMISC | \
4445 FIF_PROBE_REQ | \
4446 FIF_FCSFAIL)
4447
4448static void ath10k_configure_filter(struct ieee80211_hw *hw,
4449 unsigned int changed_flags,
4450 unsigned int *total_flags,
4451 u64 multicast)
4452{
4453 struct ath10k *ar = hw->priv;
4454 int ret;
4455
4456 mutex_lock(&ar->conf_mutex);
4457
4458 changed_flags &= SUPPORTED_FILTERS;
4459 *total_flags &= SUPPORTED_FILTERS;
4460 ar->filter_flags = *total_flags;
4461
Michal Kazior19337472014-08-28 12:58:16 +02004462 ret = ath10k_monitor_recalc(ar);
4463 if (ret)
4464 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004465
4466 mutex_unlock(&ar->conf_mutex);
4467}
4468
4469static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4470 struct ieee80211_vif *vif,
4471 struct ieee80211_bss_conf *info,
4472 u32 changed)
4473{
4474 struct ath10k *ar = hw->priv;
4475 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4476 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004477 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004478
4479 mutex_lock(&ar->conf_mutex);
4480
4481 if (changed & BSS_CHANGED_IBSS)
4482 ath10k_control_ibss(arvif, info, vif->addr);
4483
4484 if (changed & BSS_CHANGED_BEACON_INT) {
4485 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004486 vdev_param = ar->wmi.vdev_param->beacon_interval;
4487 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004488 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004489 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004490 "mac vdev %d beacon_interval %d\n",
4491 arvif->vdev_id, arvif->beacon_interval);
4492
Kalle Valo5e3dd152013-06-12 20:52:10 +03004493 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004494 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004495 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004496 }
4497
4498 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004499 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004500 "vdev %d set beacon tx mode to staggered\n",
4501 arvif->vdev_id);
4502
Bartosz Markowski226a3392013-09-26 17:47:16 +02004503 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4504 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004505 WMI_BEACON_STAGGERED_MODE);
4506 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004507 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004508 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004509
4510 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4511 if (ret)
4512 ath10k_warn(ar, "failed to update beacon template: %d\n",
4513 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004514 }
4515
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004516 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4517 ret = ath10k_mac_setup_prb_tmpl(arvif);
4518 if (ret)
4519 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4520 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004521 }
4522
Michal Kaziorba2479f2015-01-24 12:14:51 +02004523 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004524 arvif->dtim_period = info->dtim_period;
4525
Michal Kazior7aa7a722014-08-25 12:09:38 +02004526 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004527 "mac vdev %d dtim_period %d\n",
4528 arvif->vdev_id, arvif->dtim_period);
4529
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004530 vdev_param = ar->wmi.vdev_param->dtim_period;
4531 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004532 arvif->dtim_period);
4533 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004534 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004535 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004536 }
4537
4538 if (changed & BSS_CHANGED_SSID &&
4539 vif->type == NL80211_IFTYPE_AP) {
4540 arvif->u.ap.ssid_len = info->ssid_len;
4541 if (info->ssid_len)
4542 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4543 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4544 }
4545
Michal Kazior077efc82014-10-21 10:10:29 +03004546 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4547 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004548
4549 if (changed & BSS_CHANGED_BEACON_ENABLED)
4550 ath10k_control_beaconing(arvif, info);
4551
4552 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004553 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004554 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004555 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004556
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004557 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004558 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004559 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004560 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004561
4562 vdev_param = ar->wmi.vdev_param->protection_mode;
4563 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4564 info->use_cts_prot ? 1 : 0);
4565 if (ret)
4566 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
4567 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004568 }
4569
4570 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004571 if (info->use_short_slot)
4572 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4573
4574 else
4575 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4576
Michal Kazior7aa7a722014-08-25 12:09:38 +02004577 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004578 arvif->vdev_id, slottime);
4579
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004580 vdev_param = ar->wmi.vdev_param->slot_time;
4581 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004582 slottime);
4583 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004584 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004585 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004586 }
4587
4588 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004589 if (info->use_short_preamble)
4590 preamble = WMI_VDEV_PREAMBLE_SHORT;
4591 else
4592 preamble = WMI_VDEV_PREAMBLE_LONG;
4593
Michal Kazior7aa7a722014-08-25 12:09:38 +02004594 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004595 "mac vdev %d preamble %dn",
4596 arvif->vdev_id, preamble);
4597
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004598 vdev_param = ar->wmi.vdev_param->preamble;
4599 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004600 preamble);
4601 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004602 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004603 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004604 }
4605
4606 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004607 if (info->assoc) {
4608 /* Workaround: Make sure monitor vdev is not running
4609 * when associating to prevent some firmware revisions
4610 * (e.g. 10.1 and 10.2) from crashing.
4611 */
4612 if (ar->monitor_started)
4613 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004614 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004615 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004616 } else {
4617 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004618 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004619 }
4620
Michal Kazior7d9d5582014-10-21 10:40:15 +03004621 if (changed & BSS_CHANGED_TXPOWER) {
4622 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4623 arvif->vdev_id, info->txpower);
4624
4625 arvif->txpower = info->txpower;
4626 ret = ath10k_mac_txpower_recalc(ar);
4627 if (ret)
4628 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4629 }
4630
Michal Kaziorbf14e652014-12-12 12:41:38 +01004631 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004632 arvif->ps = vif->bss_conf.ps;
4633
4634 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004635 if (ret)
4636 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4637 arvif->vdev_id, ret);
4638 }
4639
Kalle Valo5e3dd152013-06-12 20:52:10 +03004640 mutex_unlock(&ar->conf_mutex);
4641}
4642
4643static int ath10k_hw_scan(struct ieee80211_hw *hw,
4644 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004645 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004646{
4647 struct ath10k *ar = hw->priv;
4648 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004649 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004650 struct wmi_start_scan_arg arg;
4651 int ret = 0;
4652 int i;
4653
4654 mutex_lock(&ar->conf_mutex);
4655
4656 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004657 switch (ar->scan.state) {
4658 case ATH10K_SCAN_IDLE:
4659 reinit_completion(&ar->scan.started);
4660 reinit_completion(&ar->scan.completed);
4661 ar->scan.state = ATH10K_SCAN_STARTING;
4662 ar->scan.is_roc = false;
4663 ar->scan.vdev_id = arvif->vdev_id;
4664 ret = 0;
4665 break;
4666 case ATH10K_SCAN_STARTING:
4667 case ATH10K_SCAN_RUNNING:
4668 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004669 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004670 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004671 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004672 spin_unlock_bh(&ar->data_lock);
4673
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004674 if (ret)
4675 goto exit;
4676
Kalle Valo5e3dd152013-06-12 20:52:10 +03004677 memset(&arg, 0, sizeof(arg));
4678 ath10k_wmi_start_scan_init(ar, &arg);
4679 arg.vdev_id = arvif->vdev_id;
4680 arg.scan_id = ATH10K_SCAN_ID;
4681
Kalle Valo5e3dd152013-06-12 20:52:10 +03004682 if (req->ie_len) {
4683 arg.ie_len = req->ie_len;
4684 memcpy(arg.ie, req->ie, arg.ie_len);
4685 }
4686
4687 if (req->n_ssids) {
4688 arg.n_ssids = req->n_ssids;
4689 for (i = 0; i < arg.n_ssids; i++) {
4690 arg.ssids[i].len = req->ssids[i].ssid_len;
4691 arg.ssids[i].ssid = req->ssids[i].ssid;
4692 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004693 } else {
4694 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004695 }
4696
4697 if (req->n_channels) {
4698 arg.n_channels = req->n_channels;
4699 for (i = 0; i < arg.n_channels; i++)
4700 arg.channels[i] = req->channels[i]->center_freq;
4701 }
4702
4703 ret = ath10k_start_scan(ar, &arg);
4704 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004705 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004706 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004707 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004708 spin_unlock_bh(&ar->data_lock);
4709 }
4710
4711exit:
4712 mutex_unlock(&ar->conf_mutex);
4713 return ret;
4714}
4715
4716static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4717 struct ieee80211_vif *vif)
4718{
4719 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004720
4721 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004722 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004723 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004724
4725 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004726}
4727
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004728static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4729 struct ath10k_vif *arvif,
4730 enum set_key_cmd cmd,
4731 struct ieee80211_key_conf *key)
4732{
4733 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4734 int ret;
4735
4736 /* 10.1 firmware branch requires default key index to be set to group
4737 * key index after installing it. Otherwise FW/HW Txes corrupted
4738 * frames with multi-vif APs. This is not required for main firmware
4739 * branch (e.g. 636).
4740 *
Michal Kazior8461baf2015-04-10 13:23:22 +00004741 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
4742 *
4743 * FIXME: It remains unknown if this is required for multi-vif STA
4744 * interfaces on 10.1.
4745 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004746
Michal Kazior8461baf2015-04-10 13:23:22 +00004747 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
4748 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004749 return;
4750
4751 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4752 return;
4753
4754 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4755 return;
4756
4757 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4758 return;
4759
4760 if (cmd != SET_KEY)
4761 return;
4762
4763 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4764 key->keyidx);
4765 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004766 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004767 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004768}
4769
Kalle Valo5e3dd152013-06-12 20:52:10 +03004770static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4771 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4772 struct ieee80211_key_conf *key)
4773{
4774 struct ath10k *ar = hw->priv;
4775 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4776 struct ath10k_peer *peer;
4777 const u8 *peer_addr;
4778 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4779 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4780 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004781 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01004782 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00004783 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004784
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004785 /* this one needs to be done in software */
4786 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4787 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004788
David Liuccec9032015-07-24 20:25:32 +03004789 if (arvif->nohwcrypt)
4790 return 1;
4791
Kalle Valo5e3dd152013-06-12 20:52:10 +03004792 if (key->keyidx > WMI_MAX_KEY_INDEX)
4793 return -ENOSPC;
4794
4795 mutex_lock(&ar->conf_mutex);
4796
4797 if (sta)
4798 peer_addr = sta->addr;
4799 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4800 peer_addr = vif->bss_conf.bssid;
4801 else
4802 peer_addr = vif->addr;
4803
4804 key->hw_key_idx = key->keyidx;
4805
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03004806 if (is_wep) {
4807 if (cmd == SET_KEY)
4808 arvif->wep_keys[key->keyidx] = key;
4809 else
4810 arvif->wep_keys[key->keyidx] = NULL;
4811 }
4812
Kalle Valo5e3dd152013-06-12 20:52:10 +03004813 /* the peer should not disappear in mid-way (unless FW goes awry) since
4814 * we already hold conf_mutex. we just make sure its there now. */
4815 spin_lock_bh(&ar->data_lock);
4816 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4817 spin_unlock_bh(&ar->data_lock);
4818
4819 if (!peer) {
4820 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004821 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004822 peer_addr);
4823 ret = -EOPNOTSUPP;
4824 goto exit;
4825 } else {
4826 /* if the peer doesn't exist there is no key to disable
4827 * anymore */
4828 goto exit;
4829 }
4830 }
4831
Michal Kazior7cc45732015-03-09 14:24:17 +01004832 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4833 flags |= WMI_KEY_PAIRWISE;
4834 else
4835 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004836
Kalle Valo5e3dd152013-06-12 20:52:10 +03004837 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004838 if (cmd == DISABLE_KEY)
4839 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004840
Michal Kaziorad325cb2015-02-18 14:02:27 +01004841 /* When WEP keys are uploaded it's possible that there are
4842 * stations associated already (e.g. when merging) without any
4843 * keys. Static WEP needs an explicit per-peer key upload.
4844 */
4845 if (vif->type == NL80211_IFTYPE_ADHOC &&
4846 cmd == SET_KEY)
4847 ath10k_mac_vif_update_wep_key(arvif, key);
4848
Michal Kazior370e5672015-02-18 14:02:26 +01004849 /* 802.1x never sets the def_wep_key_idx so each set_key()
4850 * call changes default tx key.
4851 *
4852 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4853 * after first set_key().
4854 */
4855 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4856 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004857 }
4858
Michal Kazior370e5672015-02-18 14:02:26 +01004859 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004860 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004861 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004862 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004863 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004864 goto exit;
4865 }
4866
Michal Kazior29a10002015-04-10 13:05:58 +00004867 /* mac80211 sets static WEP keys as groupwise while firmware requires
4868 * them to be installed twice as both pairwise and groupwise.
4869 */
4870 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
4871 flags2 = flags;
4872 flags2 &= ~WMI_KEY_GROUP;
4873 flags2 |= WMI_KEY_PAIRWISE;
4874
4875 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
4876 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03004877 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004878 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
4879 arvif->vdev_id, peer_addr, ret);
4880 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
4881 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03004882 if (ret2) {
4883 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00004884 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
4885 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03004886 }
Michal Kazior29a10002015-04-10 13:05:58 +00004887 goto exit;
4888 }
4889 }
4890
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004891 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4892
Kalle Valo5e3dd152013-06-12 20:52:10 +03004893 spin_lock_bh(&ar->data_lock);
4894 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4895 if (peer && cmd == SET_KEY)
4896 peer->keys[key->keyidx] = key;
4897 else if (peer && cmd == DISABLE_KEY)
4898 peer->keys[key->keyidx] = NULL;
4899 else if (peer == NULL)
4900 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004901 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004902 spin_unlock_bh(&ar->data_lock);
4903
4904exit:
4905 mutex_unlock(&ar->conf_mutex);
4906 return ret;
4907}
4908
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004909static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
4910 struct ieee80211_vif *vif,
4911 int keyidx)
4912{
4913 struct ath10k *ar = hw->priv;
4914 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4915 int ret;
4916
4917 mutex_lock(&arvif->ar->conf_mutex);
4918
4919 if (arvif->ar->state != ATH10K_STATE_ON)
4920 goto unlock;
4921
4922 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
4923 arvif->vdev_id, keyidx);
4924
4925 ret = ath10k_wmi_vdev_set_param(arvif->ar,
4926 arvif->vdev_id,
4927 arvif->ar->wmi.vdev_param->def_keyid,
4928 keyidx);
4929
4930 if (ret) {
4931 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
4932 arvif->vdev_id,
4933 ret);
4934 goto unlock;
4935 }
4936
4937 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01004938
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004939unlock:
4940 mutex_unlock(&arvif->ar->conf_mutex);
4941}
4942
Michal Kazior9797feb2014-02-14 14:49:48 +01004943static void ath10k_sta_rc_update_wk(struct work_struct *wk)
4944{
4945 struct ath10k *ar;
4946 struct ath10k_vif *arvif;
4947 struct ath10k_sta *arsta;
4948 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03004949 struct cfg80211_chan_def def;
4950 enum ieee80211_band band;
4951 const u8 *ht_mcs_mask;
4952 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01004953 u32 changed, bw, nss, smps;
4954 int err;
4955
4956 arsta = container_of(wk, struct ath10k_sta, update_wk);
4957 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4958 arvif = arsta->arvif;
4959 ar = arvif->ar;
4960
Michal Kazior45c9abc2015-04-21 20:42:58 +03004961 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
4962 return;
4963
4964 band = def.chan->band;
4965 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4966 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4967
Michal Kazior9797feb2014-02-14 14:49:48 +01004968 spin_lock_bh(&ar->data_lock);
4969
4970 changed = arsta->changed;
4971 arsta->changed = 0;
4972
4973 bw = arsta->bw;
4974 nss = arsta->nss;
4975 smps = arsta->smps;
4976
4977 spin_unlock_bh(&ar->data_lock);
4978
4979 mutex_lock(&ar->conf_mutex);
4980
Michal Kazior45c9abc2015-04-21 20:42:58 +03004981 nss = max_t(u32, 1, nss);
4982 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
4983 ath10k_mac_max_vht_nss(vht_mcs_mask)));
4984
Michal Kazior9797feb2014-02-14 14:49:48 +01004985 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004986 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004987 sta->addr, bw);
4988
4989 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
4990 WMI_PEER_CHAN_WIDTH, bw);
4991 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004992 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004993 sta->addr, bw, err);
4994 }
4995
4996 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004997 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004998 sta->addr, nss);
4999
5000 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5001 WMI_PEER_NSS, nss);
5002 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005003 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005004 sta->addr, nss, err);
5005 }
5006
5007 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005008 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005009 sta->addr, smps);
5010
5011 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5012 WMI_PEER_SMPS_STATE, smps);
5013 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005014 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005015 sta->addr, smps, err);
5016 }
5017
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005018 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5019 changed & IEEE80211_RC_NSS_CHANGED) {
5020 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005021 sta->addr);
5022
Michal Kazior590922a2014-10-21 10:10:29 +03005023 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005024 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005025 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005026 sta->addr);
5027 }
5028
Michal Kazior9797feb2014-02-14 14:49:48 +01005029 mutex_unlock(&ar->conf_mutex);
5030}
5031
Marek Puzyniak7c354242015-03-30 09:51:52 +03005032static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5033 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005034{
5035 struct ath10k *ar = arvif->ar;
5036
5037 lockdep_assert_held(&ar->conf_mutex);
5038
Marek Puzyniak7c354242015-03-30 09:51:52 +03005039 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005040 return 0;
5041
5042 if (ar->num_stations >= ar->max_num_stations)
5043 return -ENOBUFS;
5044
5045 ar->num_stations++;
5046
5047 return 0;
5048}
5049
Marek Puzyniak7c354242015-03-30 09:51:52 +03005050static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5051 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005052{
5053 struct ath10k *ar = arvif->ar;
5054
5055 lockdep_assert_held(&ar->conf_mutex);
5056
Marek Puzyniak7c354242015-03-30 09:51:52 +03005057 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005058 return;
5059
5060 ar->num_stations--;
5061}
5062
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005063struct ath10k_mac_tdls_iter_data {
5064 u32 num_tdls_stations;
5065 struct ieee80211_vif *curr_vif;
5066};
5067
5068static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5069 struct ieee80211_sta *sta)
5070{
5071 struct ath10k_mac_tdls_iter_data *iter_data = data;
5072 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5073 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5074
5075 if (sta->tdls && sta_vif == iter_data->curr_vif)
5076 iter_data->num_tdls_stations++;
5077}
5078
5079static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5080 struct ieee80211_vif *vif)
5081{
5082 struct ath10k_mac_tdls_iter_data data = {};
5083
5084 data.curr_vif = vif;
5085
5086 ieee80211_iterate_stations_atomic(hw,
5087 ath10k_mac_tdls_vif_stations_count_iter,
5088 &data);
5089 return data.num_tdls_stations;
5090}
5091
5092static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5093 struct ieee80211_vif *vif)
5094{
5095 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5096 int *num_tdls_vifs = data;
5097
5098 if (vif->type != NL80211_IFTYPE_STATION)
5099 return;
5100
5101 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5102 (*num_tdls_vifs)++;
5103}
5104
5105static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5106{
5107 int num_tdls_vifs = 0;
5108
5109 ieee80211_iterate_active_interfaces_atomic(hw,
5110 IEEE80211_IFACE_ITER_NORMAL,
5111 ath10k_mac_tdls_vifs_count_iter,
5112 &num_tdls_vifs);
5113 return num_tdls_vifs;
5114}
5115
Kalle Valo5e3dd152013-06-12 20:52:10 +03005116static int ath10k_sta_state(struct ieee80211_hw *hw,
5117 struct ieee80211_vif *vif,
5118 struct ieee80211_sta *sta,
5119 enum ieee80211_sta_state old_state,
5120 enum ieee80211_sta_state new_state)
5121{
5122 struct ath10k *ar = hw->priv;
5123 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005124 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005125 int ret = 0;
5126
Michal Kazior76f90022014-02-25 09:29:57 +02005127 if (old_state == IEEE80211_STA_NOTEXIST &&
5128 new_state == IEEE80211_STA_NONE) {
5129 memset(arsta, 0, sizeof(*arsta));
5130 arsta->arvif = arvif;
5131 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5132 }
5133
Michal Kazior9797feb2014-02-14 14:49:48 +01005134 /* cancel must be done outside the mutex to avoid deadlock */
5135 if ((old_state == IEEE80211_STA_NONE &&
5136 new_state == IEEE80211_STA_NOTEXIST))
5137 cancel_work_sync(&arsta->update_wk);
5138
Kalle Valo5e3dd152013-06-12 20:52:10 +03005139 mutex_lock(&ar->conf_mutex);
5140
5141 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005142 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005143 /*
5144 * New station addition.
5145 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005146 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5147 u32 num_tdls_stations;
5148 u32 num_tdls_vifs;
5149
Michal Kaziorcfd10612014-11-25 15:16:05 +01005150 ath10k_dbg(ar, ATH10K_DBG_MAC,
5151 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5152 arvif->vdev_id, sta->addr,
5153 ar->num_stations + 1, ar->max_num_stations,
5154 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005155
Marek Puzyniak7c354242015-03-30 09:51:52 +03005156 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005157 if (ret) {
5158 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5159 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005160 goto exit;
5161 }
5162
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005163 if (sta->tdls)
5164 peer_type = WMI_PEER_TYPE_TDLS;
5165
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005166 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005167 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005168 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005169 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 -08005170 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005171 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005172 goto exit;
5173 }
Michal Kazior077efc82014-10-21 10:10:29 +03005174
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005175 if (!sta->tdls)
5176 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005177
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005178 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5179 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5180
5181 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5182 num_tdls_stations == 0) {
5183 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5184 arvif->vdev_id, ar->max_num_tdls_vdevs);
5185 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5186 ath10k_mac_dec_num_stations(arvif, sta);
5187 ret = -ENOBUFS;
5188 goto exit;
5189 }
5190
5191 if (num_tdls_stations == 0) {
5192 /* This is the first tdls peer in current vif */
5193 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5194
5195 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5196 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005197 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005198 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005199 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005200 ath10k_peer_delete(ar, arvif->vdev_id,
5201 sta->addr);
5202 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005203 goto exit;
5204 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005205 }
Michal Kazior077efc82014-10-21 10:10:29 +03005206
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005207 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5208 WMI_TDLS_PEER_STATE_PEERING);
5209 if (ret) {
5210 ath10k_warn(ar,
5211 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5212 sta->addr, arvif->vdev_id, ret);
5213 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5214 ath10k_mac_dec_num_stations(arvif, sta);
5215
5216 if (num_tdls_stations != 0)
5217 goto exit;
5218 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5219 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005220 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005221 } else if ((old_state == IEEE80211_STA_NONE &&
5222 new_state == IEEE80211_STA_NOTEXIST)) {
5223 /*
5224 * Existing station deletion.
5225 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005226 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005227 "mac vdev %d peer delete %pM (sta gone)\n",
5228 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005229
Kalle Valo5e3dd152013-06-12 20:52:10 +03005230 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5231 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005232 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005233 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005234
Marek Puzyniak7c354242015-03-30 09:51:52 +03005235 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005236
5237 if (!sta->tdls)
5238 goto exit;
5239
5240 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5241 goto exit;
5242
5243 /* This was the last tdls peer in current vif */
5244 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5245 WMI_TDLS_DISABLE);
5246 if (ret) {
5247 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5248 arvif->vdev_id, ret);
5249 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005250 } else if (old_state == IEEE80211_STA_AUTH &&
5251 new_state == IEEE80211_STA_ASSOC &&
5252 (vif->type == NL80211_IFTYPE_AP ||
5253 vif->type == NL80211_IFTYPE_ADHOC)) {
5254 /*
5255 * New association.
5256 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005257 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005258 sta->addr);
5259
Michal Kazior590922a2014-10-21 10:10:29 +03005260 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005261 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005262 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005263 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005264 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005265 new_state == IEEE80211_STA_AUTHORIZED &&
5266 sta->tdls) {
5267 /*
5268 * Tdls station authorized.
5269 */
5270 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5271 sta->addr);
5272
5273 ret = ath10k_station_assoc(ar, vif, sta, false);
5274 if (ret) {
5275 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5276 sta->addr, arvif->vdev_id, ret);
5277 goto exit;
5278 }
5279
5280 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5281 WMI_TDLS_PEER_STATE_CONNECTED);
5282 if (ret)
5283 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5284 sta->addr, arvif->vdev_id, ret);
5285 } else if (old_state == IEEE80211_STA_ASSOC &&
5286 new_state == IEEE80211_STA_AUTH &&
5287 (vif->type == NL80211_IFTYPE_AP ||
5288 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005289 /*
5290 * Disassociation.
5291 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005292 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005293 sta->addr);
5294
Michal Kazior590922a2014-10-21 10:10:29 +03005295 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005296 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005297 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005298 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005299 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005300exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005301 mutex_unlock(&ar->conf_mutex);
5302 return ret;
5303}
5304
5305static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005306 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005307{
5308 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005309 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5310 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005311 u32 value = 0;
5312 int ret = 0;
5313
Michal Kazior548db542013-07-05 16:15:15 +03005314 lockdep_assert_held(&ar->conf_mutex);
5315
Kalle Valo5e3dd152013-06-12 20:52:10 +03005316 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5317 return 0;
5318
5319 switch (ac) {
5320 case IEEE80211_AC_VO:
5321 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5322 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005323 prio = 7;
5324 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005325 break;
5326 case IEEE80211_AC_VI:
5327 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5328 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005329 prio = 5;
5330 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005331 break;
5332 case IEEE80211_AC_BE:
5333 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5334 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005335 prio = 2;
5336 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005337 break;
5338 case IEEE80211_AC_BK:
5339 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5340 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005341 prio = 0;
5342 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005343 break;
5344 }
5345
5346 if (enable)
5347 arvif->u.sta.uapsd |= value;
5348 else
5349 arvif->u.sta.uapsd &= ~value;
5350
5351 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5352 WMI_STA_PS_PARAM_UAPSD,
5353 arvif->u.sta.uapsd);
5354 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005355 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005356 goto exit;
5357 }
5358
5359 if (arvif->u.sta.uapsd)
5360 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5361 else
5362 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5363
5364 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5365 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5366 value);
5367 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005368 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005369
Michal Kazior9f9b5742014-12-12 12:41:36 +01005370 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5371 if (ret) {
5372 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5373 arvif->vdev_id, ret);
5374 return ret;
5375 }
5376
5377 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5378 if (ret) {
5379 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5380 arvif->vdev_id, ret);
5381 return ret;
5382 }
5383
Michal Kaziorb0e56152015-01-24 12:14:52 +02005384 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5385 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5386 /* Only userspace can make an educated decision when to send
5387 * trigger frame. The following effectively disables u-UAPSD
5388 * autotrigger in firmware (which is enabled by default
5389 * provided the autotrigger service is available).
5390 */
5391
5392 arg.wmm_ac = acc;
5393 arg.user_priority = prio;
5394 arg.service_interval = 0;
5395 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5396 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5397
5398 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5399 arvif->bssid, &arg, 1);
5400 if (ret) {
5401 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5402 ret);
5403 return ret;
5404 }
5405 }
5406
Kalle Valo5e3dd152013-06-12 20:52:10 +03005407exit:
5408 return ret;
5409}
5410
5411static int ath10k_conf_tx(struct ieee80211_hw *hw,
5412 struct ieee80211_vif *vif, u16 ac,
5413 const struct ieee80211_tx_queue_params *params)
5414{
5415 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005416 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005417 struct wmi_wmm_params_arg *p = NULL;
5418 int ret;
5419
5420 mutex_lock(&ar->conf_mutex);
5421
5422 switch (ac) {
5423 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005424 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005425 break;
5426 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005427 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005428 break;
5429 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005430 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005431 break;
5432 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005433 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005434 break;
5435 }
5436
5437 if (WARN_ON(!p)) {
5438 ret = -EINVAL;
5439 goto exit;
5440 }
5441
5442 p->cwmin = params->cw_min;
5443 p->cwmax = params->cw_max;
5444 p->aifs = params->aifs;
5445
5446 /*
5447 * The channel time duration programmed in the HW is in absolute
5448 * microseconds, while mac80211 gives the txop in units of
5449 * 32 microseconds.
5450 */
5451 p->txop = params->txop * 32;
5452
Michal Kazior7fc979a2015-01-28 09:57:28 +02005453 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5454 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5455 &arvif->wmm_params);
5456 if (ret) {
5457 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5458 arvif->vdev_id, ret);
5459 goto exit;
5460 }
5461 } else {
5462 /* This won't work well with multi-interface cases but it's
5463 * better than nothing.
5464 */
5465 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5466 if (ret) {
5467 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5468 goto exit;
5469 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005470 }
5471
5472 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5473 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005474 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005475
5476exit:
5477 mutex_unlock(&ar->conf_mutex);
5478 return ret;
5479}
5480
5481#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5482
5483static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5484 struct ieee80211_vif *vif,
5485 struct ieee80211_channel *chan,
5486 int duration,
5487 enum ieee80211_roc_type type)
5488{
5489 struct ath10k *ar = hw->priv;
5490 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5491 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005492 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005493 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005494
5495 mutex_lock(&ar->conf_mutex);
5496
5497 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005498 switch (ar->scan.state) {
5499 case ATH10K_SCAN_IDLE:
5500 reinit_completion(&ar->scan.started);
5501 reinit_completion(&ar->scan.completed);
5502 reinit_completion(&ar->scan.on_channel);
5503 ar->scan.state = ATH10K_SCAN_STARTING;
5504 ar->scan.is_roc = true;
5505 ar->scan.vdev_id = arvif->vdev_id;
5506 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005507 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005508 ret = 0;
5509 break;
5510 case ATH10K_SCAN_STARTING:
5511 case ATH10K_SCAN_RUNNING:
5512 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005513 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005514 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005515 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005516 spin_unlock_bh(&ar->data_lock);
5517
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005518 if (ret)
5519 goto exit;
5520
Michal Kaziorfcf98442015-03-31 11:03:47 +00005521 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005522
Kalle Valo5e3dd152013-06-12 20:52:10 +03005523 memset(&arg, 0, sizeof(arg));
5524 ath10k_wmi_start_scan_init(ar, &arg);
5525 arg.vdev_id = arvif->vdev_id;
5526 arg.scan_id = ATH10K_SCAN_ID;
5527 arg.n_channels = 1;
5528 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005529 arg.dwell_time_active = scan_time_msec;
5530 arg.dwell_time_passive = scan_time_msec;
5531 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005532 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5533 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005534 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005535
5536 ret = ath10k_start_scan(ar, &arg);
5537 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005538 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005539 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005540 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005541 spin_unlock_bh(&ar->data_lock);
5542 goto exit;
5543 }
5544
5545 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5546 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005547 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005548
5549 ret = ath10k_scan_stop(ar);
5550 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005551 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005552
Kalle Valo5e3dd152013-06-12 20:52:10 +03005553 ret = -ETIMEDOUT;
5554 goto exit;
5555 }
5556
Michal Kaziorfcf98442015-03-31 11:03:47 +00005557 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5558 msecs_to_jiffies(duration));
5559
Kalle Valo5e3dd152013-06-12 20:52:10 +03005560 ret = 0;
5561exit:
5562 mutex_unlock(&ar->conf_mutex);
5563 return ret;
5564}
5565
5566static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5567{
5568 struct ath10k *ar = hw->priv;
5569
5570 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005571
5572 spin_lock_bh(&ar->data_lock);
5573 ar->scan.roc_notify = false;
5574 spin_unlock_bh(&ar->data_lock);
5575
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005576 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005577
Kalle Valo5e3dd152013-06-12 20:52:10 +03005578 mutex_unlock(&ar->conf_mutex);
5579
Michal Kazior4eb2e162014-10-28 10:23:09 +01005580 cancel_delayed_work_sync(&ar->scan.timeout);
5581
Kalle Valo5e3dd152013-06-12 20:52:10 +03005582 return 0;
5583}
5584
5585/*
5586 * Both RTS and Fragmentation threshold are interface-specific
5587 * in ath10k, but device-specific in mac80211.
5588 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005589
5590static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5591{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005592 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005593 struct ath10k_vif *arvif;
5594 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005595
Michal Kaziorad088bf2013-10-16 15:44:46 +03005596 mutex_lock(&ar->conf_mutex);
5597 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005598 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005599 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005600
Michal Kaziorad088bf2013-10-16 15:44:46 +03005601 ret = ath10k_mac_set_rts(arvif, value);
5602 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005603 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005604 arvif->vdev_id, ret);
5605 break;
5606 }
5607 }
5608 mutex_unlock(&ar->conf_mutex);
5609
5610 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005611}
5612
Michal Kazior92092fe2015-08-03 11:16:43 +02005613static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5614{
5615 /* Even though there's a WMI enum for fragmentation threshold no known
5616 * firmware actually implements it. Moreover it is not possible to rely
5617 * frame fragmentation to mac80211 because firmware clears the "more
5618 * fragments" bit in frame control making it impossible for remote
5619 * devices to reassemble frames.
5620 *
5621 * Hence implement a dummy callback just to say fragmentation isn't
5622 * supported. This effectively prevents mac80211 from doing frame
5623 * fragmentation in software.
5624 */
5625 return -EOPNOTSUPP;
5626}
5627
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005628static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5629 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005630{
5631 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005632 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005633 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005634
5635 /* mac80211 doesn't care if we really xmit queued frames or not
5636 * we'll collect those frames either way if we stop/delete vdevs */
5637 if (drop)
5638 return;
5639
Michal Kazior548db542013-07-05 16:15:15 +03005640 mutex_lock(&ar->conf_mutex);
5641
Michal Kazioraffd3212013-07-16 09:54:35 +02005642 if (ar->state == ATH10K_STATE_WEDGED)
5643 goto skip;
5644
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005645 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005646 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005647
Michal Kazioredb82362013-07-05 16:15:14 +03005648 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005649 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005650 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005651
Michal Kazior7962b0d2014-10-28 10:34:38 +01005652 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5653 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5654 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005655
5656 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005657 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005658
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005659 if (time_left == 0 || skip)
5660 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5661 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005662
Michal Kazioraffd3212013-07-16 09:54:35 +02005663skip:
Michal Kazior548db542013-07-05 16:15:15 +03005664 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005665}
5666
5667/* TODO: Implement this function properly
5668 * For now it is needed to reply to Probe Requests in IBSS mode.
5669 * Propably we need this information from FW.
5670 */
5671static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5672{
5673 return 1;
5674}
5675
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005676static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5677 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005678{
5679 struct ath10k *ar = hw->priv;
5680
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005681 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5682 return;
5683
Michal Kazioraffd3212013-07-16 09:54:35 +02005684 mutex_lock(&ar->conf_mutex);
5685
5686 /* If device failed to restart it will be in a different state, e.g.
5687 * ATH10K_STATE_WEDGED */
5688 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005689 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005690 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005691 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005692 }
5693
5694 mutex_unlock(&ar->conf_mutex);
5695}
5696
Michal Kazior2e1dea42013-07-31 10:32:40 +02005697static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5698 struct survey_info *survey)
5699{
5700 struct ath10k *ar = hw->priv;
5701 struct ieee80211_supported_band *sband;
5702 struct survey_info *ar_survey = &ar->survey[idx];
5703 int ret = 0;
5704
5705 mutex_lock(&ar->conf_mutex);
5706
5707 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5708 if (sband && idx >= sband->n_channels) {
5709 idx -= sband->n_channels;
5710 sband = NULL;
5711 }
5712
5713 if (!sband)
5714 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5715
5716 if (!sband || idx >= sband->n_channels) {
5717 ret = -ENOENT;
5718 goto exit;
5719 }
5720
5721 spin_lock_bh(&ar->data_lock);
5722 memcpy(survey, ar_survey, sizeof(*survey));
5723 spin_unlock_bh(&ar->data_lock);
5724
5725 survey->channel = &sband->channels[idx];
5726
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005727 if (ar->rx_channel == survey->channel)
5728 survey->filled |= SURVEY_INFO_IN_USE;
5729
Michal Kazior2e1dea42013-07-31 10:32:40 +02005730exit:
5731 mutex_unlock(&ar->conf_mutex);
5732 return ret;
5733}
5734
Michal Kazior3ae54222015-03-31 10:49:20 +00005735static bool
5736ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5737 enum ieee80211_band band,
5738 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005739{
Michal Kazior3ae54222015-03-31 10:49:20 +00005740 int num_rates = 0;
5741 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005742
Michal Kazior3ae54222015-03-31 10:49:20 +00005743 num_rates += hweight32(mask->control[band].legacy);
5744
5745 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5746 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5747
5748 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5749 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5750
5751 return num_rates == 1;
5752}
5753
5754static bool
5755ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5756 enum ieee80211_band band,
5757 const struct cfg80211_bitrate_mask *mask,
5758 int *nss)
5759{
5760 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5761 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5762 u8 ht_nss_mask = 0;
5763 u8 vht_nss_mask = 0;
5764 int i;
5765
5766 if (mask->control[band].legacy)
5767 return false;
5768
5769 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5770 if (mask->control[band].ht_mcs[i] == 0)
5771 continue;
5772 else if (mask->control[band].ht_mcs[i] ==
5773 sband->ht_cap.mcs.rx_mask[i])
5774 ht_nss_mask |= BIT(i);
5775 else
5776 return false;
5777 }
5778
5779 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5780 if (mask->control[band].vht_mcs[i] == 0)
5781 continue;
5782 else if (mask->control[band].vht_mcs[i] ==
5783 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5784 vht_nss_mask |= BIT(i);
5785 else
5786 return false;
5787 }
5788
5789 if (ht_nss_mask != vht_nss_mask)
5790 return false;
5791
5792 if (ht_nss_mask == 0)
5793 return false;
5794
5795 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5796 return false;
5797
5798 *nss = fls(ht_nss_mask);
5799
5800 return true;
5801}
5802
5803static int
5804ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5805 enum ieee80211_band band,
5806 const struct cfg80211_bitrate_mask *mask,
5807 u8 *rate, u8 *nss)
5808{
5809 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5810 int rate_idx;
5811 int i;
5812 u16 bitrate;
5813 u8 preamble;
5814 u8 hw_rate;
5815
5816 if (hweight32(mask->control[band].legacy) == 1) {
5817 rate_idx = ffs(mask->control[band].legacy) - 1;
5818
5819 hw_rate = sband->bitrates[rate_idx].hw_value;
5820 bitrate = sband->bitrates[rate_idx].bitrate;
5821
5822 if (ath10k_mac_bitrate_is_cck(bitrate))
5823 preamble = WMI_RATE_PREAMBLE_CCK;
5824 else
5825 preamble = WMI_RATE_PREAMBLE_OFDM;
5826
5827 *nss = 1;
5828 *rate = preamble << 6 |
5829 (*nss - 1) << 4 |
5830 hw_rate << 0;
5831
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005832 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005833 }
5834
Michal Kazior3ae54222015-03-31 10:49:20 +00005835 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5836 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5837 *nss = i + 1;
5838 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5839 (*nss - 1) << 4 |
5840 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005841
Michal Kazior3ae54222015-03-31 10:49:20 +00005842 return 0;
5843 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005844 }
5845
Michal Kazior3ae54222015-03-31 10:49:20 +00005846 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5847 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5848 *nss = i + 1;
5849 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5850 (*nss - 1) << 4 |
5851 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005852
Michal Kazior3ae54222015-03-31 10:49:20 +00005853 return 0;
5854 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005855 }
5856
Michal Kazior3ae54222015-03-31 10:49:20 +00005857 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005858}
5859
Michal Kazior3ae54222015-03-31 10:49:20 +00005860static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5861 u8 rate, u8 nss, u8 sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005862{
5863 struct ath10k *ar = arvif->ar;
5864 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005865 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005866
Michal Kazior3ae54222015-03-31 10:49:20 +00005867 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005868
Michal Kazior3ae54222015-03-31 10:49:20 +00005869 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5870 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005871
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005872 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005873 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005874 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005875 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005876 rate, ret);
5877 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005878 }
5879
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005880 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005881 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005882 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005883 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5884 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005885 }
5886
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005887 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005888 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005889 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005890 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5891 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005892 }
5893
Michal Kazior3ae54222015-03-31 10:49:20 +00005894 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005895}
5896
Michal Kazior45c9abc2015-04-21 20:42:58 +03005897static bool
5898ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
5899 enum ieee80211_band band,
5900 const struct cfg80211_bitrate_mask *mask)
5901{
5902 int i;
5903 u16 vht_mcs;
5904
5905 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
5906 * to express all VHT MCS rate masks. Effectively only the following
5907 * ranges can be used: none, 0-7, 0-8 and 0-9.
5908 */
5909 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5910 vht_mcs = mask->control[band].vht_mcs[i];
5911
5912 switch (vht_mcs) {
5913 case 0:
5914 case BIT(8) - 1:
5915 case BIT(9) - 1:
5916 case BIT(10) - 1:
5917 break;
5918 default:
5919 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
5920 return false;
5921 }
5922 }
5923
5924 return true;
5925}
5926
5927static void ath10k_mac_set_bitrate_mask_iter(void *data,
5928 struct ieee80211_sta *sta)
5929{
5930 struct ath10k_vif *arvif = data;
5931 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5932 struct ath10k *ar = arvif->ar;
5933
5934 if (arsta->arvif != arvif)
5935 return;
5936
5937 spin_lock_bh(&ar->data_lock);
5938 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
5939 spin_unlock_bh(&ar->data_lock);
5940
5941 ieee80211_queue_work(ar->hw, &arsta->update_wk);
5942}
5943
Michal Kazior3ae54222015-03-31 10:49:20 +00005944static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
5945 struct ieee80211_vif *vif,
5946 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005947{
5948 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00005949 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005950 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00005951 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005952 const u8 *ht_mcs_mask;
5953 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00005954 u8 rate;
5955 u8 nss;
5956 u8 sgi;
5957 int single_nss;
5958 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005959
Michal Kazior500ff9f2015-03-31 10:26:21 +00005960 if (ath10k_mac_vif_chan(vif, &def))
5961 return -EPERM;
5962
Michal Kazior500ff9f2015-03-31 10:26:21 +00005963 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005964 ht_mcs_mask = mask->control[band].ht_mcs;
5965 vht_mcs_mask = mask->control[band].vht_mcs;
Michal Kazior500ff9f2015-03-31 10:26:21 +00005966
Michal Kazior3ae54222015-03-31 10:49:20 +00005967 sgi = mask->control[band].gi;
5968 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005969 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005970
Michal Kazior3ae54222015-03-31 10:49:20 +00005971 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
5972 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
5973 &rate, &nss);
5974 if (ret) {
5975 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
5976 arvif->vdev_id, ret);
5977 return ret;
5978 }
5979 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
5980 &single_nss)) {
5981 rate = WMI_FIXED_RATE_NONE;
5982 nss = single_nss;
5983 } else {
5984 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005985 nss = min(ar->num_rf_chains,
5986 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5987 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5988
5989 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
5990 return -EINVAL;
5991
5992 mutex_lock(&ar->conf_mutex);
5993
5994 arvif->bitrate_mask = *mask;
5995 ieee80211_iterate_stations_atomic(ar->hw,
5996 ath10k_mac_set_bitrate_mask_iter,
5997 arvif);
5998
5999 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006000 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006001
6002 mutex_lock(&ar->conf_mutex);
6003
Michal Kazior3ae54222015-03-31 10:49:20 +00006004 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006005 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006006 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6007 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006008 goto exit;
6009 }
6010
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006011exit:
6012 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006013
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006014 return ret;
6015}
6016
Michal Kazior9797feb2014-02-14 14:49:48 +01006017static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6018 struct ieee80211_vif *vif,
6019 struct ieee80211_sta *sta,
6020 u32 changed)
6021{
6022 struct ath10k *ar = hw->priv;
6023 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6024 u32 bw, smps;
6025
6026 spin_lock_bh(&ar->data_lock);
6027
Michal Kazior7aa7a722014-08-25 12:09:38 +02006028 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006029 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6030 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6031 sta->smps_mode);
6032
6033 if (changed & IEEE80211_RC_BW_CHANGED) {
6034 bw = WMI_PEER_CHWIDTH_20MHZ;
6035
6036 switch (sta->bandwidth) {
6037 case IEEE80211_STA_RX_BW_20:
6038 bw = WMI_PEER_CHWIDTH_20MHZ;
6039 break;
6040 case IEEE80211_STA_RX_BW_40:
6041 bw = WMI_PEER_CHWIDTH_40MHZ;
6042 break;
6043 case IEEE80211_STA_RX_BW_80:
6044 bw = WMI_PEER_CHWIDTH_80MHZ;
6045 break;
6046 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006047 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006048 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006049 bw = WMI_PEER_CHWIDTH_20MHZ;
6050 break;
6051 }
6052
6053 arsta->bw = bw;
6054 }
6055
6056 if (changed & IEEE80211_RC_NSS_CHANGED)
6057 arsta->nss = sta->rx_nss;
6058
6059 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6060 smps = WMI_PEER_SMPS_PS_NONE;
6061
6062 switch (sta->smps_mode) {
6063 case IEEE80211_SMPS_AUTOMATIC:
6064 case IEEE80211_SMPS_OFF:
6065 smps = WMI_PEER_SMPS_PS_NONE;
6066 break;
6067 case IEEE80211_SMPS_STATIC:
6068 smps = WMI_PEER_SMPS_STATIC;
6069 break;
6070 case IEEE80211_SMPS_DYNAMIC:
6071 smps = WMI_PEER_SMPS_DYNAMIC;
6072 break;
6073 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006074 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006075 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006076 smps = WMI_PEER_SMPS_PS_NONE;
6077 break;
6078 }
6079
6080 arsta->smps = smps;
6081 }
6082
Michal Kazior9797feb2014-02-14 14:49:48 +01006083 arsta->changed |= changed;
6084
6085 spin_unlock_bh(&ar->data_lock);
6086
6087 ieee80211_queue_work(hw, &arsta->update_wk);
6088}
6089
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006090static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6091{
6092 /*
6093 * FIXME: Return 0 for time being. Need to figure out whether FW
6094 * has the API to fetch 64-bit local TSF
6095 */
6096
6097 return 0;
6098}
6099
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006100static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6101 struct ieee80211_vif *vif,
6102 enum ieee80211_ampdu_mlme_action action,
6103 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
6104 u8 buf_size)
6105{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006106 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006107 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6108
Michal Kazior7aa7a722014-08-25 12:09:38 +02006109 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 +02006110 arvif->vdev_id, sta->addr, tid, action);
6111
6112 switch (action) {
6113 case IEEE80211_AMPDU_RX_START:
6114 case IEEE80211_AMPDU_RX_STOP:
6115 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6116 * creation/removal. Do we need to verify this?
6117 */
6118 return 0;
6119 case IEEE80211_AMPDU_TX_START:
6120 case IEEE80211_AMPDU_TX_STOP_CONT:
6121 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6122 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6123 case IEEE80211_AMPDU_TX_OPERATIONAL:
6124 /* Firmware offloads Tx aggregation entirely so deny mac80211
6125 * Tx aggregation requests.
6126 */
6127 return -EOPNOTSUPP;
6128 }
6129
6130 return -EINVAL;
6131}
6132
Michal Kazior500ff9f2015-03-31 10:26:21 +00006133static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006134ath10k_mac_update_rx_channel(struct ath10k *ar,
6135 struct ieee80211_chanctx_conf *ctx,
6136 struct ieee80211_vif_chanctx_switch *vifs,
6137 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006138{
6139 struct cfg80211_chan_def *def = NULL;
6140
6141 /* Both locks are required because ar->rx_channel is modified. This
6142 * allows readers to hold either lock.
6143 */
6144 lockdep_assert_held(&ar->conf_mutex);
6145 lockdep_assert_held(&ar->data_lock);
6146
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006147 WARN_ON(ctx && vifs);
6148 WARN_ON(vifs && n_vifs != 1);
6149
Michal Kazior500ff9f2015-03-31 10:26:21 +00006150 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6151 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6152 * ppdu on Rx may reduce performance on low-end systems. It should be
6153 * possible to make tables/hashmaps to speed the lookup up (be vary of
6154 * cpu data cache lines though regarding sizes) but to keep the initial
6155 * implementation simple and less intrusive fallback to the slow lookup
6156 * only for multi-channel cases. Single-channel cases will remain to
6157 * use the old channel derival and thus performance should not be
6158 * affected much.
6159 */
6160 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006161 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006162 ieee80211_iter_chan_contexts_atomic(ar->hw,
6163 ath10k_mac_get_any_chandef_iter,
6164 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006165
6166 if (vifs)
6167 def = &vifs[0].new_ctx->def;
6168
Michal Kazior500ff9f2015-03-31 10:26:21 +00006169 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006170 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6171 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006172 } else {
6173 ar->rx_channel = NULL;
6174 }
6175 rcu_read_unlock();
6176}
6177
Michal Kazior500ff9f2015-03-31 10:26:21 +00006178static int
6179ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6180 struct ieee80211_chanctx_conf *ctx)
6181{
6182 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006183
6184 ath10k_dbg(ar, ATH10K_DBG_MAC,
6185 "mac chanctx add freq %hu width %d ptr %p\n",
6186 ctx->def.chan->center_freq, ctx->def.width, ctx);
6187
6188 mutex_lock(&ar->conf_mutex);
6189
6190 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006191 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006192 spin_unlock_bh(&ar->data_lock);
6193
6194 ath10k_recalc_radar_detection(ar);
6195 ath10k_monitor_recalc(ar);
6196
6197 mutex_unlock(&ar->conf_mutex);
6198
6199 return 0;
6200}
6201
6202static void
6203ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6204 struct ieee80211_chanctx_conf *ctx)
6205{
6206 struct ath10k *ar = hw->priv;
6207
6208 ath10k_dbg(ar, ATH10K_DBG_MAC,
6209 "mac chanctx remove freq %hu width %d ptr %p\n",
6210 ctx->def.chan->center_freq, ctx->def.width, ctx);
6211
6212 mutex_lock(&ar->conf_mutex);
6213
6214 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006215 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006216 spin_unlock_bh(&ar->data_lock);
6217
6218 ath10k_recalc_radar_detection(ar);
6219 ath10k_monitor_recalc(ar);
6220
6221 mutex_unlock(&ar->conf_mutex);
6222}
6223
6224static void
6225ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6226 struct ieee80211_chanctx_conf *ctx,
6227 u32 changed)
6228{
6229 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006230
6231 mutex_lock(&ar->conf_mutex);
6232
6233 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006234 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6235 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006236
6237 /* This shouldn't really happen because channel switching should use
6238 * switch_vif_chanctx().
6239 */
6240 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6241 goto unlock;
6242
Michal Kazior500ff9f2015-03-31 10:26:21 +00006243 ath10k_recalc_radar_detection(ar);
6244
6245 /* FIXME: How to configure Rx chains properly? */
6246
6247 /* No other actions are actually necessary. Firmware maintains channel
6248 * definitions per vdev internally and there's no host-side channel
6249 * context abstraction to configure, e.g. channel width.
6250 */
6251
6252unlock:
6253 mutex_unlock(&ar->conf_mutex);
6254}
6255
6256static int
6257ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6258 struct ieee80211_vif *vif,
6259 struct ieee80211_chanctx_conf *ctx)
6260{
6261 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006262 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6263 int ret;
6264
6265 mutex_lock(&ar->conf_mutex);
6266
6267 ath10k_dbg(ar, ATH10K_DBG_MAC,
6268 "mac chanctx assign ptr %p vdev_id %i\n",
6269 ctx, arvif->vdev_id);
6270
6271 if (WARN_ON(arvif->is_started)) {
6272 mutex_unlock(&ar->conf_mutex);
6273 return -EBUSY;
6274 }
6275
Michal Kazior089ab7a2015-06-03 12:16:55 +02006276 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006277 if (ret) {
6278 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6279 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006280 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006281 goto err;
6282 }
6283
6284 arvif->is_started = true;
6285
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006286 ret = ath10k_mac_vif_setup_ps(arvif);
6287 if (ret) {
6288 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6289 arvif->vdev_id, ret);
6290 goto err_stop;
6291 }
6292
Michal Kazior500ff9f2015-03-31 10:26:21 +00006293 if (vif->type == NL80211_IFTYPE_MONITOR) {
6294 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6295 if (ret) {
6296 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6297 arvif->vdev_id, ret);
6298 goto err_stop;
6299 }
6300
6301 arvif->is_up = true;
6302 }
6303
6304 mutex_unlock(&ar->conf_mutex);
6305 return 0;
6306
6307err_stop:
6308 ath10k_vdev_stop(arvif);
6309 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006310 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006311
6312err:
6313 mutex_unlock(&ar->conf_mutex);
6314 return ret;
6315}
6316
6317static void
6318ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6319 struct ieee80211_vif *vif,
6320 struct ieee80211_chanctx_conf *ctx)
6321{
6322 struct ath10k *ar = hw->priv;
6323 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 unassign ptr %p vdev_id %i\n",
6330 ctx, arvif->vdev_id);
6331
6332 WARN_ON(!arvif->is_started);
6333
6334 if (vif->type == NL80211_IFTYPE_MONITOR) {
6335 WARN_ON(!arvif->is_up);
6336
6337 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6338 if (ret)
6339 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6340 arvif->vdev_id, ret);
6341
6342 arvif->is_up = false;
6343 }
6344
6345 ret = ath10k_vdev_stop(arvif);
6346 if (ret)
6347 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6348 arvif->vdev_id, ret);
6349
6350 arvif->is_started = false;
6351
6352 mutex_unlock(&ar->conf_mutex);
6353}
6354
6355static int
6356ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6357 struct ieee80211_vif_chanctx_switch *vifs,
6358 int n_vifs,
6359 enum ieee80211_chanctx_switch_mode mode)
6360{
6361 struct ath10k *ar = hw->priv;
6362 struct ath10k_vif *arvif;
Michal Kazior0e6eb412015-06-03 12:16:56 +02006363 int ret;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006364 int i;
6365
6366 mutex_lock(&ar->conf_mutex);
6367
6368 ath10k_dbg(ar, ATH10K_DBG_MAC,
6369 "mac chanctx switch n_vifs %d mode %d\n",
6370 n_vifs, mode);
6371
Michal Kazior0e6eb412015-06-03 12:16:56 +02006372 /* First stop monitor interface. Some FW versions crash if there's a
6373 * lone monitor interface.
6374 */
6375 if (ar->monitor_started)
6376 ath10k_monitor_stop(ar);
6377
Michal Kazior500ff9f2015-03-31 10:26:21 +00006378 for (i = 0; i < n_vifs; i++) {
6379 arvif = ath10k_vif_to_arvif(vifs[i].vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006380
6381 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006382 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
Michal Kazior500ff9f2015-03-31 10:26:21 +00006383 arvif->vdev_id,
6384 vifs[i].old_ctx->def.chan->center_freq,
6385 vifs[i].new_ctx->def.chan->center_freq,
6386 vifs[i].old_ctx->def.width,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006387 vifs[i].new_ctx->def.width);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006388
Michal Kazior0e6eb412015-06-03 12:16:56 +02006389 if (WARN_ON(!arvif->is_started))
6390 continue;
6391
6392 if (WARN_ON(!arvif->is_up))
6393 continue;
6394
6395 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6396 if (ret) {
6397 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6398 arvif->vdev_id, ret);
6399 continue;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006400 }
Michal Kazior500ff9f2015-03-31 10:26:21 +00006401 }
Michal Kazior0e6eb412015-06-03 12:16:56 +02006402
6403 /* All relevant vdevs are downed and associated channel resources
6404 * should be available for the channel switch now.
6405 */
6406
6407 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006408 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006409 spin_unlock_bh(&ar->data_lock);
6410
Michal Kazior0e6eb412015-06-03 12:16:56 +02006411 for (i = 0; i < n_vifs; i++) {
6412 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6413
6414 if (WARN_ON(!arvif->is_started))
6415 continue;
6416
6417 if (WARN_ON(!arvif->is_up))
6418 continue;
6419
6420 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6421 if (ret)
6422 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6423 ret);
6424
6425 ret = ath10k_mac_setup_prb_tmpl(arvif);
6426 if (ret)
6427 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6428 ret);
6429
6430 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6431 if (ret) {
6432 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6433 arvif->vdev_id, ret);
6434 continue;
6435 }
6436
6437 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6438 arvif->bssid);
6439 if (ret) {
6440 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6441 arvif->vdev_id, ret);
6442 continue;
6443 }
6444 }
6445
6446 ath10k_monitor_recalc(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006447
6448 mutex_unlock(&ar->conf_mutex);
6449 return 0;
6450}
6451
Kalle Valo5e3dd152013-06-12 20:52:10 +03006452static const struct ieee80211_ops ath10k_ops = {
6453 .tx = ath10k_tx,
6454 .start = ath10k_start,
6455 .stop = ath10k_stop,
6456 .config = ath10k_config,
6457 .add_interface = ath10k_add_interface,
6458 .remove_interface = ath10k_remove_interface,
6459 .configure_filter = ath10k_configure_filter,
6460 .bss_info_changed = ath10k_bss_info_changed,
6461 .hw_scan = ath10k_hw_scan,
6462 .cancel_hw_scan = ath10k_cancel_hw_scan,
6463 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006464 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006465 .sta_state = ath10k_sta_state,
6466 .conf_tx = ath10k_conf_tx,
6467 .remain_on_channel = ath10k_remain_on_channel,
6468 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6469 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006470 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006471 .flush = ath10k_flush,
6472 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006473 .set_antenna = ath10k_set_antenna,
6474 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006475 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006476 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006477 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006478 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006479 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006480 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006481 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6482 .get_et_stats = ath10k_debug_get_et_stats,
6483 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006484 .add_chanctx = ath10k_mac_op_add_chanctx,
6485 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6486 .change_chanctx = ath10k_mac_op_change_chanctx,
6487 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6488 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6489 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006490
6491 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6492
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006493#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006494 .suspend = ath10k_wow_op_suspend,
6495 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006496#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006497#ifdef CONFIG_MAC80211_DEBUGFS
6498 .sta_add_debugfs = ath10k_sta_add_debugfs,
6499#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006500};
6501
Kalle Valo5e3dd152013-06-12 20:52:10 +03006502#define CHAN2G(_channel, _freq, _flags) { \
6503 .band = IEEE80211_BAND_2GHZ, \
6504 .hw_value = (_channel), \
6505 .center_freq = (_freq), \
6506 .flags = (_flags), \
6507 .max_antenna_gain = 0, \
6508 .max_power = 30, \
6509}
6510
6511#define CHAN5G(_channel, _freq, _flags) { \
6512 .band = IEEE80211_BAND_5GHZ, \
6513 .hw_value = (_channel), \
6514 .center_freq = (_freq), \
6515 .flags = (_flags), \
6516 .max_antenna_gain = 0, \
6517 .max_power = 30, \
6518}
6519
6520static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6521 CHAN2G(1, 2412, 0),
6522 CHAN2G(2, 2417, 0),
6523 CHAN2G(3, 2422, 0),
6524 CHAN2G(4, 2427, 0),
6525 CHAN2G(5, 2432, 0),
6526 CHAN2G(6, 2437, 0),
6527 CHAN2G(7, 2442, 0),
6528 CHAN2G(8, 2447, 0),
6529 CHAN2G(9, 2452, 0),
6530 CHAN2G(10, 2457, 0),
6531 CHAN2G(11, 2462, 0),
6532 CHAN2G(12, 2467, 0),
6533 CHAN2G(13, 2472, 0),
6534 CHAN2G(14, 2484, 0),
6535};
6536
6537static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006538 CHAN5G(36, 5180, 0),
6539 CHAN5G(40, 5200, 0),
6540 CHAN5G(44, 5220, 0),
6541 CHAN5G(48, 5240, 0),
6542 CHAN5G(52, 5260, 0),
6543 CHAN5G(56, 5280, 0),
6544 CHAN5G(60, 5300, 0),
6545 CHAN5G(64, 5320, 0),
6546 CHAN5G(100, 5500, 0),
6547 CHAN5G(104, 5520, 0),
6548 CHAN5G(108, 5540, 0),
6549 CHAN5G(112, 5560, 0),
6550 CHAN5G(116, 5580, 0),
6551 CHAN5G(120, 5600, 0),
6552 CHAN5G(124, 5620, 0),
6553 CHAN5G(128, 5640, 0),
6554 CHAN5G(132, 5660, 0),
6555 CHAN5G(136, 5680, 0),
6556 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006557 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006558 CHAN5G(149, 5745, 0),
6559 CHAN5G(153, 5765, 0),
6560 CHAN5G(157, 5785, 0),
6561 CHAN5G(161, 5805, 0),
6562 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006563};
6564
Michal Kaziore7b54192014-08-07 11:03:27 +02006565struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006566{
6567 struct ieee80211_hw *hw;
6568 struct ath10k *ar;
6569
Michal Kaziore7b54192014-08-07 11:03:27 +02006570 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006571 if (!hw)
6572 return NULL;
6573
6574 ar = hw->priv;
6575 ar->hw = hw;
6576
6577 return ar;
6578}
6579
6580void ath10k_mac_destroy(struct ath10k *ar)
6581{
6582 ieee80211_free_hw(ar->hw);
6583}
6584
6585static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6586 {
6587 .max = 8,
6588 .types = BIT(NL80211_IFTYPE_STATION)
6589 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006590 },
6591 {
6592 .max = 3,
6593 .types = BIT(NL80211_IFTYPE_P2P_GO)
6594 },
6595 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006596 .max = 1,
6597 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6598 },
6599 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006600 .max = 7,
6601 .types = BIT(NL80211_IFTYPE_AP)
6602 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006603};
6604
Bartosz Markowskif2595092013-12-10 16:20:39 +01006605static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006606 {
6607 .max = 8,
6608 .types = BIT(NL80211_IFTYPE_AP)
6609 },
6610};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006611
6612static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6613 {
6614 .limits = ath10k_if_limits,
6615 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6616 .max_interfaces = 8,
6617 .num_different_channels = 1,
6618 .beacon_int_infra_match = true,
6619 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006620};
6621
6622static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006623 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006624 .limits = ath10k_10x_if_limits,
6625 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006626 .max_interfaces = 8,
6627 .num_different_channels = 1,
6628 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006629#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006630 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6631 BIT(NL80211_CHAN_WIDTH_20) |
6632 BIT(NL80211_CHAN_WIDTH_40) |
6633 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006634#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006635 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006636};
6637
Michal Kaziorcf327842015-03-31 10:26:25 +00006638static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6639 {
6640 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02006641 .types = BIT(NL80211_IFTYPE_STATION),
6642 },
6643 {
6644 .max = 2,
6645 .types = BIT(NL80211_IFTYPE_AP) |
Michal Kaziorcf327842015-03-31 10:26:25 +00006646 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6647 BIT(NL80211_IFTYPE_P2P_GO),
6648 },
6649 {
6650 .max = 1,
6651 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6652 },
6653};
6654
Michal Kaziored25b112015-07-09 13:08:39 +02006655static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
6656 {
6657 .max = 2,
6658 .types = BIT(NL80211_IFTYPE_STATION),
6659 },
6660 {
6661 .max = 2,
6662 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
6663 },
6664 {
6665 .max = 1,
6666 .types = BIT(NL80211_IFTYPE_AP) |
6667 BIT(NL80211_IFTYPE_P2P_GO),
6668 },
6669 {
6670 .max = 1,
6671 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6672 },
6673};
6674
Michal Kaziorcf327842015-03-31 10:26:25 +00006675static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6676 {
6677 .max = 1,
6678 .types = BIT(NL80211_IFTYPE_STATION),
6679 },
6680 {
6681 .max = 1,
6682 .types = BIT(NL80211_IFTYPE_ADHOC),
6683 },
6684};
6685
6686/* FIXME: This is not thouroughly tested. These combinations may over- or
6687 * underestimate hw/fw capabilities.
6688 */
6689static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6690 {
6691 .limits = ath10k_tlv_if_limit,
6692 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02006693 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006694 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6695 },
6696 {
6697 .limits = ath10k_tlv_if_limit_ibss,
6698 .num_different_channels = 1,
6699 .max_interfaces = 2,
6700 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6701 },
6702};
6703
6704static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6705 {
6706 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02006707 .num_different_channels = 1,
6708 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00006709 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6710 },
6711 {
Michal Kaziored25b112015-07-09 13:08:39 +02006712 .limits = ath10k_tlv_qcs_if_limit,
6713 .num_different_channels = 2,
6714 .max_interfaces = 4,
6715 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
6716 },
6717 {
Michal Kaziorcf327842015-03-31 10:26:25 +00006718 .limits = ath10k_tlv_if_limit_ibss,
6719 .num_different_channels = 1,
6720 .max_interfaces = 2,
6721 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6722 },
6723};
6724
Raja Manicf36fef2015-06-22 20:22:25 +05306725static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
6726 {
6727 .max = 1,
6728 .types = BIT(NL80211_IFTYPE_STATION),
6729 },
6730 {
6731 .max = 16,
6732 .types = BIT(NL80211_IFTYPE_AP)
6733 },
6734};
6735
6736static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
6737 {
6738 .limits = ath10k_10_4_if_limits,
6739 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
6740 .max_interfaces = 16,
6741 .num_different_channels = 1,
6742 .beacon_int_infra_match = true,
6743#ifdef CONFIG_ATH10K_DFS_CERTIFIED
6744 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6745 BIT(NL80211_CHAN_WIDTH_20) |
6746 BIT(NL80211_CHAN_WIDTH_40) |
6747 BIT(NL80211_CHAN_WIDTH_80),
6748#endif
6749 },
6750};
6751
Kalle Valo5e3dd152013-06-12 20:52:10 +03006752static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6753{
6754 struct ieee80211_sta_vht_cap vht_cap = {0};
6755 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006756 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006757 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006758
6759 vht_cap.vht_supported = 1;
6760 vht_cap.cap = ar->vht_cap_info;
6761
Michal Kaziorbc657a362015-02-26 11:11:22 +01006762 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6763 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
6764 val = ar->num_rf_chains - 1;
6765 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6766 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6767
6768 vht_cap.cap |= val;
6769 }
6770
6771 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6772 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
6773 val = ar->num_rf_chains - 1;
6774 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6775 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6776
6777 vht_cap.cap |= val;
6778 }
6779
Michal Kazior8865bee42013-07-24 12:36:46 +02006780 mcs_map = 0;
6781 for (i = 0; i < 8; i++) {
6782 if (i < ar->num_rf_chains)
6783 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6784 else
6785 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6786 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006787
6788 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6789 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6790
6791 return vht_cap;
6792}
6793
6794static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6795{
6796 int i;
6797 struct ieee80211_sta_ht_cap ht_cap = {0};
6798
6799 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6800 return ht_cap;
6801
6802 ht_cap.ht_supported = 1;
6803 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6804 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6805 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6806 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6807 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6808
6809 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6810 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6811
6812 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6813 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6814
6815 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6816 u32 smps;
6817
6818 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
6819 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6820
6821 ht_cap.cap |= smps;
6822 }
6823
6824 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6825 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6826
6827 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6828 u32 stbc;
6829
6830 stbc = ar->ht_cap_info;
6831 stbc &= WMI_HT_CAP_RX_STBC;
6832 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6833 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6834 stbc &= IEEE80211_HT_CAP_RX_STBC;
6835
6836 ht_cap.cap |= stbc;
6837 }
6838
6839 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6840 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6841
6842 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6843 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6844
6845 /* max AMSDU is implicitly taken from vht_cap_info */
6846 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6847 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6848
Michal Kazior8865bee42013-07-24 12:36:46 +02006849 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006850 ht_cap.mcs.rx_mask[i] = 0xFF;
6851
6852 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6853
6854 return ht_cap;
6855}
6856
Kalle Valo5e3dd152013-06-12 20:52:10 +03006857static void ath10k_get_arvif_iter(void *data, u8 *mac,
6858 struct ieee80211_vif *vif)
6859{
6860 struct ath10k_vif_iter *arvif_iter = data;
6861 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6862
6863 if (arvif->vdev_id == arvif_iter->vdev_id)
6864 arvif_iter->arvif = arvif;
6865}
6866
6867struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6868{
6869 struct ath10k_vif_iter arvif_iter;
6870 u32 flags;
6871
6872 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6873 arvif_iter.vdev_id = vdev_id;
6874
6875 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6876 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6877 flags,
6878 ath10k_get_arvif_iter,
6879 &arvif_iter);
6880 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006881 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006882 return NULL;
6883 }
6884
6885 return arvif_iter.arvif;
6886}
6887
6888int ath10k_mac_register(struct ath10k *ar)
6889{
Johannes Berg3cb10942015-01-22 21:38:45 +01006890 static const u32 cipher_suites[] = {
6891 WLAN_CIPHER_SUITE_WEP40,
6892 WLAN_CIPHER_SUITE_WEP104,
6893 WLAN_CIPHER_SUITE_TKIP,
6894 WLAN_CIPHER_SUITE_CCMP,
6895 WLAN_CIPHER_SUITE_AES_CMAC,
6896 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03006897 struct ieee80211_supported_band *band;
6898 struct ieee80211_sta_vht_cap vht_cap;
6899 struct ieee80211_sta_ht_cap ht_cap;
6900 void *channels;
6901 int ret;
6902
6903 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6904
6905 SET_IEEE80211_DEV(ar->hw, ar->dev);
6906
6907 ht_cap = ath10k_get_ht_cap(ar);
6908 vht_cap = ath10k_create_vht_cap(ar);
6909
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00006910 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
6911 ARRAY_SIZE(ath10k_5ghz_channels)) !=
6912 ATH10K_NUM_CHANS);
6913
Kalle Valo5e3dd152013-06-12 20:52:10 +03006914 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
6915 channels = kmemdup(ath10k_2ghz_channels,
6916 sizeof(ath10k_2ghz_channels),
6917 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02006918 if (!channels) {
6919 ret = -ENOMEM;
6920 goto err_free;
6921 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006922
6923 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
6924 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
6925 band->channels = channels;
6926 band->n_bitrates = ath10k_g_rates_size;
6927 band->bitrates = ath10k_g_rates;
6928 band->ht_cap = ht_cap;
6929
Yanbo Lid68bb122015-01-23 08:18:20 +08006930 /* Enable the VHT support at 2.4 GHz */
6931 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006932
6933 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
6934 }
6935
6936 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
6937 channels = kmemdup(ath10k_5ghz_channels,
6938 sizeof(ath10k_5ghz_channels),
6939 GFP_KERNEL);
6940 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02006941 ret = -ENOMEM;
6942 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006943 }
6944
6945 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
6946 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
6947 band->channels = channels;
6948 band->n_bitrates = ath10k_a_rates_size;
6949 band->bitrates = ath10k_a_rates;
6950 band->ht_cap = ht_cap;
6951 band->vht_cap = vht_cap;
6952 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
6953 }
6954
6955 ar->hw->wiphy->interface_modes =
6956 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01006957 BIT(NL80211_IFTYPE_AP);
6958
Ben Greear46acf7b2014-05-16 17:15:38 +03006959 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
6960 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
6961
Bartosz Markowskid3541812013-12-10 16:20:40 +01006962 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
6963 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01006964 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01006965 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6966 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006967
Johannes Berg30686bf2015-06-02 21:39:54 +02006968 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
6969 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
6970 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
6971 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
6972 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
6973 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
6974 ieee80211_hw_set(ar->hw, AP_LINK_PS);
6975 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02006976 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
6977 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
6978 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
6979 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
6980 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
6981 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006982
David Liuccec9032015-07-24 20:25:32 +03006983 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
6984 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
6985
Eliad Peller0d8614b2014-09-10 14:07:36 +03006986 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00006987 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03006988
Kalle Valo5e3dd152013-06-12 20:52:10 +03006989 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03006990 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006991
6992 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02006993 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
6994 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006995 }
6996
6997 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
6998 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
6999
7000 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007001 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007002
Kalle Valo5e3dd152013-06-12 20:52:10 +03007003 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7004
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007005 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7006 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7007
7008 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7009 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7010 * correct Probe Responses. This is more of a hack advert..
7011 */
7012 ar->hw->wiphy->probe_resp_offload |=
7013 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7014 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7015 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7016 }
7017
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007018 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7019 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7020
Kalle Valo5e3dd152013-06-12 20:52:10 +03007021 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007022 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007023 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7024
7025 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007026 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7027
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007028 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7029
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007030 ret = ath10k_wow_init(ar);
7031 if (ret) {
7032 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7033 goto err_free;
7034 }
7035
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007036 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7037
Kalle Valo5e3dd152013-06-12 20:52:10 +03007038 /*
7039 * on LL hardware queues are managed entirely by the FW
7040 * so we only advertise to mac we can do the queues thing
7041 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007042 ar->hw->queues = IEEE80211_MAX_QUEUES;
7043
7044 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7045 * something that vdev_ids can't reach so that we don't stop the queue
7046 * accidentally.
7047 */
7048 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007049
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007050 switch (ar->wmi.op_version) {
7051 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007052 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7053 ar->hw->wiphy->n_iface_combinations =
7054 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007055 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007056 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007057 case ATH10K_FW_WMI_OP_VERSION_TLV:
7058 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7059 ar->hw->wiphy->iface_combinations =
7060 ath10k_tlv_qcs_if_comb;
7061 ar->hw->wiphy->n_iface_combinations =
7062 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7063 } else {
7064 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7065 ar->hw->wiphy->n_iface_combinations =
7066 ARRAY_SIZE(ath10k_tlv_if_comb);
7067 }
7068 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7069 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007070 case ATH10K_FW_WMI_OP_VERSION_10_1:
7071 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007072 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007073 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7074 ar->hw->wiphy->n_iface_combinations =
7075 ARRAY_SIZE(ath10k_10x_if_comb);
7076 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307077 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307078 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7079 ar->hw->wiphy->n_iface_combinations =
7080 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307081 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007082 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7083 case ATH10K_FW_WMI_OP_VERSION_MAX:
7084 WARN_ON(1);
7085 ret = -EINVAL;
7086 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007087 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007088
David Liuccec9032015-07-24 20:25:32 +03007089 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7090 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007091
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007092 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7093 /* Init ath dfs pattern detector */
7094 ar->ath_common.debug_mask = ATH_DBG_DFS;
7095 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7096 NL80211_DFS_UNSET);
7097
7098 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007099 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007100 }
7101
Kalle Valo5e3dd152013-06-12 20:52:10 +03007102 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7103 ath10k_reg_notifier);
7104 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007105 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007106 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007107 }
7108
Johannes Berg3cb10942015-01-22 21:38:45 +01007109 ar->hw->wiphy->cipher_suites = cipher_suites;
7110 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7111
Kalle Valo5e3dd152013-06-12 20:52:10 +03007112 ret = ieee80211_register_hw(ar->hw);
7113 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007114 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02007115 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007116 }
7117
7118 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7119 ret = regulatory_hint(ar->hw->wiphy,
7120 ar->ath_common.regulatory.alpha2);
7121 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007122 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007123 }
7124
7125 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007126
7127err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007128 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02007129err_free:
7130 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7131 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7132
Kalle Valo5e3dd152013-06-12 20:52:10 +03007133 return ret;
7134}
7135
7136void ath10k_mac_unregister(struct ath10k *ar)
7137{
7138 ieee80211_unregister_hw(ar->hw);
7139
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007140 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7141 ar->dfs_detector->exit(ar->dfs_detector);
7142
Kalle Valo5e3dd152013-06-12 20:52:10 +03007143 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7144 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7145
7146 SET_IEEE80211_DEV(ar->hw, NULL);
7147}