blob: ef0438d2cc8fa8ddb969e05c24ce2706317d8a9e [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,
Yanbo Li4b7f3532015-11-12 10:36:10 -080093 u8 hw_rate, bool cck)
Michal Kazior5528e032015-03-30 09:51:56 +030094{
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
Yanbo Li4b7f3532015-11-12 10:36:10 -0800101 if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
102 continue;
103
Michal Kazior5528e032015-03-30 09:51:56 +0300104 if (rate->hw_value == hw_rate)
105 return i;
106 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
107 rate->hw_value_short == hw_rate)
108 return i;
109 }
110
111 return 0;
112}
113
Michal Kazior01cebe12015-03-30 09:51:56 +0300114u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
115 u32 bitrate)
116{
117 int i;
118
119 for (i = 0; i < sband->n_bitrates; i++)
120 if (sband->bitrates[i].bitrate == bitrate)
121 return i;
122
123 return 0;
124}
125
Michal Kazior3ae54222015-03-31 10:49:20 +0000126static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
127{
128 switch ((mcs_map >> (2 * nss)) & 0x3) {
129 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
130 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
131 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
132 }
133 return 0;
134}
135
Michal Kazior45c9abc2015-04-21 20:42:58 +0300136static u32
137ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
138{
139 int nss;
140
141 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
142 if (ht_mcs_mask[nss])
143 return nss + 1;
144
145 return 1;
146}
147
148static u32
149ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
150{
151 int nss;
152
153 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
154 if (vht_mcs_mask[nss])
155 return nss + 1;
156
157 return 1;
158}
Kalle Valo5e3dd152013-06-12 20:52:10 +0300159
160/**********/
161/* Crypto */
162/**********/
163
164static int ath10k_send_key(struct ath10k_vif *arvif,
165 struct ieee80211_key_conf *key,
166 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100167 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300168{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200169 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300170 struct wmi_vdev_install_key_arg arg = {
171 .vdev_id = arvif->vdev_id,
172 .key_idx = key->keyidx,
173 .key_len = key->keylen,
174 .key_data = key->key,
Michal Kazior370e5672015-02-18 14:02:26 +0100175 .key_flags = flags,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300176 .macaddr = macaddr,
177 };
178
Michal Kazior548db542013-07-05 16:15:15 +0300179 lockdep_assert_held(&arvif->ar->conf_mutex);
180
Kalle Valo5e3dd152013-06-12 20:52:10 +0300181 switch (key->cipher) {
182 case WLAN_CIPHER_SUITE_CCMP:
183 arg.key_cipher = WMI_CIPHER_AES_CCM;
Marek Kwaczynskie4e82e92015-01-24 12:14:53 +0200184 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300185 break;
186 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300187 arg.key_cipher = WMI_CIPHER_TKIP;
188 arg.key_txmic_len = 8;
189 arg.key_rxmic_len = 8;
190 break;
191 case WLAN_CIPHER_SUITE_WEP40:
192 case WLAN_CIPHER_SUITE_WEP104:
193 arg.key_cipher = WMI_CIPHER_WEP;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300194 break;
Johannes Berg3cb10942015-01-22 21:38:45 +0100195 case WLAN_CIPHER_SUITE_AES_CMAC:
Bartosz Markowskid7131c02015-03-10 14:32:19 +0100196 WARN_ON(1);
197 return -EINVAL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300198 default:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200199 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300200 return -EOPNOTSUPP;
201 }
202
Kalle Valob9e284e2015-10-05 17:56:35 +0300203 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
David Liuccec9032015-07-24 20:25:32 +0300204 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
David Liuccec9032015-07-24 20:25:32 +0300205
Kalle Valo5e3dd152013-06-12 20:52:10 +0300206 if (cmd == DISABLE_KEY) {
207 arg.key_cipher = WMI_CIPHER_NONE;
208 arg.key_data = NULL;
209 }
210
211 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
212}
213
214static int ath10k_install_key(struct ath10k_vif *arvif,
215 struct ieee80211_key_conf *key,
216 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100217 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300218{
219 struct ath10k *ar = arvif->ar;
220 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300221 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300222
Michal Kazior548db542013-07-05 16:15:15 +0300223 lockdep_assert_held(&ar->conf_mutex);
224
Wolfram Sang16735d02013-11-14 14:32:02 -0800225 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300226
David Liuccec9032015-07-24 20:25:32 +0300227 if (arvif->nohwcrypt)
228 return 1;
229
Michal Kazior370e5672015-02-18 14:02:26 +0100230 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300231 if (ret)
232 return ret;
233
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300234 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
235 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300236 return -ETIMEDOUT;
237
238 return 0;
239}
240
241static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
242 const u8 *addr)
243{
244 struct ath10k *ar = arvif->ar;
245 struct ath10k_peer *peer;
246 int ret;
247 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100248 u32 flags;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300249
250 lockdep_assert_held(&ar->conf_mutex);
251
Michal Kazior8674d902015-08-13 14:10:46 +0200252 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
Peter Oh7c97b722015-12-03 09:50:55 -0800253 arvif->vif->type != NL80211_IFTYPE_ADHOC &&
254 arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
Michal Kazior8674d902015-08-13 14:10:46 +0200255 return -EINVAL;
256
Kalle Valo5e3dd152013-06-12 20:52:10 +0300257 spin_lock_bh(&ar->data_lock);
258 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
259 spin_unlock_bh(&ar->data_lock);
260
261 if (!peer)
262 return -ENOENT;
263
264 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
265 if (arvif->wep_keys[i] == NULL)
266 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100267
Michal Kazior8674d902015-08-13 14:10:46 +0200268 switch (arvif->vif->type) {
269 case NL80211_IFTYPE_AP:
270 flags = WMI_KEY_PAIRWISE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300271
Michal Kazior8674d902015-08-13 14:10:46 +0200272 if (arvif->def_wep_key_idx == i)
273 flags |= WMI_KEY_TX_USAGE;
Michal Kaziorce90b272015-04-10 13:23:21 +0000274
Michal Kazior8674d902015-08-13 14:10:46 +0200275 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
276 SET_KEY, addr, flags);
277 if (ret < 0)
278 return ret;
279 break;
280 case NL80211_IFTYPE_ADHOC:
281 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
282 SET_KEY, addr,
283 WMI_KEY_PAIRWISE);
284 if (ret < 0)
285 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300286
Michal Kazior8674d902015-08-13 14:10:46 +0200287 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
288 SET_KEY, addr, WMI_KEY_GROUP);
289 if (ret < 0)
290 return ret;
291 break;
292 default:
293 WARN_ON(1);
294 return -EINVAL;
295 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300296
Sujith Manoharanae167132014-11-25 11:46:59 +0530297 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300298 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530299 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300300 }
301
Michal Kaziorce90b272015-04-10 13:23:21 +0000302 /* In some cases (notably with static WEP IBSS with multiple keys)
303 * multicast Tx becomes broken. Both pairwise and groupwise keys are
304 * installed already. Using WMI_KEY_TX_USAGE in different combinations
305 * didn't seem help. Using def_keyid vdev parameter seems to be
306 * effective so use that.
307 *
308 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
309 */
Michal Kazior8674d902015-08-13 14:10:46 +0200310 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
311 return 0;
312
Michal Kaziorce90b272015-04-10 13:23:21 +0000313 if (arvif->def_wep_key_idx == -1)
314 return 0;
315
316 ret = ath10k_wmi_vdev_set_param(arvif->ar,
317 arvif->vdev_id,
318 arvif->ar->wmi.vdev_param->def_keyid,
319 arvif->def_wep_key_idx);
320 if (ret) {
321 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
322 arvif->vdev_id, ret);
323 return ret;
324 }
325
Kalle Valo5e3dd152013-06-12 20:52:10 +0300326 return 0;
327}
328
329static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
330 const u8 *addr)
331{
332 struct ath10k *ar = arvif->ar;
333 struct ath10k_peer *peer;
334 int first_errno = 0;
335 int ret;
336 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100337 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300338
339 lockdep_assert_held(&ar->conf_mutex);
340
341 spin_lock_bh(&ar->data_lock);
342 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
343 spin_unlock_bh(&ar->data_lock);
344
345 if (!peer)
346 return -ENOENT;
347
348 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
349 if (peer->keys[i] == NULL)
350 continue;
351
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200352 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300353 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100354 DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300355 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300356 first_errno = ret;
357
David Liuccec9032015-07-24 20:25:32 +0300358 if (ret < 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200359 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300360 i, ret);
361
Sujith Manoharanae167132014-11-25 11:46:59 +0530362 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300363 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530364 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300365 }
366
367 return first_errno;
368}
369
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530370bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
371 u8 keyidx)
372{
373 struct ath10k_peer *peer;
374 int i;
375
376 lockdep_assert_held(&ar->data_lock);
377
378 /* We don't know which vdev this peer belongs to,
379 * since WMI doesn't give us that information.
380 *
381 * FIXME: multi-bss needs to be handled.
382 */
383 peer = ath10k_peer_find(ar, 0, addr);
384 if (!peer)
385 return false;
386
387 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
388 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
389 return true;
390 }
391
392 return false;
393}
394
Kalle Valo5e3dd152013-06-12 20:52:10 +0300395static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
396 struct ieee80211_key_conf *key)
397{
398 struct ath10k *ar = arvif->ar;
399 struct ath10k_peer *peer;
400 u8 addr[ETH_ALEN];
401 int first_errno = 0;
402 int ret;
403 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100404 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300405
406 lockdep_assert_held(&ar->conf_mutex);
407
408 for (;;) {
409 /* since ath10k_install_key we can't hold data_lock all the
410 * time, so we try to remove the keys incrementally */
411 spin_lock_bh(&ar->data_lock);
412 i = 0;
413 list_for_each_entry(peer, &ar->peers, list) {
414 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
415 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300416 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300417 peer->keys[i] = NULL;
418 break;
419 }
420 }
421
422 if (i < ARRAY_SIZE(peer->keys))
423 break;
424 }
425 spin_unlock_bh(&ar->data_lock);
426
427 if (i == ARRAY_SIZE(peer->keys))
428 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200429 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100430 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300431 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300432 first_errno = ret;
433
434 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200435 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200436 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300437 }
438
439 return first_errno;
440}
441
Michal Kaziorad325cb2015-02-18 14:02:27 +0100442static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
443 struct ieee80211_key_conf *key)
444{
445 struct ath10k *ar = arvif->ar;
446 struct ath10k_peer *peer;
447 int ret;
448
449 lockdep_assert_held(&ar->conf_mutex);
450
451 list_for_each_entry(peer, &ar->peers, list) {
452 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
453 continue;
454
455 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
456 continue;
457
458 if (peer->keys[key->keyidx] == key)
459 continue;
460
461 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
462 arvif->vdev_id, key->keyidx);
463
464 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
465 if (ret) {
466 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
467 arvif->vdev_id, peer->addr, ret);
468 return ret;
469 }
470 }
471
472 return 0;
473}
474
Kalle Valo5e3dd152013-06-12 20:52:10 +0300475/*********************/
476/* General utilities */
477/*********************/
478
479static inline enum wmi_phy_mode
480chan_to_phymode(const struct cfg80211_chan_def *chandef)
481{
482 enum wmi_phy_mode phymode = MODE_UNKNOWN;
483
484 switch (chandef->chan->band) {
485 case IEEE80211_BAND_2GHZ:
486 switch (chandef->width) {
487 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800488 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
489 phymode = MODE_11B;
490 else
491 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300492 break;
493 case NL80211_CHAN_WIDTH_20:
494 phymode = MODE_11NG_HT20;
495 break;
496 case NL80211_CHAN_WIDTH_40:
497 phymode = MODE_11NG_HT40;
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_80:
502 case NL80211_CHAN_WIDTH_80P80:
503 case NL80211_CHAN_WIDTH_160:
504 phymode = MODE_UNKNOWN;
505 break;
506 }
507 break;
508 case IEEE80211_BAND_5GHZ:
509 switch (chandef->width) {
510 case NL80211_CHAN_WIDTH_20_NOHT:
511 phymode = MODE_11A;
512 break;
513 case NL80211_CHAN_WIDTH_20:
514 phymode = MODE_11NA_HT20;
515 break;
516 case NL80211_CHAN_WIDTH_40:
517 phymode = MODE_11NA_HT40;
518 break;
519 case NL80211_CHAN_WIDTH_80:
520 phymode = MODE_11AC_VHT80;
521 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400522 case NL80211_CHAN_WIDTH_5:
523 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300524 case NL80211_CHAN_WIDTH_80P80:
525 case NL80211_CHAN_WIDTH_160:
526 phymode = MODE_UNKNOWN;
527 break;
528 }
529 break;
530 default:
531 break;
532 }
533
534 WARN_ON(phymode == MODE_UNKNOWN);
535 return phymode;
536}
537
538static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
539{
540/*
541 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
542 * 0 for no restriction
543 * 1 for 1/4 us
544 * 2 for 1/2 us
545 * 3 for 1 us
546 * 4 for 2 us
547 * 5 for 4 us
548 * 6 for 8 us
549 * 7 for 16 us
550 */
551 switch (mpdudensity) {
552 case 0:
553 return 0;
554 case 1:
555 case 2:
556 case 3:
557 /* Our lower layer calculations limit our precision to
558 1 microsecond */
559 return 1;
560 case 4:
561 return 2;
562 case 5:
563 return 4;
564 case 6:
565 return 8;
566 case 7:
567 return 16;
568 default:
569 return 0;
570 }
571}
572
Michal Kazior500ff9f2015-03-31 10:26:21 +0000573int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
574 struct cfg80211_chan_def *def)
575{
576 struct ieee80211_chanctx_conf *conf;
577
578 rcu_read_lock();
579 conf = rcu_dereference(vif->chanctx_conf);
580 if (!conf) {
581 rcu_read_unlock();
582 return -ENOENT;
583 }
584
585 *def = conf->def;
586 rcu_read_unlock();
587
588 return 0;
589}
590
591static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
592 struct ieee80211_chanctx_conf *conf,
593 void *data)
594{
595 int *num = data;
596
597 (*num)++;
598}
599
600static int ath10k_mac_num_chanctxs(struct ath10k *ar)
601{
602 int num = 0;
603
604 ieee80211_iter_chan_contexts_atomic(ar->hw,
605 ath10k_mac_num_chanctxs_iter,
606 &num);
607
608 return num;
609}
610
611static void
612ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
613 struct ieee80211_chanctx_conf *conf,
614 void *data)
615{
616 struct cfg80211_chan_def **def = data;
617
618 *def = &conf->def;
619}
620
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300621static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
622 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623{
Michal Kaziore04cafb2015-08-05 12:15:24 +0200624 struct ath10k_vif *arvif;
625 int num_peers = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300626 int ret;
627
628 lockdep_assert_held(&ar->conf_mutex);
629
Michal Kaziore04cafb2015-08-05 12:15:24 +0200630 num_peers = ar->num_peers;
631
632 /* Each vdev consumes a peer entry as well */
633 list_for_each_entry(arvif, &ar->arvifs, list)
634 num_peers++;
635
636 if (num_peers >= ar->max_num_peers)
Michal Kaziorcfd10612014-11-25 15:16:05 +0100637 return -ENOBUFS;
638
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300639 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800640 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200641 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200642 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300643 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800644 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300645
646 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800647 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200648 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200649 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300650 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800651 }
Michal Kazior292a7532014-11-25 15:16:04 +0100652
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100653 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300654
655 return 0;
656}
657
Kalle Valo5a13e762014-01-20 11:01:46 +0200658static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
659{
660 struct ath10k *ar = arvif->ar;
661 u32 param;
662 int ret;
663
664 param = ar->wmi.pdev_param->sta_kickout_th;
665 ret = ath10k_wmi_pdev_set_param(ar, param,
666 ATH10K_KICKOUT_THRESHOLD);
667 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200668 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200669 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200670 return ret;
671 }
672
673 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
674 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
675 ATH10K_KEEPALIVE_MIN_IDLE);
676 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200677 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200678 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200679 return ret;
680 }
681
682 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
683 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
684 ATH10K_KEEPALIVE_MAX_IDLE);
685 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200686 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200687 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200688 return ret;
689 }
690
691 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
692 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
693 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
694 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200695 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200696 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200697 return ret;
698 }
699
700 return 0;
701}
702
Vivek Natarajanacab6402014-11-26 09:06:12 +0200703static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200704{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200705 struct ath10k *ar = arvif->ar;
706 u32 vdev_param;
707
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200708 vdev_param = ar->wmi.vdev_param->rts_threshold;
709 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200710}
711
Kalle Valo5e3dd152013-06-12 20:52:10 +0300712static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
713{
714 int ret;
715
716 lockdep_assert_held(&ar->conf_mutex);
717
718 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
719 if (ret)
720 return ret;
721
722 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
723 if (ret)
724 return ret;
725
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100726 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100727
Kalle Valo5e3dd152013-06-12 20:52:10 +0300728 return 0;
729}
730
731static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
732{
733 struct ath10k_peer *peer, *tmp;
734
735 lockdep_assert_held(&ar->conf_mutex);
736
737 spin_lock_bh(&ar->data_lock);
738 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
739 if (peer->vdev_id != vdev_id)
740 continue;
741
Michal Kazior7aa7a722014-08-25 12:09:38 +0200742 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300743 peer->addr, vdev_id);
744
745 list_del(&peer->list);
746 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100747 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300748 }
749 spin_unlock_bh(&ar->data_lock);
750}
751
Michal Kaziora96d7742013-07-16 09:38:56 +0200752static void ath10k_peer_cleanup_all(struct ath10k *ar)
753{
754 struct ath10k_peer *peer, *tmp;
755
756 lockdep_assert_held(&ar->conf_mutex);
757
758 spin_lock_bh(&ar->data_lock);
759 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
760 list_del(&peer->list);
761 kfree(peer);
762 }
763 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100764
765 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100766 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200767}
768
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300769static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
770 struct ieee80211_sta *sta,
771 enum wmi_tdls_peer_state state)
772{
773 int ret;
774 struct wmi_tdls_peer_update_cmd_arg arg = {};
775 struct wmi_tdls_peer_capab_arg cap = {};
776 struct wmi_channel_arg chan_arg = {};
777
778 lockdep_assert_held(&ar->conf_mutex);
779
780 arg.vdev_id = vdev_id;
781 arg.peer_state = state;
782 ether_addr_copy(arg.addr, sta->addr);
783
784 cap.peer_max_sp = sta->max_sp;
785 cap.peer_uapsd_queues = sta->uapsd_queues;
786
787 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
788 !sta->tdls_initiator)
789 cap.is_peer_responder = 1;
790
791 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
792 if (ret) {
793 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
794 arg.addr, vdev_id, ret);
795 return ret;
796 }
797
798 return 0;
799}
800
Kalle Valo5e3dd152013-06-12 20:52:10 +0300801/************************/
802/* Interface management */
803/************************/
804
Michal Kazior64badcb2014-09-18 11:18:02 +0300805void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
806{
807 struct ath10k *ar = arvif->ar;
808
809 lockdep_assert_held(&ar->data_lock);
810
811 if (!arvif->beacon)
812 return;
813
814 if (!arvif->beacon_buf)
815 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
816 arvif->beacon->len, DMA_TO_DEVICE);
817
Michal Kazioraf213192015-01-29 14:29:52 +0200818 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
819 arvif->beacon_state != ATH10K_BEACON_SENT))
820 return;
821
Michal Kazior64badcb2014-09-18 11:18:02 +0300822 dev_kfree_skb_any(arvif->beacon);
823
824 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200825 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300826}
827
828static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
829{
830 struct ath10k *ar = arvif->ar;
831
832 lockdep_assert_held(&ar->data_lock);
833
834 ath10k_mac_vif_beacon_free(arvif);
835
836 if (arvif->beacon_buf) {
837 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
838 arvif->beacon_buf, arvif->beacon_paddr);
839 arvif->beacon_buf = NULL;
840 }
841}
842
Kalle Valo5e3dd152013-06-12 20:52:10 +0300843static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
844{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300845 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300846
Michal Kazior548db542013-07-05 16:15:15 +0300847 lockdep_assert_held(&ar->conf_mutex);
848
Michal Kazior7962b0d2014-10-28 10:34:38 +0100849 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
850 return -ESHUTDOWN;
851
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300852 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
853 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
854 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300855 return -ETIMEDOUT;
856
857 return 0;
858}
859
Michal Kazior1bbc0972014-04-08 09:45:47 +0300860static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300861{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000862 struct cfg80211_chan_def *chandef = NULL;
Maninder Singh19be9e92015-07-16 09:25:33 +0530863 struct ieee80211_channel *channel = NULL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300864 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300865 int ret = 0;
866
867 lockdep_assert_held(&ar->conf_mutex);
868
Michal Kazior500ff9f2015-03-31 10:26:21 +0000869 ieee80211_iter_chan_contexts_atomic(ar->hw,
870 ath10k_mac_get_any_chandef_iter,
871 &chandef);
872 if (WARN_ON_ONCE(!chandef))
873 return -ENOENT;
874
875 channel = chandef->chan;
876
Kalle Valo5e3dd152013-06-12 20:52:10 +0300877 arg.vdev_id = vdev_id;
878 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100879 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300880
881 /* TODO setup this dynamically, what in case we
882 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100883 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200884 arg.channel.chan_radar =
885 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300886
Michal Kazior89c5c842013-10-23 04:02:13 -0700887 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700888 arg.channel.max_power = channel->max_power * 2;
889 arg.channel.max_reg_power = channel->max_reg_power * 2;
890 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300891
Michal Kazior7962b0d2014-10-28 10:34:38 +0100892 reinit_completion(&ar->vdev_setup_done);
893
Kalle Valo5e3dd152013-06-12 20:52:10 +0300894 ret = ath10k_wmi_vdev_start(ar, &arg);
895 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200896 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200897 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300898 return ret;
899 }
900
901 ret = ath10k_vdev_setup_sync(ar);
902 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200903 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200904 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300905 return ret;
906 }
907
908 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
909 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200910 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200911 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300912 goto vdev_stop;
913 }
914
915 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300916
Michal Kazior7aa7a722014-08-25 12:09:38 +0200917 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300918 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300919 return 0;
920
921vdev_stop:
922 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
923 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200924 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200925 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300926
927 return ret;
928}
929
Michal Kazior1bbc0972014-04-08 09:45:47 +0300930static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300931{
932 int ret = 0;
933
934 lockdep_assert_held(&ar->conf_mutex);
935
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200936 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
937 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200938 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200939 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300940
Michal Kazior7962b0d2014-10-28 10:34:38 +0100941 reinit_completion(&ar->vdev_setup_done);
942
Kalle Valo5e3dd152013-06-12 20:52:10 +0300943 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
944 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200945 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200946 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300947
948 ret = ath10k_vdev_setup_sync(ar);
949 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200950 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200951 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300952
Michal Kazior7aa7a722014-08-25 12:09:38 +0200953 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300954 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955 return ret;
956}
957
Michal Kazior1bbc0972014-04-08 09:45:47 +0300958static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300959{
960 int bit, ret = 0;
961
962 lockdep_assert_held(&ar->conf_mutex);
963
Ben Greeara9aefb32014-08-12 11:02:19 +0300964 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200965 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300966 return -ENOMEM;
967 }
968
Ben Greear16c11172014-09-23 14:17:16 -0700969 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300970
Ben Greear16c11172014-09-23 14:17:16 -0700971 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300972
973 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
974 WMI_VDEV_TYPE_MONITOR,
975 0, ar->mac_addr);
976 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200977 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200978 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300979 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300980 }
981
Ben Greear16c11172014-09-23 14:17:16 -0700982 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200983 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300984 ar->monitor_vdev_id);
985
Kalle Valo5e3dd152013-06-12 20:52:10 +0300986 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300987}
988
Michal Kazior1bbc0972014-04-08 09:45:47 +0300989static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300990{
991 int ret = 0;
992
993 lockdep_assert_held(&ar->conf_mutex);
994
Kalle Valo5e3dd152013-06-12 20:52:10 +0300995 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
996 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200997 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200998 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300999 return ret;
1000 }
1001
Ben Greear16c11172014-09-23 14:17:16 -07001002 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001003
Michal Kazior7aa7a722014-08-25 12:09:38 +02001004 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001005 ar->monitor_vdev_id);
1006 return ret;
1007}
1008
Michal Kazior1bbc0972014-04-08 09:45:47 +03001009static int ath10k_monitor_start(struct ath10k *ar)
1010{
1011 int ret;
1012
1013 lockdep_assert_held(&ar->conf_mutex);
1014
Michal Kazior1bbc0972014-04-08 09:45:47 +03001015 ret = ath10k_monitor_vdev_create(ar);
1016 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001017 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001018 return ret;
1019 }
1020
1021 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1022 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001023 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001024 ath10k_monitor_vdev_delete(ar);
1025 return ret;
1026 }
1027
1028 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001029 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +03001030
1031 return 0;
1032}
1033
Michal Kazior19337472014-08-28 12:58:16 +02001034static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001035{
1036 int ret;
1037
1038 lockdep_assert_held(&ar->conf_mutex);
1039
Michal Kazior1bbc0972014-04-08 09:45:47 +03001040 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001041 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001042 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001043 return ret;
1044 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001045
1046 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001047 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001048 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001049 return ret;
1050 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001051
1052 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001053 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001054
1055 return 0;
1056}
1057
Michal Kazior500ff9f2015-03-31 10:26:21 +00001058static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1059{
1060 int num_ctx;
1061
1062 /* At least one chanctx is required to derive a channel to start
1063 * monitor vdev on.
1064 */
1065 num_ctx = ath10k_mac_num_chanctxs(ar);
1066 if (num_ctx == 0)
1067 return false;
1068
1069 /* If there's already an existing special monitor interface then don't
1070 * bother creating another monitor vdev.
1071 */
1072 if (ar->monitor_arvif)
1073 return false;
1074
1075 return ar->monitor ||
Bob Copeland0d031c82015-09-09 12:47:34 -04001076 ar->filter_flags & FIF_OTHER_BSS ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001077 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1078}
1079
1080static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1081{
1082 int num_ctx;
1083
1084 num_ctx = ath10k_mac_num_chanctxs(ar);
1085
1086 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1087 * shouldn't allow this but make sure to prevent handling the following
1088 * case anyway since multi-channel DFS hasn't been tested at all.
1089 */
1090 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1091 return false;
1092
1093 return true;
1094}
1095
Michal Kazior19337472014-08-28 12:58:16 +02001096static int ath10k_monitor_recalc(struct ath10k *ar)
1097{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001098 bool needed;
1099 bool allowed;
1100 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001101
1102 lockdep_assert_held(&ar->conf_mutex);
1103
Michal Kazior500ff9f2015-03-31 10:26:21 +00001104 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1105 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001106
1107 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001108 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1109 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001110
Michal Kazior500ff9f2015-03-31 10:26:21 +00001111 if (WARN_ON(needed && !allowed)) {
1112 if (ar->monitor_started) {
1113 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1114
1115 ret = ath10k_monitor_stop(ar);
1116 if (ret)
Kalle Valo2a995082015-10-05 17:56:37 +03001117 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1118 ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001119 /* not serious */
1120 }
1121
1122 return -EPERM;
1123 }
1124
1125 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001126 return 0;
1127
Michal Kazior500ff9f2015-03-31 10:26:21 +00001128 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001129 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001130 else
1131 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001132}
1133
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001134static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1135{
1136 struct ath10k *ar = arvif->ar;
1137 u32 vdev_param, rts_cts = 0;
1138
1139 lockdep_assert_held(&ar->conf_mutex);
1140
1141 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1142
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001143 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001144
1145 if (arvif->num_legacy_stations > 0)
1146 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1147 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001148 else
1149 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1150 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001151
1152 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1153 rts_cts);
1154}
1155
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001156static int ath10k_start_cac(struct ath10k *ar)
1157{
1158 int ret;
1159
1160 lockdep_assert_held(&ar->conf_mutex);
1161
1162 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1163
Michal Kazior19337472014-08-28 12:58:16 +02001164 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001165 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001166 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001167 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1168 return ret;
1169 }
1170
Michal Kazior7aa7a722014-08-25 12:09:38 +02001171 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001172 ar->monitor_vdev_id);
1173
1174 return 0;
1175}
1176
1177static int ath10k_stop_cac(struct ath10k *ar)
1178{
1179 lockdep_assert_held(&ar->conf_mutex);
1180
1181 /* CAC is not running - do nothing */
1182 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1183 return 0;
1184
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001185 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001186 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001187
Michal Kazior7aa7a722014-08-25 12:09:38 +02001188 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001189
1190 return 0;
1191}
1192
Michal Kazior500ff9f2015-03-31 10:26:21 +00001193static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1194 struct ieee80211_chanctx_conf *conf,
1195 void *data)
1196{
1197 bool *ret = data;
1198
1199 if (!*ret && conf->radar_enabled)
1200 *ret = true;
1201}
1202
1203static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1204{
1205 bool has_radar = false;
1206
1207 ieee80211_iter_chan_contexts_atomic(ar->hw,
1208 ath10k_mac_has_radar_iter,
1209 &has_radar);
1210
1211 return has_radar;
1212}
1213
Michal Kaziord6500972014-04-08 09:56:09 +03001214static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001215{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001216 int ret;
1217
1218 lockdep_assert_held(&ar->conf_mutex);
1219
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001220 ath10k_stop_cac(ar);
1221
Michal Kazior500ff9f2015-03-31 10:26:21 +00001222 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001223 return;
1224
Michal Kaziord6500972014-04-08 09:56:09 +03001225 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001226 return;
1227
1228 ret = ath10k_start_cac(ar);
1229 if (ret) {
1230 /*
1231 * Not possible to start CAC on current channel so starting
1232 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1233 * by indicating that radar was detected.
1234 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001235 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001236 ieee80211_radar_detected(ar->hw);
1237 }
1238}
1239
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301240static int ath10k_vdev_stop(struct ath10k_vif *arvif)
Michal Kazior72654fa2014-04-08 09:56:09 +03001241{
1242 struct ath10k *ar = arvif->ar;
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301243 int ret;
1244
1245 lockdep_assert_held(&ar->conf_mutex);
1246
1247 reinit_completion(&ar->vdev_setup_done);
1248
1249 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1250 if (ret) {
1251 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1252 arvif->vdev_id, ret);
1253 return ret;
1254 }
1255
1256 ret = ath10k_vdev_setup_sync(ar);
1257 if (ret) {
1258 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1259 arvif->vdev_id, ret);
1260 return ret;
1261 }
1262
1263 WARN_ON(ar->num_started_vdevs == 0);
1264
1265 if (ar->num_started_vdevs != 0) {
1266 ar->num_started_vdevs--;
1267 ath10k_recalc_radar_detection(ar);
1268 }
1269
1270 return ret;
1271}
1272
Michal Kazior500ff9f2015-03-31 10:26:21 +00001273static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1274 const struct cfg80211_chan_def *chandef,
1275 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001276{
1277 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001278 struct wmi_vdev_start_request_arg arg = {};
1279 int ret = 0;
1280
1281 lockdep_assert_held(&ar->conf_mutex);
1282
1283 reinit_completion(&ar->vdev_setup_done);
1284
1285 arg.vdev_id = arvif->vdev_id;
1286 arg.dtim_period = arvif->dtim_period;
1287 arg.bcn_intval = arvif->beacon_interval;
1288
1289 arg.channel.freq = chandef->chan->center_freq;
1290 arg.channel.band_center_freq1 = chandef->center_freq1;
1291 arg.channel.mode = chan_to_phymode(chandef);
1292
1293 arg.channel.min_power = 0;
1294 arg.channel.max_power = chandef->chan->max_power * 2;
1295 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1296 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1297
1298 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1299 arg.ssid = arvif->u.ap.ssid;
1300 arg.ssid_len = arvif->u.ap.ssid_len;
1301 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1302
1303 /* For now allow DFS for AP mode */
1304 arg.channel.chan_radar =
1305 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1306 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1307 arg.ssid = arvif->vif->bss_conf.ssid;
1308 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1309 }
1310
Michal Kazior7aa7a722014-08-25 12:09:38 +02001311 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001312 "mac vdev %d start center_freq %d phymode %s\n",
1313 arg.vdev_id, arg.channel.freq,
1314 ath10k_wmi_phymode_str(arg.channel.mode));
1315
Michal Kaziordc55e302014-07-29 12:53:36 +03001316 if (restart)
1317 ret = ath10k_wmi_vdev_restart(ar, &arg);
1318 else
1319 ret = ath10k_wmi_vdev_start(ar, &arg);
1320
Michal Kazior72654fa2014-04-08 09:56:09 +03001321 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001322 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001323 arg.vdev_id, ret);
1324 return ret;
1325 }
1326
1327 ret = ath10k_vdev_setup_sync(ar);
1328 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001329 ath10k_warn(ar,
1330 "failed to synchronize setup for vdev %i restart %d: %d\n",
1331 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001332 return ret;
1333 }
1334
Michal Kaziord6500972014-04-08 09:56:09 +03001335 ar->num_started_vdevs++;
1336 ath10k_recalc_radar_detection(ar);
1337
Michal Kazior72654fa2014-04-08 09:56:09 +03001338 return ret;
1339}
1340
Michal Kazior500ff9f2015-03-31 10:26:21 +00001341static int ath10k_vdev_start(struct ath10k_vif *arvif,
1342 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001343{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001344 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001345}
1346
Michal Kazior500ff9f2015-03-31 10:26:21 +00001347static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1348 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001349{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001350 return ath10k_vdev_start_restart(arvif, def, true);
Michal Kazior72654fa2014-04-08 09:56:09 +03001351}
1352
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001353static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1354 struct sk_buff *bcn)
1355{
1356 struct ath10k *ar = arvif->ar;
1357 struct ieee80211_mgmt *mgmt;
1358 const u8 *p2p_ie;
1359 int ret;
1360
1361 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1362 return 0;
1363
1364 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1365 return 0;
1366
1367 mgmt = (void *)bcn->data;
1368 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1369 mgmt->u.beacon.variable,
1370 bcn->len - (mgmt->u.beacon.variable -
1371 bcn->data));
1372 if (!p2p_ie)
1373 return -ENOENT;
1374
1375 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1376 if (ret) {
1377 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1378 arvif->vdev_id, ret);
1379 return ret;
1380 }
1381
1382 return 0;
1383}
1384
1385static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1386 u8 oui_type, size_t ie_offset)
1387{
1388 size_t len;
1389 const u8 *next;
1390 const u8 *end;
1391 u8 *ie;
1392
1393 if (WARN_ON(skb->len < ie_offset))
1394 return -EINVAL;
1395
1396 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1397 skb->data + ie_offset,
1398 skb->len - ie_offset);
1399 if (!ie)
1400 return -ENOENT;
1401
1402 len = ie[1] + 2;
1403 end = skb->data + skb->len;
1404 next = ie + len;
1405
1406 if (WARN_ON(next > end))
1407 return -EINVAL;
1408
1409 memmove(ie, next, end - next);
1410 skb_trim(skb, skb->len - len);
1411
1412 return 0;
1413}
1414
1415static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1416{
1417 struct ath10k *ar = arvif->ar;
1418 struct ieee80211_hw *hw = ar->hw;
1419 struct ieee80211_vif *vif = arvif->vif;
1420 struct ieee80211_mutable_offsets offs = {};
1421 struct sk_buff *bcn;
1422 int ret;
1423
1424 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1425 return 0;
1426
Michal Kazior81a9a172015-03-05 16:02:17 +02001427 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1428 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1429 return 0;
1430
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001431 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1432 if (!bcn) {
1433 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1434 return -EPERM;
1435 }
1436
1437 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1438 if (ret) {
1439 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1440 kfree_skb(bcn);
1441 return ret;
1442 }
1443
1444 /* P2P IE is inserted by firmware automatically (as configured above)
1445 * so remove it from the base beacon template to avoid duplicate P2P
1446 * IEs in beacon frames.
1447 */
1448 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1449 offsetof(struct ieee80211_mgmt,
1450 u.beacon.variable));
1451
1452 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1453 0, NULL, 0);
1454 kfree_skb(bcn);
1455
1456 if (ret) {
1457 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1458 ret);
1459 return ret;
1460 }
1461
1462 return 0;
1463}
1464
1465static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1466{
1467 struct ath10k *ar = arvif->ar;
1468 struct ieee80211_hw *hw = ar->hw;
1469 struct ieee80211_vif *vif = arvif->vif;
1470 struct sk_buff *prb;
1471 int ret;
1472
1473 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1474 return 0;
1475
Michal Kazior81a9a172015-03-05 16:02:17 +02001476 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1477 return 0;
1478
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001479 prb = ieee80211_proberesp_get(hw, vif);
1480 if (!prb) {
1481 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1482 return -EPERM;
1483 }
1484
1485 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1486 kfree_skb(prb);
1487
1488 if (ret) {
1489 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1490 ret);
1491 return ret;
1492 }
1493
1494 return 0;
1495}
1496
Michal Kazior500ff9f2015-03-31 10:26:21 +00001497static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1498{
1499 struct ath10k *ar = arvif->ar;
1500 struct cfg80211_chan_def def;
1501 int ret;
1502
1503 /* When originally vdev is started during assign_vif_chanctx() some
1504 * information is missing, notably SSID. Firmware revisions with beacon
1505 * offloading require the SSID to be provided during vdev (re)start to
1506 * handle hidden SSID properly.
1507 *
1508 * Vdev restart must be done after vdev has been both started and
1509 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1510 * deliver vdev restart response event causing timeouts during vdev
1511 * syncing in ath10k.
1512 *
1513 * Note: The vdev down/up and template reinstallation could be skipped
1514 * since only wmi-tlv firmware are known to have beacon offload and
1515 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1516 * response delivery. It's probably more robust to keep it as is.
1517 */
1518 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1519 return 0;
1520
1521 if (WARN_ON(!arvif->is_started))
1522 return -EINVAL;
1523
1524 if (WARN_ON(!arvif->is_up))
1525 return -EINVAL;
1526
1527 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1528 return -EINVAL;
1529
1530 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1531 if (ret) {
1532 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1533 arvif->vdev_id, ret);
1534 return ret;
1535 }
1536
1537 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1538 * firmware will crash upon vdev up.
1539 */
1540
1541 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1542 if (ret) {
1543 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1544 return ret;
1545 }
1546
1547 ret = ath10k_mac_setup_prb_tmpl(arvif);
1548 if (ret) {
1549 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1550 return ret;
1551 }
1552
1553 ret = ath10k_vdev_restart(arvif, &def);
1554 if (ret) {
1555 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1556 arvif->vdev_id, ret);
1557 return ret;
1558 }
1559
1560 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1561 arvif->bssid);
1562 if (ret) {
1563 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1564 arvif->vdev_id, ret);
1565 return ret;
1566 }
1567
1568 return 0;
1569}
1570
Kalle Valo5e3dd152013-06-12 20:52:10 +03001571static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001572 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001573{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001574 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001575 int ret = 0;
1576
Michal Kazior548db542013-07-05 16:15:15 +03001577 lockdep_assert_held(&arvif->ar->conf_mutex);
1578
Kalle Valo5e3dd152013-06-12 20:52:10 +03001579 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001580 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1581 if (ret)
1582 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1583 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001584
Michal Kaziorc930f742014-01-23 11:38:25 +01001585 arvif->is_up = false;
1586
Michal Kazior748afc42014-01-23 12:48:21 +01001587 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001588 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001589 spin_unlock_bh(&arvif->ar->data_lock);
1590
Kalle Valo5e3dd152013-06-12 20:52:10 +03001591 return;
1592 }
1593
1594 arvif->tx_seq_no = 0x1000;
1595
Michal Kaziorc930f742014-01-23 11:38:25 +01001596 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001597 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001598
1599 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1600 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001601 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001602 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001603 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001604 return;
1605 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001606
Michal Kaziorc930f742014-01-23 11:38:25 +01001607 arvif->is_up = true;
1608
Michal Kazior500ff9f2015-03-31 10:26:21 +00001609 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1610 if (ret) {
1611 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1612 arvif->vdev_id, ret);
1613 return;
1614 }
1615
Michal Kazior7aa7a722014-08-25 12:09:38 +02001616 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001617}
1618
1619static void ath10k_control_ibss(struct ath10k_vif *arvif,
1620 struct ieee80211_bss_conf *info,
1621 const u8 self_peer[ETH_ALEN])
1622{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001623 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001624 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001625 int ret = 0;
1626
Michal Kazior548db542013-07-05 16:15:15 +03001627 lockdep_assert_held(&arvif->ar->conf_mutex);
1628
Kalle Valo5e3dd152013-06-12 20:52:10 +03001629 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001630 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001631 return;
1632
Joe Perches93803b32015-03-02 19:54:49 -08001633 eth_zero_addr(arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001634
1635 return;
1636 }
1637
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001638 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1639 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001640 ATH10K_DEFAULT_ATIM);
1641 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001642 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001643 arvif->vdev_id, ret);
1644}
1645
Michal Kazior9f9b5742014-12-12 12:41:36 +01001646static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1647{
1648 struct ath10k *ar = arvif->ar;
1649 u32 param;
1650 u32 value;
1651 int ret;
1652
1653 lockdep_assert_held(&arvif->ar->conf_mutex);
1654
1655 if (arvif->u.sta.uapsd)
1656 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1657 else
1658 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1659
1660 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1661 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1662 if (ret) {
1663 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1664 value, arvif->vdev_id, ret);
1665 return ret;
1666 }
1667
1668 return 0;
1669}
1670
1671static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1672{
1673 struct ath10k *ar = arvif->ar;
1674 u32 param;
1675 u32 value;
1676 int ret;
1677
1678 lockdep_assert_held(&arvif->ar->conf_mutex);
1679
1680 if (arvif->u.sta.uapsd)
1681 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1682 else
1683 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1684
1685 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1686 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1687 param, value);
1688 if (ret) {
1689 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1690 value, arvif->vdev_id, ret);
1691 return ret;
1692 }
1693
1694 return 0;
1695}
1696
Michal Kazior424f2632015-07-09 13:08:35 +02001697static int ath10k_mac_num_vifs_started(struct ath10k *ar)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001698{
1699 struct ath10k_vif *arvif;
1700 int num = 0;
1701
1702 lockdep_assert_held(&ar->conf_mutex);
1703
1704 list_for_each_entry(arvif, &ar->arvifs, list)
Michal Kazior424f2632015-07-09 13:08:35 +02001705 if (arvif->is_started)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001706 num++;
1707
1708 return num;
1709}
1710
Michal Kaziorad088bf2013-10-16 15:44:46 +03001711static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001712{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001713 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001714 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001715 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001716 enum wmi_sta_powersave_param param;
1717 enum wmi_sta_ps_mode psmode;
1718 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001719 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001720 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001721
Michal Kazior548db542013-07-05 16:15:15 +03001722 lockdep_assert_held(&arvif->ar->conf_mutex);
1723
Michal Kaziorad088bf2013-10-16 15:44:46 +03001724 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1725 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001726
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001727 enable_ps = arvif->ps;
1728
Michal Kazior424f2632015-07-09 13:08:35 +02001729 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001730 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1731 ar->fw_features)) {
1732 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1733 arvif->vdev_id);
1734 enable_ps = false;
1735 }
1736
Janusz Dziedzic917826b2015-05-18 09:38:17 +00001737 if (!arvif->is_started) {
1738 /* mac80211 can update vif powersave state while disconnected.
1739 * Firmware doesn't behave nicely and consumes more power than
1740 * necessary if PS is disabled on a non-started vdev. Hence
1741 * force-enable PS for non-running vdevs.
1742 */
1743 psmode = WMI_STA_PS_MODE_ENABLED;
1744 } else if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001745 psmode = WMI_STA_PS_MODE_ENABLED;
1746 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1747
Michal Kazior526549a2014-12-12 12:41:37 +01001748 ps_timeout = conf->dynamic_ps_timeout;
1749 if (ps_timeout == 0) {
1750 /* Firmware doesn't like 0 */
1751 ps_timeout = ieee80211_tu_to_usec(
1752 vif->bss_conf.beacon_int) / 1000;
1753 }
1754
Michal Kaziorad088bf2013-10-16 15:44:46 +03001755 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001756 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001757 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001758 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001759 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001760 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001761 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001762 } else {
1763 psmode = WMI_STA_PS_MODE_DISABLED;
1764 }
1765
Michal Kazior7aa7a722014-08-25 12:09:38 +02001766 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001767 arvif->vdev_id, psmode ? "enable" : "disable");
1768
Michal Kaziorad088bf2013-10-16 15:44:46 +03001769 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1770 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001771 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001772 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001773 return ret;
1774 }
1775
1776 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001777}
1778
Michal Kazior46725b152015-01-28 09:57:49 +02001779static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1780{
1781 struct ath10k *ar = arvif->ar;
1782 struct wmi_sta_keepalive_arg arg = {};
1783 int ret;
1784
1785 lockdep_assert_held(&arvif->ar->conf_mutex);
1786
1787 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1788 return 0;
1789
1790 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1791 return 0;
1792
1793 /* Some firmware revisions have a bug and ignore the `enabled` field.
1794 * Instead use the interval to disable the keepalive.
1795 */
1796 arg.vdev_id = arvif->vdev_id;
1797 arg.enabled = 1;
1798 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1799 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1800
1801 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1802 if (ret) {
1803 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1804 arvif->vdev_id, ret);
1805 return ret;
1806 }
1807
1808 return 0;
1809}
1810
Michal Kazior81a9a172015-03-05 16:02:17 +02001811static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1812{
1813 struct ath10k *ar = arvif->ar;
1814 struct ieee80211_vif *vif = arvif->vif;
1815 int ret;
1816
Michal Kazior8513d952015-03-09 14:19:24 +01001817 lockdep_assert_held(&arvif->ar->conf_mutex);
1818
1819 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1820 return;
1821
Michal Kazior81a9a172015-03-05 16:02:17 +02001822 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1823 return;
1824
1825 if (!vif->csa_active)
1826 return;
1827
1828 if (!arvif->is_up)
1829 return;
1830
1831 if (!ieee80211_csa_is_complete(vif)) {
1832 ieee80211_csa_update_counter(vif);
1833
1834 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1835 if (ret)
1836 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1837 ret);
1838
1839 ret = ath10k_mac_setup_prb_tmpl(arvif);
1840 if (ret)
1841 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1842 ret);
1843 } else {
1844 ieee80211_csa_finish(vif);
1845 }
1846}
1847
1848static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1849{
1850 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1851 ap_csa_work);
1852 struct ath10k *ar = arvif->ar;
1853
1854 mutex_lock(&ar->conf_mutex);
1855 ath10k_mac_vif_ap_csa_count_down(arvif);
1856 mutex_unlock(&ar->conf_mutex);
1857}
1858
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001859static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1860 struct ieee80211_vif *vif)
1861{
1862 struct sk_buff *skb = data;
1863 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1864 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1865
1866 if (vif->type != NL80211_IFTYPE_STATION)
1867 return;
1868
1869 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1870 return;
1871
1872 cancel_delayed_work(&arvif->connection_loss_work);
1873}
1874
1875void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1876{
1877 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1878 IEEE80211_IFACE_ITER_NORMAL,
1879 ath10k_mac_handle_beacon_iter,
1880 skb);
1881}
1882
1883static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1884 struct ieee80211_vif *vif)
1885{
1886 u32 *vdev_id = data;
1887 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1888 struct ath10k *ar = arvif->ar;
1889 struct ieee80211_hw *hw = ar->hw;
1890
1891 if (arvif->vdev_id != *vdev_id)
1892 return;
1893
1894 if (!arvif->is_up)
1895 return;
1896
1897 ieee80211_beacon_loss(vif);
1898
1899 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1900 * (done by mac80211) succeeds but beacons do not resume then it
1901 * doesn't make sense to continue operation. Queue connection loss work
1902 * which can be cancelled when beacon is received.
1903 */
1904 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1905 ATH10K_CONNECTION_LOSS_HZ);
1906}
1907
1908void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1909{
1910 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1911 IEEE80211_IFACE_ITER_NORMAL,
1912 ath10k_mac_handle_beacon_miss_iter,
1913 &vdev_id);
1914}
1915
1916static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1917{
1918 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1919 connection_loss_work.work);
1920 struct ieee80211_vif *vif = arvif->vif;
1921
1922 if (!arvif->is_up)
1923 return;
1924
1925 ieee80211_connection_loss(vif);
1926}
1927
Kalle Valo5e3dd152013-06-12 20:52:10 +03001928/**********************/
1929/* Station management */
1930/**********************/
1931
Michal Kazior590922a2014-10-21 10:10:29 +03001932static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1933 struct ieee80211_vif *vif)
1934{
1935 /* Some firmware revisions have unstable STA powersave when listen
1936 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1937 * generate NullFunc frames properly even if buffered frames have been
1938 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1939 * buffered frames. Often pinging the device from AP would simply fail.
1940 *
1941 * As a workaround set it to 1.
1942 */
1943 if (vif->type == NL80211_IFTYPE_STATION)
1944 return 1;
1945
1946 return ar->hw->conf.listen_interval;
1947}
1948
Kalle Valo5e3dd152013-06-12 20:52:10 +03001949static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001950 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001951 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001952 struct wmi_peer_assoc_complete_arg *arg)
1953{
Michal Kazior590922a2014-10-21 10:10:29 +03001954 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001955 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001956
Michal Kazior548db542013-07-05 16:15:15 +03001957 lockdep_assert_held(&ar->conf_mutex);
1958
Michal Kaziorc51880e2015-03-30 09:51:57 +03001959 if (vif->type == NL80211_IFTYPE_STATION)
1960 aid = vif->bss_conf.aid;
1961 else
1962 aid = sta->aid;
1963
Kalle Valob25f32c2014-09-14 12:50:49 +03001964 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001965 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001966 arg->peer_aid = aid;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02001967 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
Michal Kazior590922a2014-10-21 10:10:29 +03001968 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001969 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001970 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001971}
1972
1973static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001974 struct ieee80211_vif *vif,
Tamizh chelvam90eceb32015-10-29 14:27:42 +02001975 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001976 struct wmi_peer_assoc_complete_arg *arg)
1977{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001978 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001979 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001980 struct cfg80211_bss *bss;
1981 const u8 *rsnie = NULL;
1982 const u8 *wpaie = NULL;
1983
Michal Kazior548db542013-07-05 16:15:15 +03001984 lockdep_assert_held(&ar->conf_mutex);
1985
Michal Kazior500ff9f2015-03-31 10:26:21 +00001986 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1987 return;
1988
1989 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1990 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001991 if (bss) {
1992 const struct cfg80211_bss_ies *ies;
1993
1994 rcu_read_lock();
1995 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1996
1997 ies = rcu_dereference(bss->ies);
1998
1999 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03002000 WLAN_OUI_TYPE_MICROSOFT_WPA,
2001 ies->data,
2002 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002003 rcu_read_unlock();
2004 cfg80211_put_bss(ar->hw->wiphy, bss);
2005 }
2006
2007 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2008 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002009 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002010 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002011 }
2012
2013 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002014 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002015 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002016 }
Tamizh chelvam90eceb32015-10-29 14:27:42 +02002017
2018 if (sta->mfp &&
2019 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT, ar->fw_features)) {
2020 arg->peer_flags |= ar->wmi.peer_flags->pmf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002021 }
2022}
2023
2024static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002025 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002026 struct ieee80211_sta *sta,
2027 struct wmi_peer_assoc_complete_arg *arg)
2028{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002029 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002030 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002031 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002032 const struct ieee80211_supported_band *sband;
2033 const struct ieee80211_rate *rates;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002034 enum ieee80211_band band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002035 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03002036 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002037 int i;
2038
Michal Kazior548db542013-07-05 16:15:15 +03002039 lockdep_assert_held(&ar->conf_mutex);
2040
Michal Kazior500ff9f2015-03-31 10:26:21 +00002041 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2042 return;
2043
Michal Kazior45c9abc2015-04-21 20:42:58 +03002044 band = def.chan->band;
2045 sband = ar->hw->wiphy->bands[band];
2046 ratemask = sta->supp_rates[band];
2047 ratemask &= arvif->bitrate_mask.control[band].legacy;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002048 rates = sband->bitrates;
2049
2050 rateset->num_rates = 0;
2051
2052 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2053 if (!(ratemask & 1))
2054 continue;
2055
Michal Kazior486017c2015-03-30 09:51:54 +03002056 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2057 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002058 rateset->num_rates++;
2059 }
2060}
2061
Michal Kazior45c9abc2015-04-21 20:42:58 +03002062static bool
2063ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2064{
2065 int nss;
2066
2067 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2068 if (ht_mcs_mask[nss])
2069 return false;
2070
2071 return true;
2072}
2073
2074static bool
2075ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2076{
2077 int nss;
2078
2079 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2080 if (vht_mcs_mask[nss])
2081 return false;
2082
2083 return true;
2084}
2085
Kalle Valo5e3dd152013-06-12 20:52:10 +03002086static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
Michal Kazior45c9abc2015-04-21 20:42:58 +03002087 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002088 struct ieee80211_sta *sta,
2089 struct wmi_peer_assoc_complete_arg *arg)
2090{
2091 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002092 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2093 struct cfg80211_chan_def def;
2094 enum ieee80211_band band;
2095 const u8 *ht_mcs_mask;
2096 const u16 *vht_mcs_mask;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002097 int i, n;
2098 u8 max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002099 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002100
Michal Kazior548db542013-07-05 16:15:15 +03002101 lockdep_assert_held(&ar->conf_mutex);
2102
Michal Kazior45c9abc2015-04-21 20:42:58 +03002103 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2104 return;
2105
Kalle Valo5e3dd152013-06-12 20:52:10 +03002106 if (!ht_cap->ht_supported)
2107 return;
2108
Michal Kazior45c9abc2015-04-21 20:42:58 +03002109 band = def.chan->band;
2110 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2111 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2112
2113 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2114 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2115 return;
2116
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002117 arg->peer_flags |= ar->wmi.peer_flags->ht;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002118 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2119 ht_cap->ampdu_factor)) - 1;
2120
2121 arg->peer_mpdu_density =
2122 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2123
2124 arg->peer_ht_caps = ht_cap->cap;
2125 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2126
2127 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002128 arg->peer_flags |= ar->wmi.peer_flags->ldbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002129
2130 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002131 arg->peer_flags |= ar->wmi.peer_flags->bw40;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002132 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2133 }
2134
Michal Kazior45c9abc2015-04-21 20:42:58 +03002135 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2136 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2137 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002138
Michal Kazior45c9abc2015-04-21 20:42:58 +03002139 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2140 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2141 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002142
2143 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2144 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002145 arg->peer_flags |= ar->wmi.peer_flags->stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002146 }
2147
2148 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002149 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2150 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2151 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2152 arg->peer_rate_caps |= stbc;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002153 arg->peer_flags |= ar->wmi.peer_flags->stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002154 }
2155
Kalle Valo5e3dd152013-06-12 20:52:10 +03002156 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2157 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2158 else if (ht_cap->mcs.rx_mask[1])
2159 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2160
Michal Kazior45c9abc2015-04-21 20:42:58 +03002161 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2162 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2163 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2164 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002165 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002166 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002167
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002168 /*
2169 * This is a workaround for HT-enabled STAs which break the spec
2170 * and have no HT capabilities RX mask (no HT RX MCS map).
2171 *
2172 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2173 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2174 *
2175 * Firmware asserts if such situation occurs.
2176 */
2177 if (n == 0) {
2178 arg->peer_ht_rates.num_rates = 8;
2179 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2180 arg->peer_ht_rates.rates[i] = i;
2181 } else {
2182 arg->peer_ht_rates.num_rates = n;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002183 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002184 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002185
Michal Kazior7aa7a722014-08-25 12:09:38 +02002186 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002187 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002188 arg->peer_ht_rates.num_rates,
2189 arg->peer_num_spatial_streams);
2190}
2191
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002192static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2193 struct ath10k_vif *arvif,
2194 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002195{
2196 u32 uapsd = 0;
2197 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002198 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002199
Michal Kazior548db542013-07-05 16:15:15 +03002200 lockdep_assert_held(&ar->conf_mutex);
2201
Kalle Valo5e3dd152013-06-12 20:52:10 +03002202 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002203 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002204 sta->uapsd_queues, sta->max_sp);
2205
Kalle Valo5e3dd152013-06-12 20:52:10 +03002206 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2207 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2208 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2209 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2210 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2211 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2212 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2213 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2214 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2215 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2216 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2217 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2218
Kalle Valo5e3dd152013-06-12 20:52:10 +03002219 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2220 max_sp = sta->max_sp;
2221
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002222 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2223 sta->addr,
2224 WMI_AP_PS_PEER_PARAM_UAPSD,
2225 uapsd);
2226 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002227 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002228 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002229 return ret;
2230 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002231
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002232 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2233 sta->addr,
2234 WMI_AP_PS_PEER_PARAM_MAX_SP,
2235 max_sp);
2236 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002237 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002238 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002239 return ret;
2240 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002241
2242 /* TODO setup this based on STA listen interval and
2243 beacon interval. Currently we don't know
2244 sta->listen_interval - mac80211 patch required.
2245 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002246 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002247 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2248 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002249 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002250 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002251 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002252 return ret;
2253 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002254 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002255
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002256 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002257}
2258
Michal Kazior45c9abc2015-04-21 20:42:58 +03002259static u16
2260ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2261 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2262{
2263 int idx_limit;
2264 int nss;
2265 u16 mcs_map;
2266 u16 mcs;
2267
2268 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2269 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2270 vht_mcs_limit[nss];
2271
2272 if (mcs_map)
2273 idx_limit = fls(mcs_map) - 1;
2274 else
2275 idx_limit = -1;
2276
2277 switch (idx_limit) {
2278 case 0: /* fall through */
2279 case 1: /* fall through */
2280 case 2: /* fall through */
2281 case 3: /* fall through */
2282 case 4: /* fall through */
2283 case 5: /* fall through */
2284 case 6: /* fall through */
2285 default:
2286 /* see ath10k_mac_can_set_bitrate_mask() */
2287 WARN_ON(1);
2288 /* fall through */
2289 case -1:
2290 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2291 break;
2292 case 7:
2293 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2294 break;
2295 case 8:
2296 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2297 break;
2298 case 9:
2299 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2300 break;
2301 }
2302
2303 tx_mcs_set &= ~(0x3 << (nss * 2));
2304 tx_mcs_set |= mcs << (nss * 2);
2305 }
2306
2307 return tx_mcs_set;
2308}
2309
Kalle Valo5e3dd152013-06-12 20:52:10 +03002310static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002311 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002312 struct ieee80211_sta *sta,
2313 struct wmi_peer_assoc_complete_arg *arg)
2314{
2315 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002316 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002317 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002318 enum ieee80211_band band;
2319 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002320 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002321
Michal Kazior500ff9f2015-03-31 10:26:21 +00002322 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2323 return;
2324
Kalle Valo5e3dd152013-06-12 20:52:10 +03002325 if (!vht_cap->vht_supported)
2326 return;
2327
Michal Kazior45c9abc2015-04-21 20:42:58 +03002328 band = def.chan->band;
2329 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2330
2331 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2332 return;
2333
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002334 arg->peer_flags |= ar->wmi.peer_flags->vht;
Yanbo Lid68bb122015-01-23 08:18:20 +08002335
Michal Kazior500ff9f2015-03-31 10:26:21 +00002336 if (def.chan->band == IEEE80211_BAND_2GHZ)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002337 arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
Yanbo Lid68bb122015-01-23 08:18:20 +08002338
Kalle Valo5e3dd152013-06-12 20:52:10 +03002339 arg->peer_vht_caps = vht_cap->cap;
2340
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002341 ampdu_factor = (vht_cap->cap &
2342 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2343 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2344
2345 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2346 * zero in VHT IE. Using it would result in degraded throughput.
2347 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2348 * it if VHT max_mpdu is smaller. */
2349 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2350 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2351 ampdu_factor)) - 1);
2352
Kalle Valo5e3dd152013-06-12 20:52:10 +03002353 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002354 arg->peer_flags |= ar->wmi.peer_flags->bw80;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002355
2356 arg->peer_vht_rates.rx_max_rate =
2357 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2358 arg->peer_vht_rates.rx_mcs_set =
2359 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2360 arg->peer_vht_rates.tx_max_rate =
2361 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002362 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2363 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002364
Michal Kazior7aa7a722014-08-25 12:09:38 +02002365 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002366 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002367}
2368
2369static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002370 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002371 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002372 struct wmi_peer_assoc_complete_arg *arg)
2373{
Michal Kazior590922a2014-10-21 10:10:29 +03002374 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2375
Kalle Valo5e3dd152013-06-12 20:52:10 +03002376 switch (arvif->vdev_type) {
2377 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002378 if (sta->wme)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002379 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002380
2381 if (sta->wme && sta->uapsd_queues) {
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002382 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002383 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2384 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002385 break;
2386 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002387 if (vif->bss_conf.qos)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002388 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002389 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002390 case WMI_VDEV_TYPE_IBSS:
2391 if (sta->wme)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002392 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002393 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002394 default:
2395 break;
2396 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002397
2398 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002399 sta->addr, !!(arg->peer_flags &
2400 arvif->ar->wmi.peer_flags->qos));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002401}
2402
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002403static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002404{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002405 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2406 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002407}
2408
Kalle Valo5e3dd152013-06-12 20:52:10 +03002409static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002410 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002411 struct ieee80211_sta *sta,
2412 struct wmi_peer_assoc_complete_arg *arg)
2413{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002414 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002415 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002416 enum ieee80211_band band;
2417 const u8 *ht_mcs_mask;
2418 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002419 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2420
Michal Kazior500ff9f2015-03-31 10:26:21 +00002421 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2422 return;
2423
Michal Kazior45c9abc2015-04-21 20:42:58 +03002424 band = def.chan->band;
2425 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2426 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2427
2428 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002429 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002430 if (sta->vht_cap.vht_supported &&
2431 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002432 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2433 phymode = MODE_11AC_VHT40;
2434 else
2435 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002436 } else if (sta->ht_cap.ht_supported &&
2437 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002438 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2439 phymode = MODE_11NG_HT40;
2440 else
2441 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002442 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002443 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002444 } else {
2445 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002446 }
2447
2448 break;
2449 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002450 /*
2451 * Check VHT first.
2452 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002453 if (sta->vht_cap.vht_supported &&
2454 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002455 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2456 phymode = MODE_11AC_VHT80;
2457 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2458 phymode = MODE_11AC_VHT40;
2459 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2460 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002461 } else if (sta->ht_cap.ht_supported &&
2462 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2463 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002464 phymode = MODE_11NA_HT40;
2465 else
2466 phymode = MODE_11NA_HT20;
2467 } else {
2468 phymode = MODE_11A;
2469 }
2470
2471 break;
2472 default:
2473 break;
2474 }
2475
Michal Kazior7aa7a722014-08-25 12:09:38 +02002476 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002477 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002478
Kalle Valo5e3dd152013-06-12 20:52:10 +03002479 arg->peer_phymode = phymode;
2480 WARN_ON(phymode == MODE_UNKNOWN);
2481}
2482
Kalle Valob9ada652013-10-16 15:44:46 +03002483static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002484 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002485 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002486 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002487{
Michal Kazior548db542013-07-05 16:15:15 +03002488 lockdep_assert_held(&ar->conf_mutex);
2489
Kalle Valob9ada652013-10-16 15:44:46 +03002490 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002491
Michal Kazior590922a2014-10-21 10:10:29 +03002492 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
Tamizh chelvam90eceb32015-10-29 14:27:42 +02002493 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002494 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002495 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002496 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002497 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2498 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002499
Kalle Valob9ada652013-10-16 15:44:46 +03002500 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002501}
2502
Michal Kazior90046f52014-02-14 14:45:51 +01002503static const u32 ath10k_smps_map[] = {
2504 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2505 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2506 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2507 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2508};
2509
2510static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2511 const u8 *addr,
2512 const struct ieee80211_sta_ht_cap *ht_cap)
2513{
2514 int smps;
2515
2516 if (!ht_cap->ht_supported)
2517 return 0;
2518
2519 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2520 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2521
2522 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2523 return -EINVAL;
2524
2525 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2526 WMI_PEER_SMPS_STATE,
2527 ath10k_smps_map[smps]);
2528}
2529
Michal Kazior139e1702015-02-15 16:50:42 +02002530static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2531 struct ieee80211_vif *vif,
2532 struct ieee80211_sta_vht_cap vht_cap)
2533{
2534 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2535 int ret;
2536 u32 param;
2537 u32 value;
2538
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302539 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2540 return 0;
2541
Michal Kazior139e1702015-02-15 16:50:42 +02002542 if (!(ar->vht_cap_info &
2543 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2544 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2545 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2546 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2547 return 0;
2548
2549 param = ar->wmi.vdev_param->txbf;
2550 value = 0;
2551
2552 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2553 return 0;
2554
2555 /* The following logic is correct. If a remote STA advertises support
2556 * for being a beamformer then we should enable us being a beamformee.
2557 */
2558
2559 if (ar->vht_cap_info &
2560 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2561 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2562 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2563 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2564
2565 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2566 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2567 }
2568
2569 if (ar->vht_cap_info &
2570 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2571 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2572 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2573 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2574
2575 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2576 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2577 }
2578
2579 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2580 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2581
2582 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2583 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2584
2585 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2586 if (ret) {
2587 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2588 value, ret);
2589 return ret;
2590 }
2591
2592 return 0;
2593}
2594
Kalle Valo5e3dd152013-06-12 20:52:10 +03002595/* can be called only in mac80211 callbacks due to `key_count` usage */
2596static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2597 struct ieee80211_vif *vif,
2598 struct ieee80211_bss_conf *bss_conf)
2599{
2600 struct ath10k *ar = hw->priv;
2601 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002602 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002603 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002604 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002605 struct ieee80211_sta *ap_sta;
2606 int ret;
2607
Michal Kazior548db542013-07-05 16:15:15 +03002608 lockdep_assert_held(&ar->conf_mutex);
2609
Michal Kazior077efc82014-10-21 10:10:29 +03002610 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2611 arvif->vdev_id, arvif->bssid, arvif->aid);
2612
Kalle Valo5e3dd152013-06-12 20:52:10 +03002613 rcu_read_lock();
2614
2615 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2616 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002617 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002618 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002619 rcu_read_unlock();
2620 return;
2621 }
2622
Michal Kazior90046f52014-02-14 14:45:51 +01002623 /* ap_sta must be accessed only within rcu section which must be left
2624 * before calling ath10k_setup_peer_smps() which might sleep. */
2625 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002626 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002627
Michal Kazior590922a2014-10-21 10:10:29 +03002628 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002629 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002630 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002631 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002632 rcu_read_unlock();
2633 return;
2634 }
2635
2636 rcu_read_unlock();
2637
Kalle Valob9ada652013-10-16 15:44:46 +03002638 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2639 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002640 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002641 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002642 return;
2643 }
2644
Michal Kazior90046f52014-02-14 14:45:51 +01002645 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2646 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002647 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002648 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002649 return;
2650 }
2651
Michal Kazior139e1702015-02-15 16:50:42 +02002652 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2653 if (ret) {
2654 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2655 arvif->vdev_id, bss_conf->bssid, ret);
2656 return;
2657 }
2658
Michal Kazior7aa7a722014-08-25 12:09:38 +02002659 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002660 "mac vdev %d up (associated) bssid %pM aid %d\n",
2661 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2662
Michal Kazior077efc82014-10-21 10:10:29 +03002663 WARN_ON(arvif->is_up);
2664
Michal Kaziorc930f742014-01-23 11:38:25 +01002665 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002666 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002667
2668 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2669 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002670 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002671 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002672 return;
2673 }
2674
2675 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002676
2677 /* Workaround: Some firmware revisions (tested with qca6174
2678 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2679 * poked with peer param command.
2680 */
2681 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2682 WMI_PEER_DUMMY_VAR, 1);
2683 if (ret) {
2684 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2685 arvif->bssid, arvif->vdev_id, ret);
2686 return;
2687 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002688}
2689
Kalle Valo5e3dd152013-06-12 20:52:10 +03002690static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2691 struct ieee80211_vif *vif)
2692{
2693 struct ath10k *ar = hw->priv;
2694 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002695 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002696 int ret;
2697
Michal Kazior548db542013-07-05 16:15:15 +03002698 lockdep_assert_held(&ar->conf_mutex);
2699
Michal Kazior077efc82014-10-21 10:10:29 +03002700 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2701 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002702
Kalle Valo5e3dd152013-06-12 20:52:10 +03002703 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002704 if (ret)
2705 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2706 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002707
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002708 arvif->def_wep_key_idx = -1;
2709
Michal Kazior139e1702015-02-15 16:50:42 +02002710 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2711 if (ret) {
2712 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2713 arvif->vdev_id, ret);
2714 return;
2715 }
2716
Michal Kaziorc930f742014-01-23 11:38:25 +01002717 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002718
2719 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002720}
2721
Michal Kazior590922a2014-10-21 10:10:29 +03002722static int ath10k_station_assoc(struct ath10k *ar,
2723 struct ieee80211_vif *vif,
2724 struct ieee80211_sta *sta,
2725 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002726{
Michal Kazior590922a2014-10-21 10:10:29 +03002727 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002728 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002729 int ret = 0;
2730
Michal Kazior548db542013-07-05 16:15:15 +03002731 lockdep_assert_held(&ar->conf_mutex);
2732
Michal Kazior590922a2014-10-21 10:10:29 +03002733 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002734 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002735 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002736 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002737 return ret;
2738 }
2739
2740 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2741 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002742 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002743 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002744 return ret;
2745 }
2746
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002747 /* Re-assoc is run only to update supported rates for given station. It
2748 * doesn't make much sense to reconfigure the peer completely.
2749 */
2750 if (!reassoc) {
2751 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2752 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002753 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002754 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002755 arvif->vdev_id, ret);
2756 return ret;
2757 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002758
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002759 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2760 if (ret) {
2761 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2762 sta->addr, arvif->vdev_id, ret);
2763 return ret;
2764 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002765
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002766 if (!sta->wme) {
2767 arvif->num_legacy_stations++;
2768 ret = ath10k_recalc_rtscts_prot(arvif);
2769 if (ret) {
2770 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2771 arvif->vdev_id, ret);
2772 return ret;
2773 }
2774 }
2775
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002776 /* Plumb cached keys only for static WEP */
2777 if (arvif->def_wep_key_idx != -1) {
2778 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2779 if (ret) {
2780 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2781 arvif->vdev_id, ret);
2782 return ret;
2783 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002784 }
2785 }
2786
Kalle Valo5e3dd152013-06-12 20:52:10 +03002787 return ret;
2788}
2789
Michal Kazior590922a2014-10-21 10:10:29 +03002790static int ath10k_station_disassoc(struct ath10k *ar,
2791 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002792 struct ieee80211_sta *sta)
2793{
Michal Kazior590922a2014-10-21 10:10:29 +03002794 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002795 int ret = 0;
2796
2797 lockdep_assert_held(&ar->conf_mutex);
2798
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002799 if (!sta->wme) {
2800 arvif->num_legacy_stations--;
2801 ret = ath10k_recalc_rtscts_prot(arvif);
2802 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002803 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002804 arvif->vdev_id, ret);
2805 return ret;
2806 }
2807 }
2808
Kalle Valo5e3dd152013-06-12 20:52:10 +03002809 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2810 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002811 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002812 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002813 return ret;
2814 }
2815
2816 return ret;
2817}
2818
2819/**************/
2820/* Regulatory */
2821/**************/
2822
2823static int ath10k_update_channel_list(struct ath10k *ar)
2824{
2825 struct ieee80211_hw *hw = ar->hw;
2826 struct ieee80211_supported_band **bands;
2827 enum ieee80211_band band;
2828 struct ieee80211_channel *channel;
2829 struct wmi_scan_chan_list_arg arg = {0};
2830 struct wmi_channel_arg *ch;
2831 bool passive;
2832 int len;
2833 int ret;
2834 int i;
2835
Michal Kazior548db542013-07-05 16:15:15 +03002836 lockdep_assert_held(&ar->conf_mutex);
2837
Kalle Valo5e3dd152013-06-12 20:52:10 +03002838 bands = hw->wiphy->bands;
2839 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2840 if (!bands[band])
2841 continue;
2842
2843 for (i = 0; i < bands[band]->n_channels; i++) {
2844 if (bands[band]->channels[i].flags &
2845 IEEE80211_CHAN_DISABLED)
2846 continue;
2847
2848 arg.n_channels++;
2849 }
2850 }
2851
2852 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2853 arg.channels = kzalloc(len, GFP_KERNEL);
2854 if (!arg.channels)
2855 return -ENOMEM;
2856
2857 ch = arg.channels;
2858 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2859 if (!bands[band])
2860 continue;
2861
2862 for (i = 0; i < bands[band]->n_channels; i++) {
2863 channel = &bands[band]->channels[i];
2864
2865 if (channel->flags & IEEE80211_CHAN_DISABLED)
2866 continue;
2867
2868 ch->allow_ht = true;
2869
2870 /* FIXME: when should we really allow VHT? */
2871 ch->allow_vht = true;
2872
2873 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002874 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002875
2876 ch->ht40plus =
2877 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2878
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002879 ch->chan_radar =
2880 !!(channel->flags & IEEE80211_CHAN_RADAR);
2881
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002882 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002883 ch->passive = passive;
2884
2885 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002886 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002887 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002888 ch->max_power = channel->max_power * 2;
2889 ch->max_reg_power = channel->max_reg_power * 2;
2890 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002891 ch->reg_class_id = 0; /* FIXME */
2892
2893 /* FIXME: why use only legacy modes, why not any
2894 * HT/VHT modes? Would that even make any
2895 * difference? */
2896 if (channel->band == IEEE80211_BAND_2GHZ)
2897 ch->mode = MODE_11G;
2898 else
2899 ch->mode = MODE_11A;
2900
2901 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2902 continue;
2903
Michal Kazior7aa7a722014-08-25 12:09:38 +02002904 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002905 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2906 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002907 ch->freq, ch->max_power, ch->max_reg_power,
2908 ch->max_antenna_gain, ch->mode);
2909
2910 ch++;
2911 }
2912 }
2913
2914 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2915 kfree(arg.channels);
2916
2917 return ret;
2918}
2919
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002920static enum wmi_dfs_region
2921ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2922{
2923 switch (dfs_region) {
2924 case NL80211_DFS_UNSET:
2925 return WMI_UNINIT_DFS_DOMAIN;
2926 case NL80211_DFS_FCC:
2927 return WMI_FCC_DFS_DOMAIN;
2928 case NL80211_DFS_ETSI:
2929 return WMI_ETSI_DFS_DOMAIN;
2930 case NL80211_DFS_JP:
2931 return WMI_MKK4_DFS_DOMAIN;
2932 }
2933 return WMI_UNINIT_DFS_DOMAIN;
2934}
2935
Michal Kaziorf7843d72013-07-16 09:38:52 +02002936static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002937{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002938 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002939 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002940 enum wmi_dfs_region wmi_dfs_reg;
2941 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002942
Michal Kaziorf7843d72013-07-16 09:38:52 +02002943 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002944
2945 ret = ath10k_update_channel_list(ar);
2946 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002947 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002948
2949 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002950
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002951 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2952 nl_dfs_reg = ar->dfs_detector->region;
2953 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2954 } else {
2955 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2956 }
2957
Kalle Valo5e3dd152013-06-12 20:52:10 +03002958 /* Target allows setting up per-band regdomain but ath_common provides
2959 * a combined one only */
2960 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002961 regpair->reg_domain,
2962 regpair->reg_domain, /* 2ghz */
2963 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002964 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002965 regpair->reg_5ghz_ctl,
2966 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002967 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002968 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002969}
Michal Kazior548db542013-07-05 16:15:15 +03002970
Michal Kaziorf7843d72013-07-16 09:38:52 +02002971static void ath10k_reg_notifier(struct wiphy *wiphy,
2972 struct regulatory_request *request)
2973{
2974 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2975 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002976 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002977
2978 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2979
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002980 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002981 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002982 request->dfs_region);
2983 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2984 request->dfs_region);
2985 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002986 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002987 request->dfs_region);
2988 }
2989
Michal Kaziorf7843d72013-07-16 09:38:52 +02002990 mutex_lock(&ar->conf_mutex);
2991 if (ar->state == ATH10K_STATE_ON)
2992 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002993 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002994}
2995
2996/***************/
2997/* TX handlers */
2998/***************/
2999
Michal Kazior96d828d2015-03-31 10:26:23 +00003000void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3001{
3002 lockdep_assert_held(&ar->htt.tx_lock);
3003
3004 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3005 ar->tx_paused |= BIT(reason);
3006 ieee80211_stop_queues(ar->hw);
3007}
3008
3009static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3010 struct ieee80211_vif *vif)
3011{
3012 struct ath10k *ar = data;
3013 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3014
3015 if (arvif->tx_paused)
3016 return;
3017
3018 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3019}
3020
3021void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3022{
3023 lockdep_assert_held(&ar->htt.tx_lock);
3024
3025 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3026 ar->tx_paused &= ~BIT(reason);
3027
3028 if (ar->tx_paused)
3029 return;
3030
3031 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3032 IEEE80211_IFACE_ITER_RESUME_ALL,
3033 ath10k_mac_tx_unlock_iter,
3034 ar);
Michal Kazior3a73d1a2015-08-06 14:46:54 +02003035
3036 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
Michal Kazior96d828d2015-03-31 10:26:23 +00003037}
3038
3039void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3040{
3041 struct ath10k *ar = arvif->ar;
3042
3043 lockdep_assert_held(&ar->htt.tx_lock);
3044
3045 WARN_ON(reason >= BITS_PER_LONG);
3046 arvif->tx_paused |= BIT(reason);
3047 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3048}
3049
3050void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3051{
3052 struct ath10k *ar = arvif->ar;
3053
3054 lockdep_assert_held(&ar->htt.tx_lock);
3055
3056 WARN_ON(reason >= BITS_PER_LONG);
3057 arvif->tx_paused &= ~BIT(reason);
3058
3059 if (ar->tx_paused)
3060 return;
3061
3062 if (arvif->tx_paused)
3063 return;
3064
3065 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3066}
3067
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003068static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3069 enum wmi_tlv_tx_pause_id pause_id,
3070 enum wmi_tlv_tx_pause_action action)
3071{
3072 struct ath10k *ar = arvif->ar;
3073
3074 lockdep_assert_held(&ar->htt.tx_lock);
3075
Michal Kazioracd0b272015-07-09 13:08:38 +02003076 switch (action) {
3077 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3078 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003079 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003080 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3081 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3082 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003083 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003084 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3085 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003086 break;
3087 }
3088}
3089
3090struct ath10k_mac_tx_pause {
3091 u32 vdev_id;
3092 enum wmi_tlv_tx_pause_id pause_id;
3093 enum wmi_tlv_tx_pause_action action;
3094};
3095
3096static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3097 struct ieee80211_vif *vif)
3098{
3099 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3100 struct ath10k_mac_tx_pause *arg = data;
3101
Michal Kazioracd0b272015-07-09 13:08:38 +02003102 if (arvif->vdev_id != arg->vdev_id)
3103 return;
3104
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003105 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3106}
3107
Michal Kazioracd0b272015-07-09 13:08:38 +02003108void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3109 enum wmi_tlv_tx_pause_id pause_id,
3110 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003111{
3112 struct ath10k_mac_tx_pause arg = {
3113 .vdev_id = vdev_id,
3114 .pause_id = pause_id,
3115 .action = action,
3116 };
3117
3118 spin_lock_bh(&ar->htt.tx_lock);
3119 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3120 IEEE80211_IFACE_ITER_RESUME_ALL,
3121 ath10k_mac_handle_tx_pause_iter,
3122 &arg);
3123 spin_unlock_bh(&ar->htt.tx_lock);
3124}
3125
Michal Kaziord740d8f2015-03-30 09:51:51 +03003126static enum ath10k_hw_txrx_mode
Michal Kazior6a2636d2015-11-18 06:59:16 +01003127ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3128 struct ieee80211_vif *vif,
3129 struct ieee80211_sta *sta,
3130 struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003131{
3132 const struct ieee80211_hdr *hdr = (void *)skb->data;
3133 __le16 fc = hdr->frame_control;
3134
3135 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3136 return ATH10K_HW_TXRX_RAW;
3137
3138 if (ieee80211_is_mgmt(fc))
3139 return ATH10K_HW_TXRX_MGMT;
3140
3141 /* Workaround:
3142 *
3143 * NullFunc frames are mostly used to ping if a client or AP are still
3144 * reachable and responsive. This implies tx status reports must be
3145 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3146 * come to a conclusion that the other end disappeared and tear down
3147 * BSS connection or it can never disconnect from BSS/client (which is
3148 * the case).
3149 *
3150 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3151 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3152 * which seems to deliver correct tx reports for NullFunc frames. The
3153 * downside of using it is it ignores client powersave state so it can
3154 * end up disconnecting sleeping clients in AP mode. It should fix STA
3155 * mode though because AP don't sleep.
3156 */
3157 if (ar->htt.target_version_major < 3 &&
3158 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3159 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3160 return ATH10K_HW_TXRX_MGMT;
3161
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003162 /* Workaround:
3163 *
3164 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3165 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3166 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003167 *
3168 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003169 */
3170 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3171 return ATH10K_HW_TXRX_ETHERNET;
3172
David Liuccec9032015-07-24 20:25:32 +03003173 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3174 return ATH10K_HW_TXRX_RAW;
3175
Michal Kaziord740d8f2015-03-30 09:51:51 +03003176 return ATH10K_HW_TXRX_NATIVE_WIFI;
3177}
3178
David Liuccec9032015-07-24 20:25:32 +03003179static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003180 struct sk_buff *skb)
3181{
3182 const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3183 const struct ieee80211_hdr *hdr = (void *)skb->data;
David Liuccec9032015-07-24 20:25:32 +03003184 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3185 IEEE80211_TX_CTL_INJECTED;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003186
3187 if (!ieee80211_has_protected(hdr->frame_control))
3188 return false;
3189
David Liuccec9032015-07-24 20:25:32 +03003190 if ((info->flags & mask) == mask)
3191 return false;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003192
David Liuccec9032015-07-24 20:25:32 +03003193 if (vif)
3194 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003195
David Liuccec9032015-07-24 20:25:32 +03003196 return true;
3197}
3198
Michal Kazior4b604552014-07-21 21:03:09 +03003199/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3200 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003201 */
Michal Kazior4b604552014-07-21 21:03:09 +03003202static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003203{
3204 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003205 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003206 u8 *qos_ctl;
3207
3208 if (!ieee80211_is_data_qos(hdr->frame_control))
3209 return;
3210
3211 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003212 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3213 skb->data, (void *)qos_ctl - (void *)skb->data);
3214 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003215
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003216 /* Some firmware revisions don't handle sending QoS NullFunc well.
3217 * These frames are mainly used for CQM purposes so it doesn't really
3218 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003219 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003220 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003221 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kazior609db222015-11-18 06:59:22 +01003222 cb->flags &= ~ATH10K_SKB_F_QOS;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003223
3224 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003225}
3226
Michal Kaziord740d8f2015-03-30 09:51:51 +03003227static void ath10k_tx_h_8023(struct sk_buff *skb)
3228{
3229 struct ieee80211_hdr *hdr;
3230 struct rfc1042_hdr *rfc1042;
3231 struct ethhdr *eth;
3232 size_t hdrlen;
3233 u8 da[ETH_ALEN];
3234 u8 sa[ETH_ALEN];
3235 __be16 type;
3236
3237 hdr = (void *)skb->data;
3238 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3239 rfc1042 = (void *)skb->data + hdrlen;
3240
3241 ether_addr_copy(da, ieee80211_get_DA(hdr));
3242 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3243 type = rfc1042->snap_type;
3244
3245 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3246 skb_push(skb, sizeof(*eth));
3247
3248 eth = (void *)skb->data;
3249 ether_addr_copy(eth->h_dest, da);
3250 ether_addr_copy(eth->h_source, sa);
3251 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003252}
3253
Michal Kazior4b604552014-07-21 21:03:09 +03003254static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3255 struct ieee80211_vif *vif,
3256 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003257{
3258 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003259 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3260
3261 /* This is case only for P2P_GO */
3262 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3263 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3264 return;
3265
3266 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3267 spin_lock_bh(&ar->data_lock);
3268 if (arvif->u.ap.noa_data)
3269 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3270 GFP_ATOMIC))
3271 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3272 arvif->u.ap.noa_data,
3273 arvif->u.ap.noa_len);
3274 spin_unlock_bh(&ar->data_lock);
3275 }
3276}
3277
Vasanthakumar Thiagarajand39de992015-11-05 11:34:00 +05303278bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
Michal Kazior8d6d3622014-11-24 14:58:31 +01003279{
3280 /* FIXME: Not really sure since when the behaviour changed. At some
3281 * point new firmware stopped requiring creation of peer entries for
3282 * offchannel tx (and actually creating them causes issues with wmi-htc
3283 * tx credit replenishment and reliability). Assuming it's at least 3.4
3284 * because that's when the `freq` was introduced to TX_FRM HTT command.
3285 */
Vasanthakumar Thiagarajan8921f5f2015-11-05 11:33:59 +05303286 return (ar->htt.target_version_major >= 3 &&
Vasanthakumar Thiagarajand39de992015-11-05 11:34:00 +05303287 ar->htt.target_version_minor >= 4 &&
3288 ar->htt.op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003289}
3290
Michal Kaziord740d8f2015-03-30 09:51:51 +03003291static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003292{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003293 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003294 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003295
Michal Kaziord740d8f2015-03-30 09:51:51 +03003296 spin_lock_bh(&ar->data_lock);
3297
3298 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3299 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3300 ret = -ENOSPC;
3301 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003302 }
3303
Michal Kaziord740d8f2015-03-30 09:51:51 +03003304 __skb_queue_tail(q, skb);
3305 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3306
3307unlock:
3308 spin_unlock_bh(&ar->data_lock);
3309
3310 return ret;
3311}
3312
Michal Kazior8a933962015-11-18 06:59:17 +01003313static void ath10k_mac_tx(struct ath10k *ar, enum ath10k_hw_txrx_mode txmode,
3314 struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003315{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003316 struct ath10k_htt *htt = &ar->htt;
3317 int ret = 0;
3318
Michal Kazior8a933962015-11-18 06:59:17 +01003319 switch (txmode) {
Michal Kaziord740d8f2015-03-30 09:51:51 +03003320 case ATH10K_HW_TXRX_RAW:
3321 case ATH10K_HW_TXRX_NATIVE_WIFI:
3322 case ATH10K_HW_TXRX_ETHERNET:
Michal Kazior8a933962015-11-18 06:59:17 +01003323 ret = ath10k_htt_tx(htt, txmode, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003324 break;
3325 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003326 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003327 ar->fw_features))
3328 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3329 else if (ar->htt.target_version_major >= 3)
Michal Kazior8a933962015-11-18 06:59:17 +01003330 ret = ath10k_htt_tx(htt, txmode, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003331 else
3332 ret = ath10k_htt_mgmt_tx(htt, skb);
3333 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003334 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003335
3336 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003337 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3338 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003339 ieee80211_free_txskb(ar->hw, skb);
3340 }
3341}
3342
3343void ath10k_offchan_tx_purge(struct ath10k *ar)
3344{
3345 struct sk_buff *skb;
3346
3347 for (;;) {
3348 skb = skb_dequeue(&ar->offchan_tx_queue);
3349 if (!skb)
3350 break;
3351
3352 ieee80211_free_txskb(ar->hw, skb);
3353 }
3354}
3355
3356void ath10k_offchan_tx_work(struct work_struct *work)
3357{
3358 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3359 struct ath10k_peer *peer;
Michal Kazior8a933962015-11-18 06:59:17 +01003360 struct ath10k_vif *arvif;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003361 struct ieee80211_hdr *hdr;
Michal Kazior8a933962015-11-18 06:59:17 +01003362 struct ieee80211_vif *vif;
3363 struct ieee80211_sta *sta;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003364 struct sk_buff *skb;
3365 const u8 *peer_addr;
Michal Kazior8a933962015-11-18 06:59:17 +01003366 enum ath10k_hw_txrx_mode txmode;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003367 int vdev_id;
3368 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003369 unsigned long time_left;
Michal Kazioradaeed72015-08-05 12:15:23 +02003370 bool tmp_peer_created = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003371
3372 /* FW requirement: We must create a peer before FW will send out
3373 * an offchannel frame. Otherwise the frame will be stuck and
3374 * never transmitted. We delete the peer upon tx completion.
3375 * It is unlikely that a peer for offchannel tx will already be
3376 * present. However it may be in some rare cases so account for that.
3377 * Otherwise we might remove a legitimate peer and break stuff. */
3378
3379 for (;;) {
3380 skb = skb_dequeue(&ar->offchan_tx_queue);
3381 if (!skb)
3382 break;
3383
3384 mutex_lock(&ar->conf_mutex);
3385
Michal Kazior7aa7a722014-08-25 12:09:38 +02003386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003387 skb);
3388
3389 hdr = (struct ieee80211_hdr *)skb->data;
3390 peer_addr = ieee80211_get_DA(hdr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003391
3392 spin_lock_bh(&ar->data_lock);
Michal Kazior609db222015-11-18 06:59:22 +01003393 vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003394 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3395 spin_unlock_bh(&ar->data_lock);
3396
3397 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003398 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003399 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003400 peer_addr, vdev_id);
3401
3402 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003403 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3404 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003405 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003406 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003407 peer_addr, vdev_id, ret);
Michal Kazioradaeed72015-08-05 12:15:23 +02003408 tmp_peer_created = (ret == 0);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003409 }
3410
3411 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003412 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003413 ar->offchan_tx_skb = skb;
3414 spin_unlock_bh(&ar->data_lock);
3415
Michal Kazior8a933962015-11-18 06:59:17 +01003416 /* It's safe to access vif and sta - conf_mutex guarantees that
3417 * sta_state() and remove_interface() are locked exclusively
3418 * out wrt to this offchannel worker.
3419 */
3420 arvif = ath10k_get_arvif(ar, vdev_id);
3421 if (arvif) {
3422 vif = arvif->vif;
3423 sta = ieee80211_find_sta(vif, peer_addr);
3424 } else {
3425 vif = NULL;
3426 sta = NULL;
3427 }
3428
3429 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3430
3431 ath10k_mac_tx(ar, txmode, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003432
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003433 time_left =
3434 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3435 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003436 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003437 skb);
3438
Michal Kazioradaeed72015-08-05 12:15:23 +02003439 if (!peer && tmp_peer_created) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003440 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3441 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003442 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003443 peer_addr, vdev_id, ret);
3444 }
3445
3446 mutex_unlock(&ar->conf_mutex);
3447 }
3448}
3449
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003450void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3451{
3452 struct sk_buff *skb;
3453
3454 for (;;) {
3455 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3456 if (!skb)
3457 break;
3458
3459 ieee80211_free_txskb(ar->hw, skb);
3460 }
3461}
3462
3463void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3464{
3465 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3466 struct sk_buff *skb;
3467 int ret;
3468
3469 for (;;) {
3470 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3471 if (!skb)
3472 break;
3473
3474 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003475 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003476 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003477 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003478 ieee80211_free_txskb(ar->hw, skb);
3479 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003480 }
3481}
3482
Kalle Valo5e3dd152013-06-12 20:52:10 +03003483/************/
3484/* Scanning */
3485/************/
3486
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003487void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003488{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003489 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003490
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003491 switch (ar->scan.state) {
3492 case ATH10K_SCAN_IDLE:
3493 break;
3494 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003495 case ATH10K_SCAN_ABORTING:
3496 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003497 ieee80211_scan_completed(ar->hw,
3498 (ar->scan.state ==
3499 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003500 else if (ar->scan.roc_notify)
3501 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003502 /* fall through */
3503 case ATH10K_SCAN_STARTING:
3504 ar->scan.state = ATH10K_SCAN_IDLE;
3505 ar->scan_channel = NULL;
Michal Kaziorbd877442015-11-18 06:59:19 +01003506 ar->scan.roc_freq = 0;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003507 ath10k_offchan_tx_purge(ar);
3508 cancel_delayed_work(&ar->scan.timeout);
3509 complete_all(&ar->scan.completed);
3510 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003511 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003512}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003513
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003514void ath10k_scan_finish(struct ath10k *ar)
3515{
3516 spin_lock_bh(&ar->data_lock);
3517 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003518 spin_unlock_bh(&ar->data_lock);
3519}
3520
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003521static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003522{
3523 struct wmi_stop_scan_arg arg = {
3524 .req_id = 1, /* FIXME */
3525 .req_type = WMI_SCAN_STOP_ONE,
3526 .u.scan_id = ATH10K_SCAN_ID,
3527 };
3528 int ret;
3529
3530 lockdep_assert_held(&ar->conf_mutex);
3531
Kalle Valo5e3dd152013-06-12 20:52:10 +03003532 ret = ath10k_wmi_stop_scan(ar, &arg);
3533 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003534 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003535 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003536 }
3537
Kalle Valo5e3dd152013-06-12 20:52:10 +03003538 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003539 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003540 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003541 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003542 } else if (ret > 0) {
3543 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003544 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003545
3546out:
3547 /* Scan state should be updated upon scan completion but in case
3548 * firmware fails to deliver the event (for whatever reason) it is
3549 * desired to clean up scan state anyway. Firmware may have just
3550 * dropped the scan completion event delivery due to transport pipe
3551 * being overflown with data and/or it can recover on its own before
3552 * next scan request is submitted.
3553 */
3554 spin_lock_bh(&ar->data_lock);
3555 if (ar->scan.state != ATH10K_SCAN_IDLE)
3556 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003557 spin_unlock_bh(&ar->data_lock);
3558
3559 return ret;
3560}
3561
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003562static void ath10k_scan_abort(struct ath10k *ar)
3563{
3564 int ret;
3565
3566 lockdep_assert_held(&ar->conf_mutex);
3567
3568 spin_lock_bh(&ar->data_lock);
3569
3570 switch (ar->scan.state) {
3571 case ATH10K_SCAN_IDLE:
3572 /* This can happen if timeout worker kicked in and called
3573 * abortion while scan completion was being processed.
3574 */
3575 break;
3576 case ATH10K_SCAN_STARTING:
3577 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003578 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003579 ath10k_scan_state_str(ar->scan.state),
3580 ar->scan.state);
3581 break;
3582 case ATH10K_SCAN_RUNNING:
3583 ar->scan.state = ATH10K_SCAN_ABORTING;
3584 spin_unlock_bh(&ar->data_lock);
3585
3586 ret = ath10k_scan_stop(ar);
3587 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003588 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003589
3590 spin_lock_bh(&ar->data_lock);
3591 break;
3592 }
3593
3594 spin_unlock_bh(&ar->data_lock);
3595}
3596
3597void ath10k_scan_timeout_work(struct work_struct *work)
3598{
3599 struct ath10k *ar = container_of(work, struct ath10k,
3600 scan.timeout.work);
3601
3602 mutex_lock(&ar->conf_mutex);
3603 ath10k_scan_abort(ar);
3604 mutex_unlock(&ar->conf_mutex);
3605}
3606
Kalle Valo5e3dd152013-06-12 20:52:10 +03003607static int ath10k_start_scan(struct ath10k *ar,
3608 const struct wmi_start_scan_arg *arg)
3609{
3610 int ret;
3611
3612 lockdep_assert_held(&ar->conf_mutex);
3613
3614 ret = ath10k_wmi_start_scan(ar, arg);
3615 if (ret)
3616 return ret;
3617
Kalle Valo5e3dd152013-06-12 20:52:10 +03003618 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3619 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003620 ret = ath10k_scan_stop(ar);
3621 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003622 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003623
3624 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003625 }
3626
Ben Greear2f9eec02015-02-15 16:50:38 +02003627 /* If we failed to start the scan, return error code at
3628 * this point. This is probably due to some issue in the
3629 * firmware, but no need to wedge the driver due to that...
3630 */
3631 spin_lock_bh(&ar->data_lock);
3632 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3633 spin_unlock_bh(&ar->data_lock);
3634 return -EINVAL;
3635 }
3636 spin_unlock_bh(&ar->data_lock);
3637
Kalle Valo5e3dd152013-06-12 20:52:10 +03003638 return 0;
3639}
3640
3641/**********************/
3642/* mac80211 callbacks */
3643/**********************/
3644
3645static void ath10k_tx(struct ieee80211_hw *hw,
3646 struct ieee80211_tx_control *control,
3647 struct sk_buff *skb)
3648{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003649 struct ath10k *ar = hw->priv;
Michal Kazior66b8a012015-11-18 06:59:20 +01003650 struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003651 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3652 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003653 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003654 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kazior8a933962015-11-18 06:59:17 +01003655 enum ath10k_hw_txrx_mode txmode;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003656
3657 /* We should disable CCK RATE due to P2P */
3658 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003659 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003660
Michal Kazior8a933962015-11-18 06:59:17 +01003661 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003662
Michal Kazior66b8a012015-11-18 06:59:20 +01003663 skb_cb->flags = 0;
3664 if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3665 skb_cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3666
Michal Kaziord668dba2015-11-18 06:59:21 +01003667 if (ieee80211_is_mgmt(hdr->frame_control))
3668 skb_cb->flags |= ATH10K_SKB_F_MGMT;
3669
Michal Kazior609db222015-11-18 06:59:22 +01003670 if (ieee80211_is_data_qos(hdr->frame_control))
3671 skb_cb->flags |= ATH10K_SKB_F_QOS;
3672
3673 skb_cb->vif = vif;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003674
Michal Kazior8a933962015-11-18 06:59:17 +01003675 switch (txmode) {
Michal Kaziord740d8f2015-03-30 09:51:51 +03003676 case ATH10K_HW_TXRX_MGMT:
3677 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003678 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003679 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3680 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003681 break;
3682 case ATH10K_HW_TXRX_ETHERNET:
3683 ath10k_tx_h_8023(skb);
3684 break;
3685 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003686 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3687 WARN_ON_ONCE(1);
3688 ieee80211_free_txskb(hw, skb);
3689 return;
3690 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003691 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003692
Kalle Valo5e3dd152013-06-12 20:52:10 +03003693 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
Vasanthakumar Thiagarajan8921f5f2015-11-05 11:33:59 +05303694 if (!ath10k_mac_tx_frm_has_freq(ar)) {
Michal Kazior8d6d3622014-11-24 14:58:31 +01003695 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3696 skb);
3697
3698 skb_queue_tail(&ar->offchan_tx_queue, skb);
3699 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3700 return;
3701 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003702 }
3703
Michal Kazior8a933962015-11-18 06:59:17 +01003704 ath10k_mac_tx(ar, txmode, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003705}
3706
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003707/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003708void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003709{
3710 /* make sure rcu-protected mac80211 tx path itself is drained */
3711 synchronize_net();
3712
3713 ath10k_offchan_tx_purge(ar);
3714 ath10k_mgmt_over_wmi_tx_purge(ar);
3715
3716 cancel_work_sync(&ar->offchan_tx_work);
3717 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3718}
3719
Michal Kazioraffd3212013-07-16 09:54:35 +02003720void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003721{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003722 struct ath10k_vif *arvif;
3723
Michal Kazior818bdd12013-07-16 09:38:57 +02003724 lockdep_assert_held(&ar->conf_mutex);
3725
Michal Kazior19337472014-08-28 12:58:16 +02003726 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3727 ar->filter_flags = 0;
3728 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003729 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003730
3731 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003732 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003733
3734 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003735 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003736
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003737 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003738 ath10k_peer_cleanup_all(ar);
3739 ath10k_core_stop(ar);
3740 ath10k_hif_power_down(ar);
3741
3742 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003743 list_for_each_entry(arvif, &ar->arvifs, list)
3744 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003745 spin_unlock_bh(&ar->data_lock);
3746}
3747
Ben Greear46acf7b2014-05-16 17:15:38 +03003748static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3749{
3750 struct ath10k *ar = hw->priv;
3751
3752 mutex_lock(&ar->conf_mutex);
3753
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05303754 *tx_ant = ar->cfg_tx_chainmask;
3755 *rx_ant = ar->cfg_rx_chainmask;
Ben Greear46acf7b2014-05-16 17:15:38 +03003756
3757 mutex_unlock(&ar->conf_mutex);
3758
3759 return 0;
3760}
3761
Ben Greear5572a952014-11-24 16:22:10 +02003762static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3763{
3764 /* It is not clear that allowing gaps in chainmask
3765 * is helpful. Probably it will not do what user
3766 * is hoping for, so warn in that case.
3767 */
3768 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3769 return;
3770
3771 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3772 dbg, cm);
3773}
3774
Rajkumar Manoharanf58512f2015-10-27 17:51:13 +05303775static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
3776{
3777 int nsts = ar->vht_cap_info;
3778
3779 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3780 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3781
3782 /* If firmware does not deliver to host number of space-time
3783 * streams supported, assume it support up to 4 BF STS and return
3784 * the value for VHT CAP: nsts-1)
3785 */
3786 if (nsts == 0)
3787 return 3;
3788
3789 return nsts;
3790}
3791
3792static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
3793{
3794 int sound_dim = ar->vht_cap_info;
3795
3796 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3797 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3798
3799 /* If the sounding dimension is not advertised by the firmware,
3800 * let's use a default value of 1
3801 */
3802 if (sound_dim == 0)
3803 return 1;
3804
3805 return sound_dim;
3806}
3807
3808static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3809{
3810 struct ieee80211_sta_vht_cap vht_cap = {0};
3811 u16 mcs_map;
3812 u32 val;
3813 int i;
3814
3815 vht_cap.vht_supported = 1;
3816 vht_cap.cap = ar->vht_cap_info;
3817
3818 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
3819 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
3820 val = ath10k_mac_get_vht_cap_bf_sts(ar);
3821 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3822 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3823
3824 vht_cap.cap |= val;
3825 }
3826
3827 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
3828 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
3829 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
3830 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3831 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3832
3833 vht_cap.cap |= val;
3834 }
3835
3836 mcs_map = 0;
3837 for (i = 0; i < 8; i++) {
3838 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
3839 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
3840 else
3841 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
3842 }
3843
3844 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3845 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3846
3847 return vht_cap;
3848}
3849
3850static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3851{
3852 int i;
3853 struct ieee80211_sta_ht_cap ht_cap = {0};
3854
3855 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3856 return ht_cap;
3857
3858 ht_cap.ht_supported = 1;
3859 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3860 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3861 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3862 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
Peter Ohe33a99e2015-12-31 15:26:20 +02003863 ht_cap.cap |=
3864 WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
Rajkumar Manoharanf58512f2015-10-27 17:51:13 +05303865
3866 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3867 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3868
3869 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3870 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3871
3872 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3873 u32 smps;
3874
3875 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3876 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3877
3878 ht_cap.cap |= smps;
3879 }
3880
3881 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3882 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3883
3884 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3885 u32 stbc;
3886
3887 stbc = ar->ht_cap_info;
3888 stbc &= WMI_HT_CAP_RX_STBC;
3889 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3890 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3891 stbc &= IEEE80211_HT_CAP_RX_STBC;
3892
3893 ht_cap.cap |= stbc;
3894 }
3895
3896 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3897 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3898
3899 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3900 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3901
3902 /* max AMSDU is implicitly taken from vht_cap_info */
3903 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3904 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3905
3906 for (i = 0; i < ar->num_rf_chains; i++) {
3907 if (ar->cfg_rx_chainmask & BIT(i))
3908 ht_cap.mcs.rx_mask[i] = 0xFF;
3909 }
3910
3911 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3912
3913 return ht_cap;
3914}
3915
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05303916static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
3917{
3918 struct ieee80211_supported_band *band;
3919 struct ieee80211_sta_vht_cap vht_cap;
3920 struct ieee80211_sta_ht_cap ht_cap;
3921
3922 ht_cap = ath10k_get_ht_cap(ar);
3923 vht_cap = ath10k_create_vht_cap(ar);
3924
3925 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3926 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3927 band->ht_cap = ht_cap;
3928
3929 /* Enable the VHT support at 2.4 GHz */
3930 band->vht_cap = vht_cap;
3931 }
3932 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3933 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3934 band->ht_cap = ht_cap;
3935 band->vht_cap = vht_cap;
3936 }
3937}
3938
Ben Greear46acf7b2014-05-16 17:15:38 +03003939static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3940{
3941 int ret;
3942
3943 lockdep_assert_held(&ar->conf_mutex);
3944
Ben Greear5572a952014-11-24 16:22:10 +02003945 ath10k_check_chain_mask(ar, tx_ant, "tx");
3946 ath10k_check_chain_mask(ar, rx_ant, "rx");
3947
Ben Greear46acf7b2014-05-16 17:15:38 +03003948 ar->cfg_tx_chainmask = tx_ant;
3949 ar->cfg_rx_chainmask = rx_ant;
3950
3951 if ((ar->state != ATH10K_STATE_ON) &&
3952 (ar->state != ATH10K_STATE_RESTARTED))
3953 return 0;
3954
3955 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3956 tx_ant);
3957 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003958 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003959 ret, tx_ant);
3960 return ret;
3961 }
3962
3963 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3964 rx_ant);
3965 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003966 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003967 ret, rx_ant);
3968 return ret;
3969 }
3970
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05303971 /* Reload HT/VHT capability */
3972 ath10k_mac_setup_ht_vht_cap(ar);
3973
Ben Greear46acf7b2014-05-16 17:15:38 +03003974 return 0;
3975}
3976
3977static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3978{
3979 struct ath10k *ar = hw->priv;
3980 int ret;
3981
3982 mutex_lock(&ar->conf_mutex);
3983 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3984 mutex_unlock(&ar->conf_mutex);
3985 return ret;
3986}
3987
Kalle Valo5e3dd152013-06-12 20:52:10 +03003988static int ath10k_start(struct ieee80211_hw *hw)
3989{
3990 struct ath10k *ar = hw->priv;
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05303991 u32 param;
Michal Kazior818bdd12013-07-16 09:38:57 +02003992 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003993
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003994 /*
3995 * This makes sense only when restarting hw. It is harmless to call
3996 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3997 * commands will be submitted while restarting.
3998 */
3999 ath10k_drain_tx(ar);
4000
Michal Kazior548db542013-07-05 16:15:15 +03004001 mutex_lock(&ar->conf_mutex);
4002
Michal Kaziorc5058f52014-05-26 12:46:03 +03004003 switch (ar->state) {
4004 case ATH10K_STATE_OFF:
4005 ar->state = ATH10K_STATE_ON;
4006 break;
4007 case ATH10K_STATE_RESTARTING:
4008 ath10k_halt(ar);
4009 ar->state = ATH10K_STATE_RESTARTED;
4010 break;
4011 case ATH10K_STATE_ON:
4012 case ATH10K_STATE_RESTARTED:
4013 case ATH10K_STATE_WEDGED:
4014 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02004015 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03004016 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03004017 case ATH10K_STATE_UTF:
4018 ret = -EBUSY;
4019 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02004020 }
4021
4022 ret = ath10k_hif_power_up(ar);
4023 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004024 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004025 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02004026 }
4027
Kalle Valo43d2a302014-09-10 18:23:30 +03004028 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02004029 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004030 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004031 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02004032 }
4033
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05304034 param = ar->wmi.pdev_param->pmf_qos;
4035 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03004036 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004037 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004038 goto err_core_stop;
4039 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004040
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05304041 param = ar->wmi.pdev_param->dynamic_bw;
4042 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03004043 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004044 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004045 goto err_core_stop;
4046 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004047
Michal Kaziorcf327842015-03-31 10:26:25 +00004048 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
4049 ret = ath10k_wmi_adaptive_qcs(ar, true);
4050 if (ret) {
4051 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
4052 ret);
4053 goto err_core_stop;
4054 }
4055 }
4056
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03004057 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05304058 param = ar->wmi.pdev_param->burst_enable;
4059 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03004060 if (ret) {
4061 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
4062 goto err_core_stop;
4063 }
4064 }
4065
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05304066 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
Ben Greear46acf7b2014-05-16 17:15:38 +03004067
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004068 /*
4069 * By default FW set ARP frames ac to voice (6). In that case ARP
4070 * exchange is not working properly for UAPSD enabled AP. ARP requests
4071 * which arrives with access category 0 are processed by network stack
4072 * and send back with access category 0, but FW changes access category
4073 * to 6. Set ARP frames access category to best effort (0) solves
4074 * this problem.
4075 */
4076
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05304077 param = ar->wmi.pdev_param->arp_ac_override;
4078 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004079 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004080 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004081 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004082 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004083 }
4084
Maharaja62f77f02015-10-21 11:49:18 +03004085 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
4086 ar->fw_features)) {
4087 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
4088 WMI_CCA_DETECT_LEVEL_AUTO,
4089 WMI_CCA_DETECT_MARGIN_AUTO);
4090 if (ret) {
4091 ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
4092 ret);
4093 goto err_core_stop;
4094 }
4095 }
4096
Mohammed Shafi Shajakhan1fe374f2016-01-13 21:16:30 +05304097 param = ar->wmi.pdev_param->ani_enable;
4098 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05304099 if (ret) {
4100 ath10k_warn(ar, "failed to enable ani by default: %d\n",
4101 ret);
4102 goto err_core_stop;
4103 }
4104
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05304105 ar->ani_enabled = true;
4106
Mohammed Shafi Shajakhan8351c052016-01-13 21:16:33 +05304107 if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map)) {
4108 param = ar->wmi.pdev_param->peer_stats_update_period;
4109 ret = ath10k_wmi_pdev_set_param(ar, param,
4110 PEER_DEFAULT_STATS_UPDATE_PERIOD);
4111 if (ret) {
4112 ath10k_warn(ar,
4113 "failed to set peer stats period : %d\n",
4114 ret);
4115 goto err_core_stop;
4116 }
4117 }
4118
Michal Kaziord6500972014-04-08 09:56:09 +03004119 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02004120 ath10k_regd_update(ar);
4121
Simon Wunderlich855aed12014-08-02 09:12:54 +03004122 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05304123 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03004124
Michal Kaziorae254432014-05-26 12:46:02 +03004125 mutex_unlock(&ar->conf_mutex);
4126 return 0;
4127
4128err_core_stop:
4129 ath10k_core_stop(ar);
4130
4131err_power_down:
4132 ath10k_hif_power_down(ar);
4133
4134err_off:
4135 ar->state = ATH10K_STATE_OFF;
4136
4137err:
Michal Kazior548db542013-07-05 16:15:15 +03004138 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01004139 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004140}
4141
4142static void ath10k_stop(struct ieee80211_hw *hw)
4143{
4144 struct ath10k *ar = hw->priv;
4145
Michal Kaziorbca7baf2014-05-26 12:46:03 +03004146 ath10k_drain_tx(ar);
4147
Michal Kazior548db542013-07-05 16:15:15 +03004148 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03004149 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02004150 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03004151 ar->state = ATH10K_STATE_OFF;
4152 }
Michal Kazior548db542013-07-05 16:15:15 +03004153 mutex_unlock(&ar->conf_mutex);
4154
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004155 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02004156 cancel_work_sync(&ar->restart_work);
4157}
4158
Michal Kaziorad088bf2013-10-16 15:44:46 +03004159static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02004160{
Michal Kaziorad088bf2013-10-16 15:44:46 +03004161 struct ath10k_vif *arvif;
4162 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02004163
4164 lockdep_assert_held(&ar->conf_mutex);
4165
Michal Kaziorad088bf2013-10-16 15:44:46 +03004166 list_for_each_entry(arvif, &ar->arvifs, list) {
4167 ret = ath10k_mac_vif_setup_ps(arvif);
4168 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004169 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03004170 break;
4171 }
4172 }
Michal Kazioraffd3212013-07-16 09:54:35 +02004173
Michal Kaziorad088bf2013-10-16 15:44:46 +03004174 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004175}
4176
Michal Kazior7d9d5582014-10-21 10:40:15 +03004177static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
4178{
4179 int ret;
4180 u32 param;
4181
4182 lockdep_assert_held(&ar->conf_mutex);
4183
4184 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
4185
4186 param = ar->wmi.pdev_param->txpower_limit2g;
4187 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4188 if (ret) {
4189 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
4190 txpower, ret);
4191 return ret;
4192 }
4193
4194 param = ar->wmi.pdev_param->txpower_limit5g;
4195 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4196 if (ret) {
4197 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
4198 txpower, ret);
4199 return ret;
4200 }
4201
4202 return 0;
4203}
4204
4205static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4206{
4207 struct ath10k_vif *arvif;
4208 int ret, txpower = -1;
4209
4210 lockdep_assert_held(&ar->conf_mutex);
4211
4212 list_for_each_entry(arvif, &ar->arvifs, list) {
4213 WARN_ON(arvif->txpower < 0);
4214
4215 if (txpower == -1)
4216 txpower = arvif->txpower;
4217 else
4218 txpower = min(txpower, arvif->txpower);
4219 }
4220
4221 if (WARN_ON(txpower == -1))
4222 return -EINVAL;
4223
4224 ret = ath10k_mac_txpower_setup(ar, txpower);
4225 if (ret) {
4226 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4227 txpower, ret);
4228 return ret;
4229 }
4230
4231 return 0;
4232}
4233
Kalle Valo5e3dd152013-06-12 20:52:10 +03004234static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4235{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004236 struct ath10k *ar = hw->priv;
4237 struct ieee80211_conf *conf = &hw->conf;
4238 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004239
4240 mutex_lock(&ar->conf_mutex);
4241
Michal Kazioraffd3212013-07-16 09:54:35 +02004242 if (changed & IEEE80211_CONF_CHANGE_PS)
4243 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004244
4245 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004246 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4247 ret = ath10k_monitor_recalc(ar);
4248 if (ret)
4249 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004250 }
4251
4252 mutex_unlock(&ar->conf_mutex);
4253 return ret;
4254}
4255
Ben Greear5572a952014-11-24 16:22:10 +02004256static u32 get_nss_from_chainmask(u16 chain_mask)
4257{
Rajkumar Manoharanf680f702015-11-03 11:51:33 +05304258 if ((chain_mask & 0xf) == 0xf)
Ben Greear5572a952014-11-24 16:22:10 +02004259 return 4;
4260 else if ((chain_mask & 0x7) == 0x7)
4261 return 3;
4262 else if ((chain_mask & 0x3) == 0x3)
4263 return 2;
4264 return 1;
4265}
4266
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304267static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4268{
4269 u32 value = 0;
4270 struct ath10k *ar = arvif->ar;
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004271 int nsts;
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004272 int sound_dim;
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304273
4274 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4275 return 0;
4276
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004277 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304278 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4279 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004280 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304281
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004282 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304283 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4284 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004285 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304286
4287 if (!value)
4288 return 0;
4289
4290 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4291 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4292
4293 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4294 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4295 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4296
4297 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4298 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4299
4300 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4301 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4302 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4303
4304 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4305 ar->wmi.vdev_param->txbf, value);
4306}
4307
Kalle Valo5e3dd152013-06-12 20:52:10 +03004308/*
4309 * TODO:
4310 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4311 * because we will send mgmt frames without CCK. This requirement
4312 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4313 * in the TX packet.
4314 */
4315static int ath10k_add_interface(struct ieee80211_hw *hw,
4316 struct ieee80211_vif *vif)
4317{
4318 struct ath10k *ar = hw->priv;
4319 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4320 enum wmi_sta_powersave_param param;
4321 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004322 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004323 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004324 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004325 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004326
Johannes Berg848955c2014-11-11 12:48:42 +01004327 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4328
Kalle Valo5e3dd152013-06-12 20:52:10 +03004329 mutex_lock(&ar->conf_mutex);
4330
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004331 memset(arvif, 0, sizeof(*arvif));
4332
Kalle Valo5e3dd152013-06-12 20:52:10 +03004333 arvif->ar = ar;
4334 arvif->vif = vif;
4335
Ben Greeare63b33f2013-10-22 14:54:14 -07004336 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004337 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004338 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4339 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004340
Michal Kazior45c9abc2015-04-21 20:42:58 +03004341 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4342 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4343 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4344 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4345 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4346 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4347 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004348
Michal Kaziore04cafb2015-08-05 12:15:24 +02004349 if (ar->num_peers >= ar->max_num_peers) {
4350 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
Michal Kazior503422d2015-08-19 13:08:53 +02004351 ret = -ENOBUFS;
4352 goto err;
Michal Kaziore04cafb2015-08-05 12:15:24 +02004353 }
4354
Ben Greeara9aefb32014-08-12 11:02:19 +03004355 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004356 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004357 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004358 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004359 }
Ben Greear16c11172014-09-23 14:17:16 -07004360 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004361
Ben Greear16c11172014-09-23 14:17:16 -07004362 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4363 bit, ar->free_vdev_map);
4364
4365 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004366 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004367
Kalle Valo5e3dd152013-06-12 20:52:10 +03004368 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004369 case NL80211_IFTYPE_P2P_DEVICE:
4370 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4371 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4372 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004373 case NL80211_IFTYPE_UNSPECIFIED:
4374 case NL80211_IFTYPE_STATION:
4375 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4376 if (vif->p2p)
4377 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4378 break;
4379 case NL80211_IFTYPE_ADHOC:
4380 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4381 break;
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004382 case NL80211_IFTYPE_MESH_POINT:
Peter Ohbb58b892015-11-24 09:37:35 -08004383 if (test_bit(WMI_SERVICE_MESH, ar->wmi.svc_map)) {
4384 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH;
4385 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004386 ret = -EINVAL;
4387 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
4388 goto err;
4389 }
4390 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4391 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004392 case NL80211_IFTYPE_AP:
4393 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4394
4395 if (vif->p2p)
4396 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4397 break;
4398 case NL80211_IFTYPE_MONITOR:
4399 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4400 break;
4401 default:
4402 WARN_ON(1);
4403 break;
4404 }
4405
Michal Kazior96d828d2015-03-31 10:26:23 +00004406 /* Using vdev_id as queue number will make it very easy to do per-vif
4407 * tx queue locking. This shouldn't wrap due to interface combinations
4408 * but do a modulo for correctness sake and prevent using offchannel tx
4409 * queues for regular vif tx.
4410 */
4411 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4412 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4413 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4414
Michal Kazior64badcb2014-09-18 11:18:02 +03004415 /* Some firmware revisions don't wait for beacon tx completion before
4416 * sending another SWBA event. This could lead to hardware using old
4417 * (freed) beacon data in some cases, e.g. tx credit starvation
4418 * combined with missed TBTT. This is very very rare.
4419 *
4420 * On non-IOMMU-enabled hosts this could be a possible security issue
4421 * because hw could beacon some random data on the air. On
4422 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4423 * device would crash.
4424 *
4425 * Since there are no beacon tx completions (implicit nor explicit)
4426 * propagated to host the only workaround for this is to allocate a
4427 * DMA-coherent buffer for a lifetime of a vif and use it for all
4428 * beacon tx commands. Worst case for this approach is some beacons may
4429 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4430 */
4431 if (vif->type == NL80211_IFTYPE_ADHOC ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004432 vif->type == NL80211_IFTYPE_MESH_POINT ||
Michal Kazior64badcb2014-09-18 11:18:02 +03004433 vif->type == NL80211_IFTYPE_AP) {
4434 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4435 IEEE80211_MAX_FRAME_LEN,
4436 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304437 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004438 if (!arvif->beacon_buf) {
4439 ret = -ENOMEM;
4440 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4441 ret);
4442 goto err;
4443 }
4444 }
David Liuccec9032015-07-24 20:25:32 +03004445 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4446 arvif->nohwcrypt = true;
4447
4448 if (arvif->nohwcrypt &&
4449 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4450 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4451 goto err;
4452 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004453
4454 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4455 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4456 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004457
4458 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4459 arvif->vdev_subtype, vif->addr);
4460 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004461 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004462 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004463 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004464 }
4465
Ben Greear16c11172014-09-23 14:17:16 -07004466 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004467 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004468
Michal Kazior46725b152015-01-28 09:57:49 +02004469 /* It makes no sense to have firmware do keepalives. mac80211 already
4470 * takes care of this with idle connection polling.
4471 */
4472 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004473 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004474 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004475 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004476 goto err_vdev_delete;
4477 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004478
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004479 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004480
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004481 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4482 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004483 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004484 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004485 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004486 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004487 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004488 goto err_vdev_delete;
4489 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004490
Ben Greear5572a952014-11-24 16:22:10 +02004491 if (ar->cfg_tx_chainmask) {
4492 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4493
4494 vdev_param = ar->wmi.vdev_param->nss;
4495 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4496 nss);
4497 if (ret) {
4498 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4499 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4500 ret);
4501 goto err_vdev_delete;
4502 }
4503 }
4504
Michal Kaziore57e0572015-03-24 13:14:03 +00004505 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4506 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004507 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4508 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004509 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004510 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004511 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004512 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004513 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004514 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004515
Michal Kaziore57e0572015-03-24 13:14:03 +00004516 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004517 ret = ath10k_mac_set_kickout(arvif);
4518 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004519 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004520 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004521 goto err_peer_delete;
4522 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004523 }
4524
4525 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4526 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4527 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4528 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4529 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004530 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004531 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004532 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004533 goto err_peer_delete;
4534 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004535
Michal Kazior9f9b5742014-12-12 12:41:36 +01004536 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004537 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004538 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004539 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004540 goto err_peer_delete;
4541 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004542
Michal Kazior9f9b5742014-12-12 12:41:36 +01004543 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004544 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004545 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004546 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004547 goto err_peer_delete;
4548 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004549 }
4550
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304551 ret = ath10k_mac_set_txbf_conf(arvif);
4552 if (ret) {
4553 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4554 arvif->vdev_id, ret);
4555 goto err_peer_delete;
4556 }
4557
Michal Kazior424121c2013-07-22 14:13:31 +02004558 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004559 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004560 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004561 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004562 goto err_peer_delete;
4563 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004564
Michal Kazior7d9d5582014-10-21 10:40:15 +03004565 arvif->txpower = vif->bss_conf.txpower;
4566 ret = ath10k_mac_txpower_recalc(ar);
4567 if (ret) {
4568 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4569 goto err_peer_delete;
4570 }
4571
Michal Kazior500ff9f2015-03-31 10:26:21 +00004572 if (vif->type == NL80211_IFTYPE_MONITOR) {
4573 ar->monitor_arvif = arvif;
4574 ret = ath10k_monitor_recalc(ar);
4575 if (ret) {
4576 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4577 goto err_peer_delete;
4578 }
4579 }
4580
Michal Kazior6d2d51e2015-08-07 09:08:21 +02004581 spin_lock_bh(&ar->htt.tx_lock);
4582 if (!ar->tx_paused)
4583 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4584 spin_unlock_bh(&ar->htt.tx_lock);
4585
Kalle Valo5e3dd152013-06-12 20:52:10 +03004586 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004587 return 0;
4588
4589err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004590 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4591 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004592 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4593
4594err_vdev_delete:
4595 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004596 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004597 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004598
4599err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004600 if (arvif->beacon_buf) {
4601 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4602 arvif->beacon_buf, arvif->beacon_paddr);
4603 arvif->beacon_buf = NULL;
4604 }
4605
Michal Kazior9dad14a2013-10-16 15:44:45 +03004606 mutex_unlock(&ar->conf_mutex);
4607
Kalle Valo5e3dd152013-06-12 20:52:10 +03004608 return ret;
4609}
4610
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004611static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4612{
4613 int i;
4614
4615 for (i = 0; i < BITS_PER_LONG; i++)
4616 ath10k_mac_vif_tx_unlock(arvif, i);
4617}
4618
Kalle Valo5e3dd152013-06-12 20:52:10 +03004619static void ath10k_remove_interface(struct ieee80211_hw *hw,
4620 struct ieee80211_vif *vif)
4621{
4622 struct ath10k *ar = hw->priv;
4623 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4624 int ret;
4625
Michal Kazior81a9a172015-03-05 16:02:17 +02004626 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004627 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004628
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304629 mutex_lock(&ar->conf_mutex);
4630
Michal Kaziored543882013-09-13 14:16:56 +02004631 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004632 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004633 spin_unlock_bh(&ar->data_lock);
4634
Simon Wunderlich855aed12014-08-02 09:12:54 +03004635 ret = ath10k_spectral_vif_stop(arvif);
4636 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004637 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004638 arvif->vdev_id, ret);
4639
Ben Greear16c11172014-09-23 14:17:16 -07004640 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004641 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004642
Michal Kaziore57e0572015-03-24 13:14:03 +00004643 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4644 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004645 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4646 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004647 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004648 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004649 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004650
4651 kfree(arvif->u.ap.noa_data);
4652 }
4653
Michal Kazior7aa7a722014-08-25 12:09:38 +02004654 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004655 arvif->vdev_id);
4656
Kalle Valo5e3dd152013-06-12 20:52:10 +03004657 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4658 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004659 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004660 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004661
Michal Kazior2c512052015-02-15 16:50:40 +02004662 /* Some firmware revisions don't notify host about self-peer removal
4663 * until after associated vdev is deleted.
4664 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004665 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4666 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004667 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4668 vif->addr);
4669 if (ret)
4670 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4671 arvif->vdev_id, ret);
4672
4673 spin_lock_bh(&ar->data_lock);
4674 ar->num_peers--;
4675 spin_unlock_bh(&ar->data_lock);
4676 }
4677
Kalle Valo5e3dd152013-06-12 20:52:10 +03004678 ath10k_peer_cleanup(ar, arvif->vdev_id);
4679
Michal Kazior500ff9f2015-03-31 10:26:21 +00004680 if (vif->type == NL80211_IFTYPE_MONITOR) {
4681 ar->monitor_arvif = NULL;
4682 ret = ath10k_monitor_recalc(ar);
4683 if (ret)
4684 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4685 }
4686
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004687 spin_lock_bh(&ar->htt.tx_lock);
4688 ath10k_mac_vif_tx_unlock_all(arvif);
4689 spin_unlock_bh(&ar->htt.tx_lock);
4690
Kalle Valo5e3dd152013-06-12 20:52:10 +03004691 mutex_unlock(&ar->conf_mutex);
4692}
4693
4694/*
4695 * FIXME: Has to be verified.
4696 */
4697#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004698 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004699 FIF_CONTROL | \
4700 FIF_PSPOLL | \
4701 FIF_OTHER_BSS | \
4702 FIF_BCN_PRBRESP_PROMISC | \
4703 FIF_PROBE_REQ | \
4704 FIF_FCSFAIL)
4705
4706static void ath10k_configure_filter(struct ieee80211_hw *hw,
4707 unsigned int changed_flags,
4708 unsigned int *total_flags,
4709 u64 multicast)
4710{
4711 struct ath10k *ar = hw->priv;
4712 int ret;
4713
4714 mutex_lock(&ar->conf_mutex);
4715
4716 changed_flags &= SUPPORTED_FILTERS;
4717 *total_flags &= SUPPORTED_FILTERS;
4718 ar->filter_flags = *total_flags;
4719
Michal Kazior19337472014-08-28 12:58:16 +02004720 ret = ath10k_monitor_recalc(ar);
4721 if (ret)
4722 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004723
4724 mutex_unlock(&ar->conf_mutex);
4725}
4726
4727static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4728 struct ieee80211_vif *vif,
4729 struct ieee80211_bss_conf *info,
4730 u32 changed)
4731{
4732 struct ath10k *ar = hw->priv;
4733 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4734 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004735 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004736
4737 mutex_lock(&ar->conf_mutex);
4738
4739 if (changed & BSS_CHANGED_IBSS)
4740 ath10k_control_ibss(arvif, info, vif->addr);
4741
4742 if (changed & BSS_CHANGED_BEACON_INT) {
4743 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004744 vdev_param = ar->wmi.vdev_param->beacon_interval;
4745 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004746 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004747 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004748 "mac vdev %d beacon_interval %d\n",
4749 arvif->vdev_id, arvif->beacon_interval);
4750
Kalle Valo5e3dd152013-06-12 20:52:10 +03004751 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004752 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004753 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004754 }
4755
4756 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004757 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004758 "vdev %d set beacon tx mode to staggered\n",
4759 arvif->vdev_id);
4760
Bartosz Markowski226a3392013-09-26 17:47:16 +02004761 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4762 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004763 WMI_BEACON_STAGGERED_MODE);
4764 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004765 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004766 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004767
4768 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4769 if (ret)
4770 ath10k_warn(ar, "failed to update beacon template: %d\n",
4771 ret);
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004772
4773 if (ieee80211_vif_is_mesh(vif)) {
4774 /* mesh doesn't use SSID but firmware needs it */
4775 strncpy(arvif->u.ap.ssid, "mesh",
4776 sizeof(arvif->u.ap.ssid));
4777 arvif->u.ap.ssid_len = 4;
4778 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004779 }
4780
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004781 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4782 ret = ath10k_mac_setup_prb_tmpl(arvif);
4783 if (ret)
4784 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4785 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004786 }
4787
Michal Kaziorba2479f2015-01-24 12:14:51 +02004788 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004789 arvif->dtim_period = info->dtim_period;
4790
Michal Kazior7aa7a722014-08-25 12:09:38 +02004791 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004792 "mac vdev %d dtim_period %d\n",
4793 arvif->vdev_id, arvif->dtim_period);
4794
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004795 vdev_param = ar->wmi.vdev_param->dtim_period;
4796 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004797 arvif->dtim_period);
4798 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004799 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004800 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004801 }
4802
4803 if (changed & BSS_CHANGED_SSID &&
4804 vif->type == NL80211_IFTYPE_AP) {
4805 arvif->u.ap.ssid_len = info->ssid_len;
4806 if (info->ssid_len)
4807 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4808 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4809 }
4810
Michal Kazior077efc82014-10-21 10:10:29 +03004811 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4812 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004813
4814 if (changed & BSS_CHANGED_BEACON_ENABLED)
4815 ath10k_control_beaconing(arvif, info);
4816
4817 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004818 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004819 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004820 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004821
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004822 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004823 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004824 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004825 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004826
4827 vdev_param = ar->wmi.vdev_param->protection_mode;
4828 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4829 info->use_cts_prot ? 1 : 0);
4830 if (ret)
4831 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
Kalle Valo617b0f42015-10-05 17:56:35 +03004832 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004833 }
4834
4835 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004836 if (info->use_short_slot)
4837 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4838
4839 else
4840 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4841
Michal Kazior7aa7a722014-08-25 12:09:38 +02004842 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004843 arvif->vdev_id, slottime);
4844
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004845 vdev_param = ar->wmi.vdev_param->slot_time;
4846 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004847 slottime);
4848 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004849 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004850 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004851 }
4852
4853 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004854 if (info->use_short_preamble)
4855 preamble = WMI_VDEV_PREAMBLE_SHORT;
4856 else
4857 preamble = WMI_VDEV_PREAMBLE_LONG;
4858
Michal Kazior7aa7a722014-08-25 12:09:38 +02004859 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004860 "mac vdev %d preamble %dn",
4861 arvif->vdev_id, preamble);
4862
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004863 vdev_param = ar->wmi.vdev_param->preamble;
4864 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004865 preamble);
4866 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004867 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004868 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004869 }
4870
4871 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004872 if (info->assoc) {
4873 /* Workaround: Make sure monitor vdev is not running
4874 * when associating to prevent some firmware revisions
4875 * (e.g. 10.1 and 10.2) from crashing.
4876 */
4877 if (ar->monitor_started)
4878 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004879 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004880 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004881 } else {
4882 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004883 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004884 }
4885
Michal Kazior7d9d5582014-10-21 10:40:15 +03004886 if (changed & BSS_CHANGED_TXPOWER) {
4887 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4888 arvif->vdev_id, info->txpower);
4889
4890 arvif->txpower = info->txpower;
4891 ret = ath10k_mac_txpower_recalc(ar);
4892 if (ret)
4893 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4894 }
4895
Michal Kaziorbf14e652014-12-12 12:41:38 +01004896 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004897 arvif->ps = vif->bss_conf.ps;
4898
4899 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004900 if (ret)
4901 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4902 arvif->vdev_id, ret);
4903 }
4904
Kalle Valo5e3dd152013-06-12 20:52:10 +03004905 mutex_unlock(&ar->conf_mutex);
4906}
4907
4908static int ath10k_hw_scan(struct ieee80211_hw *hw,
4909 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004910 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004911{
4912 struct ath10k *ar = hw->priv;
4913 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004914 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004915 struct wmi_start_scan_arg arg;
4916 int ret = 0;
4917 int i;
4918
4919 mutex_lock(&ar->conf_mutex);
4920
4921 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004922 switch (ar->scan.state) {
4923 case ATH10K_SCAN_IDLE:
4924 reinit_completion(&ar->scan.started);
4925 reinit_completion(&ar->scan.completed);
4926 ar->scan.state = ATH10K_SCAN_STARTING;
4927 ar->scan.is_roc = false;
4928 ar->scan.vdev_id = arvif->vdev_id;
4929 ret = 0;
4930 break;
4931 case ATH10K_SCAN_STARTING:
4932 case ATH10K_SCAN_RUNNING:
4933 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004934 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004935 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004936 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004937 spin_unlock_bh(&ar->data_lock);
4938
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004939 if (ret)
4940 goto exit;
4941
Kalle Valo5e3dd152013-06-12 20:52:10 +03004942 memset(&arg, 0, sizeof(arg));
4943 ath10k_wmi_start_scan_init(ar, &arg);
4944 arg.vdev_id = arvif->vdev_id;
4945 arg.scan_id = ATH10K_SCAN_ID;
4946
Kalle Valo5e3dd152013-06-12 20:52:10 +03004947 if (req->ie_len) {
4948 arg.ie_len = req->ie_len;
4949 memcpy(arg.ie, req->ie, arg.ie_len);
4950 }
4951
4952 if (req->n_ssids) {
4953 arg.n_ssids = req->n_ssids;
4954 for (i = 0; i < arg.n_ssids; i++) {
4955 arg.ssids[i].len = req->ssids[i].ssid_len;
4956 arg.ssids[i].ssid = req->ssids[i].ssid;
4957 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004958 } else {
4959 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004960 }
4961
4962 if (req->n_channels) {
4963 arg.n_channels = req->n_channels;
4964 for (i = 0; i < arg.n_channels; i++)
4965 arg.channels[i] = req->channels[i]->center_freq;
4966 }
4967
4968 ret = ath10k_start_scan(ar, &arg);
4969 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004970 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004971 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004972 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004973 spin_unlock_bh(&ar->data_lock);
4974 }
4975
Michal Kazior634349b2015-09-03 10:43:45 +02004976 /* Add a 200ms margin to account for event/command processing */
4977 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4978 msecs_to_jiffies(arg.max_scan_time +
4979 200));
4980
Kalle Valo5e3dd152013-06-12 20:52:10 +03004981exit:
4982 mutex_unlock(&ar->conf_mutex);
4983 return ret;
4984}
4985
4986static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4987 struct ieee80211_vif *vif)
4988{
4989 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004990
4991 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004992 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004993 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004994
4995 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004996}
4997
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004998static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4999 struct ath10k_vif *arvif,
5000 enum set_key_cmd cmd,
5001 struct ieee80211_key_conf *key)
5002{
5003 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
5004 int ret;
5005
5006 /* 10.1 firmware branch requires default key index to be set to group
5007 * key index after installing it. Otherwise FW/HW Txes corrupted
5008 * frames with multi-vif APs. This is not required for main firmware
5009 * branch (e.g. 636).
5010 *
Michal Kazior8461baf2015-04-10 13:23:22 +00005011 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5012 *
5013 * FIXME: It remains unknown if this is required for multi-vif STA
5014 * interfaces on 10.1.
5015 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005016
Michal Kazior8461baf2015-04-10 13:23:22 +00005017 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5018 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005019 return;
5020
5021 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
5022 return;
5023
5024 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
5025 return;
5026
5027 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5028 return;
5029
5030 if (cmd != SET_KEY)
5031 return;
5032
5033 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5034 key->keyidx);
5035 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005036 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02005037 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005038}
5039
Kalle Valo5e3dd152013-06-12 20:52:10 +03005040static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5041 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5042 struct ieee80211_key_conf *key)
5043{
5044 struct ath10k *ar = hw->priv;
5045 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5046 struct ath10k_peer *peer;
5047 const u8 *peer_addr;
5048 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
5049 key->cipher == WLAN_CIPHER_SUITE_WEP104;
5050 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00005051 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01005052 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00005053 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005054
Bartosz Markowskid7131c02015-03-10 14:32:19 +01005055 /* this one needs to be done in software */
5056 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
5057 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005058
David Liuccec9032015-07-24 20:25:32 +03005059 if (arvif->nohwcrypt)
5060 return 1;
5061
Kalle Valo5e3dd152013-06-12 20:52:10 +03005062 if (key->keyidx > WMI_MAX_KEY_INDEX)
5063 return -ENOSPC;
5064
5065 mutex_lock(&ar->conf_mutex);
5066
5067 if (sta)
5068 peer_addr = sta->addr;
5069 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
5070 peer_addr = vif->bss_conf.bssid;
5071 else
5072 peer_addr = vif->addr;
5073
5074 key->hw_key_idx = key->keyidx;
5075
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03005076 if (is_wep) {
5077 if (cmd == SET_KEY)
5078 arvif->wep_keys[key->keyidx] = key;
5079 else
5080 arvif->wep_keys[key->keyidx] = NULL;
5081 }
5082
Kalle Valo5e3dd152013-06-12 20:52:10 +03005083 /* the peer should not disappear in mid-way (unless FW goes awry) since
5084 * we already hold conf_mutex. we just make sure its there now. */
5085 spin_lock_bh(&ar->data_lock);
5086 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5087 spin_unlock_bh(&ar->data_lock);
5088
5089 if (!peer) {
5090 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005091 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03005092 peer_addr);
5093 ret = -EOPNOTSUPP;
5094 goto exit;
5095 } else {
5096 /* if the peer doesn't exist there is no key to disable
5097 * anymore */
5098 goto exit;
5099 }
5100 }
5101
Michal Kazior7cc45732015-03-09 14:24:17 +01005102 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5103 flags |= WMI_KEY_PAIRWISE;
5104 else
5105 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005106
Kalle Valo5e3dd152013-06-12 20:52:10 +03005107 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005108 if (cmd == DISABLE_KEY)
5109 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01005110
Michal Kaziorad325cb2015-02-18 14:02:27 +01005111 /* When WEP keys are uploaded it's possible that there are
5112 * stations associated already (e.g. when merging) without any
5113 * keys. Static WEP needs an explicit per-peer key upload.
5114 */
5115 if (vif->type == NL80211_IFTYPE_ADHOC &&
5116 cmd == SET_KEY)
5117 ath10k_mac_vif_update_wep_key(arvif, key);
5118
Michal Kazior370e5672015-02-18 14:02:26 +01005119 /* 802.1x never sets the def_wep_key_idx so each set_key()
5120 * call changes default tx key.
5121 *
5122 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
5123 * after first set_key().
5124 */
5125 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
5126 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005127 }
5128
Michal Kazior370e5672015-02-18 14:02:26 +01005129 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005130 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03005131 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02005132 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02005133 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005134 goto exit;
5135 }
5136
Michal Kazior29a10002015-04-10 13:05:58 +00005137 /* mac80211 sets static WEP keys as groupwise while firmware requires
5138 * them to be installed twice as both pairwise and groupwise.
5139 */
5140 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
5141 flags2 = flags;
5142 flags2 &= ~WMI_KEY_GROUP;
5143 flags2 |= WMI_KEY_PAIRWISE;
5144
5145 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
5146 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03005147 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00005148 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
5149 arvif->vdev_id, peer_addr, ret);
5150 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
5151 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03005152 if (ret2) {
5153 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00005154 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
5155 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03005156 }
Michal Kazior29a10002015-04-10 13:05:58 +00005157 goto exit;
5158 }
5159 }
5160
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005161 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
5162
Kalle Valo5e3dd152013-06-12 20:52:10 +03005163 spin_lock_bh(&ar->data_lock);
5164 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5165 if (peer && cmd == SET_KEY)
5166 peer->keys[key->keyidx] = key;
5167 else if (peer && cmd == DISABLE_KEY)
5168 peer->keys[key->keyidx] = NULL;
5169 else if (peer == NULL)
5170 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005171 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005172 spin_unlock_bh(&ar->data_lock);
5173
5174exit:
5175 mutex_unlock(&ar->conf_mutex);
5176 return ret;
5177}
5178
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005179static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
5180 struct ieee80211_vif *vif,
5181 int keyidx)
5182{
5183 struct ath10k *ar = hw->priv;
5184 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5185 int ret;
5186
5187 mutex_lock(&arvif->ar->conf_mutex);
5188
5189 if (arvif->ar->state != ATH10K_STATE_ON)
5190 goto unlock;
5191
5192 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5193 arvif->vdev_id, keyidx);
5194
5195 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5196 arvif->vdev_id,
5197 arvif->ar->wmi.vdev_param->def_keyid,
5198 keyidx);
5199
5200 if (ret) {
5201 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5202 arvif->vdev_id,
5203 ret);
5204 goto unlock;
5205 }
5206
5207 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01005208
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005209unlock:
5210 mutex_unlock(&arvif->ar->conf_mutex);
5211}
5212
Michal Kazior9797feb2014-02-14 14:49:48 +01005213static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5214{
5215 struct ath10k *ar;
5216 struct ath10k_vif *arvif;
5217 struct ath10k_sta *arsta;
5218 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005219 struct cfg80211_chan_def def;
5220 enum ieee80211_band band;
5221 const u8 *ht_mcs_mask;
5222 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005223 u32 changed, bw, nss, smps;
5224 int err;
5225
5226 arsta = container_of(wk, struct ath10k_sta, update_wk);
5227 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5228 arvif = arsta->arvif;
5229 ar = arvif->ar;
5230
Michal Kazior45c9abc2015-04-21 20:42:58 +03005231 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5232 return;
5233
5234 band = def.chan->band;
5235 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5236 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5237
Michal Kazior9797feb2014-02-14 14:49:48 +01005238 spin_lock_bh(&ar->data_lock);
5239
5240 changed = arsta->changed;
5241 arsta->changed = 0;
5242
5243 bw = arsta->bw;
5244 nss = arsta->nss;
5245 smps = arsta->smps;
5246
5247 spin_unlock_bh(&ar->data_lock);
5248
5249 mutex_lock(&ar->conf_mutex);
5250
Michal Kazior45c9abc2015-04-21 20:42:58 +03005251 nss = max_t(u32, 1, nss);
5252 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5253 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5254
Michal Kazior9797feb2014-02-14 14:49:48 +01005255 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005256 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005257 sta->addr, bw);
5258
5259 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5260 WMI_PEER_CHAN_WIDTH, bw);
5261 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005262 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005263 sta->addr, bw, err);
5264 }
5265
5266 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005267 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005268 sta->addr, nss);
5269
5270 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5271 WMI_PEER_NSS, nss);
5272 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005273 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005274 sta->addr, nss, err);
5275 }
5276
5277 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005278 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005279 sta->addr, smps);
5280
5281 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5282 WMI_PEER_SMPS_STATE, smps);
5283 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005284 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005285 sta->addr, smps, err);
5286 }
5287
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005288 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5289 changed & IEEE80211_RC_NSS_CHANGED) {
5290 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005291 sta->addr);
5292
Michal Kazior590922a2014-10-21 10:10:29 +03005293 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005294 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005295 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005296 sta->addr);
5297 }
5298
Michal Kazior9797feb2014-02-14 14:49:48 +01005299 mutex_unlock(&ar->conf_mutex);
5300}
5301
Marek Puzyniak7c354242015-03-30 09:51:52 +03005302static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5303 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005304{
5305 struct ath10k *ar = arvif->ar;
5306
5307 lockdep_assert_held(&ar->conf_mutex);
5308
Marek Puzyniak7c354242015-03-30 09:51:52 +03005309 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005310 return 0;
5311
5312 if (ar->num_stations >= ar->max_num_stations)
5313 return -ENOBUFS;
5314
5315 ar->num_stations++;
5316
5317 return 0;
5318}
5319
Marek Puzyniak7c354242015-03-30 09:51:52 +03005320static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5321 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005322{
5323 struct ath10k *ar = arvif->ar;
5324
5325 lockdep_assert_held(&ar->conf_mutex);
5326
Marek Puzyniak7c354242015-03-30 09:51:52 +03005327 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005328 return;
5329
5330 ar->num_stations--;
5331}
5332
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005333struct ath10k_mac_tdls_iter_data {
5334 u32 num_tdls_stations;
5335 struct ieee80211_vif *curr_vif;
5336};
5337
5338static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5339 struct ieee80211_sta *sta)
5340{
5341 struct ath10k_mac_tdls_iter_data *iter_data = data;
5342 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5343 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5344
5345 if (sta->tdls && sta_vif == iter_data->curr_vif)
5346 iter_data->num_tdls_stations++;
5347}
5348
5349static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5350 struct ieee80211_vif *vif)
5351{
5352 struct ath10k_mac_tdls_iter_data data = {};
5353
5354 data.curr_vif = vif;
5355
5356 ieee80211_iterate_stations_atomic(hw,
5357 ath10k_mac_tdls_vif_stations_count_iter,
5358 &data);
5359 return data.num_tdls_stations;
5360}
5361
5362static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5363 struct ieee80211_vif *vif)
5364{
5365 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5366 int *num_tdls_vifs = data;
5367
5368 if (vif->type != NL80211_IFTYPE_STATION)
5369 return;
5370
5371 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5372 (*num_tdls_vifs)++;
5373}
5374
5375static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5376{
5377 int num_tdls_vifs = 0;
5378
5379 ieee80211_iterate_active_interfaces_atomic(hw,
5380 IEEE80211_IFACE_ITER_NORMAL,
5381 ath10k_mac_tdls_vifs_count_iter,
5382 &num_tdls_vifs);
5383 return num_tdls_vifs;
5384}
5385
Kalle Valo5e3dd152013-06-12 20:52:10 +03005386static int ath10k_sta_state(struct ieee80211_hw *hw,
5387 struct ieee80211_vif *vif,
5388 struct ieee80211_sta *sta,
5389 enum ieee80211_sta_state old_state,
5390 enum ieee80211_sta_state new_state)
5391{
5392 struct ath10k *ar = hw->priv;
5393 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005394 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005395 int ret = 0;
5396
Michal Kazior76f90022014-02-25 09:29:57 +02005397 if (old_state == IEEE80211_STA_NOTEXIST &&
5398 new_state == IEEE80211_STA_NONE) {
5399 memset(arsta, 0, sizeof(*arsta));
5400 arsta->arvif = arvif;
5401 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5402 }
5403
Michal Kazior9797feb2014-02-14 14:49:48 +01005404 /* cancel must be done outside the mutex to avoid deadlock */
5405 if ((old_state == IEEE80211_STA_NONE &&
5406 new_state == IEEE80211_STA_NOTEXIST))
5407 cancel_work_sync(&arsta->update_wk);
5408
Kalle Valo5e3dd152013-06-12 20:52:10 +03005409 mutex_lock(&ar->conf_mutex);
5410
5411 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005412 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005413 /*
5414 * New station addition.
5415 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005416 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5417 u32 num_tdls_stations;
5418 u32 num_tdls_vifs;
5419
Michal Kaziorcfd10612014-11-25 15:16:05 +01005420 ath10k_dbg(ar, ATH10K_DBG_MAC,
5421 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5422 arvif->vdev_id, sta->addr,
5423 ar->num_stations + 1, ar->max_num_stations,
5424 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005425
Marek Puzyniak7c354242015-03-30 09:51:52 +03005426 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005427 if (ret) {
5428 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5429 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005430 goto exit;
5431 }
5432
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005433 if (sta->tdls)
5434 peer_type = WMI_PEER_TYPE_TDLS;
5435
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005436 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005437 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005438 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005439 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 -08005440 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005441 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005442 goto exit;
5443 }
Michal Kazior077efc82014-10-21 10:10:29 +03005444
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005445 if (!sta->tdls)
5446 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005447
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005448 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5449 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5450
5451 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5452 num_tdls_stations == 0) {
5453 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5454 arvif->vdev_id, ar->max_num_tdls_vdevs);
5455 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5456 ath10k_mac_dec_num_stations(arvif, sta);
5457 ret = -ENOBUFS;
5458 goto exit;
5459 }
5460
5461 if (num_tdls_stations == 0) {
5462 /* This is the first tdls peer in current vif */
5463 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5464
5465 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5466 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005467 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005468 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005469 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005470 ath10k_peer_delete(ar, arvif->vdev_id,
5471 sta->addr);
5472 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005473 goto exit;
5474 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005475 }
Michal Kazior077efc82014-10-21 10:10:29 +03005476
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005477 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5478 WMI_TDLS_PEER_STATE_PEERING);
5479 if (ret) {
5480 ath10k_warn(ar,
5481 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5482 sta->addr, arvif->vdev_id, ret);
5483 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5484 ath10k_mac_dec_num_stations(arvif, sta);
5485
5486 if (num_tdls_stations != 0)
5487 goto exit;
5488 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5489 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005490 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005491 } else if ((old_state == IEEE80211_STA_NONE &&
5492 new_state == IEEE80211_STA_NOTEXIST)) {
5493 /*
5494 * Existing station deletion.
5495 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005496 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005497 "mac vdev %d peer delete %pM (sta gone)\n",
5498 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005499
Kalle Valo5e3dd152013-06-12 20:52:10 +03005500 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5501 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005502 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005503 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005504
Marek Puzyniak7c354242015-03-30 09:51:52 +03005505 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005506
5507 if (!sta->tdls)
5508 goto exit;
5509
5510 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5511 goto exit;
5512
5513 /* This was the last tdls peer in current vif */
5514 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5515 WMI_TDLS_DISABLE);
5516 if (ret) {
5517 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5518 arvif->vdev_id, ret);
5519 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005520 } else if (old_state == IEEE80211_STA_AUTH &&
5521 new_state == IEEE80211_STA_ASSOC &&
5522 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005523 vif->type == NL80211_IFTYPE_MESH_POINT ||
Kalle Valo5e3dd152013-06-12 20:52:10 +03005524 vif->type == NL80211_IFTYPE_ADHOC)) {
5525 /*
5526 * New association.
5527 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005528 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005529 sta->addr);
5530
Michal Kazior590922a2014-10-21 10:10:29 +03005531 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005532 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005533 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005534 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005535 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005536 new_state == IEEE80211_STA_AUTHORIZED &&
5537 sta->tdls) {
5538 /*
5539 * Tdls station authorized.
5540 */
5541 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5542 sta->addr);
5543
5544 ret = ath10k_station_assoc(ar, vif, sta, false);
5545 if (ret) {
5546 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5547 sta->addr, arvif->vdev_id, ret);
5548 goto exit;
5549 }
5550
5551 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5552 WMI_TDLS_PEER_STATE_CONNECTED);
5553 if (ret)
5554 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5555 sta->addr, arvif->vdev_id, ret);
5556 } else if (old_state == IEEE80211_STA_ASSOC &&
5557 new_state == IEEE80211_STA_AUTH &&
5558 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005559 vif->type == NL80211_IFTYPE_MESH_POINT ||
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005560 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005561 /*
5562 * Disassociation.
5563 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005564 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005565 sta->addr);
5566
Michal Kazior590922a2014-10-21 10:10:29 +03005567 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005568 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005569 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005570 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005571 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005572exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005573 mutex_unlock(&ar->conf_mutex);
5574 return ret;
5575}
5576
5577static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005578 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005579{
5580 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005581 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5582 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005583 u32 value = 0;
5584 int ret = 0;
5585
Michal Kazior548db542013-07-05 16:15:15 +03005586 lockdep_assert_held(&ar->conf_mutex);
5587
Kalle Valo5e3dd152013-06-12 20:52:10 +03005588 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5589 return 0;
5590
5591 switch (ac) {
5592 case IEEE80211_AC_VO:
5593 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5594 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005595 prio = 7;
5596 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005597 break;
5598 case IEEE80211_AC_VI:
5599 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5600 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005601 prio = 5;
5602 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005603 break;
5604 case IEEE80211_AC_BE:
5605 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5606 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005607 prio = 2;
5608 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005609 break;
5610 case IEEE80211_AC_BK:
5611 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5612 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005613 prio = 0;
5614 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005615 break;
5616 }
5617
5618 if (enable)
5619 arvif->u.sta.uapsd |= value;
5620 else
5621 arvif->u.sta.uapsd &= ~value;
5622
5623 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5624 WMI_STA_PS_PARAM_UAPSD,
5625 arvif->u.sta.uapsd);
5626 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005627 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005628 goto exit;
5629 }
5630
5631 if (arvif->u.sta.uapsd)
5632 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5633 else
5634 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5635
5636 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5637 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5638 value);
5639 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005640 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005641
Michal Kazior9f9b5742014-12-12 12:41:36 +01005642 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5643 if (ret) {
5644 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5645 arvif->vdev_id, ret);
5646 return ret;
5647 }
5648
5649 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5650 if (ret) {
5651 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5652 arvif->vdev_id, ret);
5653 return ret;
5654 }
5655
Michal Kaziorb0e56152015-01-24 12:14:52 +02005656 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5657 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5658 /* Only userspace can make an educated decision when to send
5659 * trigger frame. The following effectively disables u-UAPSD
5660 * autotrigger in firmware (which is enabled by default
5661 * provided the autotrigger service is available).
5662 */
5663
5664 arg.wmm_ac = acc;
5665 arg.user_priority = prio;
5666 arg.service_interval = 0;
5667 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5668 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5669
5670 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5671 arvif->bssid, &arg, 1);
5672 if (ret) {
5673 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5674 ret);
5675 return ret;
5676 }
5677 }
5678
Kalle Valo5e3dd152013-06-12 20:52:10 +03005679exit:
5680 return ret;
5681}
5682
5683static int ath10k_conf_tx(struct ieee80211_hw *hw,
5684 struct ieee80211_vif *vif, u16 ac,
5685 const struct ieee80211_tx_queue_params *params)
5686{
5687 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005688 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005689 struct wmi_wmm_params_arg *p = NULL;
5690 int ret;
5691
5692 mutex_lock(&ar->conf_mutex);
5693
5694 switch (ac) {
5695 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005696 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005697 break;
5698 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005699 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005700 break;
5701 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005702 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005703 break;
5704 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005705 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005706 break;
5707 }
5708
5709 if (WARN_ON(!p)) {
5710 ret = -EINVAL;
5711 goto exit;
5712 }
5713
5714 p->cwmin = params->cw_min;
5715 p->cwmax = params->cw_max;
5716 p->aifs = params->aifs;
5717
5718 /*
5719 * The channel time duration programmed in the HW is in absolute
5720 * microseconds, while mac80211 gives the txop in units of
5721 * 32 microseconds.
5722 */
5723 p->txop = params->txop * 32;
5724
Michal Kazior7fc979a2015-01-28 09:57:28 +02005725 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5726 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5727 &arvif->wmm_params);
5728 if (ret) {
5729 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5730 arvif->vdev_id, ret);
5731 goto exit;
5732 }
5733 } else {
5734 /* This won't work well with multi-interface cases but it's
5735 * better than nothing.
5736 */
5737 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5738 if (ret) {
5739 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5740 goto exit;
5741 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005742 }
5743
5744 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5745 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005746 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005747
5748exit:
5749 mutex_unlock(&ar->conf_mutex);
5750 return ret;
5751}
5752
5753#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5754
5755static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5756 struct ieee80211_vif *vif,
5757 struct ieee80211_channel *chan,
5758 int duration,
5759 enum ieee80211_roc_type type)
5760{
5761 struct ath10k *ar = hw->priv;
5762 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5763 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005764 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005765 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005766
5767 mutex_lock(&ar->conf_mutex);
5768
5769 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005770 switch (ar->scan.state) {
5771 case ATH10K_SCAN_IDLE:
5772 reinit_completion(&ar->scan.started);
5773 reinit_completion(&ar->scan.completed);
5774 reinit_completion(&ar->scan.on_channel);
5775 ar->scan.state = ATH10K_SCAN_STARTING;
5776 ar->scan.is_roc = true;
5777 ar->scan.vdev_id = arvif->vdev_id;
5778 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005779 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005780 ret = 0;
5781 break;
5782 case ATH10K_SCAN_STARTING:
5783 case ATH10K_SCAN_RUNNING:
5784 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005785 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005786 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005787 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005788 spin_unlock_bh(&ar->data_lock);
5789
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005790 if (ret)
5791 goto exit;
5792
Michal Kaziorfcf98442015-03-31 11:03:47 +00005793 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005794
Kalle Valo5e3dd152013-06-12 20:52:10 +03005795 memset(&arg, 0, sizeof(arg));
5796 ath10k_wmi_start_scan_init(ar, &arg);
5797 arg.vdev_id = arvif->vdev_id;
5798 arg.scan_id = ATH10K_SCAN_ID;
5799 arg.n_channels = 1;
5800 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005801 arg.dwell_time_active = scan_time_msec;
5802 arg.dwell_time_passive = scan_time_msec;
5803 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005804 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5805 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005806 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005807
5808 ret = ath10k_start_scan(ar, &arg);
5809 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005810 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005811 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005812 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005813 spin_unlock_bh(&ar->data_lock);
5814 goto exit;
5815 }
5816
5817 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5818 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005819 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005820
5821 ret = ath10k_scan_stop(ar);
5822 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005823 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005824
Kalle Valo5e3dd152013-06-12 20:52:10 +03005825 ret = -ETIMEDOUT;
5826 goto exit;
5827 }
5828
Michal Kaziorfcf98442015-03-31 11:03:47 +00005829 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5830 msecs_to_jiffies(duration));
5831
Kalle Valo5e3dd152013-06-12 20:52:10 +03005832 ret = 0;
5833exit:
5834 mutex_unlock(&ar->conf_mutex);
5835 return ret;
5836}
5837
5838static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5839{
5840 struct ath10k *ar = hw->priv;
5841
5842 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005843
5844 spin_lock_bh(&ar->data_lock);
5845 ar->scan.roc_notify = false;
5846 spin_unlock_bh(&ar->data_lock);
5847
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005848 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005849
Kalle Valo5e3dd152013-06-12 20:52:10 +03005850 mutex_unlock(&ar->conf_mutex);
5851
Michal Kazior4eb2e162014-10-28 10:23:09 +01005852 cancel_delayed_work_sync(&ar->scan.timeout);
5853
Kalle Valo5e3dd152013-06-12 20:52:10 +03005854 return 0;
5855}
5856
5857/*
5858 * Both RTS and Fragmentation threshold are interface-specific
5859 * in ath10k, but device-specific in mac80211.
5860 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005861
5862static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5863{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005864 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005865 struct ath10k_vif *arvif;
5866 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005867
Michal Kaziorad088bf2013-10-16 15:44:46 +03005868 mutex_lock(&ar->conf_mutex);
5869 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005870 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005871 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005872
Michal Kaziorad088bf2013-10-16 15:44:46 +03005873 ret = ath10k_mac_set_rts(arvif, value);
5874 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005875 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005876 arvif->vdev_id, ret);
5877 break;
5878 }
5879 }
5880 mutex_unlock(&ar->conf_mutex);
5881
5882 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005883}
5884
Michal Kazior92092fe2015-08-03 11:16:43 +02005885static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5886{
5887 /* Even though there's a WMI enum for fragmentation threshold no known
5888 * firmware actually implements it. Moreover it is not possible to rely
5889 * frame fragmentation to mac80211 because firmware clears the "more
5890 * fragments" bit in frame control making it impossible for remote
5891 * devices to reassemble frames.
5892 *
5893 * Hence implement a dummy callback just to say fragmentation isn't
5894 * supported. This effectively prevents mac80211 from doing frame
5895 * fragmentation in software.
5896 */
5897 return -EOPNOTSUPP;
5898}
5899
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005900static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5901 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005902{
5903 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005904 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005905 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005906
5907 /* mac80211 doesn't care if we really xmit queued frames or not
5908 * we'll collect those frames either way if we stop/delete vdevs */
5909 if (drop)
5910 return;
5911
Michal Kazior548db542013-07-05 16:15:15 +03005912 mutex_lock(&ar->conf_mutex);
5913
Michal Kazioraffd3212013-07-16 09:54:35 +02005914 if (ar->state == ATH10K_STATE_WEDGED)
5915 goto skip;
5916
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005917 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005918 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005919
Michal Kazioredb82362013-07-05 16:15:14 +03005920 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005921 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005922 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005923
Michal Kazior7962b0d2014-10-28 10:34:38 +01005924 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5925 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5926 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005927
5928 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005929 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005930
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005931 if (time_left == 0 || skip)
5932 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5933 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005934
Michal Kazioraffd3212013-07-16 09:54:35 +02005935skip:
Michal Kazior548db542013-07-05 16:15:15 +03005936 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005937}
5938
5939/* TODO: Implement this function properly
5940 * For now it is needed to reply to Probe Requests in IBSS mode.
5941 * Propably we need this information from FW.
5942 */
5943static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5944{
5945 return 1;
5946}
5947
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005948static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5949 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005950{
5951 struct ath10k *ar = hw->priv;
5952
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005953 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5954 return;
5955
Michal Kazioraffd3212013-07-16 09:54:35 +02005956 mutex_lock(&ar->conf_mutex);
5957
5958 /* If device failed to restart it will be in a different state, e.g.
5959 * ATH10K_STATE_WEDGED */
5960 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005961 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005962 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005963 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005964 }
5965
5966 mutex_unlock(&ar->conf_mutex);
5967}
5968
Michal Kazior2e1dea42013-07-31 10:32:40 +02005969static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5970 struct survey_info *survey)
5971{
5972 struct ath10k *ar = hw->priv;
5973 struct ieee80211_supported_band *sband;
5974 struct survey_info *ar_survey = &ar->survey[idx];
5975 int ret = 0;
5976
5977 mutex_lock(&ar->conf_mutex);
5978
5979 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5980 if (sband && idx >= sband->n_channels) {
5981 idx -= sband->n_channels;
5982 sband = NULL;
5983 }
5984
5985 if (!sband)
5986 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5987
5988 if (!sband || idx >= sband->n_channels) {
5989 ret = -ENOENT;
5990 goto exit;
5991 }
5992
5993 spin_lock_bh(&ar->data_lock);
5994 memcpy(survey, ar_survey, sizeof(*survey));
5995 spin_unlock_bh(&ar->data_lock);
5996
5997 survey->channel = &sband->channels[idx];
5998
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005999 if (ar->rx_channel == survey->channel)
6000 survey->filled |= SURVEY_INFO_IN_USE;
6001
Michal Kazior2e1dea42013-07-31 10:32:40 +02006002exit:
6003 mutex_unlock(&ar->conf_mutex);
6004 return ret;
6005}
6006
Michal Kazior3ae54222015-03-31 10:49:20 +00006007static bool
6008ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6009 enum ieee80211_band band,
6010 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006011{
Michal Kazior3ae54222015-03-31 10:49:20 +00006012 int num_rates = 0;
6013 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006014
Michal Kazior3ae54222015-03-31 10:49:20 +00006015 num_rates += hweight32(mask->control[band].legacy);
6016
6017 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6018 num_rates += hweight8(mask->control[band].ht_mcs[i]);
6019
6020 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
6021 num_rates += hweight16(mask->control[band].vht_mcs[i]);
6022
6023 return num_rates == 1;
6024}
6025
6026static bool
6027ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
6028 enum ieee80211_band band,
6029 const struct cfg80211_bitrate_mask *mask,
6030 int *nss)
6031{
6032 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6033 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6034 u8 ht_nss_mask = 0;
6035 u8 vht_nss_mask = 0;
6036 int i;
6037
6038 if (mask->control[band].legacy)
6039 return false;
6040
6041 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6042 if (mask->control[band].ht_mcs[i] == 0)
6043 continue;
6044 else if (mask->control[band].ht_mcs[i] ==
6045 sband->ht_cap.mcs.rx_mask[i])
6046 ht_nss_mask |= BIT(i);
6047 else
6048 return false;
6049 }
6050
6051 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6052 if (mask->control[band].vht_mcs[i] == 0)
6053 continue;
6054 else if (mask->control[band].vht_mcs[i] ==
6055 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
6056 vht_nss_mask |= BIT(i);
6057 else
6058 return false;
6059 }
6060
6061 if (ht_nss_mask != vht_nss_mask)
6062 return false;
6063
6064 if (ht_nss_mask == 0)
6065 return false;
6066
6067 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
6068 return false;
6069
6070 *nss = fls(ht_nss_mask);
6071
6072 return true;
6073}
6074
6075static int
6076ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6077 enum ieee80211_band band,
6078 const struct cfg80211_bitrate_mask *mask,
6079 u8 *rate, u8 *nss)
6080{
6081 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6082 int rate_idx;
6083 int i;
6084 u16 bitrate;
6085 u8 preamble;
6086 u8 hw_rate;
6087
6088 if (hweight32(mask->control[band].legacy) == 1) {
6089 rate_idx = ffs(mask->control[band].legacy) - 1;
6090
6091 hw_rate = sband->bitrates[rate_idx].hw_value;
6092 bitrate = sband->bitrates[rate_idx].bitrate;
6093
6094 if (ath10k_mac_bitrate_is_cck(bitrate))
6095 preamble = WMI_RATE_PREAMBLE_CCK;
6096 else
6097 preamble = WMI_RATE_PREAMBLE_OFDM;
6098
6099 *nss = 1;
6100 *rate = preamble << 6 |
6101 (*nss - 1) << 4 |
6102 hw_rate << 0;
6103
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006104 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006105 }
6106
Michal Kazior3ae54222015-03-31 10:49:20 +00006107 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6108 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6109 *nss = i + 1;
6110 *rate = WMI_RATE_PREAMBLE_HT << 6 |
6111 (*nss - 1) << 4 |
6112 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006113
Michal Kazior3ae54222015-03-31 10:49:20 +00006114 return 0;
6115 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006116 }
6117
Michal Kazior3ae54222015-03-31 10:49:20 +00006118 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6119 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
6120 *nss = i + 1;
6121 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
6122 (*nss - 1) << 4 |
6123 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006124
Michal Kazior3ae54222015-03-31 10:49:20 +00006125 return 0;
6126 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006127 }
6128
Michal Kazior3ae54222015-03-31 10:49:20 +00006129 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006130}
6131
Michal Kazior3ae54222015-03-31 10:49:20 +00006132static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306133 u8 rate, u8 nss, u8 sgi, u8 ldpc)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006134{
6135 struct ath10k *ar = arvif->ar;
6136 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00006137 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006138
Michal Kazior3ae54222015-03-31 10:49:20 +00006139 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006140
Michal Kazior3ae54222015-03-31 10:49:20 +00006141 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
6142 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006143
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006144 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00006145 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006146 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006147 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00006148 rate, ret);
6149 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006150 }
6151
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006152 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00006153 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006154 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006155 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
6156 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006157 }
6158
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006159 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00006160 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006161 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006162 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
6163 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006164 }
6165
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306166 vdev_param = ar->wmi.vdev_param->ldpc;
6167 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
6168 if (ret) {
6169 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
6170 return ret;
6171 }
6172
Michal Kazior3ae54222015-03-31 10:49:20 +00006173 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006174}
6175
Michal Kazior45c9abc2015-04-21 20:42:58 +03006176static bool
6177ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
6178 enum ieee80211_band band,
6179 const struct cfg80211_bitrate_mask *mask)
6180{
6181 int i;
6182 u16 vht_mcs;
6183
6184 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6185 * to express all VHT MCS rate masks. Effectively only the following
6186 * ranges can be used: none, 0-7, 0-8 and 0-9.
6187 */
6188 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6189 vht_mcs = mask->control[band].vht_mcs[i];
6190
6191 switch (vht_mcs) {
6192 case 0:
6193 case BIT(8) - 1:
6194 case BIT(9) - 1:
6195 case BIT(10) - 1:
6196 break;
6197 default:
6198 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6199 return false;
6200 }
6201 }
6202
6203 return true;
6204}
6205
6206static void ath10k_mac_set_bitrate_mask_iter(void *data,
6207 struct ieee80211_sta *sta)
6208{
6209 struct ath10k_vif *arvif = data;
6210 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6211 struct ath10k *ar = arvif->ar;
6212
6213 if (arsta->arvif != arvif)
6214 return;
6215
6216 spin_lock_bh(&ar->data_lock);
6217 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6218 spin_unlock_bh(&ar->data_lock);
6219
6220 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6221}
6222
Michal Kazior3ae54222015-03-31 10:49:20 +00006223static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6224 struct ieee80211_vif *vif,
6225 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006226{
6227 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006228 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006229 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006230 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006231 const u8 *ht_mcs_mask;
6232 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006233 u8 rate;
6234 u8 nss;
6235 u8 sgi;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306236 u8 ldpc;
Michal Kazior3ae54222015-03-31 10:49:20 +00006237 int single_nss;
6238 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006239
Michal Kazior500ff9f2015-03-31 10:26:21 +00006240 if (ath10k_mac_vif_chan(vif, &def))
6241 return -EPERM;
6242
Michal Kazior500ff9f2015-03-31 10:26:21 +00006243 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006244 ht_mcs_mask = mask->control[band].ht_mcs;
6245 vht_mcs_mask = mask->control[band].vht_mcs;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306246 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006247
Michal Kazior3ae54222015-03-31 10:49:20 +00006248 sgi = mask->control[band].gi;
6249 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006250 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006251
Michal Kazior3ae54222015-03-31 10:49:20 +00006252 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6253 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6254 &rate, &nss);
6255 if (ret) {
6256 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6257 arvif->vdev_id, ret);
6258 return ret;
6259 }
6260 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6261 &single_nss)) {
6262 rate = WMI_FIXED_RATE_NONE;
6263 nss = single_nss;
6264 } else {
6265 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006266 nss = min(ar->num_rf_chains,
6267 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6268 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6269
6270 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6271 return -EINVAL;
6272
6273 mutex_lock(&ar->conf_mutex);
6274
6275 arvif->bitrate_mask = *mask;
6276 ieee80211_iterate_stations_atomic(ar->hw,
6277 ath10k_mac_set_bitrate_mask_iter,
6278 arvif);
6279
6280 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006281 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006282
6283 mutex_lock(&ar->conf_mutex);
6284
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306285 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006286 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006287 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6288 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006289 goto exit;
6290 }
6291
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006292exit:
6293 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006294
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006295 return ret;
6296}
6297
Michal Kazior9797feb2014-02-14 14:49:48 +01006298static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6299 struct ieee80211_vif *vif,
6300 struct ieee80211_sta *sta,
6301 u32 changed)
6302{
6303 struct ath10k *ar = hw->priv;
6304 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6305 u32 bw, smps;
6306
6307 spin_lock_bh(&ar->data_lock);
6308
Michal Kazior7aa7a722014-08-25 12:09:38 +02006309 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006310 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6311 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6312 sta->smps_mode);
6313
6314 if (changed & IEEE80211_RC_BW_CHANGED) {
6315 bw = WMI_PEER_CHWIDTH_20MHZ;
6316
6317 switch (sta->bandwidth) {
6318 case IEEE80211_STA_RX_BW_20:
6319 bw = WMI_PEER_CHWIDTH_20MHZ;
6320 break;
6321 case IEEE80211_STA_RX_BW_40:
6322 bw = WMI_PEER_CHWIDTH_40MHZ;
6323 break;
6324 case IEEE80211_STA_RX_BW_80:
6325 bw = WMI_PEER_CHWIDTH_80MHZ;
6326 break;
6327 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006328 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006329 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006330 bw = WMI_PEER_CHWIDTH_20MHZ;
6331 break;
6332 }
6333
6334 arsta->bw = bw;
6335 }
6336
6337 if (changed & IEEE80211_RC_NSS_CHANGED)
6338 arsta->nss = sta->rx_nss;
6339
6340 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6341 smps = WMI_PEER_SMPS_PS_NONE;
6342
6343 switch (sta->smps_mode) {
6344 case IEEE80211_SMPS_AUTOMATIC:
6345 case IEEE80211_SMPS_OFF:
6346 smps = WMI_PEER_SMPS_PS_NONE;
6347 break;
6348 case IEEE80211_SMPS_STATIC:
6349 smps = WMI_PEER_SMPS_STATIC;
6350 break;
6351 case IEEE80211_SMPS_DYNAMIC:
6352 smps = WMI_PEER_SMPS_DYNAMIC;
6353 break;
6354 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006355 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006356 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006357 smps = WMI_PEER_SMPS_PS_NONE;
6358 break;
6359 }
6360
6361 arsta->smps = smps;
6362 }
6363
Michal Kazior9797feb2014-02-14 14:49:48 +01006364 arsta->changed |= changed;
6365
6366 spin_unlock_bh(&ar->data_lock);
6367
6368 ieee80211_queue_work(hw, &arsta->update_wk);
6369}
6370
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006371static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6372{
6373 /*
6374 * FIXME: Return 0 for time being. Need to figure out whether FW
6375 * has the API to fetch 64-bit local TSF
6376 */
6377
6378 return 0;
6379}
6380
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006381static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6382 struct ieee80211_vif *vif,
6383 enum ieee80211_ampdu_mlme_action action,
6384 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
Emmanuel Grumbache3abc8f2015-08-16 11:13:22 +03006385 u8 buf_size, bool amsdu)
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006386{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006387 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006388 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6389
Michal Kazior7aa7a722014-08-25 12:09:38 +02006390 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 +02006391 arvif->vdev_id, sta->addr, tid, action);
6392
6393 switch (action) {
6394 case IEEE80211_AMPDU_RX_START:
6395 case IEEE80211_AMPDU_RX_STOP:
6396 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6397 * creation/removal. Do we need to verify this?
6398 */
6399 return 0;
6400 case IEEE80211_AMPDU_TX_START:
6401 case IEEE80211_AMPDU_TX_STOP_CONT:
6402 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6403 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6404 case IEEE80211_AMPDU_TX_OPERATIONAL:
6405 /* Firmware offloads Tx aggregation entirely so deny mac80211
6406 * Tx aggregation requests.
6407 */
6408 return -EOPNOTSUPP;
6409 }
6410
6411 return -EINVAL;
6412}
6413
Michal Kazior500ff9f2015-03-31 10:26:21 +00006414static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006415ath10k_mac_update_rx_channel(struct ath10k *ar,
6416 struct ieee80211_chanctx_conf *ctx,
6417 struct ieee80211_vif_chanctx_switch *vifs,
6418 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006419{
6420 struct cfg80211_chan_def *def = NULL;
6421
6422 /* Both locks are required because ar->rx_channel is modified. This
6423 * allows readers to hold either lock.
6424 */
6425 lockdep_assert_held(&ar->conf_mutex);
6426 lockdep_assert_held(&ar->data_lock);
6427
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006428 WARN_ON(ctx && vifs);
6429 WARN_ON(vifs && n_vifs != 1);
6430
Michal Kazior500ff9f2015-03-31 10:26:21 +00006431 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6432 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6433 * ppdu on Rx may reduce performance on low-end systems. It should be
6434 * possible to make tables/hashmaps to speed the lookup up (be vary of
6435 * cpu data cache lines though regarding sizes) but to keep the initial
6436 * implementation simple and less intrusive fallback to the slow lookup
6437 * only for multi-channel cases. Single-channel cases will remain to
6438 * use the old channel derival and thus performance should not be
6439 * affected much.
6440 */
6441 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006442 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006443 ieee80211_iter_chan_contexts_atomic(ar->hw,
Kalle Valo617b0f42015-10-05 17:56:35 +03006444 ath10k_mac_get_any_chandef_iter,
6445 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006446
6447 if (vifs)
6448 def = &vifs[0].new_ctx->def;
6449
Michal Kazior500ff9f2015-03-31 10:26:21 +00006450 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006451 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6452 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006453 } else {
6454 ar->rx_channel = NULL;
6455 }
6456 rcu_read_unlock();
6457}
6458
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006459static void
6460ath10k_mac_update_vif_chan(struct ath10k *ar,
6461 struct ieee80211_vif_chanctx_switch *vifs,
6462 int n_vifs)
6463{
6464 struct ath10k_vif *arvif;
6465 int ret;
6466 int i;
6467
6468 lockdep_assert_held(&ar->conf_mutex);
6469
6470 /* First stop monitor interface. Some FW versions crash if there's a
6471 * lone monitor interface.
6472 */
6473 if (ar->monitor_started)
6474 ath10k_monitor_stop(ar);
6475
6476 for (i = 0; i < n_vifs; i++) {
6477 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6478
6479 ath10k_dbg(ar, ATH10K_DBG_MAC,
6480 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
6481 arvif->vdev_id,
6482 vifs[i].old_ctx->def.chan->center_freq,
6483 vifs[i].new_ctx->def.chan->center_freq,
6484 vifs[i].old_ctx->def.width,
6485 vifs[i].new_ctx->def.width);
6486
6487 if (WARN_ON(!arvif->is_started))
6488 continue;
6489
6490 if (WARN_ON(!arvif->is_up))
6491 continue;
6492
6493 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6494 if (ret) {
6495 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6496 arvif->vdev_id, ret);
6497 continue;
6498 }
6499 }
6500
6501 /* All relevant vdevs are downed and associated channel resources
6502 * should be available for the channel switch now.
6503 */
6504
6505 spin_lock_bh(&ar->data_lock);
6506 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
6507 spin_unlock_bh(&ar->data_lock);
6508
6509 for (i = 0; i < n_vifs; i++) {
6510 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6511
6512 if (WARN_ON(!arvif->is_started))
6513 continue;
6514
6515 if (WARN_ON(!arvif->is_up))
6516 continue;
6517
6518 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6519 if (ret)
6520 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6521 ret);
6522
6523 ret = ath10k_mac_setup_prb_tmpl(arvif);
6524 if (ret)
6525 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6526 ret);
6527
6528 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6529 if (ret) {
6530 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6531 arvif->vdev_id, ret);
6532 continue;
6533 }
6534
6535 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6536 arvif->bssid);
6537 if (ret) {
6538 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6539 arvif->vdev_id, ret);
6540 continue;
6541 }
6542 }
6543
6544 ath10k_monitor_recalc(ar);
6545}
6546
Michal Kazior500ff9f2015-03-31 10:26:21 +00006547static int
6548ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6549 struct ieee80211_chanctx_conf *ctx)
6550{
6551 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006552
6553 ath10k_dbg(ar, ATH10K_DBG_MAC,
6554 "mac chanctx add freq %hu width %d ptr %p\n",
6555 ctx->def.chan->center_freq, ctx->def.width, ctx);
6556
6557 mutex_lock(&ar->conf_mutex);
6558
6559 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006560 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006561 spin_unlock_bh(&ar->data_lock);
6562
6563 ath10k_recalc_radar_detection(ar);
6564 ath10k_monitor_recalc(ar);
6565
6566 mutex_unlock(&ar->conf_mutex);
6567
6568 return 0;
6569}
6570
6571static void
6572ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6573 struct ieee80211_chanctx_conf *ctx)
6574{
6575 struct ath10k *ar = hw->priv;
6576
6577 ath10k_dbg(ar, ATH10K_DBG_MAC,
6578 "mac chanctx remove freq %hu width %d ptr %p\n",
6579 ctx->def.chan->center_freq, ctx->def.width, ctx);
6580
6581 mutex_lock(&ar->conf_mutex);
6582
6583 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006584 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006585 spin_unlock_bh(&ar->data_lock);
6586
6587 ath10k_recalc_radar_detection(ar);
6588 ath10k_monitor_recalc(ar);
6589
6590 mutex_unlock(&ar->conf_mutex);
6591}
6592
Michal Kazior9713e3d2015-09-03 10:44:52 +02006593struct ath10k_mac_change_chanctx_arg {
6594 struct ieee80211_chanctx_conf *ctx;
6595 struct ieee80211_vif_chanctx_switch *vifs;
6596 int n_vifs;
6597 int next_vif;
6598};
6599
6600static void
6601ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6602 struct ieee80211_vif *vif)
6603{
6604 struct ath10k_mac_change_chanctx_arg *arg = data;
6605
6606 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
6607 return;
6608
6609 arg->n_vifs++;
6610}
6611
6612static void
6613ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6614 struct ieee80211_vif *vif)
6615{
6616 struct ath10k_mac_change_chanctx_arg *arg = data;
6617 struct ieee80211_chanctx_conf *ctx;
6618
6619 ctx = rcu_access_pointer(vif->chanctx_conf);
6620 if (ctx != arg->ctx)
6621 return;
6622
6623 if (WARN_ON(arg->next_vif == arg->n_vifs))
6624 return;
6625
6626 arg->vifs[arg->next_vif].vif = vif;
6627 arg->vifs[arg->next_vif].old_ctx = ctx;
6628 arg->vifs[arg->next_vif].new_ctx = ctx;
6629 arg->next_vif++;
6630}
6631
Michal Kazior500ff9f2015-03-31 10:26:21 +00006632static void
6633ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6634 struct ieee80211_chanctx_conf *ctx,
6635 u32 changed)
6636{
6637 struct ath10k *ar = hw->priv;
Michal Kazior9713e3d2015-09-03 10:44:52 +02006638 struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
Michal Kazior500ff9f2015-03-31 10:26:21 +00006639
6640 mutex_lock(&ar->conf_mutex);
6641
6642 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006643 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6644 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006645
6646 /* This shouldn't really happen because channel switching should use
6647 * switch_vif_chanctx().
6648 */
6649 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6650 goto unlock;
6651
Michal Kazior9713e3d2015-09-03 10:44:52 +02006652 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
6653 ieee80211_iterate_active_interfaces_atomic(
6654 hw,
6655 IEEE80211_IFACE_ITER_NORMAL,
6656 ath10k_mac_change_chanctx_cnt_iter,
6657 &arg);
6658 if (arg.n_vifs == 0)
6659 goto radar;
6660
6661 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
6662 GFP_KERNEL);
6663 if (!arg.vifs)
6664 goto radar;
6665
6666 ieee80211_iterate_active_interfaces_atomic(
6667 hw,
6668 IEEE80211_IFACE_ITER_NORMAL,
6669 ath10k_mac_change_chanctx_fill_iter,
6670 &arg);
6671 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6672 kfree(arg.vifs);
6673 }
6674
6675radar:
Michal Kazior500ff9f2015-03-31 10:26:21 +00006676 ath10k_recalc_radar_detection(ar);
6677
6678 /* FIXME: How to configure Rx chains properly? */
6679
6680 /* No other actions are actually necessary. Firmware maintains channel
6681 * definitions per vdev internally and there's no host-side channel
6682 * context abstraction to configure, e.g. channel width.
6683 */
6684
6685unlock:
6686 mutex_unlock(&ar->conf_mutex);
6687}
6688
6689static int
6690ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6691 struct ieee80211_vif *vif,
6692 struct ieee80211_chanctx_conf *ctx)
6693{
6694 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006695 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6696 int ret;
6697
6698 mutex_lock(&ar->conf_mutex);
6699
6700 ath10k_dbg(ar, ATH10K_DBG_MAC,
6701 "mac chanctx assign ptr %p vdev_id %i\n",
6702 ctx, arvif->vdev_id);
6703
6704 if (WARN_ON(arvif->is_started)) {
6705 mutex_unlock(&ar->conf_mutex);
6706 return -EBUSY;
6707 }
6708
Michal Kazior089ab7a2015-06-03 12:16:55 +02006709 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006710 if (ret) {
6711 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6712 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006713 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006714 goto err;
6715 }
6716
6717 arvif->is_started = true;
6718
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006719 ret = ath10k_mac_vif_setup_ps(arvif);
6720 if (ret) {
6721 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6722 arvif->vdev_id, ret);
6723 goto err_stop;
6724 }
6725
Michal Kazior500ff9f2015-03-31 10:26:21 +00006726 if (vif->type == NL80211_IFTYPE_MONITOR) {
6727 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6728 if (ret) {
6729 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6730 arvif->vdev_id, ret);
6731 goto err_stop;
6732 }
6733
6734 arvif->is_up = true;
6735 }
6736
6737 mutex_unlock(&ar->conf_mutex);
6738 return 0;
6739
6740err_stop:
6741 ath10k_vdev_stop(arvif);
6742 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006743 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006744
6745err:
6746 mutex_unlock(&ar->conf_mutex);
6747 return ret;
6748}
6749
6750static void
6751ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6752 struct ieee80211_vif *vif,
6753 struct ieee80211_chanctx_conf *ctx)
6754{
6755 struct ath10k *ar = hw->priv;
6756 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6757 int ret;
6758
6759 mutex_lock(&ar->conf_mutex);
6760
6761 ath10k_dbg(ar, ATH10K_DBG_MAC,
6762 "mac chanctx unassign ptr %p vdev_id %i\n",
6763 ctx, arvif->vdev_id);
6764
6765 WARN_ON(!arvif->is_started);
6766
6767 if (vif->type == NL80211_IFTYPE_MONITOR) {
6768 WARN_ON(!arvif->is_up);
6769
6770 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6771 if (ret)
6772 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6773 arvif->vdev_id, ret);
6774
6775 arvif->is_up = false;
6776 }
6777
6778 ret = ath10k_vdev_stop(arvif);
6779 if (ret)
6780 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6781 arvif->vdev_id, ret);
6782
6783 arvif->is_started = false;
6784
6785 mutex_unlock(&ar->conf_mutex);
6786}
6787
6788static int
6789ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6790 struct ieee80211_vif_chanctx_switch *vifs,
6791 int n_vifs,
6792 enum ieee80211_chanctx_switch_mode mode)
6793{
6794 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006795
6796 mutex_lock(&ar->conf_mutex);
6797
6798 ath10k_dbg(ar, ATH10K_DBG_MAC,
6799 "mac chanctx switch n_vifs %d mode %d\n",
6800 n_vifs, mode);
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006801 ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006802
6803 mutex_unlock(&ar->conf_mutex);
6804 return 0;
6805}
6806
Kalle Valo5e3dd152013-06-12 20:52:10 +03006807static const struct ieee80211_ops ath10k_ops = {
6808 .tx = ath10k_tx,
6809 .start = ath10k_start,
6810 .stop = ath10k_stop,
6811 .config = ath10k_config,
6812 .add_interface = ath10k_add_interface,
6813 .remove_interface = ath10k_remove_interface,
6814 .configure_filter = ath10k_configure_filter,
6815 .bss_info_changed = ath10k_bss_info_changed,
6816 .hw_scan = ath10k_hw_scan,
6817 .cancel_hw_scan = ath10k_cancel_hw_scan,
6818 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006819 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006820 .sta_state = ath10k_sta_state,
6821 .conf_tx = ath10k_conf_tx,
6822 .remain_on_channel = ath10k_remain_on_channel,
6823 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6824 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006825 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006826 .flush = ath10k_flush,
6827 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006828 .set_antenna = ath10k_set_antenna,
6829 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006830 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006831 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006832 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006833 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006834 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006835 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006836 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6837 .get_et_stats = ath10k_debug_get_et_stats,
6838 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006839 .add_chanctx = ath10k_mac_op_add_chanctx,
6840 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6841 .change_chanctx = ath10k_mac_op_change_chanctx,
6842 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6843 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6844 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006845
6846 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6847
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006848#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006849 .suspend = ath10k_wow_op_suspend,
6850 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006851#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006852#ifdef CONFIG_MAC80211_DEBUGFS
6853 .sta_add_debugfs = ath10k_sta_add_debugfs,
6854#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006855};
6856
Kalle Valo5e3dd152013-06-12 20:52:10 +03006857#define CHAN2G(_channel, _freq, _flags) { \
6858 .band = IEEE80211_BAND_2GHZ, \
6859 .hw_value = (_channel), \
6860 .center_freq = (_freq), \
6861 .flags = (_flags), \
6862 .max_antenna_gain = 0, \
6863 .max_power = 30, \
6864}
6865
6866#define CHAN5G(_channel, _freq, _flags) { \
6867 .band = IEEE80211_BAND_5GHZ, \
6868 .hw_value = (_channel), \
6869 .center_freq = (_freq), \
6870 .flags = (_flags), \
6871 .max_antenna_gain = 0, \
6872 .max_power = 30, \
6873}
6874
6875static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6876 CHAN2G(1, 2412, 0),
6877 CHAN2G(2, 2417, 0),
6878 CHAN2G(3, 2422, 0),
6879 CHAN2G(4, 2427, 0),
6880 CHAN2G(5, 2432, 0),
6881 CHAN2G(6, 2437, 0),
6882 CHAN2G(7, 2442, 0),
6883 CHAN2G(8, 2447, 0),
6884 CHAN2G(9, 2452, 0),
6885 CHAN2G(10, 2457, 0),
6886 CHAN2G(11, 2462, 0),
6887 CHAN2G(12, 2467, 0),
6888 CHAN2G(13, 2472, 0),
6889 CHAN2G(14, 2484, 0),
6890};
6891
6892static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006893 CHAN5G(36, 5180, 0),
6894 CHAN5G(40, 5200, 0),
6895 CHAN5G(44, 5220, 0),
6896 CHAN5G(48, 5240, 0),
6897 CHAN5G(52, 5260, 0),
6898 CHAN5G(56, 5280, 0),
6899 CHAN5G(60, 5300, 0),
6900 CHAN5G(64, 5320, 0),
6901 CHAN5G(100, 5500, 0),
6902 CHAN5G(104, 5520, 0),
6903 CHAN5G(108, 5540, 0),
6904 CHAN5G(112, 5560, 0),
6905 CHAN5G(116, 5580, 0),
6906 CHAN5G(120, 5600, 0),
6907 CHAN5G(124, 5620, 0),
6908 CHAN5G(128, 5640, 0),
6909 CHAN5G(132, 5660, 0),
6910 CHAN5G(136, 5680, 0),
6911 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006912 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006913 CHAN5G(149, 5745, 0),
6914 CHAN5G(153, 5765, 0),
6915 CHAN5G(157, 5785, 0),
6916 CHAN5G(161, 5805, 0),
6917 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006918};
6919
Michal Kaziore7b54192014-08-07 11:03:27 +02006920struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006921{
6922 struct ieee80211_hw *hw;
6923 struct ath10k *ar;
6924
Michal Kaziore7b54192014-08-07 11:03:27 +02006925 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006926 if (!hw)
6927 return NULL;
6928
6929 ar = hw->priv;
6930 ar->hw = hw;
6931
6932 return ar;
6933}
6934
6935void ath10k_mac_destroy(struct ath10k *ar)
6936{
6937 ieee80211_free_hw(ar->hw);
6938}
6939
6940static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6941 {
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306942 .max = 8,
6943 .types = BIT(NL80211_IFTYPE_STATION)
6944 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006945 },
6946 {
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306947 .max = 3,
6948 .types = BIT(NL80211_IFTYPE_P2P_GO)
Michal Kaziord531cb82013-07-31 10:55:13 +02006949 },
6950 {
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306951 .max = 1,
6952 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
Michal Kazior75d2bd42014-12-12 12:41:39 +01006953 },
6954 {
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306955 .max = 7,
6956 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006957#ifdef CONFIG_MAC80211_MESH
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306958 | BIT(NL80211_IFTYPE_MESH_POINT)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006959#endif
Michal Kaziord531cb82013-07-31 10:55:13 +02006960 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006961};
6962
Bartosz Markowskif2595092013-12-10 16:20:39 +01006963static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006964 {
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306965 .max = 8,
6966 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006967#ifdef CONFIG_MAC80211_MESH
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306968 | BIT(NL80211_IFTYPE_MESH_POINT)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006969#endif
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006970 },
Mohammed Shafi Shajakhan78f7aeb2015-11-21 15:24:41 +05306971 {
6972 .max = 1,
6973 .types = BIT(NL80211_IFTYPE_STATION)
6974 },
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006975};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006976
6977static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6978 {
6979 .limits = ath10k_if_limits,
6980 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6981 .max_interfaces = 8,
6982 .num_different_channels = 1,
6983 .beacon_int_infra_match = true,
6984 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006985};
6986
6987static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006988 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006989 .limits = ath10k_10x_if_limits,
6990 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006991 .max_interfaces = 8,
6992 .num_different_channels = 1,
6993 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006994#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006995 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6996 BIT(NL80211_CHAN_WIDTH_20) |
6997 BIT(NL80211_CHAN_WIDTH_40) |
6998 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006999#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01007000 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03007001};
7002
Michal Kaziorcf327842015-03-31 10:26:25 +00007003static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
7004 {
7005 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02007006 .types = BIT(NL80211_IFTYPE_STATION),
7007 },
7008 {
7009 .max = 2,
7010 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007011#ifdef CONFIG_MAC80211_MESH
7012 BIT(NL80211_IFTYPE_MESH_POINT) |
7013#endif
Michal Kaziorcf327842015-03-31 10:26:25 +00007014 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7015 BIT(NL80211_IFTYPE_P2P_GO),
7016 },
7017 {
7018 .max = 1,
7019 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7020 },
7021};
7022
Michal Kaziored25b112015-07-09 13:08:39 +02007023static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
7024 {
7025 .max = 2,
7026 .types = BIT(NL80211_IFTYPE_STATION),
7027 },
7028 {
7029 .max = 2,
7030 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
7031 },
7032 {
7033 .max = 1,
7034 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007035#ifdef CONFIG_MAC80211_MESH
7036 BIT(NL80211_IFTYPE_MESH_POINT) |
7037#endif
Michal Kaziored25b112015-07-09 13:08:39 +02007038 BIT(NL80211_IFTYPE_P2P_GO),
7039 },
7040 {
7041 .max = 1,
7042 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7043 },
7044};
7045
Michal Kaziorcf327842015-03-31 10:26:25 +00007046static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
7047 {
7048 .max = 1,
7049 .types = BIT(NL80211_IFTYPE_STATION),
7050 },
7051 {
7052 .max = 1,
7053 .types = BIT(NL80211_IFTYPE_ADHOC),
7054 },
7055};
7056
7057/* FIXME: This is not thouroughly tested. These combinations may over- or
7058 * underestimate hw/fw capabilities.
7059 */
7060static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
7061 {
7062 .limits = ath10k_tlv_if_limit,
7063 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02007064 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00007065 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7066 },
7067 {
7068 .limits = ath10k_tlv_if_limit_ibss,
7069 .num_different_channels = 1,
7070 .max_interfaces = 2,
7071 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7072 },
7073};
7074
7075static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
7076 {
7077 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02007078 .num_different_channels = 1,
7079 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00007080 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7081 },
7082 {
Michal Kaziored25b112015-07-09 13:08:39 +02007083 .limits = ath10k_tlv_qcs_if_limit,
7084 .num_different_channels = 2,
7085 .max_interfaces = 4,
7086 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
7087 },
7088 {
Michal Kaziorcf327842015-03-31 10:26:25 +00007089 .limits = ath10k_tlv_if_limit_ibss,
7090 .num_different_channels = 1,
7091 .max_interfaces = 2,
7092 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7093 },
7094};
7095
Raja Manicf36fef2015-06-22 20:22:25 +05307096static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
7097 {
7098 .max = 1,
7099 .types = BIT(NL80211_IFTYPE_STATION),
7100 },
7101 {
7102 .max = 16,
7103 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007104#ifdef CONFIG_MAC80211_MESH
7105 | BIT(NL80211_IFTYPE_MESH_POINT)
7106#endif
Raja Manicf36fef2015-06-22 20:22:25 +05307107 },
7108};
7109
7110static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
7111 {
7112 .limits = ath10k_10_4_if_limits,
7113 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
7114 .max_interfaces = 16,
7115 .num_different_channels = 1,
7116 .beacon_int_infra_match = true,
7117#ifdef CONFIG_ATH10K_DFS_CERTIFIED
7118 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7119 BIT(NL80211_CHAN_WIDTH_20) |
7120 BIT(NL80211_CHAN_WIDTH_40) |
7121 BIT(NL80211_CHAN_WIDTH_80),
7122#endif
7123 },
7124};
7125
Kalle Valo5e3dd152013-06-12 20:52:10 +03007126static void ath10k_get_arvif_iter(void *data, u8 *mac,
7127 struct ieee80211_vif *vif)
7128{
7129 struct ath10k_vif_iter *arvif_iter = data;
7130 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
7131
7132 if (arvif->vdev_id == arvif_iter->vdev_id)
7133 arvif_iter->arvif = arvif;
7134}
7135
7136struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
7137{
7138 struct ath10k_vif_iter arvif_iter;
7139 u32 flags;
7140
7141 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
7142 arvif_iter.vdev_id = vdev_id;
7143
7144 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
7145 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7146 flags,
7147 ath10k_get_arvif_iter,
7148 &arvif_iter);
7149 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007150 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007151 return NULL;
7152 }
7153
7154 return arvif_iter.arvif;
7155}
7156
7157int ath10k_mac_register(struct ath10k *ar)
7158{
Johannes Berg3cb10942015-01-22 21:38:45 +01007159 static const u32 cipher_suites[] = {
7160 WLAN_CIPHER_SUITE_WEP40,
7161 WLAN_CIPHER_SUITE_WEP104,
7162 WLAN_CIPHER_SUITE_TKIP,
7163 WLAN_CIPHER_SUITE_CCMP,
7164 WLAN_CIPHER_SUITE_AES_CMAC,
7165 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03007166 struct ieee80211_supported_band *band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007167 void *channels;
7168 int ret;
7169
7170 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7171
7172 SET_IEEE80211_DEV(ar->hw, ar->dev);
7173
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00007174 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
7175 ARRAY_SIZE(ath10k_5ghz_channels)) !=
7176 ATH10K_NUM_CHANS);
7177
Kalle Valo5e3dd152013-06-12 20:52:10 +03007178 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
7179 channels = kmemdup(ath10k_2ghz_channels,
7180 sizeof(ath10k_2ghz_channels),
7181 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02007182 if (!channels) {
7183 ret = -ENOMEM;
7184 goto err_free;
7185 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007186
7187 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
7188 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7189 band->channels = channels;
7190 band->n_bitrates = ath10k_g_rates_size;
7191 band->bitrates = ath10k_g_rates;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007192
7193 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
7194 }
7195
7196 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7197 channels = kmemdup(ath10k_5ghz_channels,
7198 sizeof(ath10k_5ghz_channels),
7199 GFP_KERNEL);
7200 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007201 ret = -ENOMEM;
7202 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007203 }
7204
7205 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7206 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7207 band->channels = channels;
7208 band->n_bitrates = ath10k_a_rates_size;
7209 band->bitrates = ath10k_a_rates;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007210 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7211 }
7212
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05307213 ath10k_mac_setup_ht_vht_cap(ar);
7214
Kalle Valo5e3dd152013-06-12 20:52:10 +03007215 ar->hw->wiphy->interface_modes =
7216 BIT(NL80211_IFTYPE_STATION) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007217 BIT(NL80211_IFTYPE_AP) |
7218 BIT(NL80211_IFTYPE_MESH_POINT);
Bartosz Markowskid3541812013-12-10 16:20:40 +01007219
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05307220 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
7221 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
Ben Greear46acf7b2014-05-16 17:15:38 +03007222
Bartosz Markowskid3541812013-12-10 16:20:40 +01007223 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7224 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007225 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007226 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7227 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007228
Johannes Berg30686bf2015-06-02 21:39:54 +02007229 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7230 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7231 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7232 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7233 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7234 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7235 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7236 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007237 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7238 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7239 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7240 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7241 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7242 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007243
David Liuccec9032015-07-24 20:25:32 +03007244 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7245 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7246
Eliad Peller0d8614b2014-09-10 14:07:36 +03007247 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007248 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007249
Kalle Valo5e3dd152013-06-12 20:52:10 +03007250 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007251 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007252
7253 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007254 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7255 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007256 }
7257
7258 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7259 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7260
7261 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007262 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007263
Kalle Valo5e3dd152013-06-12 20:52:10 +03007264 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7265
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007266 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7267 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7268
7269 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7270 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7271 * correct Probe Responses. This is more of a hack advert..
7272 */
7273 ar->hw->wiphy->probe_resp_offload |=
7274 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7275 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7276 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7277 }
7278
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007279 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7280 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7281
Kalle Valo5e3dd152013-06-12 20:52:10 +03007282 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007283 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007284 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7285
7286 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007287 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7288
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007289 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7290
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007291 ret = ath10k_wow_init(ar);
7292 if (ret) {
7293 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7294 goto err_free;
7295 }
7296
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007297 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7298
Kalle Valo5e3dd152013-06-12 20:52:10 +03007299 /*
7300 * on LL hardware queues are managed entirely by the FW
7301 * so we only advertise to mac we can do the queues thing
7302 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007303 ar->hw->queues = IEEE80211_MAX_QUEUES;
7304
7305 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7306 * something that vdev_ids can't reach so that we don't stop the queue
7307 * accidentally.
7308 */
7309 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007310
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007311 switch (ar->wmi.op_version) {
7312 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007313 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7314 ar->hw->wiphy->n_iface_combinations =
7315 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007316 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007317 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007318 case ATH10K_FW_WMI_OP_VERSION_TLV:
7319 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7320 ar->hw->wiphy->iface_combinations =
7321 ath10k_tlv_qcs_if_comb;
7322 ar->hw->wiphy->n_iface_combinations =
7323 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7324 } else {
7325 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7326 ar->hw->wiphy->n_iface_combinations =
7327 ARRAY_SIZE(ath10k_tlv_if_comb);
7328 }
7329 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7330 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007331 case ATH10K_FW_WMI_OP_VERSION_10_1:
7332 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007333 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007334 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7335 ar->hw->wiphy->n_iface_combinations =
7336 ARRAY_SIZE(ath10k_10x_if_comb);
7337 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307338 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307339 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7340 ar->hw->wiphy->n_iface_combinations =
7341 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307342 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007343 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7344 case ATH10K_FW_WMI_OP_VERSION_MAX:
7345 WARN_ON(1);
7346 ret = -EINVAL;
7347 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007348 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007349
David Liuccec9032015-07-24 20:25:32 +03007350 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7351 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007352
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007353 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7354 /* Init ath dfs pattern detector */
7355 ar->ath_common.debug_mask = ATH_DBG_DFS;
7356 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7357 NL80211_DFS_UNSET);
7358
7359 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007360 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007361 }
7362
Kalle Valo5e3dd152013-06-12 20:52:10 +03007363 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7364 ath10k_reg_notifier);
7365 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007366 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007367 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007368 }
7369
Johannes Berg3cb10942015-01-22 21:38:45 +01007370 ar->hw->wiphy->cipher_suites = cipher_suites;
7371 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7372
Kalle Valo5e3dd152013-06-12 20:52:10 +03007373 ret = ieee80211_register_hw(ar->hw);
7374 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007375 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007376 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007377 }
7378
7379 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7380 ret = regulatory_hint(ar->hw->wiphy,
7381 ar->ath_common.regulatory.alpha2);
7382 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007383 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007384 }
7385
7386 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007387
7388err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007389 ieee80211_unregister_hw(ar->hw);
Jeff Johnson0e339442015-10-08 09:15:53 -07007390
7391err_dfs_detector_exit:
7392 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7393 ar->dfs_detector->exit(ar->dfs_detector);
7394
Michal Kaziord6015b22013-07-22 14:13:30 +02007395err_free:
7396 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7397 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7398
Jeff Johnson0e339442015-10-08 09:15:53 -07007399 SET_IEEE80211_DEV(ar->hw, NULL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007400 return ret;
7401}
7402
7403void ath10k_mac_unregister(struct ath10k *ar)
7404{
7405 ieee80211_unregister_hw(ar->hw);
7406
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007407 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7408 ar->dfs_detector->exit(ar->dfs_detector);
7409
Kalle Valo5e3dd152013-06-12 20:52:10 +03007410 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7411 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7412
7413 SET_IEEE80211_DEV(ar->hw, NULL);
7414}