blob: fd4c13507790173b138ffbe89b3e1d3318c38754 [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 &&
253 arvif->vif->type != NL80211_IFTYPE_ADHOC))
254 return -EINVAL;
255
Kalle Valo5e3dd152013-06-12 20:52:10 +0300256 spin_lock_bh(&ar->data_lock);
257 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
258 spin_unlock_bh(&ar->data_lock);
259
260 if (!peer)
261 return -ENOENT;
262
263 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
264 if (arvif->wep_keys[i] == NULL)
265 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100266
Michal Kazior8674d902015-08-13 14:10:46 +0200267 switch (arvif->vif->type) {
268 case NL80211_IFTYPE_AP:
269 flags = WMI_KEY_PAIRWISE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300270
Michal Kazior8674d902015-08-13 14:10:46 +0200271 if (arvif->def_wep_key_idx == i)
272 flags |= WMI_KEY_TX_USAGE;
Michal Kaziorce90b272015-04-10 13:23:21 +0000273
Michal Kazior8674d902015-08-13 14:10:46 +0200274 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
275 SET_KEY, addr, flags);
276 if (ret < 0)
277 return ret;
278 break;
279 case NL80211_IFTYPE_ADHOC:
280 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
281 SET_KEY, addr,
282 WMI_KEY_PAIRWISE);
283 if (ret < 0)
284 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300285
Michal Kazior8674d902015-08-13 14:10:46 +0200286 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
287 SET_KEY, addr, WMI_KEY_GROUP);
288 if (ret < 0)
289 return ret;
290 break;
291 default:
292 WARN_ON(1);
293 return -EINVAL;
294 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300295
Sujith Manoharanae167132014-11-25 11:46:59 +0530296 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300297 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530298 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300299 }
300
Michal Kaziorce90b272015-04-10 13:23:21 +0000301 /* In some cases (notably with static WEP IBSS with multiple keys)
302 * multicast Tx becomes broken. Both pairwise and groupwise keys are
303 * installed already. Using WMI_KEY_TX_USAGE in different combinations
304 * didn't seem help. Using def_keyid vdev parameter seems to be
305 * effective so use that.
306 *
307 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
308 */
Michal Kazior8674d902015-08-13 14:10:46 +0200309 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
310 return 0;
311
Michal Kaziorce90b272015-04-10 13:23:21 +0000312 if (arvif->def_wep_key_idx == -1)
313 return 0;
314
315 ret = ath10k_wmi_vdev_set_param(arvif->ar,
316 arvif->vdev_id,
317 arvif->ar->wmi.vdev_param->def_keyid,
318 arvif->def_wep_key_idx);
319 if (ret) {
320 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
321 arvif->vdev_id, ret);
322 return ret;
323 }
324
Kalle Valo5e3dd152013-06-12 20:52:10 +0300325 return 0;
326}
327
328static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
329 const u8 *addr)
330{
331 struct ath10k *ar = arvif->ar;
332 struct ath10k_peer *peer;
333 int first_errno = 0;
334 int ret;
335 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100336 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300337
338 lockdep_assert_held(&ar->conf_mutex);
339
340 spin_lock_bh(&ar->data_lock);
341 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
342 spin_unlock_bh(&ar->data_lock);
343
344 if (!peer)
345 return -ENOENT;
346
347 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
348 if (peer->keys[i] == NULL)
349 continue;
350
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200351 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300352 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100353 DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300354 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300355 first_errno = ret;
356
David Liuccec9032015-07-24 20:25:32 +0300357 if (ret < 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200358 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300359 i, ret);
360
Sujith Manoharanae167132014-11-25 11:46:59 +0530361 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300362 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530363 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300364 }
365
366 return first_errno;
367}
368
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530369bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
370 u8 keyidx)
371{
372 struct ath10k_peer *peer;
373 int i;
374
375 lockdep_assert_held(&ar->data_lock);
376
377 /* We don't know which vdev this peer belongs to,
378 * since WMI doesn't give us that information.
379 *
380 * FIXME: multi-bss needs to be handled.
381 */
382 peer = ath10k_peer_find(ar, 0, addr);
383 if (!peer)
384 return false;
385
386 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
387 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
388 return true;
389 }
390
391 return false;
392}
393
Kalle Valo5e3dd152013-06-12 20:52:10 +0300394static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
395 struct ieee80211_key_conf *key)
396{
397 struct ath10k *ar = arvif->ar;
398 struct ath10k_peer *peer;
399 u8 addr[ETH_ALEN];
400 int first_errno = 0;
401 int ret;
402 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100403 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300404
405 lockdep_assert_held(&ar->conf_mutex);
406
407 for (;;) {
408 /* since ath10k_install_key we can't hold data_lock all the
409 * time, so we try to remove the keys incrementally */
410 spin_lock_bh(&ar->data_lock);
411 i = 0;
412 list_for_each_entry(peer, &ar->peers, list) {
413 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
414 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300415 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300416 peer->keys[i] = NULL;
417 break;
418 }
419 }
420
421 if (i < ARRAY_SIZE(peer->keys))
422 break;
423 }
424 spin_unlock_bh(&ar->data_lock);
425
426 if (i == ARRAY_SIZE(peer->keys))
427 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200428 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100429 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
David Liuccec9032015-07-24 20:25:32 +0300430 if (ret < 0 && first_errno == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300431 first_errno = ret;
432
433 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200434 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200435 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300436 }
437
438 return first_errno;
439}
440
Michal Kaziorad325cb2015-02-18 14:02:27 +0100441static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
442 struct ieee80211_key_conf *key)
443{
444 struct ath10k *ar = arvif->ar;
445 struct ath10k_peer *peer;
446 int ret;
447
448 lockdep_assert_held(&ar->conf_mutex);
449
450 list_for_each_entry(peer, &ar->peers, list) {
451 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
452 continue;
453
454 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
455 continue;
456
457 if (peer->keys[key->keyidx] == key)
458 continue;
459
460 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
461 arvif->vdev_id, key->keyidx);
462
463 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
464 if (ret) {
465 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
466 arvif->vdev_id, peer->addr, ret);
467 return ret;
468 }
469 }
470
471 return 0;
472}
473
Kalle Valo5e3dd152013-06-12 20:52:10 +0300474/*********************/
475/* General utilities */
476/*********************/
477
478static inline enum wmi_phy_mode
479chan_to_phymode(const struct cfg80211_chan_def *chandef)
480{
481 enum wmi_phy_mode phymode = MODE_UNKNOWN;
482
483 switch (chandef->chan->band) {
484 case IEEE80211_BAND_2GHZ:
485 switch (chandef->width) {
486 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800487 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
488 phymode = MODE_11B;
489 else
490 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300491 break;
492 case NL80211_CHAN_WIDTH_20:
493 phymode = MODE_11NG_HT20;
494 break;
495 case NL80211_CHAN_WIDTH_40:
496 phymode = MODE_11NG_HT40;
497 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400498 case NL80211_CHAN_WIDTH_5:
499 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300500 case NL80211_CHAN_WIDTH_80:
501 case NL80211_CHAN_WIDTH_80P80:
502 case NL80211_CHAN_WIDTH_160:
503 phymode = MODE_UNKNOWN;
504 break;
505 }
506 break;
507 case IEEE80211_BAND_5GHZ:
508 switch (chandef->width) {
509 case NL80211_CHAN_WIDTH_20_NOHT:
510 phymode = MODE_11A;
511 break;
512 case NL80211_CHAN_WIDTH_20:
513 phymode = MODE_11NA_HT20;
514 break;
515 case NL80211_CHAN_WIDTH_40:
516 phymode = MODE_11NA_HT40;
517 break;
518 case NL80211_CHAN_WIDTH_80:
519 phymode = MODE_11AC_VHT80;
520 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400521 case NL80211_CHAN_WIDTH_5:
522 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300523 case NL80211_CHAN_WIDTH_80P80:
524 case NL80211_CHAN_WIDTH_160:
525 phymode = MODE_UNKNOWN;
526 break;
527 }
528 break;
529 default:
530 break;
531 }
532
533 WARN_ON(phymode == MODE_UNKNOWN);
534 return phymode;
535}
536
537static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
538{
539/*
540 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
541 * 0 for no restriction
542 * 1 for 1/4 us
543 * 2 for 1/2 us
544 * 3 for 1 us
545 * 4 for 2 us
546 * 5 for 4 us
547 * 6 for 8 us
548 * 7 for 16 us
549 */
550 switch (mpdudensity) {
551 case 0:
552 return 0;
553 case 1:
554 case 2:
555 case 3:
556 /* Our lower layer calculations limit our precision to
557 1 microsecond */
558 return 1;
559 case 4:
560 return 2;
561 case 5:
562 return 4;
563 case 6:
564 return 8;
565 case 7:
566 return 16;
567 default:
568 return 0;
569 }
570}
571
Michal Kazior500ff9f2015-03-31 10:26:21 +0000572int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
573 struct cfg80211_chan_def *def)
574{
575 struct ieee80211_chanctx_conf *conf;
576
577 rcu_read_lock();
578 conf = rcu_dereference(vif->chanctx_conf);
579 if (!conf) {
580 rcu_read_unlock();
581 return -ENOENT;
582 }
583
584 *def = conf->def;
585 rcu_read_unlock();
586
587 return 0;
588}
589
590static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
591 struct ieee80211_chanctx_conf *conf,
592 void *data)
593{
594 int *num = data;
595
596 (*num)++;
597}
598
599static int ath10k_mac_num_chanctxs(struct ath10k *ar)
600{
601 int num = 0;
602
603 ieee80211_iter_chan_contexts_atomic(ar->hw,
604 ath10k_mac_num_chanctxs_iter,
605 &num);
606
607 return num;
608}
609
610static void
611ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
612 struct ieee80211_chanctx_conf *conf,
613 void *data)
614{
615 struct cfg80211_chan_def **def = data;
616
617 *def = &conf->def;
618}
619
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300620static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
621 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300622{
Michal Kaziore04cafb2015-08-05 12:15:24 +0200623 struct ath10k_vif *arvif;
624 int num_peers = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300625 int ret;
626
627 lockdep_assert_held(&ar->conf_mutex);
628
Michal Kaziore04cafb2015-08-05 12:15:24 +0200629 num_peers = ar->num_peers;
630
631 /* Each vdev consumes a peer entry as well */
632 list_for_each_entry(arvif, &ar->arvifs, list)
633 num_peers++;
634
635 if (num_peers >= ar->max_num_peers)
Michal Kaziorcfd10612014-11-25 15:16:05 +0100636 return -ENOBUFS;
637
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300638 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800639 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200640 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200641 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300642 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800643 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300644
645 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800646 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200647 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200648 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300649 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800650 }
Michal Kazior292a7532014-11-25 15:16:04 +0100651
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100652 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300653
654 return 0;
655}
656
Kalle Valo5a13e762014-01-20 11:01:46 +0200657static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
658{
659 struct ath10k *ar = arvif->ar;
660 u32 param;
661 int ret;
662
663 param = ar->wmi.pdev_param->sta_kickout_th;
664 ret = ath10k_wmi_pdev_set_param(ar, param,
665 ATH10K_KICKOUT_THRESHOLD);
666 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200667 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200668 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200669 return ret;
670 }
671
672 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
673 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
674 ATH10K_KEEPALIVE_MIN_IDLE);
675 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200676 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200677 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200678 return ret;
679 }
680
681 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
682 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
683 ATH10K_KEEPALIVE_MAX_IDLE);
684 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200685 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200686 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200687 return ret;
688 }
689
690 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
691 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
692 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
693 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200694 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200695 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200696 return ret;
697 }
698
699 return 0;
700}
701
Vivek Natarajanacab6402014-11-26 09:06:12 +0200702static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200703{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200704 struct ath10k *ar = arvif->ar;
705 u32 vdev_param;
706
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200707 vdev_param = ar->wmi.vdev_param->rts_threshold;
708 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200709}
710
Kalle Valo5e3dd152013-06-12 20:52:10 +0300711static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
712{
713 int ret;
714
715 lockdep_assert_held(&ar->conf_mutex);
716
717 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
718 if (ret)
719 return ret;
720
721 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
722 if (ret)
723 return ret;
724
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100725 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100726
Kalle Valo5e3dd152013-06-12 20:52:10 +0300727 return 0;
728}
729
730static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
731{
732 struct ath10k_peer *peer, *tmp;
733
734 lockdep_assert_held(&ar->conf_mutex);
735
736 spin_lock_bh(&ar->data_lock);
737 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
738 if (peer->vdev_id != vdev_id)
739 continue;
740
Michal Kazior7aa7a722014-08-25 12:09:38 +0200741 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300742 peer->addr, vdev_id);
743
744 list_del(&peer->list);
745 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100746 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300747 }
748 spin_unlock_bh(&ar->data_lock);
749}
750
Michal Kaziora96d7742013-07-16 09:38:56 +0200751static void ath10k_peer_cleanup_all(struct ath10k *ar)
752{
753 struct ath10k_peer *peer, *tmp;
754
755 lockdep_assert_held(&ar->conf_mutex);
756
757 spin_lock_bh(&ar->data_lock);
758 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
759 list_del(&peer->list);
760 kfree(peer);
761 }
762 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100763
764 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100765 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200766}
767
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300768static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
769 struct ieee80211_sta *sta,
770 enum wmi_tdls_peer_state state)
771{
772 int ret;
773 struct wmi_tdls_peer_update_cmd_arg arg = {};
774 struct wmi_tdls_peer_capab_arg cap = {};
775 struct wmi_channel_arg chan_arg = {};
776
777 lockdep_assert_held(&ar->conf_mutex);
778
779 arg.vdev_id = vdev_id;
780 arg.peer_state = state;
781 ether_addr_copy(arg.addr, sta->addr);
782
783 cap.peer_max_sp = sta->max_sp;
784 cap.peer_uapsd_queues = sta->uapsd_queues;
785
786 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
787 !sta->tdls_initiator)
788 cap.is_peer_responder = 1;
789
790 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
791 if (ret) {
792 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
793 arg.addr, vdev_id, ret);
794 return ret;
795 }
796
797 return 0;
798}
799
Kalle Valo5e3dd152013-06-12 20:52:10 +0300800/************************/
801/* Interface management */
802/************************/
803
Michal Kazior64badcb2014-09-18 11:18:02 +0300804void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
805{
806 struct ath10k *ar = arvif->ar;
807
808 lockdep_assert_held(&ar->data_lock);
809
810 if (!arvif->beacon)
811 return;
812
813 if (!arvif->beacon_buf)
814 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
815 arvif->beacon->len, DMA_TO_DEVICE);
816
Michal Kazioraf213192015-01-29 14:29:52 +0200817 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
818 arvif->beacon_state != ATH10K_BEACON_SENT))
819 return;
820
Michal Kazior64badcb2014-09-18 11:18:02 +0300821 dev_kfree_skb_any(arvif->beacon);
822
823 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200824 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300825}
826
827static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
828{
829 struct ath10k *ar = arvif->ar;
830
831 lockdep_assert_held(&ar->data_lock);
832
833 ath10k_mac_vif_beacon_free(arvif);
834
835 if (arvif->beacon_buf) {
836 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
837 arvif->beacon_buf, arvif->beacon_paddr);
838 arvif->beacon_buf = NULL;
839 }
840}
841
Kalle Valo5e3dd152013-06-12 20:52:10 +0300842static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
843{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300844 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300845
Michal Kazior548db542013-07-05 16:15:15 +0300846 lockdep_assert_held(&ar->conf_mutex);
847
Michal Kazior7962b0d2014-10-28 10:34:38 +0100848 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
849 return -ESHUTDOWN;
850
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300851 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
852 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
853 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300854 return -ETIMEDOUT;
855
856 return 0;
857}
858
Michal Kazior1bbc0972014-04-08 09:45:47 +0300859static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300860{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000861 struct cfg80211_chan_def *chandef = NULL;
Maninder Singh19be9e92015-07-16 09:25:33 +0530862 struct ieee80211_channel *channel = NULL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300863 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300864 int ret = 0;
865
866 lockdep_assert_held(&ar->conf_mutex);
867
Michal Kazior500ff9f2015-03-31 10:26:21 +0000868 ieee80211_iter_chan_contexts_atomic(ar->hw,
869 ath10k_mac_get_any_chandef_iter,
870 &chandef);
871 if (WARN_ON_ONCE(!chandef))
872 return -ENOENT;
873
874 channel = chandef->chan;
875
Kalle Valo5e3dd152013-06-12 20:52:10 +0300876 arg.vdev_id = vdev_id;
877 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100878 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300879
880 /* TODO setup this dynamically, what in case we
881 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100882 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200883 arg.channel.chan_radar =
884 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300885
Michal Kazior89c5c842013-10-23 04:02:13 -0700886 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700887 arg.channel.max_power = channel->max_power * 2;
888 arg.channel.max_reg_power = channel->max_reg_power * 2;
889 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300890
Michal Kazior7962b0d2014-10-28 10:34:38 +0100891 reinit_completion(&ar->vdev_setup_done);
892
Kalle Valo5e3dd152013-06-12 20:52:10 +0300893 ret = ath10k_wmi_vdev_start(ar, &arg);
894 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200895 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200896 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300897 return ret;
898 }
899
900 ret = ath10k_vdev_setup_sync(ar);
901 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200902 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200903 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300904 return ret;
905 }
906
907 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
908 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200909 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200910 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300911 goto vdev_stop;
912 }
913
914 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300915
Michal Kazior7aa7a722014-08-25 12:09:38 +0200916 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300917 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300918 return 0;
919
920vdev_stop:
921 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
922 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200923 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200924 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300925
926 return ret;
927}
928
Michal Kazior1bbc0972014-04-08 09:45:47 +0300929static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300930{
931 int ret = 0;
932
933 lockdep_assert_held(&ar->conf_mutex);
934
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200935 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
936 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200937 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200938 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300939
Michal Kazior7962b0d2014-10-28 10:34:38 +0100940 reinit_completion(&ar->vdev_setup_done);
941
Kalle Valo5e3dd152013-06-12 20:52:10 +0300942 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
943 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200944 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200945 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300946
947 ret = ath10k_vdev_setup_sync(ar);
948 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200949 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200950 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300951
Michal Kazior7aa7a722014-08-25 12:09:38 +0200952 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300953 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300954 return ret;
955}
956
Michal Kazior1bbc0972014-04-08 09:45:47 +0300957static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300958{
959 int bit, ret = 0;
960
961 lockdep_assert_held(&ar->conf_mutex);
962
Ben Greeara9aefb32014-08-12 11:02:19 +0300963 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200964 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300965 return -ENOMEM;
966 }
967
Ben Greear16c11172014-09-23 14:17:16 -0700968 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300969
Ben Greear16c11172014-09-23 14:17:16 -0700970 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300971
972 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
973 WMI_VDEV_TYPE_MONITOR,
974 0, ar->mac_addr);
975 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200976 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200977 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300978 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300979 }
980
Ben Greear16c11172014-09-23 14:17:16 -0700981 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200982 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300983 ar->monitor_vdev_id);
984
Kalle Valo5e3dd152013-06-12 20:52:10 +0300985 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300986}
987
Michal Kazior1bbc0972014-04-08 09:45:47 +0300988static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300989{
990 int ret = 0;
991
992 lockdep_assert_held(&ar->conf_mutex);
993
Kalle Valo5e3dd152013-06-12 20:52:10 +0300994 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
995 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200996 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200997 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300998 return ret;
999 }
1000
Ben Greear16c11172014-09-23 14:17:16 -07001001 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001002
Michal Kazior7aa7a722014-08-25 12:09:38 +02001003 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001004 ar->monitor_vdev_id);
1005 return ret;
1006}
1007
Michal Kazior1bbc0972014-04-08 09:45:47 +03001008static int ath10k_monitor_start(struct ath10k *ar)
1009{
1010 int ret;
1011
1012 lockdep_assert_held(&ar->conf_mutex);
1013
Michal Kazior1bbc0972014-04-08 09:45:47 +03001014 ret = ath10k_monitor_vdev_create(ar);
1015 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001016 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001017 return ret;
1018 }
1019
1020 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1021 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001022 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001023 ath10k_monitor_vdev_delete(ar);
1024 return ret;
1025 }
1026
1027 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001028 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +03001029
1030 return 0;
1031}
1032
Michal Kazior19337472014-08-28 12:58:16 +02001033static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001034{
1035 int ret;
1036
1037 lockdep_assert_held(&ar->conf_mutex);
1038
Michal Kazior1bbc0972014-04-08 09:45:47 +03001039 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001040 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001041 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001042 return ret;
1043 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001044
1045 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001046 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001047 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001048 return ret;
1049 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001050
1051 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001052 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001053
1054 return 0;
1055}
1056
Michal Kazior500ff9f2015-03-31 10:26:21 +00001057static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1058{
1059 int num_ctx;
1060
1061 /* At least one chanctx is required to derive a channel to start
1062 * monitor vdev on.
1063 */
1064 num_ctx = ath10k_mac_num_chanctxs(ar);
1065 if (num_ctx == 0)
1066 return false;
1067
1068 /* If there's already an existing special monitor interface then don't
1069 * bother creating another monitor vdev.
1070 */
1071 if (ar->monitor_arvif)
1072 return false;
1073
1074 return ar->monitor ||
Bob Copeland0d031c82015-09-09 12:47:34 -04001075 ar->filter_flags & FIF_OTHER_BSS ||
Michal Kazior500ff9f2015-03-31 10:26:21 +00001076 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1077}
1078
1079static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1080{
1081 int num_ctx;
1082
1083 num_ctx = ath10k_mac_num_chanctxs(ar);
1084
1085 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1086 * shouldn't allow this but make sure to prevent handling the following
1087 * case anyway since multi-channel DFS hasn't been tested at all.
1088 */
1089 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1090 return false;
1091
1092 return true;
1093}
1094
Michal Kazior19337472014-08-28 12:58:16 +02001095static int ath10k_monitor_recalc(struct ath10k *ar)
1096{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001097 bool needed;
1098 bool allowed;
1099 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001100
1101 lockdep_assert_held(&ar->conf_mutex);
1102
Michal Kazior500ff9f2015-03-31 10:26:21 +00001103 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1104 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001105
1106 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001107 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1108 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001109
Michal Kazior500ff9f2015-03-31 10:26:21 +00001110 if (WARN_ON(needed && !allowed)) {
1111 if (ar->monitor_started) {
1112 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1113
1114 ret = ath10k_monitor_stop(ar);
1115 if (ret)
Kalle Valo2a995082015-10-05 17:56:37 +03001116 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1117 ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001118 /* not serious */
1119 }
1120
1121 return -EPERM;
1122 }
1123
1124 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001125 return 0;
1126
Michal Kazior500ff9f2015-03-31 10:26:21 +00001127 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001128 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001129 else
1130 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001131}
1132
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001133static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1134{
1135 struct ath10k *ar = arvif->ar;
1136 u32 vdev_param, rts_cts = 0;
1137
1138 lockdep_assert_held(&ar->conf_mutex);
1139
1140 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1141
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001142 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001143
1144 if (arvif->num_legacy_stations > 0)
1145 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1146 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001147 else
1148 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1149 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001150
1151 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1152 rts_cts);
1153}
1154
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001155static int ath10k_start_cac(struct ath10k *ar)
1156{
1157 int ret;
1158
1159 lockdep_assert_held(&ar->conf_mutex);
1160
1161 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1162
Michal Kazior19337472014-08-28 12:58:16 +02001163 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001164 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001165 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001166 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1167 return ret;
1168 }
1169
Michal Kazior7aa7a722014-08-25 12:09:38 +02001170 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001171 ar->monitor_vdev_id);
1172
1173 return 0;
1174}
1175
1176static int ath10k_stop_cac(struct ath10k *ar)
1177{
1178 lockdep_assert_held(&ar->conf_mutex);
1179
1180 /* CAC is not running - do nothing */
1181 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1182 return 0;
1183
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001184 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001185 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001186
Michal Kazior7aa7a722014-08-25 12:09:38 +02001187 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001188
1189 return 0;
1190}
1191
Michal Kazior500ff9f2015-03-31 10:26:21 +00001192static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1193 struct ieee80211_chanctx_conf *conf,
1194 void *data)
1195{
1196 bool *ret = data;
1197
1198 if (!*ret && conf->radar_enabled)
1199 *ret = true;
1200}
1201
1202static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1203{
1204 bool has_radar = false;
1205
1206 ieee80211_iter_chan_contexts_atomic(ar->hw,
1207 ath10k_mac_has_radar_iter,
1208 &has_radar);
1209
1210 return has_radar;
1211}
1212
Michal Kaziord6500972014-04-08 09:56:09 +03001213static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001214{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001215 int ret;
1216
1217 lockdep_assert_held(&ar->conf_mutex);
1218
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001219 ath10k_stop_cac(ar);
1220
Michal Kazior500ff9f2015-03-31 10:26:21 +00001221 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001222 return;
1223
Michal Kaziord6500972014-04-08 09:56:09 +03001224 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001225 return;
1226
1227 ret = ath10k_start_cac(ar);
1228 if (ret) {
1229 /*
1230 * Not possible to start CAC on current channel so starting
1231 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1232 * by indicating that radar was detected.
1233 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001234 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001235 ieee80211_radar_detected(ar->hw);
1236 }
1237}
1238
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301239static int ath10k_vdev_stop(struct ath10k_vif *arvif)
Michal Kazior72654fa2014-04-08 09:56:09 +03001240{
1241 struct ath10k *ar = arvif->ar;
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301242 int ret;
1243
1244 lockdep_assert_held(&ar->conf_mutex);
1245
1246 reinit_completion(&ar->vdev_setup_done);
1247
1248 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1249 if (ret) {
1250 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1251 arvif->vdev_id, ret);
1252 return ret;
1253 }
1254
1255 ret = ath10k_vdev_setup_sync(ar);
1256 if (ret) {
1257 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1258 arvif->vdev_id, ret);
1259 return ret;
1260 }
1261
1262 WARN_ON(ar->num_started_vdevs == 0);
1263
1264 if (ar->num_started_vdevs != 0) {
1265 ar->num_started_vdevs--;
1266 ath10k_recalc_radar_detection(ar);
1267 }
1268
1269 return ret;
1270}
1271
Michal Kazior500ff9f2015-03-31 10:26:21 +00001272static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1273 const struct cfg80211_chan_def *chandef,
1274 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001275{
1276 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001277 struct wmi_vdev_start_request_arg arg = {};
1278 int ret = 0;
1279
1280 lockdep_assert_held(&ar->conf_mutex);
1281
1282 reinit_completion(&ar->vdev_setup_done);
1283
1284 arg.vdev_id = arvif->vdev_id;
1285 arg.dtim_period = arvif->dtim_period;
1286 arg.bcn_intval = arvif->beacon_interval;
1287
1288 arg.channel.freq = chandef->chan->center_freq;
1289 arg.channel.band_center_freq1 = chandef->center_freq1;
1290 arg.channel.mode = chan_to_phymode(chandef);
1291
1292 arg.channel.min_power = 0;
1293 arg.channel.max_power = chandef->chan->max_power * 2;
1294 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1295 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1296
1297 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1298 arg.ssid = arvif->u.ap.ssid;
1299 arg.ssid_len = arvif->u.ap.ssid_len;
1300 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1301
1302 /* For now allow DFS for AP mode */
1303 arg.channel.chan_radar =
1304 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1305 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1306 arg.ssid = arvif->vif->bss_conf.ssid;
1307 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1308 }
1309
Michal Kazior7aa7a722014-08-25 12:09:38 +02001310 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001311 "mac vdev %d start center_freq %d phymode %s\n",
1312 arg.vdev_id, arg.channel.freq,
1313 ath10k_wmi_phymode_str(arg.channel.mode));
1314
Michal Kaziordc55e302014-07-29 12:53:36 +03001315 if (restart)
1316 ret = ath10k_wmi_vdev_restart(ar, &arg);
1317 else
1318 ret = ath10k_wmi_vdev_start(ar, &arg);
1319
Michal Kazior72654fa2014-04-08 09:56:09 +03001320 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001321 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001322 arg.vdev_id, ret);
1323 return ret;
1324 }
1325
1326 ret = ath10k_vdev_setup_sync(ar);
1327 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001328 ath10k_warn(ar,
1329 "failed to synchronize setup for vdev %i restart %d: %d\n",
1330 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001331 return ret;
1332 }
1333
Michal Kaziord6500972014-04-08 09:56:09 +03001334 ar->num_started_vdevs++;
1335 ath10k_recalc_radar_detection(ar);
1336
Michal Kazior72654fa2014-04-08 09:56:09 +03001337 return ret;
1338}
1339
Michal Kazior500ff9f2015-03-31 10:26:21 +00001340static int ath10k_vdev_start(struct ath10k_vif *arvif,
1341 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001342{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001343 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001344}
1345
Michal Kazior500ff9f2015-03-31 10:26:21 +00001346static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1347 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001348{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001349 return ath10k_vdev_start_restart(arvif, def, true);
Michal Kazior72654fa2014-04-08 09:56:09 +03001350}
1351
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001352static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1353 struct sk_buff *bcn)
1354{
1355 struct ath10k *ar = arvif->ar;
1356 struct ieee80211_mgmt *mgmt;
1357 const u8 *p2p_ie;
1358 int ret;
1359
1360 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1361 return 0;
1362
1363 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1364 return 0;
1365
1366 mgmt = (void *)bcn->data;
1367 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1368 mgmt->u.beacon.variable,
1369 bcn->len - (mgmt->u.beacon.variable -
1370 bcn->data));
1371 if (!p2p_ie)
1372 return -ENOENT;
1373
1374 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1375 if (ret) {
1376 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1377 arvif->vdev_id, ret);
1378 return ret;
1379 }
1380
1381 return 0;
1382}
1383
1384static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1385 u8 oui_type, size_t ie_offset)
1386{
1387 size_t len;
1388 const u8 *next;
1389 const u8 *end;
1390 u8 *ie;
1391
1392 if (WARN_ON(skb->len < ie_offset))
1393 return -EINVAL;
1394
1395 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1396 skb->data + ie_offset,
1397 skb->len - ie_offset);
1398 if (!ie)
1399 return -ENOENT;
1400
1401 len = ie[1] + 2;
1402 end = skb->data + skb->len;
1403 next = ie + len;
1404
1405 if (WARN_ON(next > end))
1406 return -EINVAL;
1407
1408 memmove(ie, next, end - next);
1409 skb_trim(skb, skb->len - len);
1410
1411 return 0;
1412}
1413
1414static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1415{
1416 struct ath10k *ar = arvif->ar;
1417 struct ieee80211_hw *hw = ar->hw;
1418 struct ieee80211_vif *vif = arvif->vif;
1419 struct ieee80211_mutable_offsets offs = {};
1420 struct sk_buff *bcn;
1421 int ret;
1422
1423 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1424 return 0;
1425
Michal Kazior81a9a172015-03-05 16:02:17 +02001426 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1427 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1428 return 0;
1429
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001430 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1431 if (!bcn) {
1432 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1433 return -EPERM;
1434 }
1435
1436 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1437 if (ret) {
1438 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1439 kfree_skb(bcn);
1440 return ret;
1441 }
1442
1443 /* P2P IE is inserted by firmware automatically (as configured above)
1444 * so remove it from the base beacon template to avoid duplicate P2P
1445 * IEs in beacon frames.
1446 */
1447 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1448 offsetof(struct ieee80211_mgmt,
1449 u.beacon.variable));
1450
1451 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1452 0, NULL, 0);
1453 kfree_skb(bcn);
1454
1455 if (ret) {
1456 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1457 ret);
1458 return ret;
1459 }
1460
1461 return 0;
1462}
1463
1464static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1465{
1466 struct ath10k *ar = arvif->ar;
1467 struct ieee80211_hw *hw = ar->hw;
1468 struct ieee80211_vif *vif = arvif->vif;
1469 struct sk_buff *prb;
1470 int ret;
1471
1472 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1473 return 0;
1474
Michal Kazior81a9a172015-03-05 16:02:17 +02001475 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1476 return 0;
1477
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001478 prb = ieee80211_proberesp_get(hw, vif);
1479 if (!prb) {
1480 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1481 return -EPERM;
1482 }
1483
1484 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1485 kfree_skb(prb);
1486
1487 if (ret) {
1488 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1489 ret);
1490 return ret;
1491 }
1492
1493 return 0;
1494}
1495
Michal Kazior500ff9f2015-03-31 10:26:21 +00001496static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1497{
1498 struct ath10k *ar = arvif->ar;
1499 struct cfg80211_chan_def def;
1500 int ret;
1501
1502 /* When originally vdev is started during assign_vif_chanctx() some
1503 * information is missing, notably SSID. Firmware revisions with beacon
1504 * offloading require the SSID to be provided during vdev (re)start to
1505 * handle hidden SSID properly.
1506 *
1507 * Vdev restart must be done after vdev has been both started and
1508 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1509 * deliver vdev restart response event causing timeouts during vdev
1510 * syncing in ath10k.
1511 *
1512 * Note: The vdev down/up and template reinstallation could be skipped
1513 * since only wmi-tlv firmware are known to have beacon offload and
1514 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1515 * response delivery. It's probably more robust to keep it as is.
1516 */
1517 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1518 return 0;
1519
1520 if (WARN_ON(!arvif->is_started))
1521 return -EINVAL;
1522
1523 if (WARN_ON(!arvif->is_up))
1524 return -EINVAL;
1525
1526 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1527 return -EINVAL;
1528
1529 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1530 if (ret) {
1531 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1532 arvif->vdev_id, ret);
1533 return ret;
1534 }
1535
1536 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1537 * firmware will crash upon vdev up.
1538 */
1539
1540 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1541 if (ret) {
1542 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1543 return ret;
1544 }
1545
1546 ret = ath10k_mac_setup_prb_tmpl(arvif);
1547 if (ret) {
1548 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1549 return ret;
1550 }
1551
1552 ret = ath10k_vdev_restart(arvif, &def);
1553 if (ret) {
1554 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1555 arvif->vdev_id, ret);
1556 return ret;
1557 }
1558
1559 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1560 arvif->bssid);
1561 if (ret) {
1562 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1563 arvif->vdev_id, ret);
1564 return ret;
1565 }
1566
1567 return 0;
1568}
1569
Kalle Valo5e3dd152013-06-12 20:52:10 +03001570static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001571 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001572{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001573 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001574 int ret = 0;
1575
Michal Kazior548db542013-07-05 16:15:15 +03001576 lockdep_assert_held(&arvif->ar->conf_mutex);
1577
Kalle Valo5e3dd152013-06-12 20:52:10 +03001578 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001579 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1580 if (ret)
1581 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1582 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001583
Michal Kaziorc930f742014-01-23 11:38:25 +01001584 arvif->is_up = false;
1585
Michal Kazior748afc42014-01-23 12:48:21 +01001586 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001587 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001588 spin_unlock_bh(&arvif->ar->data_lock);
1589
Kalle Valo5e3dd152013-06-12 20:52:10 +03001590 return;
1591 }
1592
1593 arvif->tx_seq_no = 0x1000;
1594
Michal Kaziorc930f742014-01-23 11:38:25 +01001595 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001596 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001597
1598 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1599 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001600 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001601 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001602 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001603 return;
1604 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001605
Michal Kaziorc930f742014-01-23 11:38:25 +01001606 arvif->is_up = true;
1607
Michal Kazior500ff9f2015-03-31 10:26:21 +00001608 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1609 if (ret) {
1610 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1611 arvif->vdev_id, ret);
1612 return;
1613 }
1614
Michal Kazior7aa7a722014-08-25 12:09:38 +02001615 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001616}
1617
1618static void ath10k_control_ibss(struct ath10k_vif *arvif,
1619 struct ieee80211_bss_conf *info,
1620 const u8 self_peer[ETH_ALEN])
1621{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001622 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001623 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001624 int ret = 0;
1625
Michal Kazior548db542013-07-05 16:15:15 +03001626 lockdep_assert_held(&arvif->ar->conf_mutex);
1627
Kalle Valo5e3dd152013-06-12 20:52:10 +03001628 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001629 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001630 return;
1631
Joe Perches93803b32015-03-02 19:54:49 -08001632 eth_zero_addr(arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001633
1634 return;
1635 }
1636
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001637 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1638 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001639 ATH10K_DEFAULT_ATIM);
1640 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001641 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001642 arvif->vdev_id, ret);
1643}
1644
Michal Kazior9f9b5742014-12-12 12:41:36 +01001645static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1646{
1647 struct ath10k *ar = arvif->ar;
1648 u32 param;
1649 u32 value;
1650 int ret;
1651
1652 lockdep_assert_held(&arvif->ar->conf_mutex);
1653
1654 if (arvif->u.sta.uapsd)
1655 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1656 else
1657 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1658
1659 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1660 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1661 if (ret) {
1662 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1663 value, arvif->vdev_id, ret);
1664 return ret;
1665 }
1666
1667 return 0;
1668}
1669
1670static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1671{
1672 struct ath10k *ar = arvif->ar;
1673 u32 param;
1674 u32 value;
1675 int ret;
1676
1677 lockdep_assert_held(&arvif->ar->conf_mutex);
1678
1679 if (arvif->u.sta.uapsd)
1680 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1681 else
1682 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1683
1684 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1685 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1686 param, value);
1687 if (ret) {
1688 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1689 value, arvif->vdev_id, ret);
1690 return ret;
1691 }
1692
1693 return 0;
1694}
1695
Michal Kazior424f2632015-07-09 13:08:35 +02001696static int ath10k_mac_num_vifs_started(struct ath10k *ar)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001697{
1698 struct ath10k_vif *arvif;
1699 int num = 0;
1700
1701 lockdep_assert_held(&ar->conf_mutex);
1702
1703 list_for_each_entry(arvif, &ar->arvifs, list)
Michal Kazior424f2632015-07-09 13:08:35 +02001704 if (arvif->is_started)
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001705 num++;
1706
1707 return num;
1708}
1709
Michal Kaziorad088bf2013-10-16 15:44:46 +03001710static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001711{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001712 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001713 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001714 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001715 enum wmi_sta_powersave_param param;
1716 enum wmi_sta_ps_mode psmode;
1717 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001718 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001719 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001720
Michal Kazior548db542013-07-05 16:15:15 +03001721 lockdep_assert_held(&arvif->ar->conf_mutex);
1722
Michal Kaziorad088bf2013-10-16 15:44:46 +03001723 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1724 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001725
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001726 enable_ps = arvif->ps;
1727
Michal Kazior424f2632015-07-09 13:08:35 +02001728 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001729 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1730 ar->fw_features)) {
1731 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1732 arvif->vdev_id);
1733 enable_ps = false;
1734 }
1735
Janusz Dziedzic917826b2015-05-18 09:38:17 +00001736 if (!arvif->is_started) {
1737 /* mac80211 can update vif powersave state while disconnected.
1738 * Firmware doesn't behave nicely and consumes more power than
1739 * necessary if PS is disabled on a non-started vdev. Hence
1740 * force-enable PS for non-running vdevs.
1741 */
1742 psmode = WMI_STA_PS_MODE_ENABLED;
1743 } else if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001744 psmode = WMI_STA_PS_MODE_ENABLED;
1745 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1746
Michal Kazior526549a2014-12-12 12:41:37 +01001747 ps_timeout = conf->dynamic_ps_timeout;
1748 if (ps_timeout == 0) {
1749 /* Firmware doesn't like 0 */
1750 ps_timeout = ieee80211_tu_to_usec(
1751 vif->bss_conf.beacon_int) / 1000;
1752 }
1753
Michal Kaziorad088bf2013-10-16 15:44:46 +03001754 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001755 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001756 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001757 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001758 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001759 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001760 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001761 } else {
1762 psmode = WMI_STA_PS_MODE_DISABLED;
1763 }
1764
Michal Kazior7aa7a722014-08-25 12:09:38 +02001765 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001766 arvif->vdev_id, psmode ? "enable" : "disable");
1767
Michal Kaziorad088bf2013-10-16 15:44:46 +03001768 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1769 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001770 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001771 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001772 return ret;
1773 }
1774
1775 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001776}
1777
Michal Kazior46725b152015-01-28 09:57:49 +02001778static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1779{
1780 struct ath10k *ar = arvif->ar;
1781 struct wmi_sta_keepalive_arg arg = {};
1782 int ret;
1783
1784 lockdep_assert_held(&arvif->ar->conf_mutex);
1785
1786 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1787 return 0;
1788
1789 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1790 return 0;
1791
1792 /* Some firmware revisions have a bug and ignore the `enabled` field.
1793 * Instead use the interval to disable the keepalive.
1794 */
1795 arg.vdev_id = arvif->vdev_id;
1796 arg.enabled = 1;
1797 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1798 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1799
1800 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1801 if (ret) {
1802 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1803 arvif->vdev_id, ret);
1804 return ret;
1805 }
1806
1807 return 0;
1808}
1809
Michal Kazior81a9a172015-03-05 16:02:17 +02001810static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1811{
1812 struct ath10k *ar = arvif->ar;
1813 struct ieee80211_vif *vif = arvif->vif;
1814 int ret;
1815
Michal Kazior8513d952015-03-09 14:19:24 +01001816 lockdep_assert_held(&arvif->ar->conf_mutex);
1817
1818 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1819 return;
1820
Michal Kazior81a9a172015-03-05 16:02:17 +02001821 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1822 return;
1823
1824 if (!vif->csa_active)
1825 return;
1826
1827 if (!arvif->is_up)
1828 return;
1829
1830 if (!ieee80211_csa_is_complete(vif)) {
1831 ieee80211_csa_update_counter(vif);
1832
1833 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1834 if (ret)
1835 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1836 ret);
1837
1838 ret = ath10k_mac_setup_prb_tmpl(arvif);
1839 if (ret)
1840 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1841 ret);
1842 } else {
1843 ieee80211_csa_finish(vif);
1844 }
1845}
1846
1847static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1848{
1849 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1850 ap_csa_work);
1851 struct ath10k *ar = arvif->ar;
1852
1853 mutex_lock(&ar->conf_mutex);
1854 ath10k_mac_vif_ap_csa_count_down(arvif);
1855 mutex_unlock(&ar->conf_mutex);
1856}
1857
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001858static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1859 struct ieee80211_vif *vif)
1860{
1861 struct sk_buff *skb = data;
1862 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1863 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1864
1865 if (vif->type != NL80211_IFTYPE_STATION)
1866 return;
1867
1868 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1869 return;
1870
1871 cancel_delayed_work(&arvif->connection_loss_work);
1872}
1873
1874void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1875{
1876 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1877 IEEE80211_IFACE_ITER_NORMAL,
1878 ath10k_mac_handle_beacon_iter,
1879 skb);
1880}
1881
1882static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1883 struct ieee80211_vif *vif)
1884{
1885 u32 *vdev_id = data;
1886 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1887 struct ath10k *ar = arvif->ar;
1888 struct ieee80211_hw *hw = ar->hw;
1889
1890 if (arvif->vdev_id != *vdev_id)
1891 return;
1892
1893 if (!arvif->is_up)
1894 return;
1895
1896 ieee80211_beacon_loss(vif);
1897
1898 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1899 * (done by mac80211) succeeds but beacons do not resume then it
1900 * doesn't make sense to continue operation. Queue connection loss work
1901 * which can be cancelled when beacon is received.
1902 */
1903 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1904 ATH10K_CONNECTION_LOSS_HZ);
1905}
1906
1907void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1908{
1909 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1910 IEEE80211_IFACE_ITER_NORMAL,
1911 ath10k_mac_handle_beacon_miss_iter,
1912 &vdev_id);
1913}
1914
1915static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1916{
1917 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1918 connection_loss_work.work);
1919 struct ieee80211_vif *vif = arvif->vif;
1920
1921 if (!arvif->is_up)
1922 return;
1923
1924 ieee80211_connection_loss(vif);
1925}
1926
Kalle Valo5e3dd152013-06-12 20:52:10 +03001927/**********************/
1928/* Station management */
1929/**********************/
1930
Michal Kazior590922a2014-10-21 10:10:29 +03001931static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1932 struct ieee80211_vif *vif)
1933{
1934 /* Some firmware revisions have unstable STA powersave when listen
1935 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1936 * generate NullFunc frames properly even if buffered frames have been
1937 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1938 * buffered frames. Often pinging the device from AP would simply fail.
1939 *
1940 * As a workaround set it to 1.
1941 */
1942 if (vif->type == NL80211_IFTYPE_STATION)
1943 return 1;
1944
1945 return ar->hw->conf.listen_interval;
1946}
1947
Kalle Valo5e3dd152013-06-12 20:52:10 +03001948static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001949 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001950 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001951 struct wmi_peer_assoc_complete_arg *arg)
1952{
Michal Kazior590922a2014-10-21 10:10:29 +03001953 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001954 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001955
Michal Kazior548db542013-07-05 16:15:15 +03001956 lockdep_assert_held(&ar->conf_mutex);
1957
Michal Kaziorc51880e2015-03-30 09:51:57 +03001958 if (vif->type == NL80211_IFTYPE_STATION)
1959 aid = vif->bss_conf.aid;
1960 else
1961 aid = sta->aid;
1962
Kalle Valob25f32c2014-09-14 12:50:49 +03001963 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001964 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001965 arg->peer_aid = aid;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02001966 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
Michal Kazior590922a2014-10-21 10:10:29 +03001967 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001968 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001969 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001970}
1971
1972static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001973 struct ieee80211_vif *vif,
Tamizh chelvam90eceb32015-10-29 14:27:42 +02001974 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001975 struct wmi_peer_assoc_complete_arg *arg)
1976{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001977 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001978 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001979 struct cfg80211_bss *bss;
1980 const u8 *rsnie = NULL;
1981 const u8 *wpaie = NULL;
1982
Michal Kazior548db542013-07-05 16:15:15 +03001983 lockdep_assert_held(&ar->conf_mutex);
1984
Michal Kazior500ff9f2015-03-31 10:26:21 +00001985 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1986 return;
1987
1988 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1989 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001990 if (bss) {
1991 const struct cfg80211_bss_ies *ies;
1992
1993 rcu_read_lock();
1994 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1995
1996 ies = rcu_dereference(bss->ies);
1997
1998 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001999 WLAN_OUI_TYPE_MICROSOFT_WPA,
2000 ies->data,
2001 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002002 rcu_read_unlock();
2003 cfg80211_put_bss(ar->hw->wiphy, bss);
2004 }
2005
2006 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2007 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002008 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002009 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002010 }
2011
2012 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002013 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002014 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002015 }
Tamizh chelvam90eceb32015-10-29 14:27:42 +02002016
2017 if (sta->mfp &&
2018 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT, ar->fw_features)) {
2019 arg->peer_flags |= ar->wmi.peer_flags->pmf;
2020 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002021}
2022
2023static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002024 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002025 struct ieee80211_sta *sta,
2026 struct wmi_peer_assoc_complete_arg *arg)
2027{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002028 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002029 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002030 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002031 const struct ieee80211_supported_band *sband;
2032 const struct ieee80211_rate *rates;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002033 enum ieee80211_band band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002034 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03002035 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002036 int i;
2037
Michal Kazior548db542013-07-05 16:15:15 +03002038 lockdep_assert_held(&ar->conf_mutex);
2039
Michal Kazior500ff9f2015-03-31 10:26:21 +00002040 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2041 return;
2042
Michal Kazior45c9abc2015-04-21 20:42:58 +03002043 band = def.chan->band;
2044 sband = ar->hw->wiphy->bands[band];
2045 ratemask = sta->supp_rates[band];
2046 ratemask &= arvif->bitrate_mask.control[band].legacy;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002047 rates = sband->bitrates;
2048
2049 rateset->num_rates = 0;
2050
2051 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2052 if (!(ratemask & 1))
2053 continue;
2054
Michal Kazior486017c2015-03-30 09:51:54 +03002055 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2056 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002057 rateset->num_rates++;
2058 }
2059}
2060
Michal Kazior45c9abc2015-04-21 20:42:58 +03002061static bool
2062ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2063{
2064 int nss;
2065
2066 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2067 if (ht_mcs_mask[nss])
2068 return false;
2069
2070 return true;
2071}
2072
2073static bool
2074ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2075{
2076 int nss;
2077
2078 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2079 if (vht_mcs_mask[nss])
2080 return false;
2081
2082 return true;
2083}
2084
Kalle Valo5e3dd152013-06-12 20:52:10 +03002085static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
Michal Kazior45c9abc2015-04-21 20:42:58 +03002086 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002087 struct ieee80211_sta *sta,
2088 struct wmi_peer_assoc_complete_arg *arg)
2089{
2090 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002091 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2092 struct cfg80211_chan_def def;
2093 enum ieee80211_band band;
2094 const u8 *ht_mcs_mask;
2095 const u16 *vht_mcs_mask;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002096 int i, n;
2097 u8 max_nss;
Kalle Valoaf762c02014-09-14 12:50:17 +03002098 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002099
Michal Kazior548db542013-07-05 16:15:15 +03002100 lockdep_assert_held(&ar->conf_mutex);
2101
Michal Kazior45c9abc2015-04-21 20:42:58 +03002102 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2103 return;
2104
Kalle Valo5e3dd152013-06-12 20:52:10 +03002105 if (!ht_cap->ht_supported)
2106 return;
2107
Michal Kazior45c9abc2015-04-21 20:42:58 +03002108 band = def.chan->band;
2109 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2110 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2111
2112 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2113 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2114 return;
2115
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002116 arg->peer_flags |= ar->wmi.peer_flags->ht;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002117 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2118 ht_cap->ampdu_factor)) - 1;
2119
2120 arg->peer_mpdu_density =
2121 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2122
2123 arg->peer_ht_caps = ht_cap->cap;
2124 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2125
2126 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002127 arg->peer_flags |= ar->wmi.peer_flags->ldbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002128
2129 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002130 arg->peer_flags |= ar->wmi.peer_flags->bw40;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002131 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2132 }
2133
Michal Kazior45c9abc2015-04-21 20:42:58 +03002134 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2135 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2136 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002137
Michal Kazior45c9abc2015-04-21 20:42:58 +03002138 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2139 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2140 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002141
2142 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2143 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002144 arg->peer_flags |= ar->wmi.peer_flags->stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002145 }
2146
2147 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002148 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2149 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2150 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2151 arg->peer_rate_caps |= stbc;
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002152 arg->peer_flags |= ar->wmi.peer_flags->stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002153 }
2154
Kalle Valo5e3dd152013-06-12 20:52:10 +03002155 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2156 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2157 else if (ht_cap->mcs.rx_mask[1])
2158 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2159
Michal Kazior45c9abc2015-04-21 20:42:58 +03002160 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2161 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2162 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2163 max_nss = (i / 8) + 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002164 arg->peer_ht_rates.rates[n++] = i;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002165 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002166
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002167 /*
2168 * This is a workaround for HT-enabled STAs which break the spec
2169 * and have no HT capabilities RX mask (no HT RX MCS map).
2170 *
2171 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2172 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2173 *
2174 * Firmware asserts if such situation occurs.
2175 */
2176 if (n == 0) {
2177 arg->peer_ht_rates.num_rates = 8;
2178 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2179 arg->peer_ht_rates.rates[i] = i;
2180 } else {
2181 arg->peer_ht_rates.num_rates = n;
Vivek Natarajan72f8cef2015-10-06 15:19:34 +03002182 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002183 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002184
Michal Kazior7aa7a722014-08-25 12:09:38 +02002185 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002186 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002187 arg->peer_ht_rates.num_rates,
2188 arg->peer_num_spatial_streams);
2189}
2190
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002191static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2192 struct ath10k_vif *arvif,
2193 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002194{
2195 u32 uapsd = 0;
2196 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002197 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002198
Michal Kazior548db542013-07-05 16:15:15 +03002199 lockdep_assert_held(&ar->conf_mutex);
2200
Kalle Valo5e3dd152013-06-12 20:52:10 +03002201 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002202 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002203 sta->uapsd_queues, sta->max_sp);
2204
Kalle Valo5e3dd152013-06-12 20:52:10 +03002205 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2206 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2207 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2208 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2209 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2210 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2211 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2212 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2213 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2214 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2215 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2216 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2217
Kalle Valo5e3dd152013-06-12 20:52:10 +03002218 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2219 max_sp = sta->max_sp;
2220
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002221 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2222 sta->addr,
2223 WMI_AP_PS_PEER_PARAM_UAPSD,
2224 uapsd);
2225 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002226 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002227 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002228 return ret;
2229 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002230
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002231 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2232 sta->addr,
2233 WMI_AP_PS_PEER_PARAM_MAX_SP,
2234 max_sp);
2235 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002236 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002237 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002238 return ret;
2239 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002240
2241 /* TODO setup this based on STA listen interval and
2242 beacon interval. Currently we don't know
2243 sta->listen_interval - mac80211 patch required.
2244 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002245 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002246 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2247 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002248 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002249 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002250 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002251 return ret;
2252 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002253 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002254
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002255 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002256}
2257
Michal Kazior45c9abc2015-04-21 20:42:58 +03002258static u16
2259ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2260 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2261{
2262 int idx_limit;
2263 int nss;
2264 u16 mcs_map;
2265 u16 mcs;
2266
2267 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2268 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2269 vht_mcs_limit[nss];
2270
2271 if (mcs_map)
2272 idx_limit = fls(mcs_map) - 1;
2273 else
2274 idx_limit = -1;
2275
2276 switch (idx_limit) {
2277 case 0: /* fall through */
2278 case 1: /* fall through */
2279 case 2: /* fall through */
2280 case 3: /* fall through */
2281 case 4: /* fall through */
2282 case 5: /* fall through */
2283 case 6: /* fall through */
2284 default:
2285 /* see ath10k_mac_can_set_bitrate_mask() */
2286 WARN_ON(1);
2287 /* fall through */
2288 case -1:
2289 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2290 break;
2291 case 7:
2292 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2293 break;
2294 case 8:
2295 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2296 break;
2297 case 9:
2298 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2299 break;
2300 }
2301
2302 tx_mcs_set &= ~(0x3 << (nss * 2));
2303 tx_mcs_set |= mcs << (nss * 2);
2304 }
2305
2306 return tx_mcs_set;
2307}
2308
Kalle Valo5e3dd152013-06-12 20:52:10 +03002309static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002310 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002311 struct ieee80211_sta *sta,
2312 struct wmi_peer_assoc_complete_arg *arg)
2313{
2314 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002315 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002316 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002317 enum ieee80211_band band;
2318 const u16 *vht_mcs_mask;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002319 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002320
Michal Kazior500ff9f2015-03-31 10:26:21 +00002321 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2322 return;
2323
Kalle Valo5e3dd152013-06-12 20:52:10 +03002324 if (!vht_cap->vht_supported)
2325 return;
2326
Michal Kazior45c9abc2015-04-21 20:42:58 +03002327 band = def.chan->band;
2328 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2329
2330 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2331 return;
2332
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002333 arg->peer_flags |= ar->wmi.peer_flags->vht;
Yanbo Lid68bb122015-01-23 08:18:20 +08002334
Michal Kazior500ff9f2015-03-31 10:26:21 +00002335 if (def.chan->band == IEEE80211_BAND_2GHZ)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002336 arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
Yanbo Lid68bb122015-01-23 08:18:20 +08002337
Kalle Valo5e3dd152013-06-12 20:52:10 +03002338 arg->peer_vht_caps = vht_cap->cap;
2339
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002340 ampdu_factor = (vht_cap->cap &
2341 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2342 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2343
2344 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2345 * zero in VHT IE. Using it would result in degraded throughput.
2346 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2347 * it if VHT max_mpdu is smaller. */
2348 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2349 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2350 ampdu_factor)) - 1);
2351
Kalle Valo5e3dd152013-06-12 20:52:10 +03002352 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002353 arg->peer_flags |= ar->wmi.peer_flags->bw80;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002354
2355 arg->peer_vht_rates.rx_max_rate =
2356 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2357 arg->peer_vht_rates.rx_mcs_set =
2358 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2359 arg->peer_vht_rates.tx_max_rate =
2360 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002361 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2362 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002363
Michal Kazior7aa7a722014-08-25 12:09:38 +02002364 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002365 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002366}
2367
2368static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002369 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002370 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002371 struct wmi_peer_assoc_complete_arg *arg)
2372{
Michal Kazior590922a2014-10-21 10:10:29 +03002373 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2374
Kalle Valo5e3dd152013-06-12 20:52:10 +03002375 switch (arvif->vdev_type) {
2376 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002377 if (sta->wme)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002378 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002379
2380 if (sta->wme && sta->uapsd_queues) {
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002381 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002382 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2383 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002384 break;
2385 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002386 if (vif->bss_conf.qos)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002387 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002388 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002389 case WMI_VDEV_TYPE_IBSS:
2390 if (sta->wme)
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002391 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002392 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002393 default:
2394 break;
2395 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002396
2397 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
Tamizh chelvam3fab30f2015-10-29 14:27:37 +02002398 sta->addr, !!(arg->peer_flags &
2399 arvif->ar->wmi.peer_flags->qos));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002400}
2401
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002402static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002403{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002404 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2405 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002406}
2407
Kalle Valo5e3dd152013-06-12 20:52:10 +03002408static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002409 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002410 struct ieee80211_sta *sta,
2411 struct wmi_peer_assoc_complete_arg *arg)
2412{
Michal Kazior45c9abc2015-04-21 20:42:58 +03002413 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002414 struct cfg80211_chan_def def;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002415 enum ieee80211_band band;
2416 const u8 *ht_mcs_mask;
2417 const u16 *vht_mcs_mask;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002418 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2419
Michal Kazior500ff9f2015-03-31 10:26:21 +00002420 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2421 return;
2422
Michal Kazior45c9abc2015-04-21 20:42:58 +03002423 band = def.chan->band;
2424 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2425 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2426
2427 switch (band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002428 case IEEE80211_BAND_2GHZ:
Michal Kazior45c9abc2015-04-21 20:42:58 +03002429 if (sta->vht_cap.vht_supported &&
2430 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Yanbo Lid68bb122015-01-23 08:18:20 +08002431 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2432 phymode = MODE_11AC_VHT40;
2433 else
2434 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002435 } else if (sta->ht_cap.ht_supported &&
2436 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002437 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2438 phymode = MODE_11NG_HT40;
2439 else
2440 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002441 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002442 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002443 } else {
2444 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002445 }
2446
2447 break;
2448 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002449 /*
2450 * Check VHT first.
2451 */
Michal Kazior45c9abc2015-04-21 20:42:58 +03002452 if (sta->vht_cap.vht_supported &&
2453 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002454 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2455 phymode = MODE_11AC_VHT80;
2456 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2457 phymode = MODE_11AC_VHT40;
2458 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2459 phymode = MODE_11AC_VHT20;
Michal Kazior45c9abc2015-04-21 20:42:58 +03002460 } else if (sta->ht_cap.ht_supported &&
2461 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2462 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002463 phymode = MODE_11NA_HT40;
2464 else
2465 phymode = MODE_11NA_HT20;
2466 } else {
2467 phymode = MODE_11A;
2468 }
2469
2470 break;
2471 default:
2472 break;
2473 }
2474
Michal Kazior7aa7a722014-08-25 12:09:38 +02002475 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002476 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002477
Kalle Valo5e3dd152013-06-12 20:52:10 +03002478 arg->peer_phymode = phymode;
2479 WARN_ON(phymode == MODE_UNKNOWN);
2480}
2481
Kalle Valob9ada652013-10-16 15:44:46 +03002482static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002483 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002484 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002485 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002486{
Michal Kazior548db542013-07-05 16:15:15 +03002487 lockdep_assert_held(&ar->conf_mutex);
2488
Kalle Valob9ada652013-10-16 15:44:46 +03002489 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002490
Michal Kazior590922a2014-10-21 10:10:29 +03002491 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
Tamizh chelvam90eceb32015-10-29 14:27:42 +02002492 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002493 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Michal Kazior45c9abc2015-04-21 20:42:58 +03002494 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002495 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002496 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2497 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002498
Kalle Valob9ada652013-10-16 15:44:46 +03002499 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002500}
2501
Michal Kazior90046f52014-02-14 14:45:51 +01002502static const u32 ath10k_smps_map[] = {
2503 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2504 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2505 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2506 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2507};
2508
2509static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2510 const u8 *addr,
2511 const struct ieee80211_sta_ht_cap *ht_cap)
2512{
2513 int smps;
2514
2515 if (!ht_cap->ht_supported)
2516 return 0;
2517
2518 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2519 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2520
2521 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2522 return -EINVAL;
2523
2524 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2525 WMI_PEER_SMPS_STATE,
2526 ath10k_smps_map[smps]);
2527}
2528
Michal Kazior139e1702015-02-15 16:50:42 +02002529static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2530 struct ieee80211_vif *vif,
2531 struct ieee80211_sta_vht_cap vht_cap)
2532{
2533 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2534 int ret;
2535 u32 param;
2536 u32 value;
2537
Vivek Natarajan08e75ea2015-08-04 10:45:11 +05302538 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2539 return 0;
2540
Michal Kazior139e1702015-02-15 16:50:42 +02002541 if (!(ar->vht_cap_info &
2542 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2543 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2544 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2545 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2546 return 0;
2547
2548 param = ar->wmi.vdev_param->txbf;
2549 value = 0;
2550
2551 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2552 return 0;
2553
2554 /* The following logic is correct. If a remote STA advertises support
2555 * for being a beamformer then we should enable us being a beamformee.
2556 */
2557
2558 if (ar->vht_cap_info &
2559 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2560 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2561 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2562 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2563
2564 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2565 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2566 }
2567
2568 if (ar->vht_cap_info &
2569 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2570 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2571 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2572 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2573
2574 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2575 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2576 }
2577
2578 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2579 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2580
2581 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2582 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2583
2584 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2585 if (ret) {
2586 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2587 value, ret);
2588 return ret;
2589 }
2590
2591 return 0;
2592}
2593
Kalle Valo5e3dd152013-06-12 20:52:10 +03002594/* can be called only in mac80211 callbacks due to `key_count` usage */
2595static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2596 struct ieee80211_vif *vif,
2597 struct ieee80211_bss_conf *bss_conf)
2598{
2599 struct ath10k *ar = hw->priv;
2600 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002601 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002602 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002603 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002604 struct ieee80211_sta *ap_sta;
2605 int ret;
2606
Michal Kazior548db542013-07-05 16:15:15 +03002607 lockdep_assert_held(&ar->conf_mutex);
2608
Michal Kazior077efc82014-10-21 10:10:29 +03002609 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2610 arvif->vdev_id, arvif->bssid, arvif->aid);
2611
Kalle Valo5e3dd152013-06-12 20:52:10 +03002612 rcu_read_lock();
2613
2614 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2615 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002616 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002617 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002618 rcu_read_unlock();
2619 return;
2620 }
2621
Michal Kazior90046f52014-02-14 14:45:51 +01002622 /* ap_sta must be accessed only within rcu section which must be left
2623 * before calling ath10k_setup_peer_smps() which might sleep. */
2624 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002625 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002626
Michal Kazior590922a2014-10-21 10:10:29 +03002627 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002628 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002629 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002630 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002631 rcu_read_unlock();
2632 return;
2633 }
2634
2635 rcu_read_unlock();
2636
Kalle Valob9ada652013-10-16 15:44:46 +03002637 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2638 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002639 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002640 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002641 return;
2642 }
2643
Michal Kazior90046f52014-02-14 14:45:51 +01002644 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2645 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002646 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002647 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002648 return;
2649 }
2650
Michal Kazior139e1702015-02-15 16:50:42 +02002651 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2652 if (ret) {
2653 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2654 arvif->vdev_id, bss_conf->bssid, ret);
2655 return;
2656 }
2657
Michal Kazior7aa7a722014-08-25 12:09:38 +02002658 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002659 "mac vdev %d up (associated) bssid %pM aid %d\n",
2660 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2661
Michal Kazior077efc82014-10-21 10:10:29 +03002662 WARN_ON(arvif->is_up);
2663
Michal Kaziorc930f742014-01-23 11:38:25 +01002664 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002665 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002666
2667 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2668 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002669 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002670 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002671 return;
2672 }
2673
2674 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002675
2676 /* Workaround: Some firmware revisions (tested with qca6174
2677 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2678 * poked with peer param command.
2679 */
2680 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2681 WMI_PEER_DUMMY_VAR, 1);
2682 if (ret) {
2683 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2684 arvif->bssid, arvif->vdev_id, ret);
2685 return;
2686 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002687}
2688
Kalle Valo5e3dd152013-06-12 20:52:10 +03002689static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2690 struct ieee80211_vif *vif)
2691{
2692 struct ath10k *ar = hw->priv;
2693 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002694 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002695 int ret;
2696
Michal Kazior548db542013-07-05 16:15:15 +03002697 lockdep_assert_held(&ar->conf_mutex);
2698
Michal Kazior077efc82014-10-21 10:10:29 +03002699 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2700 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002701
Kalle Valo5e3dd152013-06-12 20:52:10 +03002702 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002703 if (ret)
2704 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2705 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002706
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002707 arvif->def_wep_key_idx = -1;
2708
Michal Kazior139e1702015-02-15 16:50:42 +02002709 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2710 if (ret) {
2711 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2712 arvif->vdev_id, ret);
2713 return;
2714 }
2715
Michal Kaziorc930f742014-01-23 11:38:25 +01002716 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002717
2718 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002719}
2720
Michal Kazior590922a2014-10-21 10:10:29 +03002721static int ath10k_station_assoc(struct ath10k *ar,
2722 struct ieee80211_vif *vif,
2723 struct ieee80211_sta *sta,
2724 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002725{
Michal Kazior590922a2014-10-21 10:10:29 +03002726 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002727 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002728 int ret = 0;
2729
Michal Kazior548db542013-07-05 16:15:15 +03002730 lockdep_assert_held(&ar->conf_mutex);
2731
Michal Kazior590922a2014-10-21 10:10:29 +03002732 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002733 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002734 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002735 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002736 return ret;
2737 }
2738
2739 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2740 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002741 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002742 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002743 return ret;
2744 }
2745
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002746 /* Re-assoc is run only to update supported rates for given station. It
2747 * doesn't make much sense to reconfigure the peer completely.
2748 */
2749 if (!reassoc) {
2750 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2751 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002752 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002753 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002754 arvif->vdev_id, ret);
2755 return ret;
2756 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002757
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002758 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2759 if (ret) {
2760 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2761 sta->addr, arvif->vdev_id, ret);
2762 return ret;
2763 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002764
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002765 if (!sta->wme) {
2766 arvif->num_legacy_stations++;
2767 ret = ath10k_recalc_rtscts_prot(arvif);
2768 if (ret) {
2769 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2770 arvif->vdev_id, ret);
2771 return ret;
2772 }
2773 }
2774
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002775 /* Plumb cached keys only for static WEP */
2776 if (arvif->def_wep_key_idx != -1) {
2777 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2778 if (ret) {
2779 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2780 arvif->vdev_id, ret);
2781 return ret;
2782 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002783 }
2784 }
2785
Kalle Valo5e3dd152013-06-12 20:52:10 +03002786 return ret;
2787}
2788
Michal Kazior590922a2014-10-21 10:10:29 +03002789static int ath10k_station_disassoc(struct ath10k *ar,
2790 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002791 struct ieee80211_sta *sta)
2792{
Michal Kazior590922a2014-10-21 10:10:29 +03002793 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002794 int ret = 0;
2795
2796 lockdep_assert_held(&ar->conf_mutex);
2797
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002798 if (!sta->wme) {
2799 arvif->num_legacy_stations--;
2800 ret = ath10k_recalc_rtscts_prot(arvif);
2801 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002802 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002803 arvif->vdev_id, ret);
2804 return ret;
2805 }
2806 }
2807
Kalle Valo5e3dd152013-06-12 20:52:10 +03002808 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2809 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002810 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002811 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002812 return ret;
2813 }
2814
2815 return ret;
2816}
2817
2818/**************/
2819/* Regulatory */
2820/**************/
2821
2822static int ath10k_update_channel_list(struct ath10k *ar)
2823{
2824 struct ieee80211_hw *hw = ar->hw;
2825 struct ieee80211_supported_band **bands;
2826 enum ieee80211_band band;
2827 struct ieee80211_channel *channel;
2828 struct wmi_scan_chan_list_arg arg = {0};
2829 struct wmi_channel_arg *ch;
2830 bool passive;
2831 int len;
2832 int ret;
2833 int i;
2834
Michal Kazior548db542013-07-05 16:15:15 +03002835 lockdep_assert_held(&ar->conf_mutex);
2836
Kalle Valo5e3dd152013-06-12 20:52:10 +03002837 bands = hw->wiphy->bands;
2838 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2839 if (!bands[band])
2840 continue;
2841
2842 for (i = 0; i < bands[band]->n_channels; i++) {
2843 if (bands[band]->channels[i].flags &
2844 IEEE80211_CHAN_DISABLED)
2845 continue;
2846
2847 arg.n_channels++;
2848 }
2849 }
2850
2851 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2852 arg.channels = kzalloc(len, GFP_KERNEL);
2853 if (!arg.channels)
2854 return -ENOMEM;
2855
2856 ch = arg.channels;
2857 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2858 if (!bands[band])
2859 continue;
2860
2861 for (i = 0; i < bands[band]->n_channels; i++) {
2862 channel = &bands[band]->channels[i];
2863
2864 if (channel->flags & IEEE80211_CHAN_DISABLED)
2865 continue;
2866
2867 ch->allow_ht = true;
2868
2869 /* FIXME: when should we really allow VHT? */
2870 ch->allow_vht = true;
2871
2872 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002873 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002874
2875 ch->ht40plus =
2876 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2877
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002878 ch->chan_radar =
2879 !!(channel->flags & IEEE80211_CHAN_RADAR);
2880
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002881 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002882 ch->passive = passive;
2883
2884 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002885 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002886 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002887 ch->max_power = channel->max_power * 2;
2888 ch->max_reg_power = channel->max_reg_power * 2;
2889 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002890 ch->reg_class_id = 0; /* FIXME */
2891
2892 /* FIXME: why use only legacy modes, why not any
2893 * HT/VHT modes? Would that even make any
2894 * difference? */
2895 if (channel->band == IEEE80211_BAND_2GHZ)
2896 ch->mode = MODE_11G;
2897 else
2898 ch->mode = MODE_11A;
2899
2900 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2901 continue;
2902
Michal Kazior7aa7a722014-08-25 12:09:38 +02002903 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002904 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2905 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002906 ch->freq, ch->max_power, ch->max_reg_power,
2907 ch->max_antenna_gain, ch->mode);
2908
2909 ch++;
2910 }
2911 }
2912
2913 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2914 kfree(arg.channels);
2915
2916 return ret;
2917}
2918
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002919static enum wmi_dfs_region
2920ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2921{
2922 switch (dfs_region) {
2923 case NL80211_DFS_UNSET:
2924 return WMI_UNINIT_DFS_DOMAIN;
2925 case NL80211_DFS_FCC:
2926 return WMI_FCC_DFS_DOMAIN;
2927 case NL80211_DFS_ETSI:
2928 return WMI_ETSI_DFS_DOMAIN;
2929 case NL80211_DFS_JP:
2930 return WMI_MKK4_DFS_DOMAIN;
2931 }
2932 return WMI_UNINIT_DFS_DOMAIN;
2933}
2934
Michal Kaziorf7843d72013-07-16 09:38:52 +02002935static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002936{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002937 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002938 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002939 enum wmi_dfs_region wmi_dfs_reg;
2940 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002941
Michal Kaziorf7843d72013-07-16 09:38:52 +02002942 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002943
2944 ret = ath10k_update_channel_list(ar);
2945 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002946 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002947
2948 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002949
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002950 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2951 nl_dfs_reg = ar->dfs_detector->region;
2952 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2953 } else {
2954 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2955 }
2956
Kalle Valo5e3dd152013-06-12 20:52:10 +03002957 /* Target allows setting up per-band regdomain but ath_common provides
2958 * a combined one only */
2959 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002960 regpair->reg_domain,
2961 regpair->reg_domain, /* 2ghz */
2962 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002963 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002964 regpair->reg_5ghz_ctl,
2965 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002966 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002967 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002968}
Michal Kazior548db542013-07-05 16:15:15 +03002969
Michal Kaziorf7843d72013-07-16 09:38:52 +02002970static void ath10k_reg_notifier(struct wiphy *wiphy,
2971 struct regulatory_request *request)
2972{
2973 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2974 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002975 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002976
2977 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2978
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002979 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002980 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002981 request->dfs_region);
2982 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2983 request->dfs_region);
2984 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002985 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002986 request->dfs_region);
2987 }
2988
Michal Kaziorf7843d72013-07-16 09:38:52 +02002989 mutex_lock(&ar->conf_mutex);
2990 if (ar->state == ATH10K_STATE_ON)
2991 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002992 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002993}
2994
2995/***************/
2996/* TX handlers */
2997/***************/
2998
Michal Kazior96d828d2015-03-31 10:26:23 +00002999void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3000{
3001 lockdep_assert_held(&ar->htt.tx_lock);
3002
3003 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3004 ar->tx_paused |= BIT(reason);
3005 ieee80211_stop_queues(ar->hw);
3006}
3007
3008static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3009 struct ieee80211_vif *vif)
3010{
3011 struct ath10k *ar = data;
3012 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3013
3014 if (arvif->tx_paused)
3015 return;
3016
3017 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3018}
3019
3020void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3021{
3022 lockdep_assert_held(&ar->htt.tx_lock);
3023
3024 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3025 ar->tx_paused &= ~BIT(reason);
3026
3027 if (ar->tx_paused)
3028 return;
3029
3030 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3031 IEEE80211_IFACE_ITER_RESUME_ALL,
3032 ath10k_mac_tx_unlock_iter,
3033 ar);
Michal Kazior3a73d1a2015-08-06 14:46:54 +02003034
3035 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
Michal Kazior96d828d2015-03-31 10:26:23 +00003036}
3037
3038void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3039{
3040 struct ath10k *ar = arvif->ar;
3041
3042 lockdep_assert_held(&ar->htt.tx_lock);
3043
3044 WARN_ON(reason >= BITS_PER_LONG);
3045 arvif->tx_paused |= BIT(reason);
3046 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3047}
3048
3049void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3050{
3051 struct ath10k *ar = arvif->ar;
3052
3053 lockdep_assert_held(&ar->htt.tx_lock);
3054
3055 WARN_ON(reason >= BITS_PER_LONG);
3056 arvif->tx_paused &= ~BIT(reason);
3057
3058 if (ar->tx_paused)
3059 return;
3060
3061 if (arvif->tx_paused)
3062 return;
3063
3064 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3065}
3066
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003067static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3068 enum wmi_tlv_tx_pause_id pause_id,
3069 enum wmi_tlv_tx_pause_action action)
3070{
3071 struct ath10k *ar = arvif->ar;
3072
3073 lockdep_assert_held(&ar->htt.tx_lock);
3074
Michal Kazioracd0b272015-07-09 13:08:38 +02003075 switch (action) {
3076 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3077 ath10k_mac_vif_tx_lock(arvif, pause_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003078 break;
Michal Kazioracd0b272015-07-09 13:08:38 +02003079 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3080 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3081 break;
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003082 default:
Michal Kazioracd0b272015-07-09 13:08:38 +02003083 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
3084 action, arvif->vdev_id);
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003085 break;
3086 }
3087}
3088
3089struct ath10k_mac_tx_pause {
3090 u32 vdev_id;
3091 enum wmi_tlv_tx_pause_id pause_id;
3092 enum wmi_tlv_tx_pause_action action;
3093};
3094
3095static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3096 struct ieee80211_vif *vif)
3097{
3098 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3099 struct ath10k_mac_tx_pause *arg = data;
3100
Michal Kazioracd0b272015-07-09 13:08:38 +02003101 if (arvif->vdev_id != arg->vdev_id)
3102 return;
3103
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003104 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3105}
3106
Michal Kazioracd0b272015-07-09 13:08:38 +02003107void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3108 enum wmi_tlv_tx_pause_id pause_id,
3109 enum wmi_tlv_tx_pause_action action)
Michal Kaziorb4aa5392015-03-31 10:26:24 +00003110{
3111 struct ath10k_mac_tx_pause arg = {
3112 .vdev_id = vdev_id,
3113 .pause_id = pause_id,
3114 .action = action,
3115 };
3116
3117 spin_lock_bh(&ar->htt.tx_lock);
3118 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3119 IEEE80211_IFACE_ITER_RESUME_ALL,
3120 ath10k_mac_handle_tx_pause_iter,
3121 &arg);
3122 spin_unlock_bh(&ar->htt.tx_lock);
3123}
3124
Michal Kazior42c3aa62013-10-02 11:03:38 +02003125static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
3126{
3127 if (ieee80211_is_mgmt(hdr->frame_control))
3128 return HTT_DATA_TX_EXT_TID_MGMT;
3129
3130 if (!ieee80211_is_data_qos(hdr->frame_control))
3131 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3132
3133 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3134 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3135
3136 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3137}
3138
Michal Kazior2b37c292014-09-02 11:00:22 +03003139static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003140{
Michal Kazior2b37c292014-09-02 11:00:22 +03003141 if (vif)
3142 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003143
Michal Kazior1bbc0972014-04-08 09:45:47 +03003144 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003145 return ar->monitor_vdev_id;
3146
Michal Kazior7aa7a722014-08-25 12:09:38 +02003147 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003148 return 0;
3149}
3150
Michal Kaziord740d8f2015-03-30 09:51:51 +03003151static enum ath10k_hw_txrx_mode
Michal Kazior6a2636d2015-11-18 06:59:16 +01003152ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3153 struct ieee80211_vif *vif,
3154 struct ieee80211_sta *sta,
3155 struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003156{
3157 const struct ieee80211_hdr *hdr = (void *)skb->data;
3158 __le16 fc = hdr->frame_control;
3159
3160 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3161 return ATH10K_HW_TXRX_RAW;
3162
3163 if (ieee80211_is_mgmt(fc))
3164 return ATH10K_HW_TXRX_MGMT;
3165
3166 /* Workaround:
3167 *
3168 * NullFunc frames are mostly used to ping if a client or AP are still
3169 * reachable and responsive. This implies tx status reports must be
3170 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3171 * come to a conclusion that the other end disappeared and tear down
3172 * BSS connection or it can never disconnect from BSS/client (which is
3173 * the case).
3174 *
3175 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3176 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3177 * which seems to deliver correct tx reports for NullFunc frames. The
3178 * downside of using it is it ignores client powersave state so it can
3179 * end up disconnecting sleeping clients in AP mode. It should fix STA
3180 * mode though because AP don't sleep.
3181 */
3182 if (ar->htt.target_version_major < 3 &&
3183 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3184 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3185 return ATH10K_HW_TXRX_MGMT;
3186
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003187 /* Workaround:
3188 *
3189 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3190 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3191 * to work with Ethernet txmode so use it.
David Liuccec9032015-07-24 20:25:32 +03003192 *
3193 * FIXME: Check if raw mode works with TDLS.
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003194 */
3195 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3196 return ATH10K_HW_TXRX_ETHERNET;
3197
David Liuccec9032015-07-24 20:25:32 +03003198 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
3199 return ATH10K_HW_TXRX_RAW;
3200
Michal Kaziord740d8f2015-03-30 09:51:51 +03003201 return ATH10K_HW_TXRX_NATIVE_WIFI;
3202}
3203
David Liuccec9032015-07-24 20:25:32 +03003204static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003205 struct sk_buff *skb)
3206{
3207 const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3208 const struct ieee80211_hdr *hdr = (void *)skb->data;
David Liuccec9032015-07-24 20:25:32 +03003209 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3210 IEEE80211_TX_CTL_INJECTED;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003211
3212 if (!ieee80211_has_protected(hdr->frame_control))
3213 return false;
3214
David Liuccec9032015-07-24 20:25:32 +03003215 if ((info->flags & mask) == mask)
3216 return false;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003217
David Liuccec9032015-07-24 20:25:32 +03003218 if (vif)
3219 return !ath10k_vif_to_arvif(vif)->nohwcrypt;
Michal Kaziorfd12cb32015-11-18 06:59:15 +01003220
David Liuccec9032015-07-24 20:25:32 +03003221 return true;
3222}
3223
Michal Kazior4b604552014-07-21 21:03:09 +03003224/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3225 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003226 */
Michal Kazior4b604552014-07-21 21:03:09 +03003227static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003228{
3229 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003230 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003231 u8 *qos_ctl;
3232
3233 if (!ieee80211_is_data_qos(hdr->frame_control))
3234 return;
3235
3236 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003237 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3238 skb->data, (void *)qos_ctl - (void *)skb->data);
3239 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003240
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003241 /* Some firmware revisions don't handle sending QoS NullFunc well.
3242 * These frames are mainly used for CQM purposes so it doesn't really
3243 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003244 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003245 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003246 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003247 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003248
3249 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003250}
3251
Michal Kaziord740d8f2015-03-30 09:51:51 +03003252static void ath10k_tx_h_8023(struct sk_buff *skb)
3253{
3254 struct ieee80211_hdr *hdr;
3255 struct rfc1042_hdr *rfc1042;
3256 struct ethhdr *eth;
3257 size_t hdrlen;
3258 u8 da[ETH_ALEN];
3259 u8 sa[ETH_ALEN];
3260 __be16 type;
3261
3262 hdr = (void *)skb->data;
3263 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3264 rfc1042 = (void *)skb->data + hdrlen;
3265
3266 ether_addr_copy(da, ieee80211_get_DA(hdr));
3267 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3268 type = rfc1042->snap_type;
3269
3270 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3271 skb_push(skb, sizeof(*eth));
3272
3273 eth = (void *)skb->data;
3274 ether_addr_copy(eth->h_dest, da);
3275 ether_addr_copy(eth->h_source, sa);
3276 eth->h_proto = type;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003277}
3278
Michal Kazior4b604552014-07-21 21:03:09 +03003279static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3280 struct ieee80211_vif *vif,
3281 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003282{
3283 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003284 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3285
3286 /* This is case only for P2P_GO */
3287 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3288 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3289 return;
3290
3291 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3292 spin_lock_bh(&ar->data_lock);
3293 if (arvif->u.ap.noa_data)
3294 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3295 GFP_ATOMIC))
3296 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3297 arvif->u.ap.noa_data,
3298 arvif->u.ap.noa_len);
3299 spin_unlock_bh(&ar->data_lock);
3300 }
3301}
3302
Vasanthakumar Thiagarajand39de992015-11-05 11:34:00 +05303303bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
Michal Kazior8d6d3622014-11-24 14:58:31 +01003304{
3305 /* FIXME: Not really sure since when the behaviour changed. At some
3306 * point new firmware stopped requiring creation of peer entries for
3307 * offchannel tx (and actually creating them causes issues with wmi-htc
3308 * tx credit replenishment and reliability). Assuming it's at least 3.4
3309 * because that's when the `freq` was introduced to TX_FRM HTT command.
3310 */
Vasanthakumar Thiagarajan8921f5f2015-11-05 11:33:59 +05303311 return (ar->htt.target_version_major >= 3 &&
Vasanthakumar Thiagarajand39de992015-11-05 11:34:00 +05303312 ar->htt.target_version_minor >= 4 &&
3313 ar->htt.op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003314}
3315
Michal Kaziord740d8f2015-03-30 09:51:51 +03003316static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003317{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003318 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003319 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003320
Michal Kaziord740d8f2015-03-30 09:51:51 +03003321 spin_lock_bh(&ar->data_lock);
3322
3323 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3324 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3325 ret = -ENOSPC;
3326 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003327 }
3328
Michal Kaziord740d8f2015-03-30 09:51:51 +03003329 __skb_queue_tail(q, skb);
3330 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3331
3332unlock:
3333 spin_unlock_bh(&ar->data_lock);
3334
3335 return ret;
3336}
3337
Michal Kazior8a933962015-11-18 06:59:17 +01003338static void ath10k_mac_tx(struct ath10k *ar, enum ath10k_hw_txrx_mode txmode,
3339 struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003340{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003341 struct ath10k_htt *htt = &ar->htt;
3342 int ret = 0;
3343
Michal Kazior8a933962015-11-18 06:59:17 +01003344 switch (txmode) {
Michal Kaziord740d8f2015-03-30 09:51:51 +03003345 case ATH10K_HW_TXRX_RAW:
3346 case ATH10K_HW_TXRX_NATIVE_WIFI:
3347 case ATH10K_HW_TXRX_ETHERNET:
Michal Kazior8a933962015-11-18 06:59:17 +01003348 ret = ath10k_htt_tx(htt, txmode, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003349 break;
3350 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003351 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003352 ar->fw_features))
3353 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3354 else if (ar->htt.target_version_major >= 3)
Michal Kazior8a933962015-11-18 06:59:17 +01003355 ret = ath10k_htt_tx(htt, txmode, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003356 else
3357 ret = ath10k_htt_mgmt_tx(htt, skb);
3358 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003359 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003360
3361 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003362 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3363 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003364 ieee80211_free_txskb(ar->hw, skb);
3365 }
3366}
3367
3368void ath10k_offchan_tx_purge(struct ath10k *ar)
3369{
3370 struct sk_buff *skb;
3371
3372 for (;;) {
3373 skb = skb_dequeue(&ar->offchan_tx_queue);
3374 if (!skb)
3375 break;
3376
3377 ieee80211_free_txskb(ar->hw, skb);
3378 }
3379}
3380
3381void ath10k_offchan_tx_work(struct work_struct *work)
3382{
3383 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3384 struct ath10k_peer *peer;
Michal Kazior8a933962015-11-18 06:59:17 +01003385 struct ath10k_vif *arvif;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003386 struct ieee80211_hdr *hdr;
Michal Kazior8a933962015-11-18 06:59:17 +01003387 struct ieee80211_vif *vif;
3388 struct ieee80211_sta *sta;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003389 struct sk_buff *skb;
3390 const u8 *peer_addr;
Michal Kazior8a933962015-11-18 06:59:17 +01003391 enum ath10k_hw_txrx_mode txmode;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003392 int vdev_id;
3393 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003394 unsigned long time_left;
Michal Kazioradaeed72015-08-05 12:15:23 +02003395 bool tmp_peer_created = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003396
3397 /* FW requirement: We must create a peer before FW will send out
3398 * an offchannel frame. Otherwise the frame will be stuck and
3399 * never transmitted. We delete the peer upon tx completion.
3400 * It is unlikely that a peer for offchannel tx will already be
3401 * present. However it may be in some rare cases so account for that.
3402 * Otherwise we might remove a legitimate peer and break stuff. */
3403
3404 for (;;) {
3405 skb = skb_dequeue(&ar->offchan_tx_queue);
3406 if (!skb)
3407 break;
3408
3409 mutex_lock(&ar->conf_mutex);
3410
Michal Kazior7aa7a722014-08-25 12:09:38 +02003411 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003412 skb);
3413
3414 hdr = (struct ieee80211_hdr *)skb->data;
3415 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003416 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003417
3418 spin_lock_bh(&ar->data_lock);
3419 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3420 spin_unlock_bh(&ar->data_lock);
3421
3422 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003423 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003424 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003425 peer_addr, vdev_id);
3426
3427 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003428 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3429 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003430 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003431 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003432 peer_addr, vdev_id, ret);
Michal Kazioradaeed72015-08-05 12:15:23 +02003433 tmp_peer_created = (ret == 0);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003434 }
3435
3436 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003437 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003438 ar->offchan_tx_skb = skb;
3439 spin_unlock_bh(&ar->data_lock);
3440
Michal Kazior8a933962015-11-18 06:59:17 +01003441 /* It's safe to access vif and sta - conf_mutex guarantees that
3442 * sta_state() and remove_interface() are locked exclusively
3443 * out wrt to this offchannel worker.
3444 */
3445 arvif = ath10k_get_arvif(ar, vdev_id);
3446 if (arvif) {
3447 vif = arvif->vif;
3448 sta = ieee80211_find_sta(vif, peer_addr);
3449 } else {
3450 vif = NULL;
3451 sta = NULL;
3452 }
3453
3454 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3455
3456 ath10k_mac_tx(ar, txmode, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003457
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003458 time_left =
3459 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3460 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003461 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003462 skb);
3463
Michal Kazioradaeed72015-08-05 12:15:23 +02003464 if (!peer && tmp_peer_created) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003465 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3466 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003467 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003468 peer_addr, vdev_id, ret);
3469 }
3470
3471 mutex_unlock(&ar->conf_mutex);
3472 }
3473}
3474
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003475void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3476{
3477 struct sk_buff *skb;
3478
3479 for (;;) {
3480 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3481 if (!skb)
3482 break;
3483
3484 ieee80211_free_txskb(ar->hw, skb);
3485 }
3486}
3487
3488void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3489{
3490 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3491 struct sk_buff *skb;
3492 int ret;
3493
3494 for (;;) {
3495 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3496 if (!skb)
3497 break;
3498
3499 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003500 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003501 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003502 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003503 ieee80211_free_txskb(ar->hw, skb);
3504 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003505 }
3506}
3507
Kalle Valo5e3dd152013-06-12 20:52:10 +03003508/************/
3509/* Scanning */
3510/************/
3511
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003512void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003513{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003514 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003515
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003516 switch (ar->scan.state) {
3517 case ATH10K_SCAN_IDLE:
3518 break;
3519 case ATH10K_SCAN_RUNNING:
Michal Kazior7305d3e2014-11-24 14:58:33 +01003520 case ATH10K_SCAN_ABORTING:
3521 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003522 ieee80211_scan_completed(ar->hw,
3523 (ar->scan.state ==
3524 ATH10K_SCAN_ABORTING));
Michal Kaziord710e752015-07-09 13:08:36 +02003525 else if (ar->scan.roc_notify)
3526 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003527 /* fall through */
3528 case ATH10K_SCAN_STARTING:
3529 ar->scan.state = ATH10K_SCAN_IDLE;
3530 ar->scan_channel = NULL;
3531 ath10k_offchan_tx_purge(ar);
3532 cancel_delayed_work(&ar->scan.timeout);
3533 complete_all(&ar->scan.completed);
3534 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003535 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003536}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003537
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003538void ath10k_scan_finish(struct ath10k *ar)
3539{
3540 spin_lock_bh(&ar->data_lock);
3541 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003542 spin_unlock_bh(&ar->data_lock);
3543}
3544
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003545static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003546{
3547 struct wmi_stop_scan_arg arg = {
3548 .req_id = 1, /* FIXME */
3549 .req_type = WMI_SCAN_STOP_ONE,
3550 .u.scan_id = ATH10K_SCAN_ID,
3551 };
3552 int ret;
3553
3554 lockdep_assert_held(&ar->conf_mutex);
3555
Kalle Valo5e3dd152013-06-12 20:52:10 +03003556 ret = ath10k_wmi_stop_scan(ar, &arg);
3557 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003558 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003559 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003560 }
3561
Kalle Valo5e3dd152013-06-12 20:52:10 +03003562 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003563 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003564 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003565 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003566 } else if (ret > 0) {
3567 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003568 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003569
3570out:
3571 /* Scan state should be updated upon scan completion but in case
3572 * firmware fails to deliver the event (for whatever reason) it is
3573 * desired to clean up scan state anyway. Firmware may have just
3574 * dropped the scan completion event delivery due to transport pipe
3575 * being overflown with data and/or it can recover on its own before
3576 * next scan request is submitted.
3577 */
3578 spin_lock_bh(&ar->data_lock);
3579 if (ar->scan.state != ATH10K_SCAN_IDLE)
3580 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003581 spin_unlock_bh(&ar->data_lock);
3582
3583 return ret;
3584}
3585
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003586static void ath10k_scan_abort(struct ath10k *ar)
3587{
3588 int ret;
3589
3590 lockdep_assert_held(&ar->conf_mutex);
3591
3592 spin_lock_bh(&ar->data_lock);
3593
3594 switch (ar->scan.state) {
3595 case ATH10K_SCAN_IDLE:
3596 /* This can happen if timeout worker kicked in and called
3597 * abortion while scan completion was being processed.
3598 */
3599 break;
3600 case ATH10K_SCAN_STARTING:
3601 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003602 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003603 ath10k_scan_state_str(ar->scan.state),
3604 ar->scan.state);
3605 break;
3606 case ATH10K_SCAN_RUNNING:
3607 ar->scan.state = ATH10K_SCAN_ABORTING;
3608 spin_unlock_bh(&ar->data_lock);
3609
3610 ret = ath10k_scan_stop(ar);
3611 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003612 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003613
3614 spin_lock_bh(&ar->data_lock);
3615 break;
3616 }
3617
3618 spin_unlock_bh(&ar->data_lock);
3619}
3620
3621void ath10k_scan_timeout_work(struct work_struct *work)
3622{
3623 struct ath10k *ar = container_of(work, struct ath10k,
3624 scan.timeout.work);
3625
3626 mutex_lock(&ar->conf_mutex);
3627 ath10k_scan_abort(ar);
3628 mutex_unlock(&ar->conf_mutex);
3629}
3630
Kalle Valo5e3dd152013-06-12 20:52:10 +03003631static int ath10k_start_scan(struct ath10k *ar,
3632 const struct wmi_start_scan_arg *arg)
3633{
3634 int ret;
3635
3636 lockdep_assert_held(&ar->conf_mutex);
3637
3638 ret = ath10k_wmi_start_scan(ar, arg);
3639 if (ret)
3640 return ret;
3641
Kalle Valo5e3dd152013-06-12 20:52:10 +03003642 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3643 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003644 ret = ath10k_scan_stop(ar);
3645 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003646 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003647
3648 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003649 }
3650
Ben Greear2f9eec02015-02-15 16:50:38 +02003651 /* If we failed to start the scan, return error code at
3652 * this point. This is probably due to some issue in the
3653 * firmware, but no need to wedge the driver due to that...
3654 */
3655 spin_lock_bh(&ar->data_lock);
3656 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3657 spin_unlock_bh(&ar->data_lock);
3658 return -EINVAL;
3659 }
3660 spin_unlock_bh(&ar->data_lock);
3661
Kalle Valo5e3dd152013-06-12 20:52:10 +03003662 return 0;
3663}
3664
3665/**********************/
3666/* mac80211 callbacks */
3667/**********************/
3668
3669static void ath10k_tx(struct ieee80211_hw *hw,
3670 struct ieee80211_tx_control *control,
3671 struct sk_buff *skb)
3672{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003673 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003674 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3675 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003676 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003677 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kazior8a933962015-11-18 06:59:17 +01003678 enum ath10k_hw_txrx_mode txmode;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003679
3680 /* We should disable CCK RATE due to P2P */
3681 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003682 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003683
Michal Kazior8a933962015-11-18 06:59:17 +01003684 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
3685
Michal Kazior4b604552014-07-21 21:03:09 +03003686 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003687 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003688 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
David Liuccec9032015-07-24 20:25:32 +03003689 ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
Michal Kazior2b37c292014-09-02 11:00:22 +03003690 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003691
Michal Kazior8a933962015-11-18 06:59:17 +01003692 switch (txmode) {
Michal Kaziord740d8f2015-03-30 09:51:51 +03003693 case ATH10K_HW_TXRX_MGMT:
3694 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003695 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003696 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3697 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003698 break;
3699 case ATH10K_HW_TXRX_ETHERNET:
3700 ath10k_tx_h_8023(skb);
3701 break;
3702 case ATH10K_HW_TXRX_RAW:
David Liuccec9032015-07-24 20:25:32 +03003703 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
3704 WARN_ON_ONCE(1);
3705 ieee80211_free_txskb(hw, skb);
3706 return;
3707 }
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003708 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003709
Kalle Valo5e3dd152013-06-12 20:52:10 +03003710 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3711 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003712 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003713 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003714 spin_unlock_bh(&ar->data_lock);
3715
Vasanthakumar Thiagarajan8921f5f2015-11-05 11:33:59 +05303716 if (!ath10k_mac_tx_frm_has_freq(ar)) {
Michal Kazior8d6d3622014-11-24 14:58:31 +01003717 ATH10K_SKB_CB(skb)->htt.freq = 0;
3718 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003719
Michal Kazior8d6d3622014-11-24 14:58:31 +01003720 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3721 skb);
3722
3723 skb_queue_tail(&ar->offchan_tx_queue, skb);
3724 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3725 return;
3726 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003727 }
3728
Michal Kazior8a933962015-11-18 06:59:17 +01003729 ath10k_mac_tx(ar, txmode, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003730}
3731
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003732/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003733void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003734{
3735 /* make sure rcu-protected mac80211 tx path itself is drained */
3736 synchronize_net();
3737
3738 ath10k_offchan_tx_purge(ar);
3739 ath10k_mgmt_over_wmi_tx_purge(ar);
3740
3741 cancel_work_sync(&ar->offchan_tx_work);
3742 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3743}
3744
Michal Kazioraffd3212013-07-16 09:54:35 +02003745void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003746{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003747 struct ath10k_vif *arvif;
3748
Michal Kazior818bdd12013-07-16 09:38:57 +02003749 lockdep_assert_held(&ar->conf_mutex);
3750
Michal Kazior19337472014-08-28 12:58:16 +02003751 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3752 ar->filter_flags = 0;
3753 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003754 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003755
3756 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003757 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003758
3759 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003760 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003761
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003762 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003763 ath10k_peer_cleanup_all(ar);
3764 ath10k_core_stop(ar);
3765 ath10k_hif_power_down(ar);
3766
3767 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003768 list_for_each_entry(arvif, &ar->arvifs, list)
3769 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003770 spin_unlock_bh(&ar->data_lock);
3771}
3772
Ben Greear46acf7b2014-05-16 17:15:38 +03003773static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3774{
3775 struct ath10k *ar = hw->priv;
3776
3777 mutex_lock(&ar->conf_mutex);
3778
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05303779 *tx_ant = ar->cfg_tx_chainmask;
3780 *rx_ant = ar->cfg_rx_chainmask;
Ben Greear46acf7b2014-05-16 17:15:38 +03003781
3782 mutex_unlock(&ar->conf_mutex);
3783
3784 return 0;
3785}
3786
Ben Greear5572a952014-11-24 16:22:10 +02003787static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3788{
3789 /* It is not clear that allowing gaps in chainmask
3790 * is helpful. Probably it will not do what user
3791 * is hoping for, so warn in that case.
3792 */
3793 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3794 return;
3795
3796 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3797 dbg, cm);
3798}
3799
Rajkumar Manoharanf58512f2015-10-27 17:51:13 +05303800static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
3801{
3802 int nsts = ar->vht_cap_info;
3803
3804 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3805 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3806
3807 /* If firmware does not deliver to host number of space-time
3808 * streams supported, assume it support up to 4 BF STS and return
3809 * the value for VHT CAP: nsts-1)
3810 */
3811 if (nsts == 0)
3812 return 3;
3813
3814 return nsts;
3815}
3816
3817static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
3818{
3819 int sound_dim = ar->vht_cap_info;
3820
3821 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3822 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3823
3824 /* If the sounding dimension is not advertised by the firmware,
3825 * let's use a default value of 1
3826 */
3827 if (sound_dim == 0)
3828 return 1;
3829
3830 return sound_dim;
3831}
3832
3833static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
3834{
3835 struct ieee80211_sta_vht_cap vht_cap = {0};
3836 u16 mcs_map;
3837 u32 val;
3838 int i;
3839
3840 vht_cap.vht_supported = 1;
3841 vht_cap.cap = ar->vht_cap_info;
3842
3843 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
3844 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
3845 val = ath10k_mac_get_vht_cap_bf_sts(ar);
3846 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
3847 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
3848
3849 vht_cap.cap |= val;
3850 }
3851
3852 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
3853 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
3854 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
3855 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
3856 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
3857
3858 vht_cap.cap |= val;
3859 }
3860
3861 mcs_map = 0;
3862 for (i = 0; i < 8; i++) {
3863 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
3864 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
3865 else
3866 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
3867 }
3868
3869 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
3870 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
3871
3872 return vht_cap;
3873}
3874
3875static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
3876{
3877 int i;
3878 struct ieee80211_sta_ht_cap ht_cap = {0};
3879
3880 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
3881 return ht_cap;
3882
3883 ht_cap.ht_supported = 1;
3884 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
3885 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
3886 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
3887 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
3888 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
3889
3890 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
3891 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
3892
3893 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
3894 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
3895
3896 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
3897 u32 smps;
3898
3899 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
3900 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
3901
3902 ht_cap.cap |= smps;
3903 }
3904
3905 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
3906 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
3907
3908 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
3909 u32 stbc;
3910
3911 stbc = ar->ht_cap_info;
3912 stbc &= WMI_HT_CAP_RX_STBC;
3913 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
3914 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
3915 stbc &= IEEE80211_HT_CAP_RX_STBC;
3916
3917 ht_cap.cap |= stbc;
3918 }
3919
3920 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
3921 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
3922
3923 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
3924 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
3925
3926 /* max AMSDU is implicitly taken from vht_cap_info */
3927 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
3928 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
3929
3930 for (i = 0; i < ar->num_rf_chains; i++) {
3931 if (ar->cfg_rx_chainmask & BIT(i))
3932 ht_cap.mcs.rx_mask[i] = 0xFF;
3933 }
3934
3935 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
3936
3937 return ht_cap;
3938}
3939
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05303940static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
3941{
3942 struct ieee80211_supported_band *band;
3943 struct ieee80211_sta_vht_cap vht_cap;
3944 struct ieee80211_sta_ht_cap ht_cap;
3945
3946 ht_cap = ath10k_get_ht_cap(ar);
3947 vht_cap = ath10k_create_vht_cap(ar);
3948
3949 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
3950 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
3951 band->ht_cap = ht_cap;
3952
3953 /* Enable the VHT support at 2.4 GHz */
3954 band->vht_cap = vht_cap;
3955 }
3956 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
3957 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
3958 band->ht_cap = ht_cap;
3959 band->vht_cap = vht_cap;
3960 }
3961}
3962
Ben Greear46acf7b2014-05-16 17:15:38 +03003963static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3964{
3965 int ret;
3966
3967 lockdep_assert_held(&ar->conf_mutex);
3968
Ben Greear5572a952014-11-24 16:22:10 +02003969 ath10k_check_chain_mask(ar, tx_ant, "tx");
3970 ath10k_check_chain_mask(ar, rx_ant, "rx");
3971
Ben Greear46acf7b2014-05-16 17:15:38 +03003972 ar->cfg_tx_chainmask = tx_ant;
3973 ar->cfg_rx_chainmask = rx_ant;
3974
3975 if ((ar->state != ATH10K_STATE_ON) &&
3976 (ar->state != ATH10K_STATE_RESTARTED))
3977 return 0;
3978
3979 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3980 tx_ant);
3981 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003982 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003983 ret, tx_ant);
3984 return ret;
3985 }
3986
3987 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3988 rx_ant);
3989 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003990 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003991 ret, rx_ant);
3992 return ret;
3993 }
3994
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05303995 /* Reload HT/VHT capability */
3996 ath10k_mac_setup_ht_vht_cap(ar);
3997
Ben Greear46acf7b2014-05-16 17:15:38 +03003998 return 0;
3999}
4000
4001static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
4002{
4003 struct ath10k *ar = hw->priv;
4004 int ret;
4005
4006 mutex_lock(&ar->conf_mutex);
4007 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
4008 mutex_unlock(&ar->conf_mutex);
4009 return ret;
4010}
4011
Kalle Valo5e3dd152013-06-12 20:52:10 +03004012static int ath10k_start(struct ieee80211_hw *hw)
4013{
4014 struct ath10k *ar = hw->priv;
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03004015 u32 burst_enable;
Michal Kazior818bdd12013-07-16 09:38:57 +02004016 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004017
Michal Kaziorbca7baf2014-05-26 12:46:03 +03004018 /*
4019 * This makes sense only when restarting hw. It is harmless to call
4020 * uncoditionally. This is necessary to make sure no HTT/WMI tx
4021 * commands will be submitted while restarting.
4022 */
4023 ath10k_drain_tx(ar);
4024
Michal Kazior548db542013-07-05 16:15:15 +03004025 mutex_lock(&ar->conf_mutex);
4026
Michal Kaziorc5058f52014-05-26 12:46:03 +03004027 switch (ar->state) {
4028 case ATH10K_STATE_OFF:
4029 ar->state = ATH10K_STATE_ON;
4030 break;
4031 case ATH10K_STATE_RESTARTING:
4032 ath10k_halt(ar);
4033 ar->state = ATH10K_STATE_RESTARTED;
4034 break;
4035 case ATH10K_STATE_ON:
4036 case ATH10K_STATE_RESTARTED:
4037 case ATH10K_STATE_WEDGED:
4038 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02004039 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03004040 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03004041 case ATH10K_STATE_UTF:
4042 ret = -EBUSY;
4043 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02004044 }
4045
4046 ret = ath10k_hif_power_up(ar);
4047 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004048 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004049 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02004050 }
4051
Kalle Valo43d2a302014-09-10 18:23:30 +03004052 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02004053 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004054 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004055 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02004056 }
4057
Bartosz Markowski226a3392013-09-26 17:47:16 +02004058 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03004059 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004060 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004061 goto err_core_stop;
4062 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004063
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01004064 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03004065 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004066 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004067 goto err_core_stop;
4068 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004069
Michal Kaziorcf327842015-03-31 10:26:25 +00004070 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
4071 ret = ath10k_wmi_adaptive_qcs(ar, true);
4072 if (ret) {
4073 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
4074 ret);
4075 goto err_core_stop;
4076 }
4077 }
4078
Janusz Dziedzic24ab13e2015-04-01 22:53:18 +03004079 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
4080 burst_enable = ar->wmi.pdev_param->burst_enable;
4081 ret = ath10k_wmi_pdev_set_param(ar, burst_enable, 0);
4082 if (ret) {
4083 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
4084 goto err_core_stop;
4085 }
4086 }
4087
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05304088 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
Ben Greear46acf7b2014-05-16 17:15:38 +03004089
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004090 /*
4091 * By default FW set ARP frames ac to voice (6). In that case ARP
4092 * exchange is not working properly for UAPSD enabled AP. ARP requests
4093 * which arrives with access category 0 are processed by network stack
4094 * and send back with access category 0, but FW changes access category
4095 * to 6. Set ARP frames access category to best effort (0) solves
4096 * this problem.
4097 */
4098
4099 ret = ath10k_wmi_pdev_set_param(ar,
4100 ar->wmi.pdev_param->arp_ac_override, 0);
4101 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004102 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004103 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03004104 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02004105 }
4106
Maharaja62f77f02015-10-21 11:49:18 +03004107 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
4108 ar->fw_features)) {
4109 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
4110 WMI_CCA_DETECT_LEVEL_AUTO,
4111 WMI_CCA_DETECT_MARGIN_AUTO);
4112 if (ret) {
4113 ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
4114 ret);
4115 goto err_core_stop;
4116 }
4117 }
4118
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05304119 ret = ath10k_wmi_pdev_set_param(ar,
4120 ar->wmi.pdev_param->ani_enable, 1);
4121 if (ret) {
4122 ath10k_warn(ar, "failed to enable ani by default: %d\n",
4123 ret);
4124 goto err_core_stop;
4125 }
4126
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05304127 ar->ani_enabled = true;
4128
Michal Kaziord6500972014-04-08 09:56:09 +03004129 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02004130 ath10k_regd_update(ar);
4131
Simon Wunderlich855aed12014-08-02 09:12:54 +03004132 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05304133 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03004134
Michal Kaziorae254432014-05-26 12:46:02 +03004135 mutex_unlock(&ar->conf_mutex);
4136 return 0;
4137
4138err_core_stop:
4139 ath10k_core_stop(ar);
4140
4141err_power_down:
4142 ath10k_hif_power_down(ar);
4143
4144err_off:
4145 ar->state = ATH10K_STATE_OFF;
4146
4147err:
Michal Kazior548db542013-07-05 16:15:15 +03004148 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01004149 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004150}
4151
4152static void ath10k_stop(struct ieee80211_hw *hw)
4153{
4154 struct ath10k *ar = hw->priv;
4155
Michal Kaziorbca7baf2014-05-26 12:46:03 +03004156 ath10k_drain_tx(ar);
4157
Michal Kazior548db542013-07-05 16:15:15 +03004158 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03004159 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02004160 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03004161 ar->state = ATH10K_STATE_OFF;
4162 }
Michal Kazior548db542013-07-05 16:15:15 +03004163 mutex_unlock(&ar->conf_mutex);
4164
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004165 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02004166 cancel_work_sync(&ar->restart_work);
4167}
4168
Michal Kaziorad088bf2013-10-16 15:44:46 +03004169static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02004170{
Michal Kaziorad088bf2013-10-16 15:44:46 +03004171 struct ath10k_vif *arvif;
4172 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02004173
4174 lockdep_assert_held(&ar->conf_mutex);
4175
Michal Kaziorad088bf2013-10-16 15:44:46 +03004176 list_for_each_entry(arvif, &ar->arvifs, list) {
4177 ret = ath10k_mac_vif_setup_ps(arvif);
4178 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004179 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03004180 break;
4181 }
4182 }
Michal Kazioraffd3212013-07-16 09:54:35 +02004183
Michal Kaziorad088bf2013-10-16 15:44:46 +03004184 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004185}
4186
Michal Kazior7d9d5582014-10-21 10:40:15 +03004187static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
4188{
4189 int ret;
4190 u32 param;
4191
4192 lockdep_assert_held(&ar->conf_mutex);
4193
4194 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
4195
4196 param = ar->wmi.pdev_param->txpower_limit2g;
4197 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4198 if (ret) {
4199 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
4200 txpower, ret);
4201 return ret;
4202 }
4203
4204 param = ar->wmi.pdev_param->txpower_limit5g;
4205 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
4206 if (ret) {
4207 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
4208 txpower, ret);
4209 return ret;
4210 }
4211
4212 return 0;
4213}
4214
4215static int ath10k_mac_txpower_recalc(struct ath10k *ar)
4216{
4217 struct ath10k_vif *arvif;
4218 int ret, txpower = -1;
4219
4220 lockdep_assert_held(&ar->conf_mutex);
4221
4222 list_for_each_entry(arvif, &ar->arvifs, list) {
4223 WARN_ON(arvif->txpower < 0);
4224
4225 if (txpower == -1)
4226 txpower = arvif->txpower;
4227 else
4228 txpower = min(txpower, arvif->txpower);
4229 }
4230
4231 if (WARN_ON(txpower == -1))
4232 return -EINVAL;
4233
4234 ret = ath10k_mac_txpower_setup(ar, txpower);
4235 if (ret) {
4236 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
4237 txpower, ret);
4238 return ret;
4239 }
4240
4241 return 0;
4242}
4243
Kalle Valo5e3dd152013-06-12 20:52:10 +03004244static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
4245{
Kalle Valo5e3dd152013-06-12 20:52:10 +03004246 struct ath10k *ar = hw->priv;
4247 struct ieee80211_conf *conf = &hw->conf;
4248 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004249
4250 mutex_lock(&ar->conf_mutex);
4251
Michal Kazioraffd3212013-07-16 09:54:35 +02004252 if (changed & IEEE80211_CONF_CHANGE_PS)
4253 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004254
4255 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02004256 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
4257 ret = ath10k_monitor_recalc(ar);
4258 if (ret)
4259 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004260 }
4261
4262 mutex_unlock(&ar->conf_mutex);
4263 return ret;
4264}
4265
Ben Greear5572a952014-11-24 16:22:10 +02004266static u32 get_nss_from_chainmask(u16 chain_mask)
4267{
4268 if ((chain_mask & 0x15) == 0x15)
4269 return 4;
4270 else if ((chain_mask & 0x7) == 0x7)
4271 return 3;
4272 else if ((chain_mask & 0x3) == 0x3)
4273 return 2;
4274 return 1;
4275}
4276
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304277static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
4278{
4279 u32 value = 0;
4280 struct ath10k *ar = arvif->ar;
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004281 int nsts;
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004282 int sound_dim;
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304283
4284 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
4285 return 0;
4286
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004287 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304288 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4289 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
Bartosz Markowski707a0c82015-09-02 13:20:19 +02004290 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304291
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004292 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304293 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4294 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
Bartosz Markowski0c6d6f22015-09-02 13:20:20 +02004295 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304296
4297 if (!value)
4298 return 0;
4299
4300 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
4301 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4302
4303 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
4304 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
4305 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
4306
4307 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
4308 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4309
4310 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
4311 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
4312 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
4313
4314 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4315 ar->wmi.vdev_param->txbf, value);
4316}
4317
Kalle Valo5e3dd152013-06-12 20:52:10 +03004318/*
4319 * TODO:
4320 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4321 * because we will send mgmt frames without CCK. This requirement
4322 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4323 * in the TX packet.
4324 */
4325static int ath10k_add_interface(struct ieee80211_hw *hw,
4326 struct ieee80211_vif *vif)
4327{
4328 struct ath10k *ar = hw->priv;
4329 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4330 enum wmi_sta_powersave_param param;
4331 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004332 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004333 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004334 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004335 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004336
Johannes Berg848955c2014-11-11 12:48:42 +01004337 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4338
Kalle Valo5e3dd152013-06-12 20:52:10 +03004339 mutex_lock(&ar->conf_mutex);
4340
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004341 memset(arvif, 0, sizeof(*arvif));
4342
Kalle Valo5e3dd152013-06-12 20:52:10 +03004343 arvif->ar = ar;
4344 arvif->vif = vif;
4345
Ben Greeare63b33f2013-10-22 14:54:14 -07004346 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004347 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004348 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4349 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004350
Michal Kazior45c9abc2015-04-21 20:42:58 +03004351 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4352 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4353 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4354 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4355 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4356 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4357 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004358
Michal Kaziore04cafb2015-08-05 12:15:24 +02004359 if (ar->num_peers >= ar->max_num_peers) {
4360 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
Michal Kazior503422d2015-08-19 13:08:53 +02004361 ret = -ENOBUFS;
4362 goto err;
Michal Kaziore04cafb2015-08-05 12:15:24 +02004363 }
4364
Ben Greeara9aefb32014-08-12 11:02:19 +03004365 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004366 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004367 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004368 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004369 }
Ben Greear16c11172014-09-23 14:17:16 -07004370 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004371
Ben Greear16c11172014-09-23 14:17:16 -07004372 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4373 bit, ar->free_vdev_map);
4374
4375 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004376 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004377
Kalle Valo5e3dd152013-06-12 20:52:10 +03004378 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004379 case NL80211_IFTYPE_P2P_DEVICE:
4380 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4381 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4382 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004383 case NL80211_IFTYPE_UNSPECIFIED:
4384 case NL80211_IFTYPE_STATION:
4385 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4386 if (vif->p2p)
4387 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4388 break;
4389 case NL80211_IFTYPE_ADHOC:
4390 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4391 break;
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004392 case NL80211_IFTYPE_MESH_POINT:
4393 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4394 ret = -EINVAL;
4395 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
4396 goto err;
4397 }
4398 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4399 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004400 case NL80211_IFTYPE_AP:
4401 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4402
4403 if (vif->p2p)
4404 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4405 break;
4406 case NL80211_IFTYPE_MONITOR:
4407 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4408 break;
4409 default:
4410 WARN_ON(1);
4411 break;
4412 }
4413
Michal Kazior96d828d2015-03-31 10:26:23 +00004414 /* Using vdev_id as queue number will make it very easy to do per-vif
4415 * tx queue locking. This shouldn't wrap due to interface combinations
4416 * but do a modulo for correctness sake and prevent using offchannel tx
4417 * queues for regular vif tx.
4418 */
4419 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4420 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4421 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4422
Michal Kazior64badcb2014-09-18 11:18:02 +03004423 /* Some firmware revisions don't wait for beacon tx completion before
4424 * sending another SWBA event. This could lead to hardware using old
4425 * (freed) beacon data in some cases, e.g. tx credit starvation
4426 * combined with missed TBTT. This is very very rare.
4427 *
4428 * On non-IOMMU-enabled hosts this could be a possible security issue
4429 * because hw could beacon some random data on the air. On
4430 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4431 * device would crash.
4432 *
4433 * Since there are no beacon tx completions (implicit nor explicit)
4434 * propagated to host the only workaround for this is to allocate a
4435 * DMA-coherent buffer for a lifetime of a vif and use it for all
4436 * beacon tx commands. Worst case for this approach is some beacons may
4437 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4438 */
4439 if (vif->type == NL80211_IFTYPE_ADHOC ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004440 vif->type == NL80211_IFTYPE_MESH_POINT ||
Michal Kazior64badcb2014-09-18 11:18:02 +03004441 vif->type == NL80211_IFTYPE_AP) {
4442 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4443 IEEE80211_MAX_FRAME_LEN,
4444 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304445 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004446 if (!arvif->beacon_buf) {
4447 ret = -ENOMEM;
4448 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4449 ret);
4450 goto err;
4451 }
4452 }
David Liuccec9032015-07-24 20:25:32 +03004453 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
4454 arvif->nohwcrypt = true;
4455
4456 if (arvif->nohwcrypt &&
4457 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
4458 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
4459 goto err;
4460 }
Michal Kazior64badcb2014-09-18 11:18:02 +03004461
4462 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4463 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4464 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004465
4466 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4467 arvif->vdev_subtype, vif->addr);
4468 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004469 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004470 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004471 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004472 }
4473
Ben Greear16c11172014-09-23 14:17:16 -07004474 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004475 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004476
Michal Kazior46725b152015-01-28 09:57:49 +02004477 /* It makes no sense to have firmware do keepalives. mac80211 already
4478 * takes care of this with idle connection polling.
4479 */
4480 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004481 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004482 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004483 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004484 goto err_vdev_delete;
4485 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004486
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004487 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004488
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004489 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4490 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004491 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004492 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004493 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004494 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004495 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004496 goto err_vdev_delete;
4497 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004498
Ben Greear5572a952014-11-24 16:22:10 +02004499 if (ar->cfg_tx_chainmask) {
4500 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4501
4502 vdev_param = ar->wmi.vdev_param->nss;
4503 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4504 nss);
4505 if (ret) {
4506 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4507 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4508 ret);
4509 goto err_vdev_delete;
4510 }
4511 }
4512
Michal Kaziore57e0572015-03-24 13:14:03 +00004513 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4514 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004515 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4516 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004517 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004518 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004519 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004520 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004521 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004522 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004523
Michal Kaziore57e0572015-03-24 13:14:03 +00004524 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004525 ret = ath10k_mac_set_kickout(arvif);
4526 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004527 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004528 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004529 goto err_peer_delete;
4530 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004531 }
4532
4533 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4534 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4535 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4536 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4537 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004538 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004539 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004540 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004541 goto err_peer_delete;
4542 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004543
Michal Kazior9f9b5742014-12-12 12:41:36 +01004544 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004545 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004546 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004547 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004548 goto err_peer_delete;
4549 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004550
Michal Kazior9f9b5742014-12-12 12:41:36 +01004551 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004552 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004553 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004554 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004555 goto err_peer_delete;
4556 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004557 }
4558
Vivek Natarajana48e2cc2015-08-04 10:45:12 +05304559 ret = ath10k_mac_set_txbf_conf(arvif);
4560 if (ret) {
4561 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
4562 arvif->vdev_id, ret);
4563 goto err_peer_delete;
4564 }
4565
Michal Kazior424121c2013-07-22 14:13:31 +02004566 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004567 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004568 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004569 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004570 goto err_peer_delete;
4571 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004572
Michal Kazior7d9d5582014-10-21 10:40:15 +03004573 arvif->txpower = vif->bss_conf.txpower;
4574 ret = ath10k_mac_txpower_recalc(ar);
4575 if (ret) {
4576 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4577 goto err_peer_delete;
4578 }
4579
Michal Kazior500ff9f2015-03-31 10:26:21 +00004580 if (vif->type == NL80211_IFTYPE_MONITOR) {
4581 ar->monitor_arvif = arvif;
4582 ret = ath10k_monitor_recalc(ar);
4583 if (ret) {
4584 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4585 goto err_peer_delete;
4586 }
4587 }
4588
Michal Kazior6d2d51e2015-08-07 09:08:21 +02004589 spin_lock_bh(&ar->htt.tx_lock);
4590 if (!ar->tx_paused)
4591 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
4592 spin_unlock_bh(&ar->htt.tx_lock);
4593
Kalle Valo5e3dd152013-06-12 20:52:10 +03004594 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004595 return 0;
4596
4597err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004598 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4599 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004600 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4601
4602err_vdev_delete:
4603 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004604 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004605 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004606
4607err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004608 if (arvif->beacon_buf) {
4609 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4610 arvif->beacon_buf, arvif->beacon_paddr);
4611 arvif->beacon_buf = NULL;
4612 }
4613
Michal Kazior9dad14a2013-10-16 15:44:45 +03004614 mutex_unlock(&ar->conf_mutex);
4615
Kalle Valo5e3dd152013-06-12 20:52:10 +03004616 return ret;
4617}
4618
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004619static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4620{
4621 int i;
4622
4623 for (i = 0; i < BITS_PER_LONG; i++)
4624 ath10k_mac_vif_tx_unlock(arvif, i);
4625}
4626
Kalle Valo5e3dd152013-06-12 20:52:10 +03004627static void ath10k_remove_interface(struct ieee80211_hw *hw,
4628 struct ieee80211_vif *vif)
4629{
4630 struct ath10k *ar = hw->priv;
4631 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4632 int ret;
4633
Michal Kazior81a9a172015-03-05 16:02:17 +02004634 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004635 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004636
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304637 mutex_lock(&ar->conf_mutex);
4638
Michal Kaziored543882013-09-13 14:16:56 +02004639 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004640 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004641 spin_unlock_bh(&ar->data_lock);
4642
Simon Wunderlich855aed12014-08-02 09:12:54 +03004643 ret = ath10k_spectral_vif_stop(arvif);
4644 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004645 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004646 arvif->vdev_id, ret);
4647
Ben Greear16c11172014-09-23 14:17:16 -07004648 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004649 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004650
Michal Kaziore57e0572015-03-24 13:14:03 +00004651 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4652 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004653 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4654 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004655 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004656 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004657 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004658
4659 kfree(arvif->u.ap.noa_data);
4660 }
4661
Michal Kazior7aa7a722014-08-25 12:09:38 +02004662 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004663 arvif->vdev_id);
4664
Kalle Valo5e3dd152013-06-12 20:52:10 +03004665 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4666 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004667 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004668 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004669
Michal Kazior2c512052015-02-15 16:50:40 +02004670 /* Some firmware revisions don't notify host about self-peer removal
4671 * until after associated vdev is deleted.
4672 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004673 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4674 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004675 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4676 vif->addr);
4677 if (ret)
4678 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4679 arvif->vdev_id, ret);
4680
4681 spin_lock_bh(&ar->data_lock);
4682 ar->num_peers--;
4683 spin_unlock_bh(&ar->data_lock);
4684 }
4685
Kalle Valo5e3dd152013-06-12 20:52:10 +03004686 ath10k_peer_cleanup(ar, arvif->vdev_id);
4687
Michal Kazior500ff9f2015-03-31 10:26:21 +00004688 if (vif->type == NL80211_IFTYPE_MONITOR) {
4689 ar->monitor_arvif = NULL;
4690 ret = ath10k_monitor_recalc(ar);
4691 if (ret)
4692 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4693 }
4694
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004695 spin_lock_bh(&ar->htt.tx_lock);
4696 ath10k_mac_vif_tx_unlock_all(arvif);
4697 spin_unlock_bh(&ar->htt.tx_lock);
4698
Kalle Valo5e3dd152013-06-12 20:52:10 +03004699 mutex_unlock(&ar->conf_mutex);
4700}
4701
4702/*
4703 * FIXME: Has to be verified.
4704 */
4705#define SUPPORTED_FILTERS \
Johannes Bergdf140462015-04-22 14:40:58 +02004706 (FIF_ALLMULTI | \
Kalle Valo5e3dd152013-06-12 20:52:10 +03004707 FIF_CONTROL | \
4708 FIF_PSPOLL | \
4709 FIF_OTHER_BSS | \
4710 FIF_BCN_PRBRESP_PROMISC | \
4711 FIF_PROBE_REQ | \
4712 FIF_FCSFAIL)
4713
4714static void ath10k_configure_filter(struct ieee80211_hw *hw,
4715 unsigned int changed_flags,
4716 unsigned int *total_flags,
4717 u64 multicast)
4718{
4719 struct ath10k *ar = hw->priv;
4720 int ret;
4721
4722 mutex_lock(&ar->conf_mutex);
4723
4724 changed_flags &= SUPPORTED_FILTERS;
4725 *total_flags &= SUPPORTED_FILTERS;
4726 ar->filter_flags = *total_flags;
4727
Michal Kazior19337472014-08-28 12:58:16 +02004728 ret = ath10k_monitor_recalc(ar);
4729 if (ret)
4730 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004731
4732 mutex_unlock(&ar->conf_mutex);
4733}
4734
4735static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4736 struct ieee80211_vif *vif,
4737 struct ieee80211_bss_conf *info,
4738 u32 changed)
4739{
4740 struct ath10k *ar = hw->priv;
4741 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4742 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004743 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004744
4745 mutex_lock(&ar->conf_mutex);
4746
4747 if (changed & BSS_CHANGED_IBSS)
4748 ath10k_control_ibss(arvif, info, vif->addr);
4749
4750 if (changed & BSS_CHANGED_BEACON_INT) {
4751 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004752 vdev_param = ar->wmi.vdev_param->beacon_interval;
4753 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004754 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004755 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004756 "mac vdev %d beacon_interval %d\n",
4757 arvif->vdev_id, arvif->beacon_interval);
4758
Kalle Valo5e3dd152013-06-12 20:52:10 +03004759 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004760 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004761 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004762 }
4763
4764 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004765 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004766 "vdev %d set beacon tx mode to staggered\n",
4767 arvif->vdev_id);
4768
Bartosz Markowski226a3392013-09-26 17:47:16 +02004769 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4770 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004771 WMI_BEACON_STAGGERED_MODE);
4772 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004773 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004774 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004775
4776 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4777 if (ret)
4778 ath10k_warn(ar, "failed to update beacon template: %d\n",
4779 ret);
Bob Copelandb6c7baf2015-09-09 12:47:36 -04004780
4781 if (ieee80211_vif_is_mesh(vif)) {
4782 /* mesh doesn't use SSID but firmware needs it */
4783 strncpy(arvif->u.ap.ssid, "mesh",
4784 sizeof(arvif->u.ap.ssid));
4785 arvif->u.ap.ssid_len = 4;
4786 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004787 }
4788
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004789 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4790 ret = ath10k_mac_setup_prb_tmpl(arvif);
4791 if (ret)
4792 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4793 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004794 }
4795
Michal Kaziorba2479f2015-01-24 12:14:51 +02004796 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004797 arvif->dtim_period = info->dtim_period;
4798
Michal Kazior7aa7a722014-08-25 12:09:38 +02004799 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004800 "mac vdev %d dtim_period %d\n",
4801 arvif->vdev_id, arvif->dtim_period);
4802
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004803 vdev_param = ar->wmi.vdev_param->dtim_period;
4804 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004805 arvif->dtim_period);
4806 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004807 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004808 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004809 }
4810
4811 if (changed & BSS_CHANGED_SSID &&
4812 vif->type == NL80211_IFTYPE_AP) {
4813 arvif->u.ap.ssid_len = info->ssid_len;
4814 if (info->ssid_len)
4815 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4816 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4817 }
4818
Michal Kazior077efc82014-10-21 10:10:29 +03004819 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4820 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004821
4822 if (changed & BSS_CHANGED_BEACON_ENABLED)
4823 ath10k_control_beaconing(arvif, info);
4824
4825 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004826 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004827 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004828 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004829
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004830 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004831 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004832 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004833 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004834
4835 vdev_param = ar->wmi.vdev_param->protection_mode;
4836 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4837 info->use_cts_prot ? 1 : 0);
4838 if (ret)
4839 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
Kalle Valo617b0f42015-10-05 17:56:35 +03004840 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004841 }
4842
4843 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004844 if (info->use_short_slot)
4845 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4846
4847 else
4848 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4849
Michal Kazior7aa7a722014-08-25 12:09:38 +02004850 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004851 arvif->vdev_id, slottime);
4852
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004853 vdev_param = ar->wmi.vdev_param->slot_time;
4854 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004855 slottime);
4856 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004857 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004858 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004859 }
4860
4861 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004862 if (info->use_short_preamble)
4863 preamble = WMI_VDEV_PREAMBLE_SHORT;
4864 else
4865 preamble = WMI_VDEV_PREAMBLE_LONG;
4866
Michal Kazior7aa7a722014-08-25 12:09:38 +02004867 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004868 "mac vdev %d preamble %dn",
4869 arvif->vdev_id, preamble);
4870
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004871 vdev_param = ar->wmi.vdev_param->preamble;
4872 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004873 preamble);
4874 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004875 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004876 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004877 }
4878
4879 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004880 if (info->assoc) {
4881 /* Workaround: Make sure monitor vdev is not running
4882 * when associating to prevent some firmware revisions
4883 * (e.g. 10.1 and 10.2) from crashing.
4884 */
4885 if (ar->monitor_started)
4886 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004887 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004888 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004889 } else {
4890 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004891 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004892 }
4893
Michal Kazior7d9d5582014-10-21 10:40:15 +03004894 if (changed & BSS_CHANGED_TXPOWER) {
4895 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4896 arvif->vdev_id, info->txpower);
4897
4898 arvif->txpower = info->txpower;
4899 ret = ath10k_mac_txpower_recalc(ar);
4900 if (ret)
4901 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4902 }
4903
Michal Kaziorbf14e652014-12-12 12:41:38 +01004904 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004905 arvif->ps = vif->bss_conf.ps;
4906
4907 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004908 if (ret)
4909 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4910 arvif->vdev_id, ret);
4911 }
4912
Kalle Valo5e3dd152013-06-12 20:52:10 +03004913 mutex_unlock(&ar->conf_mutex);
4914}
4915
4916static int ath10k_hw_scan(struct ieee80211_hw *hw,
4917 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004918 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004919{
4920 struct ath10k *ar = hw->priv;
4921 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004922 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004923 struct wmi_start_scan_arg arg;
4924 int ret = 0;
4925 int i;
4926
4927 mutex_lock(&ar->conf_mutex);
4928
4929 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004930 switch (ar->scan.state) {
4931 case ATH10K_SCAN_IDLE:
4932 reinit_completion(&ar->scan.started);
4933 reinit_completion(&ar->scan.completed);
4934 ar->scan.state = ATH10K_SCAN_STARTING;
4935 ar->scan.is_roc = false;
4936 ar->scan.vdev_id = arvif->vdev_id;
4937 ret = 0;
4938 break;
4939 case ATH10K_SCAN_STARTING:
4940 case ATH10K_SCAN_RUNNING:
4941 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004942 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004943 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004944 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004945 spin_unlock_bh(&ar->data_lock);
4946
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004947 if (ret)
4948 goto exit;
4949
Kalle Valo5e3dd152013-06-12 20:52:10 +03004950 memset(&arg, 0, sizeof(arg));
4951 ath10k_wmi_start_scan_init(ar, &arg);
4952 arg.vdev_id = arvif->vdev_id;
4953 arg.scan_id = ATH10K_SCAN_ID;
4954
Kalle Valo5e3dd152013-06-12 20:52:10 +03004955 if (req->ie_len) {
4956 arg.ie_len = req->ie_len;
4957 memcpy(arg.ie, req->ie, arg.ie_len);
4958 }
4959
4960 if (req->n_ssids) {
4961 arg.n_ssids = req->n_ssids;
4962 for (i = 0; i < arg.n_ssids; i++) {
4963 arg.ssids[i].len = req->ssids[i].ssid_len;
4964 arg.ssids[i].ssid = req->ssids[i].ssid;
4965 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004966 } else {
4967 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004968 }
4969
4970 if (req->n_channels) {
4971 arg.n_channels = req->n_channels;
4972 for (i = 0; i < arg.n_channels; i++)
4973 arg.channels[i] = req->channels[i]->center_freq;
4974 }
4975
4976 ret = ath10k_start_scan(ar, &arg);
4977 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004978 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004979 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004980 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004981 spin_unlock_bh(&ar->data_lock);
4982 }
4983
Michal Kazior634349b2015-09-03 10:43:45 +02004984 /* Add a 200ms margin to account for event/command processing */
4985 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4986 msecs_to_jiffies(arg.max_scan_time +
4987 200));
4988
Kalle Valo5e3dd152013-06-12 20:52:10 +03004989exit:
4990 mutex_unlock(&ar->conf_mutex);
4991 return ret;
4992}
4993
4994static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4995 struct ieee80211_vif *vif)
4996{
4997 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004998
4999 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005000 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005001 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01005002
5003 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005004}
5005
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005006static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
5007 struct ath10k_vif *arvif,
5008 enum set_key_cmd cmd,
5009 struct ieee80211_key_conf *key)
5010{
5011 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
5012 int ret;
5013
5014 /* 10.1 firmware branch requires default key index to be set to group
5015 * key index after installing it. Otherwise FW/HW Txes corrupted
5016 * frames with multi-vif APs. This is not required for main firmware
5017 * branch (e.g. 636).
5018 *
Michal Kazior8461baf2015-04-10 13:23:22 +00005019 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5020 *
5021 * FIXME: It remains unknown if this is required for multi-vif STA
5022 * interfaces on 10.1.
5023 */
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005024
Michal Kazior8461baf2015-04-10 13:23:22 +00005025 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
5026 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005027 return;
5028
5029 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
5030 return;
5031
5032 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
5033 return;
5034
5035 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5036 return;
5037
5038 if (cmd != SET_KEY)
5039 return;
5040
5041 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5042 key->keyidx);
5043 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005044 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02005045 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005046}
5047
Kalle Valo5e3dd152013-06-12 20:52:10 +03005048static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5049 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5050 struct ieee80211_key_conf *key)
5051{
5052 struct ath10k *ar = hw->priv;
5053 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5054 struct ath10k_peer *peer;
5055 const u8 *peer_addr;
5056 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
5057 key->cipher == WLAN_CIPHER_SUITE_WEP104;
5058 int ret = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00005059 int ret2;
Michal Kazior370e5672015-02-18 14:02:26 +01005060 u32 flags = 0;
Michal Kazior29a10002015-04-10 13:05:58 +00005061 u32 flags2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005062
Bartosz Markowskid7131c02015-03-10 14:32:19 +01005063 /* this one needs to be done in software */
5064 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
5065 return 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005066
David Liuccec9032015-07-24 20:25:32 +03005067 if (arvif->nohwcrypt)
5068 return 1;
5069
Kalle Valo5e3dd152013-06-12 20:52:10 +03005070 if (key->keyidx > WMI_MAX_KEY_INDEX)
5071 return -ENOSPC;
5072
5073 mutex_lock(&ar->conf_mutex);
5074
5075 if (sta)
5076 peer_addr = sta->addr;
5077 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
5078 peer_addr = vif->bss_conf.bssid;
5079 else
5080 peer_addr = vif->addr;
5081
5082 key->hw_key_idx = key->keyidx;
5083
Michal Kazior7c8cc7e2015-04-01 22:53:19 +03005084 if (is_wep) {
5085 if (cmd == SET_KEY)
5086 arvif->wep_keys[key->keyidx] = key;
5087 else
5088 arvif->wep_keys[key->keyidx] = NULL;
5089 }
5090
Kalle Valo5e3dd152013-06-12 20:52:10 +03005091 /* the peer should not disappear in mid-way (unless FW goes awry) since
5092 * we already hold conf_mutex. we just make sure its there now. */
5093 spin_lock_bh(&ar->data_lock);
5094 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5095 spin_unlock_bh(&ar->data_lock);
5096
5097 if (!peer) {
5098 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005099 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03005100 peer_addr);
5101 ret = -EOPNOTSUPP;
5102 goto exit;
5103 } else {
5104 /* if the peer doesn't exist there is no key to disable
5105 * anymore */
5106 goto exit;
5107 }
5108 }
5109
Michal Kazior7cc45732015-03-09 14:24:17 +01005110 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5111 flags |= WMI_KEY_PAIRWISE;
5112 else
5113 flags |= WMI_KEY_GROUP;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005114
Kalle Valo5e3dd152013-06-12 20:52:10 +03005115 if (is_wep) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005116 if (cmd == DISABLE_KEY)
5117 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01005118
Michal Kaziorad325cb2015-02-18 14:02:27 +01005119 /* When WEP keys are uploaded it's possible that there are
5120 * stations associated already (e.g. when merging) without any
5121 * keys. Static WEP needs an explicit per-peer key upload.
5122 */
5123 if (vif->type == NL80211_IFTYPE_ADHOC &&
5124 cmd == SET_KEY)
5125 ath10k_mac_vif_update_wep_key(arvif, key);
5126
Michal Kazior370e5672015-02-18 14:02:26 +01005127 /* 802.1x never sets the def_wep_key_idx so each set_key()
5128 * call changes default tx key.
5129 *
5130 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
5131 * after first set_key().
5132 */
5133 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
5134 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005135 }
5136
Michal Kazior370e5672015-02-18 14:02:26 +01005137 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005138 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03005139 WARN_ON(ret > 0);
Michal Kazior7aa7a722014-08-25 12:09:38 +02005140 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02005141 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005142 goto exit;
5143 }
5144
Michal Kazior29a10002015-04-10 13:05:58 +00005145 /* mac80211 sets static WEP keys as groupwise while firmware requires
5146 * them to be installed twice as both pairwise and groupwise.
5147 */
5148 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
5149 flags2 = flags;
5150 flags2 &= ~WMI_KEY_GROUP;
5151 flags2 |= WMI_KEY_PAIRWISE;
5152
5153 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
5154 if (ret) {
David Liuccec9032015-07-24 20:25:32 +03005155 WARN_ON(ret > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00005156 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
5157 arvif->vdev_id, peer_addr, ret);
5158 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
5159 peer_addr, flags);
David Liuccec9032015-07-24 20:25:32 +03005160 if (ret2) {
5161 WARN_ON(ret2 > 0);
Michal Kazior29a10002015-04-10 13:05:58 +00005162 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
5163 arvif->vdev_id, peer_addr, ret2);
David Liuccec9032015-07-24 20:25:32 +03005164 }
Michal Kazior29a10002015-04-10 13:05:58 +00005165 goto exit;
5166 }
5167 }
5168
Michal Kaziorcfb27d22013-12-02 09:06:36 +01005169 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
5170
Kalle Valo5e3dd152013-06-12 20:52:10 +03005171 spin_lock_bh(&ar->data_lock);
5172 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
5173 if (peer && cmd == SET_KEY)
5174 peer->keys[key->keyidx] = key;
5175 else if (peer && cmd == DISABLE_KEY)
5176 peer->keys[key->keyidx] = NULL;
5177 else if (peer == NULL)
5178 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005179 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005180 spin_unlock_bh(&ar->data_lock);
5181
5182exit:
5183 mutex_unlock(&ar->conf_mutex);
5184 return ret;
5185}
5186
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005187static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
5188 struct ieee80211_vif *vif,
5189 int keyidx)
5190{
5191 struct ath10k *ar = hw->priv;
5192 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5193 int ret;
5194
5195 mutex_lock(&arvif->ar->conf_mutex);
5196
5197 if (arvif->ar->state != ATH10K_STATE_ON)
5198 goto unlock;
5199
5200 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
5201 arvif->vdev_id, keyidx);
5202
5203 ret = ath10k_wmi_vdev_set_param(arvif->ar,
5204 arvif->vdev_id,
5205 arvif->ar->wmi.vdev_param->def_keyid,
5206 keyidx);
5207
5208 if (ret) {
5209 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
5210 arvif->vdev_id,
5211 ret);
5212 goto unlock;
5213 }
5214
5215 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01005216
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02005217unlock:
5218 mutex_unlock(&arvif->ar->conf_mutex);
5219}
5220
Michal Kazior9797feb2014-02-14 14:49:48 +01005221static void ath10k_sta_rc_update_wk(struct work_struct *wk)
5222{
5223 struct ath10k *ar;
5224 struct ath10k_vif *arvif;
5225 struct ath10k_sta *arsta;
5226 struct ieee80211_sta *sta;
Michal Kazior45c9abc2015-04-21 20:42:58 +03005227 struct cfg80211_chan_def def;
5228 enum ieee80211_band band;
5229 const u8 *ht_mcs_mask;
5230 const u16 *vht_mcs_mask;
Michal Kazior9797feb2014-02-14 14:49:48 +01005231 u32 changed, bw, nss, smps;
5232 int err;
5233
5234 arsta = container_of(wk, struct ath10k_sta, update_wk);
5235 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
5236 arvif = arsta->arvif;
5237 ar = arvif->ar;
5238
Michal Kazior45c9abc2015-04-21 20:42:58 +03005239 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
5240 return;
5241
5242 band = def.chan->band;
5243 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5244 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5245
Michal Kazior9797feb2014-02-14 14:49:48 +01005246 spin_lock_bh(&ar->data_lock);
5247
5248 changed = arsta->changed;
5249 arsta->changed = 0;
5250
5251 bw = arsta->bw;
5252 nss = arsta->nss;
5253 smps = arsta->smps;
5254
5255 spin_unlock_bh(&ar->data_lock);
5256
5257 mutex_lock(&ar->conf_mutex);
5258
Michal Kazior45c9abc2015-04-21 20:42:58 +03005259 nss = max_t(u32, 1, nss);
5260 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
5261 ath10k_mac_max_vht_nss(vht_mcs_mask)));
5262
Michal Kazior9797feb2014-02-14 14:49:48 +01005263 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005264 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005265 sta->addr, bw);
5266
5267 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5268 WMI_PEER_CHAN_WIDTH, bw);
5269 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005270 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005271 sta->addr, bw, err);
5272 }
5273
5274 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005275 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005276 sta->addr, nss);
5277
5278 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5279 WMI_PEER_NSS, nss);
5280 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005281 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005282 sta->addr, nss, err);
5283 }
5284
5285 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005286 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005287 sta->addr, smps);
5288
5289 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
5290 WMI_PEER_SMPS_STATE, smps);
5291 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005292 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01005293 sta->addr, smps, err);
5294 }
5295
Janusz Dziedzic55884c02014-12-17 12:30:02 +02005296 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
5297 changed & IEEE80211_RC_NSS_CHANGED) {
5298 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005299 sta->addr);
5300
Michal Kazior590922a2014-10-21 10:10:29 +03005301 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005302 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005303 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02005304 sta->addr);
5305 }
5306
Michal Kazior9797feb2014-02-14 14:49:48 +01005307 mutex_unlock(&ar->conf_mutex);
5308}
5309
Marek Puzyniak7c354242015-03-30 09:51:52 +03005310static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
5311 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005312{
5313 struct ath10k *ar = arvif->ar;
5314
5315 lockdep_assert_held(&ar->conf_mutex);
5316
Marek Puzyniak7c354242015-03-30 09:51:52 +03005317 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005318 return 0;
5319
5320 if (ar->num_stations >= ar->max_num_stations)
5321 return -ENOBUFS;
5322
5323 ar->num_stations++;
5324
5325 return 0;
5326}
5327
Marek Puzyniak7c354242015-03-30 09:51:52 +03005328static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
5329 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005330{
5331 struct ath10k *ar = arvif->ar;
5332
5333 lockdep_assert_held(&ar->conf_mutex);
5334
Marek Puzyniak7c354242015-03-30 09:51:52 +03005335 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01005336 return;
5337
5338 ar->num_stations--;
5339}
5340
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005341struct ath10k_mac_tdls_iter_data {
5342 u32 num_tdls_stations;
5343 struct ieee80211_vif *curr_vif;
5344};
5345
5346static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
5347 struct ieee80211_sta *sta)
5348{
5349 struct ath10k_mac_tdls_iter_data *iter_data = data;
5350 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5351 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
5352
5353 if (sta->tdls && sta_vif == iter_data->curr_vif)
5354 iter_data->num_tdls_stations++;
5355}
5356
5357static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
5358 struct ieee80211_vif *vif)
5359{
5360 struct ath10k_mac_tdls_iter_data data = {};
5361
5362 data.curr_vif = vif;
5363
5364 ieee80211_iterate_stations_atomic(hw,
5365 ath10k_mac_tdls_vif_stations_count_iter,
5366 &data);
5367 return data.num_tdls_stations;
5368}
5369
5370static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
5371 struct ieee80211_vif *vif)
5372{
5373 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5374 int *num_tdls_vifs = data;
5375
5376 if (vif->type != NL80211_IFTYPE_STATION)
5377 return;
5378
5379 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
5380 (*num_tdls_vifs)++;
5381}
5382
5383static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
5384{
5385 int num_tdls_vifs = 0;
5386
5387 ieee80211_iterate_active_interfaces_atomic(hw,
5388 IEEE80211_IFACE_ITER_NORMAL,
5389 ath10k_mac_tdls_vifs_count_iter,
5390 &num_tdls_vifs);
5391 return num_tdls_vifs;
5392}
5393
Kalle Valo5e3dd152013-06-12 20:52:10 +03005394static int ath10k_sta_state(struct ieee80211_hw *hw,
5395 struct ieee80211_vif *vif,
5396 struct ieee80211_sta *sta,
5397 enum ieee80211_sta_state old_state,
5398 enum ieee80211_sta_state new_state)
5399{
5400 struct ath10k *ar = hw->priv;
5401 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005402 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005403 int ret = 0;
5404
Michal Kazior76f90022014-02-25 09:29:57 +02005405 if (old_state == IEEE80211_STA_NOTEXIST &&
5406 new_state == IEEE80211_STA_NONE) {
5407 memset(arsta, 0, sizeof(*arsta));
5408 arsta->arvif = arvif;
5409 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5410 }
5411
Michal Kazior9797feb2014-02-14 14:49:48 +01005412 /* cancel must be done outside the mutex to avoid deadlock */
5413 if ((old_state == IEEE80211_STA_NONE &&
5414 new_state == IEEE80211_STA_NOTEXIST))
5415 cancel_work_sync(&arsta->update_wk);
5416
Kalle Valo5e3dd152013-06-12 20:52:10 +03005417 mutex_lock(&ar->conf_mutex);
5418
5419 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005420 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005421 /*
5422 * New station addition.
5423 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005424 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5425 u32 num_tdls_stations;
5426 u32 num_tdls_vifs;
5427
Michal Kaziorcfd10612014-11-25 15:16:05 +01005428 ath10k_dbg(ar, ATH10K_DBG_MAC,
5429 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5430 arvif->vdev_id, sta->addr,
5431 ar->num_stations + 1, ar->max_num_stations,
5432 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005433
Marek Puzyniak7c354242015-03-30 09:51:52 +03005434 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005435 if (ret) {
5436 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5437 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005438 goto exit;
5439 }
5440
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005441 if (sta->tdls)
5442 peer_type = WMI_PEER_TYPE_TDLS;
5443
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005444 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005445 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005446 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005447 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 -08005448 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005449 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005450 goto exit;
5451 }
Michal Kazior077efc82014-10-21 10:10:29 +03005452
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005453 if (!sta->tdls)
5454 goto exit;
Michal Kazior077efc82014-10-21 10:10:29 +03005455
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005456 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5457 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5458
5459 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5460 num_tdls_stations == 0) {
5461 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5462 arvif->vdev_id, ar->max_num_tdls_vdevs);
5463 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5464 ath10k_mac_dec_num_stations(arvif, sta);
5465 ret = -ENOBUFS;
5466 goto exit;
5467 }
5468
5469 if (num_tdls_stations == 0) {
5470 /* This is the first tdls peer in current vif */
5471 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5472
5473 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5474 state);
Michal Kazior077efc82014-10-21 10:10:29 +03005475 if (ret) {
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005476 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
Michal Kazior077efc82014-10-21 10:10:29 +03005477 arvif->vdev_id, ret);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005478 ath10k_peer_delete(ar, arvif->vdev_id,
5479 sta->addr);
5480 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kazior077efc82014-10-21 10:10:29 +03005481 goto exit;
5482 }
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005483 }
Michal Kazior077efc82014-10-21 10:10:29 +03005484
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005485 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5486 WMI_TDLS_PEER_STATE_PEERING);
5487 if (ret) {
5488 ath10k_warn(ar,
5489 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5490 sta->addr, arvif->vdev_id, ret);
5491 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5492 ath10k_mac_dec_num_stations(arvif, sta);
5493
5494 if (num_tdls_stations != 0)
5495 goto exit;
5496 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5497 WMI_TDLS_DISABLE);
Michal Kazior077efc82014-10-21 10:10:29 +03005498 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005499 } else if ((old_state == IEEE80211_STA_NONE &&
5500 new_state == IEEE80211_STA_NOTEXIST)) {
5501 /*
5502 * Existing station deletion.
5503 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005504 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005505 "mac vdev %d peer delete %pM (sta gone)\n",
5506 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005507
Kalle Valo5e3dd152013-06-12 20:52:10 +03005508 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5509 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005510 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005511 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005512
Marek Puzyniak7c354242015-03-30 09:51:52 +03005513 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005514
5515 if (!sta->tdls)
5516 goto exit;
5517
5518 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5519 goto exit;
5520
5521 /* This was the last tdls peer in current vif */
5522 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5523 WMI_TDLS_DISABLE);
5524 if (ret) {
5525 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5526 arvif->vdev_id, ret);
5527 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005528 } else if (old_state == IEEE80211_STA_AUTH &&
5529 new_state == IEEE80211_STA_ASSOC &&
5530 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005531 vif->type == NL80211_IFTYPE_MESH_POINT ||
Kalle Valo5e3dd152013-06-12 20:52:10 +03005532 vif->type == NL80211_IFTYPE_ADHOC)) {
5533 /*
5534 * New association.
5535 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005536 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005537 sta->addr);
5538
Michal Kazior590922a2014-10-21 10:10:29 +03005539 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005540 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005541 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005542 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005543 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005544 new_state == IEEE80211_STA_AUTHORIZED &&
5545 sta->tdls) {
5546 /*
5547 * Tdls station authorized.
5548 */
5549 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5550 sta->addr);
5551
5552 ret = ath10k_station_assoc(ar, vif, sta, false);
5553 if (ret) {
5554 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5555 sta->addr, arvif->vdev_id, ret);
5556 goto exit;
5557 }
5558
5559 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5560 WMI_TDLS_PEER_STATE_CONNECTED);
5561 if (ret)
5562 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5563 sta->addr, arvif->vdev_id, ret);
5564 } else if (old_state == IEEE80211_STA_ASSOC &&
5565 new_state == IEEE80211_STA_AUTH &&
5566 (vif->type == NL80211_IFTYPE_AP ||
Bob Copelandb6c7baf2015-09-09 12:47:36 -04005567 vif->type == NL80211_IFTYPE_MESH_POINT ||
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005568 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005569 /*
5570 * Disassociation.
5571 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005572 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005573 sta->addr);
5574
Michal Kazior590922a2014-10-21 10:10:29 +03005575 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005576 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005577 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005578 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005579 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005580exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005581 mutex_unlock(&ar->conf_mutex);
5582 return ret;
5583}
5584
5585static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005586 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005587{
5588 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005589 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5590 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005591 u32 value = 0;
5592 int ret = 0;
5593
Michal Kazior548db542013-07-05 16:15:15 +03005594 lockdep_assert_held(&ar->conf_mutex);
5595
Kalle Valo5e3dd152013-06-12 20:52:10 +03005596 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5597 return 0;
5598
5599 switch (ac) {
5600 case IEEE80211_AC_VO:
5601 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5602 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005603 prio = 7;
5604 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005605 break;
5606 case IEEE80211_AC_VI:
5607 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5608 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005609 prio = 5;
5610 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005611 break;
5612 case IEEE80211_AC_BE:
5613 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5614 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005615 prio = 2;
5616 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005617 break;
5618 case IEEE80211_AC_BK:
5619 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5620 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005621 prio = 0;
5622 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005623 break;
5624 }
5625
5626 if (enable)
5627 arvif->u.sta.uapsd |= value;
5628 else
5629 arvif->u.sta.uapsd &= ~value;
5630
5631 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5632 WMI_STA_PS_PARAM_UAPSD,
5633 arvif->u.sta.uapsd);
5634 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005635 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005636 goto exit;
5637 }
5638
5639 if (arvif->u.sta.uapsd)
5640 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5641 else
5642 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5643
5644 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5645 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5646 value);
5647 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005648 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005649
Michal Kazior9f9b5742014-12-12 12:41:36 +01005650 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5651 if (ret) {
5652 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5653 arvif->vdev_id, ret);
5654 return ret;
5655 }
5656
5657 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5658 if (ret) {
5659 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5660 arvif->vdev_id, ret);
5661 return ret;
5662 }
5663
Michal Kaziorb0e56152015-01-24 12:14:52 +02005664 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5665 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5666 /* Only userspace can make an educated decision when to send
5667 * trigger frame. The following effectively disables u-UAPSD
5668 * autotrigger in firmware (which is enabled by default
5669 * provided the autotrigger service is available).
5670 */
5671
5672 arg.wmm_ac = acc;
5673 arg.user_priority = prio;
5674 arg.service_interval = 0;
5675 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5676 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5677
5678 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5679 arvif->bssid, &arg, 1);
5680 if (ret) {
5681 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5682 ret);
5683 return ret;
5684 }
5685 }
5686
Kalle Valo5e3dd152013-06-12 20:52:10 +03005687exit:
5688 return ret;
5689}
5690
5691static int ath10k_conf_tx(struct ieee80211_hw *hw,
5692 struct ieee80211_vif *vif, u16 ac,
5693 const struct ieee80211_tx_queue_params *params)
5694{
5695 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005696 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005697 struct wmi_wmm_params_arg *p = NULL;
5698 int ret;
5699
5700 mutex_lock(&ar->conf_mutex);
5701
5702 switch (ac) {
5703 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005704 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005705 break;
5706 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005707 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005708 break;
5709 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005710 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005711 break;
5712 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005713 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005714 break;
5715 }
5716
5717 if (WARN_ON(!p)) {
5718 ret = -EINVAL;
5719 goto exit;
5720 }
5721
5722 p->cwmin = params->cw_min;
5723 p->cwmax = params->cw_max;
5724 p->aifs = params->aifs;
5725
5726 /*
5727 * The channel time duration programmed in the HW is in absolute
5728 * microseconds, while mac80211 gives the txop in units of
5729 * 32 microseconds.
5730 */
5731 p->txop = params->txop * 32;
5732
Michal Kazior7fc979a2015-01-28 09:57:28 +02005733 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5734 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5735 &arvif->wmm_params);
5736 if (ret) {
5737 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5738 arvif->vdev_id, ret);
5739 goto exit;
5740 }
5741 } else {
5742 /* This won't work well with multi-interface cases but it's
5743 * better than nothing.
5744 */
5745 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5746 if (ret) {
5747 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5748 goto exit;
5749 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005750 }
5751
5752 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5753 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005754 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005755
5756exit:
5757 mutex_unlock(&ar->conf_mutex);
5758 return ret;
5759}
5760
5761#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5762
5763static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5764 struct ieee80211_vif *vif,
5765 struct ieee80211_channel *chan,
5766 int duration,
5767 enum ieee80211_roc_type type)
5768{
5769 struct ath10k *ar = hw->priv;
5770 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5771 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005772 int ret = 0;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005773 u32 scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005774
5775 mutex_lock(&ar->conf_mutex);
5776
5777 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005778 switch (ar->scan.state) {
5779 case ATH10K_SCAN_IDLE:
5780 reinit_completion(&ar->scan.started);
5781 reinit_completion(&ar->scan.completed);
5782 reinit_completion(&ar->scan.on_channel);
5783 ar->scan.state = ATH10K_SCAN_STARTING;
5784 ar->scan.is_roc = true;
5785 ar->scan.vdev_id = arvif->vdev_id;
5786 ar->scan.roc_freq = chan->center_freq;
Michal Kaziord710e752015-07-09 13:08:36 +02005787 ar->scan.roc_notify = true;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005788 ret = 0;
5789 break;
5790 case ATH10K_SCAN_STARTING:
5791 case ATH10K_SCAN_RUNNING:
5792 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005793 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005794 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005795 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005796 spin_unlock_bh(&ar->data_lock);
5797
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005798 if (ret)
5799 goto exit;
5800
Michal Kaziorfcf98442015-03-31 11:03:47 +00005801 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005802
Kalle Valo5e3dd152013-06-12 20:52:10 +03005803 memset(&arg, 0, sizeof(arg));
5804 ath10k_wmi_start_scan_init(ar, &arg);
5805 arg.vdev_id = arvif->vdev_id;
5806 arg.scan_id = ATH10K_SCAN_ID;
5807 arg.n_channels = 1;
5808 arg.channels[0] = chan->center_freq;
Michal Kaziorfcf98442015-03-31 11:03:47 +00005809 arg.dwell_time_active = scan_time_msec;
5810 arg.dwell_time_passive = scan_time_msec;
5811 arg.max_scan_time = scan_time_msec;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005812 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5813 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
Michal Kaziordbd3f9f2015-03-31 11:03:48 +00005814 arg.burst_duration_ms = duration;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005815
5816 ret = ath10k_start_scan(ar, &arg);
5817 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005818 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005819 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005820 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005821 spin_unlock_bh(&ar->data_lock);
5822 goto exit;
5823 }
5824
5825 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5826 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005827 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005828
5829 ret = ath10k_scan_stop(ar);
5830 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005831 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005832
Kalle Valo5e3dd152013-06-12 20:52:10 +03005833 ret = -ETIMEDOUT;
5834 goto exit;
5835 }
5836
Michal Kaziorfcf98442015-03-31 11:03:47 +00005837 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
5838 msecs_to_jiffies(duration));
5839
Kalle Valo5e3dd152013-06-12 20:52:10 +03005840 ret = 0;
5841exit:
5842 mutex_unlock(&ar->conf_mutex);
5843 return ret;
5844}
5845
5846static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5847{
5848 struct ath10k *ar = hw->priv;
5849
5850 mutex_lock(&ar->conf_mutex);
Michal Kaziord710e752015-07-09 13:08:36 +02005851
5852 spin_lock_bh(&ar->data_lock);
5853 ar->scan.roc_notify = false;
5854 spin_unlock_bh(&ar->data_lock);
5855
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005856 ath10k_scan_abort(ar);
Michal Kaziord710e752015-07-09 13:08:36 +02005857
Kalle Valo5e3dd152013-06-12 20:52:10 +03005858 mutex_unlock(&ar->conf_mutex);
5859
Michal Kazior4eb2e162014-10-28 10:23:09 +01005860 cancel_delayed_work_sync(&ar->scan.timeout);
5861
Kalle Valo5e3dd152013-06-12 20:52:10 +03005862 return 0;
5863}
5864
5865/*
5866 * Both RTS and Fragmentation threshold are interface-specific
5867 * in ath10k, but device-specific in mac80211.
5868 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005869
5870static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5871{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005872 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005873 struct ath10k_vif *arvif;
5874 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005875
Michal Kaziorad088bf2013-10-16 15:44:46 +03005876 mutex_lock(&ar->conf_mutex);
5877 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005878 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005879 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005880
Michal Kaziorad088bf2013-10-16 15:44:46 +03005881 ret = ath10k_mac_set_rts(arvif, value);
5882 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005883 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005884 arvif->vdev_id, ret);
5885 break;
5886 }
5887 }
5888 mutex_unlock(&ar->conf_mutex);
5889
5890 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005891}
5892
Michal Kazior92092fe2015-08-03 11:16:43 +02005893static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
5894{
5895 /* Even though there's a WMI enum for fragmentation threshold no known
5896 * firmware actually implements it. Moreover it is not possible to rely
5897 * frame fragmentation to mac80211 because firmware clears the "more
5898 * fragments" bit in frame control making it impossible for remote
5899 * devices to reassemble frames.
5900 *
5901 * Hence implement a dummy callback just to say fragmentation isn't
5902 * supported. This effectively prevents mac80211 from doing frame
5903 * fragmentation in software.
5904 */
5905 return -EOPNOTSUPP;
5906}
5907
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005908static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5909 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005910{
5911 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005912 bool skip;
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005913 long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005914
5915 /* mac80211 doesn't care if we really xmit queued frames or not
5916 * we'll collect those frames either way if we stop/delete vdevs */
5917 if (drop)
5918 return;
5919
Michal Kazior548db542013-07-05 16:15:15 +03005920 mutex_lock(&ar->conf_mutex);
5921
Michal Kazioraffd3212013-07-16 09:54:35 +02005922 if (ar->state == ATH10K_STATE_WEDGED)
5923 goto skip;
5924
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005925 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005926 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005927
Michal Kazioredb82362013-07-05 16:15:14 +03005928 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005929 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005930 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005931
Michal Kazior7962b0d2014-10-28 10:34:38 +01005932 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5933 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5934 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005935
5936 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005937 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005938
Nicholas Mc Guired4298a32015-06-15 14:46:43 +03005939 if (time_left == 0 || skip)
5940 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
5941 skip, ar->state, time_left);
Michal Kazior548db542013-07-05 16:15:15 +03005942
Michal Kazioraffd3212013-07-16 09:54:35 +02005943skip:
Michal Kazior548db542013-07-05 16:15:15 +03005944 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005945}
5946
5947/* TODO: Implement this function properly
5948 * For now it is needed to reply to Probe Requests in IBSS mode.
5949 * Propably we need this information from FW.
5950 */
5951static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5952{
5953 return 1;
5954}
5955
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005956static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5957 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005958{
5959 struct ath10k *ar = hw->priv;
5960
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005961 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5962 return;
5963
Michal Kazioraffd3212013-07-16 09:54:35 +02005964 mutex_lock(&ar->conf_mutex);
5965
5966 /* If device failed to restart it will be in a different state, e.g.
5967 * ATH10K_STATE_WEDGED */
5968 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005969 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005970 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005971 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005972 }
5973
5974 mutex_unlock(&ar->conf_mutex);
5975}
5976
Michal Kazior2e1dea42013-07-31 10:32:40 +02005977static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5978 struct survey_info *survey)
5979{
5980 struct ath10k *ar = hw->priv;
5981 struct ieee80211_supported_band *sband;
5982 struct survey_info *ar_survey = &ar->survey[idx];
5983 int ret = 0;
5984
5985 mutex_lock(&ar->conf_mutex);
5986
5987 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5988 if (sband && idx >= sband->n_channels) {
5989 idx -= sband->n_channels;
5990 sband = NULL;
5991 }
5992
5993 if (!sband)
5994 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5995
5996 if (!sband || idx >= sband->n_channels) {
5997 ret = -ENOENT;
5998 goto exit;
5999 }
6000
6001 spin_lock_bh(&ar->data_lock);
6002 memcpy(survey, ar_survey, sizeof(*survey));
6003 spin_unlock_bh(&ar->data_lock);
6004
6005 survey->channel = &sband->channels[idx];
6006
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03006007 if (ar->rx_channel == survey->channel)
6008 survey->filled |= SURVEY_INFO_IN_USE;
6009
Michal Kazior2e1dea42013-07-31 10:32:40 +02006010exit:
6011 mutex_unlock(&ar->conf_mutex);
6012 return ret;
6013}
6014
Michal Kazior3ae54222015-03-31 10:49:20 +00006015static bool
6016ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6017 enum ieee80211_band band,
6018 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006019{
Michal Kazior3ae54222015-03-31 10:49:20 +00006020 int num_rates = 0;
6021 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006022
Michal Kazior3ae54222015-03-31 10:49:20 +00006023 num_rates += hweight32(mask->control[band].legacy);
6024
6025 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6026 num_rates += hweight8(mask->control[band].ht_mcs[i]);
6027
6028 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
6029 num_rates += hweight16(mask->control[band].vht_mcs[i]);
6030
6031 return num_rates == 1;
6032}
6033
6034static bool
6035ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
6036 enum ieee80211_band band,
6037 const struct cfg80211_bitrate_mask *mask,
6038 int *nss)
6039{
6040 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6041 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6042 u8 ht_nss_mask = 0;
6043 u8 vht_nss_mask = 0;
6044 int i;
6045
6046 if (mask->control[band].legacy)
6047 return false;
6048
6049 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6050 if (mask->control[band].ht_mcs[i] == 0)
6051 continue;
6052 else if (mask->control[band].ht_mcs[i] ==
6053 sband->ht_cap.mcs.rx_mask[i])
6054 ht_nss_mask |= BIT(i);
6055 else
6056 return false;
6057 }
6058
6059 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6060 if (mask->control[band].vht_mcs[i] == 0)
6061 continue;
6062 else if (mask->control[band].vht_mcs[i] ==
6063 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
6064 vht_nss_mask |= BIT(i);
6065 else
6066 return false;
6067 }
6068
6069 if (ht_nss_mask != vht_nss_mask)
6070 return false;
6071
6072 if (ht_nss_mask == 0)
6073 return false;
6074
6075 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
6076 return false;
6077
6078 *nss = fls(ht_nss_mask);
6079
6080 return true;
6081}
6082
6083static int
6084ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6085 enum ieee80211_band band,
6086 const struct cfg80211_bitrate_mask *mask,
6087 u8 *rate, u8 *nss)
6088{
6089 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6090 int rate_idx;
6091 int i;
6092 u16 bitrate;
6093 u8 preamble;
6094 u8 hw_rate;
6095
6096 if (hweight32(mask->control[band].legacy) == 1) {
6097 rate_idx = ffs(mask->control[band].legacy) - 1;
6098
6099 hw_rate = sband->bitrates[rate_idx].hw_value;
6100 bitrate = sband->bitrates[rate_idx].bitrate;
6101
6102 if (ath10k_mac_bitrate_is_cck(bitrate))
6103 preamble = WMI_RATE_PREAMBLE_CCK;
6104 else
6105 preamble = WMI_RATE_PREAMBLE_OFDM;
6106
6107 *nss = 1;
6108 *rate = preamble << 6 |
6109 (*nss - 1) << 4 |
6110 hw_rate << 0;
6111
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006112 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006113 }
6114
Michal Kazior3ae54222015-03-31 10:49:20 +00006115 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6116 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6117 *nss = i + 1;
6118 *rate = WMI_RATE_PREAMBLE_HT << 6 |
6119 (*nss - 1) << 4 |
6120 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006121
Michal Kazior3ae54222015-03-31 10:49:20 +00006122 return 0;
6123 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006124 }
6125
Michal Kazior3ae54222015-03-31 10:49:20 +00006126 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6127 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
6128 *nss = i + 1;
6129 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
6130 (*nss - 1) << 4 |
6131 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006132
Michal Kazior3ae54222015-03-31 10:49:20 +00006133 return 0;
6134 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006135 }
6136
Michal Kazior3ae54222015-03-31 10:49:20 +00006137 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006138}
6139
Michal Kazior3ae54222015-03-31 10:49:20 +00006140static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306141 u8 rate, u8 nss, u8 sgi, u8 ldpc)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006142{
6143 struct ath10k *ar = arvif->ar;
6144 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00006145 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006146
Michal Kazior3ae54222015-03-31 10:49:20 +00006147 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006148
Michal Kazior3ae54222015-03-31 10:49:20 +00006149 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
6150 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006151
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006152 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00006153 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006154 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006155 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00006156 rate, ret);
6157 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006158 }
6159
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006160 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00006161 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006162 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006163 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
6164 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006165 }
6166
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006167 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00006168 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006169 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006170 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
6171 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006172 }
6173
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306174 vdev_param = ar->wmi.vdev_param->ldpc;
6175 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
6176 if (ret) {
6177 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
6178 return ret;
6179 }
6180
Michal Kazior3ae54222015-03-31 10:49:20 +00006181 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006182}
6183
Michal Kazior45c9abc2015-04-21 20:42:58 +03006184static bool
6185ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
6186 enum ieee80211_band band,
6187 const struct cfg80211_bitrate_mask *mask)
6188{
6189 int i;
6190 u16 vht_mcs;
6191
6192 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6193 * to express all VHT MCS rate masks. Effectively only the following
6194 * ranges can be used: none, 0-7, 0-8 and 0-9.
6195 */
6196 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6197 vht_mcs = mask->control[band].vht_mcs[i];
6198
6199 switch (vht_mcs) {
6200 case 0:
6201 case BIT(8) - 1:
6202 case BIT(9) - 1:
6203 case BIT(10) - 1:
6204 break;
6205 default:
6206 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6207 return false;
6208 }
6209 }
6210
6211 return true;
6212}
6213
6214static void ath10k_mac_set_bitrate_mask_iter(void *data,
6215 struct ieee80211_sta *sta)
6216{
6217 struct ath10k_vif *arvif = data;
6218 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6219 struct ath10k *ar = arvif->ar;
6220
6221 if (arsta->arvif != arvif)
6222 return;
6223
6224 spin_lock_bh(&ar->data_lock);
6225 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
6226 spin_unlock_bh(&ar->data_lock);
6227
6228 ieee80211_queue_work(ar->hw, &arsta->update_wk);
6229}
6230
Michal Kazior3ae54222015-03-31 10:49:20 +00006231static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
6232 struct ieee80211_vif *vif,
6233 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006234{
6235 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006236 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006237 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006238 enum ieee80211_band band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006239 const u8 *ht_mcs_mask;
6240 const u16 *vht_mcs_mask;
Michal Kazior3ae54222015-03-31 10:49:20 +00006241 u8 rate;
6242 u8 nss;
6243 u8 sgi;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306244 u8 ldpc;
Michal Kazior3ae54222015-03-31 10:49:20 +00006245 int single_nss;
6246 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006247
Michal Kazior500ff9f2015-03-31 10:26:21 +00006248 if (ath10k_mac_vif_chan(vif, &def))
6249 return -EPERM;
6250
Michal Kazior500ff9f2015-03-31 10:26:21 +00006251 band = def.chan->band;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006252 ht_mcs_mask = mask->control[band].ht_mcs;
6253 vht_mcs_mask = mask->control[band].vht_mcs;
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306254 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006255
Michal Kazior3ae54222015-03-31 10:49:20 +00006256 sgi = mask->control[band].gi;
6257 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01006258 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006259
Michal Kazior3ae54222015-03-31 10:49:20 +00006260 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
6261 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6262 &rate, &nss);
6263 if (ret) {
6264 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
6265 arvif->vdev_id, ret);
6266 return ret;
6267 }
6268 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
6269 &single_nss)) {
6270 rate = WMI_FIXED_RATE_NONE;
6271 nss = single_nss;
6272 } else {
6273 rate = WMI_FIXED_RATE_NONE;
Michal Kazior45c9abc2015-04-21 20:42:58 +03006274 nss = min(ar->num_rf_chains,
6275 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6276 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6277
6278 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask))
6279 return -EINVAL;
6280
6281 mutex_lock(&ar->conf_mutex);
6282
6283 arvif->bitrate_mask = *mask;
6284 ieee80211_iterate_stations_atomic(ar->hw,
6285 ath10k_mac_set_bitrate_mask_iter,
6286 arvif);
6287
6288 mutex_unlock(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006289 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006290
6291 mutex_lock(&ar->conf_mutex);
6292
Rajkumar Manoharanbd4a41e2015-09-16 13:19:00 +05306293 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006294 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00006295 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
6296 arvif->vdev_id, ret);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006297 goto exit;
6298 }
6299
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006300exit:
6301 mutex_unlock(&ar->conf_mutex);
Michal Kazior3ae54222015-03-31 10:49:20 +00006302
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01006303 return ret;
6304}
6305
Michal Kazior9797feb2014-02-14 14:49:48 +01006306static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
6307 struct ieee80211_vif *vif,
6308 struct ieee80211_sta *sta,
6309 u32 changed)
6310{
6311 struct ath10k *ar = hw->priv;
6312 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6313 u32 bw, smps;
6314
6315 spin_lock_bh(&ar->data_lock);
6316
Michal Kazior7aa7a722014-08-25 12:09:38 +02006317 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01006318 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6319 sta->addr, changed, sta->bandwidth, sta->rx_nss,
6320 sta->smps_mode);
6321
6322 if (changed & IEEE80211_RC_BW_CHANGED) {
6323 bw = WMI_PEER_CHWIDTH_20MHZ;
6324
6325 switch (sta->bandwidth) {
6326 case IEEE80211_STA_RX_BW_20:
6327 bw = WMI_PEER_CHWIDTH_20MHZ;
6328 break;
6329 case IEEE80211_STA_RX_BW_40:
6330 bw = WMI_PEER_CHWIDTH_40MHZ;
6331 break;
6332 case IEEE80211_STA_RX_BW_80:
6333 bw = WMI_PEER_CHWIDTH_80MHZ;
6334 break;
6335 case IEEE80211_STA_RX_BW_160:
Masanari Iidad939be32015-02-27 23:52:31 +09006336 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006337 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006338 bw = WMI_PEER_CHWIDTH_20MHZ;
6339 break;
6340 }
6341
6342 arsta->bw = bw;
6343 }
6344
6345 if (changed & IEEE80211_RC_NSS_CHANGED)
6346 arsta->nss = sta->rx_nss;
6347
6348 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6349 smps = WMI_PEER_SMPS_PS_NONE;
6350
6351 switch (sta->smps_mode) {
6352 case IEEE80211_SMPS_AUTOMATIC:
6353 case IEEE80211_SMPS_OFF:
6354 smps = WMI_PEER_SMPS_PS_NONE;
6355 break;
6356 case IEEE80211_SMPS_STATIC:
6357 smps = WMI_PEER_SMPS_STATIC;
6358 break;
6359 case IEEE80211_SMPS_DYNAMIC:
6360 smps = WMI_PEER_SMPS_DYNAMIC;
6361 break;
6362 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02006363 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02006364 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01006365 smps = WMI_PEER_SMPS_PS_NONE;
6366 break;
6367 }
6368
6369 arsta->smps = smps;
6370 }
6371
Michal Kazior9797feb2014-02-14 14:49:48 +01006372 arsta->changed |= changed;
6373
6374 spin_unlock_bh(&ar->data_lock);
6375
6376 ieee80211_queue_work(hw, &arsta->update_wk);
6377}
6378
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006379static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
6380{
6381 /*
6382 * FIXME: Return 0 for time being. Need to figure out whether FW
6383 * has the API to fetch 64-bit local TSF
6384 */
6385
6386 return 0;
6387}
6388
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006389static int ath10k_ampdu_action(struct ieee80211_hw *hw,
6390 struct ieee80211_vif *vif,
6391 enum ieee80211_ampdu_mlme_action action,
6392 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
Emmanuel Grumbache3abc8f2015-08-16 11:13:22 +03006393 u8 buf_size, bool amsdu)
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006394{
Michal Kazior7aa7a722014-08-25 12:09:38 +02006395 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006396 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6397
Michal Kazior7aa7a722014-08-25 12:09:38 +02006398 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 +02006399 arvif->vdev_id, sta->addr, tid, action);
6400
6401 switch (action) {
6402 case IEEE80211_AMPDU_RX_START:
6403 case IEEE80211_AMPDU_RX_STOP:
6404 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
6405 * creation/removal. Do we need to verify this?
6406 */
6407 return 0;
6408 case IEEE80211_AMPDU_TX_START:
6409 case IEEE80211_AMPDU_TX_STOP_CONT:
6410 case IEEE80211_AMPDU_TX_STOP_FLUSH:
6411 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6412 case IEEE80211_AMPDU_TX_OPERATIONAL:
6413 /* Firmware offloads Tx aggregation entirely so deny mac80211
6414 * Tx aggregation requests.
6415 */
6416 return -EOPNOTSUPP;
6417 }
6418
6419 return -EINVAL;
6420}
6421
Michal Kazior500ff9f2015-03-31 10:26:21 +00006422static void
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006423ath10k_mac_update_rx_channel(struct ath10k *ar,
6424 struct ieee80211_chanctx_conf *ctx,
6425 struct ieee80211_vif_chanctx_switch *vifs,
6426 int n_vifs)
Michal Kazior500ff9f2015-03-31 10:26:21 +00006427{
6428 struct cfg80211_chan_def *def = NULL;
6429
6430 /* Both locks are required because ar->rx_channel is modified. This
6431 * allows readers to hold either lock.
6432 */
6433 lockdep_assert_held(&ar->conf_mutex);
6434 lockdep_assert_held(&ar->data_lock);
6435
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006436 WARN_ON(ctx && vifs);
6437 WARN_ON(vifs && n_vifs != 1);
6438
Michal Kazior500ff9f2015-03-31 10:26:21 +00006439 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
6440 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
6441 * ppdu on Rx may reduce performance on low-end systems. It should be
6442 * possible to make tables/hashmaps to speed the lookup up (be vary of
6443 * cpu data cache lines though regarding sizes) but to keep the initial
6444 * implementation simple and less intrusive fallback to the slow lookup
6445 * only for multi-channel cases. Single-channel cases will remain to
6446 * use the old channel derival and thus performance should not be
6447 * affected much.
6448 */
6449 rcu_read_lock();
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006450 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00006451 ieee80211_iter_chan_contexts_atomic(ar->hw,
Kalle Valo617b0f42015-10-05 17:56:35 +03006452 ath10k_mac_get_any_chandef_iter,
6453 &def);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006454
6455 if (vifs)
6456 def = &vifs[0].new_ctx->def;
6457
Michal Kazior500ff9f2015-03-31 10:26:21 +00006458 ar->rx_channel = def->chan;
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006459 } else if (ctx && ath10k_mac_num_chanctxs(ar) == 0) {
6460 ar->rx_channel = ctx->def.chan;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006461 } else {
6462 ar->rx_channel = NULL;
6463 }
6464 rcu_read_unlock();
6465}
6466
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006467static void
6468ath10k_mac_update_vif_chan(struct ath10k *ar,
6469 struct ieee80211_vif_chanctx_switch *vifs,
6470 int n_vifs)
6471{
6472 struct ath10k_vif *arvif;
6473 int ret;
6474 int i;
6475
6476 lockdep_assert_held(&ar->conf_mutex);
6477
6478 /* First stop monitor interface. Some FW versions crash if there's a
6479 * lone monitor interface.
6480 */
6481 if (ar->monitor_started)
6482 ath10k_monitor_stop(ar);
6483
6484 for (i = 0; i < n_vifs; i++) {
6485 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6486
6487 ath10k_dbg(ar, ATH10K_DBG_MAC,
6488 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
6489 arvif->vdev_id,
6490 vifs[i].old_ctx->def.chan->center_freq,
6491 vifs[i].new_ctx->def.chan->center_freq,
6492 vifs[i].old_ctx->def.width,
6493 vifs[i].new_ctx->def.width);
6494
6495 if (WARN_ON(!arvif->is_started))
6496 continue;
6497
6498 if (WARN_ON(!arvif->is_up))
6499 continue;
6500
6501 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6502 if (ret) {
6503 ath10k_warn(ar, "failed to down vdev %d: %d\n",
6504 arvif->vdev_id, ret);
6505 continue;
6506 }
6507 }
6508
6509 /* All relevant vdevs are downed and associated channel resources
6510 * should be available for the channel switch now.
6511 */
6512
6513 spin_lock_bh(&ar->data_lock);
6514 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
6515 spin_unlock_bh(&ar->data_lock);
6516
6517 for (i = 0; i < n_vifs; i++) {
6518 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6519
6520 if (WARN_ON(!arvif->is_started))
6521 continue;
6522
6523 if (WARN_ON(!arvif->is_up))
6524 continue;
6525
6526 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6527 if (ret)
6528 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
6529 ret);
6530
6531 ret = ath10k_mac_setup_prb_tmpl(arvif);
6532 if (ret)
6533 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
6534 ret);
6535
6536 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
6537 if (ret) {
6538 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
6539 arvif->vdev_id, ret);
6540 continue;
6541 }
6542
6543 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6544 arvif->bssid);
6545 if (ret) {
6546 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
6547 arvif->vdev_id, ret);
6548 continue;
6549 }
6550 }
6551
6552 ath10k_monitor_recalc(ar);
6553}
6554
Michal Kazior500ff9f2015-03-31 10:26:21 +00006555static int
6556ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6557 struct ieee80211_chanctx_conf *ctx)
6558{
6559 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006560
6561 ath10k_dbg(ar, ATH10K_DBG_MAC,
6562 "mac chanctx add freq %hu width %d ptr %p\n",
6563 ctx->def.chan->center_freq, ctx->def.width, ctx);
6564
6565 mutex_lock(&ar->conf_mutex);
6566
6567 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006568 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006569 spin_unlock_bh(&ar->data_lock);
6570
6571 ath10k_recalc_radar_detection(ar);
6572 ath10k_monitor_recalc(ar);
6573
6574 mutex_unlock(&ar->conf_mutex);
6575
6576 return 0;
6577}
6578
6579static void
6580ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6581 struct ieee80211_chanctx_conf *ctx)
6582{
6583 struct ath10k *ar = hw->priv;
6584
6585 ath10k_dbg(ar, ATH10K_DBG_MAC,
6586 "mac chanctx remove freq %hu width %d ptr %p\n",
6587 ctx->def.chan->center_freq, ctx->def.width, ctx);
6588
6589 mutex_lock(&ar->conf_mutex);
6590
6591 spin_lock_bh(&ar->data_lock);
Michal Kaziord7bf4b42015-06-03 12:16:54 +02006592 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006593 spin_unlock_bh(&ar->data_lock);
6594
6595 ath10k_recalc_radar_detection(ar);
6596 ath10k_monitor_recalc(ar);
6597
6598 mutex_unlock(&ar->conf_mutex);
6599}
6600
Michal Kazior9713e3d2015-09-03 10:44:52 +02006601struct ath10k_mac_change_chanctx_arg {
6602 struct ieee80211_chanctx_conf *ctx;
6603 struct ieee80211_vif_chanctx_switch *vifs;
6604 int n_vifs;
6605 int next_vif;
6606};
6607
6608static void
6609ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6610 struct ieee80211_vif *vif)
6611{
6612 struct ath10k_mac_change_chanctx_arg *arg = data;
6613
6614 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
6615 return;
6616
6617 arg->n_vifs++;
6618}
6619
6620static void
6621ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6622 struct ieee80211_vif *vif)
6623{
6624 struct ath10k_mac_change_chanctx_arg *arg = data;
6625 struct ieee80211_chanctx_conf *ctx;
6626
6627 ctx = rcu_access_pointer(vif->chanctx_conf);
6628 if (ctx != arg->ctx)
6629 return;
6630
6631 if (WARN_ON(arg->next_vif == arg->n_vifs))
6632 return;
6633
6634 arg->vifs[arg->next_vif].vif = vif;
6635 arg->vifs[arg->next_vif].old_ctx = ctx;
6636 arg->vifs[arg->next_vif].new_ctx = ctx;
6637 arg->next_vif++;
6638}
6639
Michal Kazior500ff9f2015-03-31 10:26:21 +00006640static void
6641ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6642 struct ieee80211_chanctx_conf *ctx,
6643 u32 changed)
6644{
6645 struct ath10k *ar = hw->priv;
Michal Kazior9713e3d2015-09-03 10:44:52 +02006646 struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
Michal Kazior500ff9f2015-03-31 10:26:21 +00006647
6648 mutex_lock(&ar->conf_mutex);
6649
6650 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006651 "mac chanctx change freq %hu width %d ptr %p changed %x\n",
6652 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006653
6654 /* This shouldn't really happen because channel switching should use
6655 * switch_vif_chanctx().
6656 */
6657 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6658 goto unlock;
6659
Michal Kazior9713e3d2015-09-03 10:44:52 +02006660 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
6661 ieee80211_iterate_active_interfaces_atomic(
6662 hw,
6663 IEEE80211_IFACE_ITER_NORMAL,
6664 ath10k_mac_change_chanctx_cnt_iter,
6665 &arg);
6666 if (arg.n_vifs == 0)
6667 goto radar;
6668
6669 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
6670 GFP_KERNEL);
6671 if (!arg.vifs)
6672 goto radar;
6673
6674 ieee80211_iterate_active_interfaces_atomic(
6675 hw,
6676 IEEE80211_IFACE_ITER_NORMAL,
6677 ath10k_mac_change_chanctx_fill_iter,
6678 &arg);
6679 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6680 kfree(arg.vifs);
6681 }
6682
6683radar:
Michal Kazior500ff9f2015-03-31 10:26:21 +00006684 ath10k_recalc_radar_detection(ar);
6685
6686 /* FIXME: How to configure Rx chains properly? */
6687
6688 /* No other actions are actually necessary. Firmware maintains channel
6689 * definitions per vdev internally and there's no host-side channel
6690 * context abstraction to configure, e.g. channel width.
6691 */
6692
6693unlock:
6694 mutex_unlock(&ar->conf_mutex);
6695}
6696
6697static int
6698ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6699 struct ieee80211_vif *vif,
6700 struct ieee80211_chanctx_conf *ctx)
6701{
6702 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006703 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6704 int ret;
6705
6706 mutex_lock(&ar->conf_mutex);
6707
6708 ath10k_dbg(ar, ATH10K_DBG_MAC,
6709 "mac chanctx assign ptr %p vdev_id %i\n",
6710 ctx, arvif->vdev_id);
6711
6712 if (WARN_ON(arvif->is_started)) {
6713 mutex_unlock(&ar->conf_mutex);
6714 return -EBUSY;
6715 }
6716
Michal Kazior089ab7a2015-06-03 12:16:55 +02006717 ret = ath10k_vdev_start(arvif, &ctx->def);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006718 if (ret) {
6719 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6720 arvif->vdev_id, vif->addr,
Michal Kazior089ab7a2015-06-03 12:16:55 +02006721 ctx->def.chan->center_freq, ret);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006722 goto err;
6723 }
6724
6725 arvif->is_started = true;
6726
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006727 ret = ath10k_mac_vif_setup_ps(arvif);
6728 if (ret) {
6729 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
6730 arvif->vdev_id, ret);
6731 goto err_stop;
6732 }
6733
Michal Kazior500ff9f2015-03-31 10:26:21 +00006734 if (vif->type == NL80211_IFTYPE_MONITOR) {
6735 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6736 if (ret) {
6737 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6738 arvif->vdev_id, ret);
6739 goto err_stop;
6740 }
6741
6742 arvif->is_up = true;
6743 }
6744
6745 mutex_unlock(&ar->conf_mutex);
6746 return 0;
6747
6748err_stop:
6749 ath10k_vdev_stop(arvif);
6750 arvif->is_started = false;
Michal Kaziorf23e587e2015-07-09 13:08:37 +02006751 ath10k_mac_vif_setup_ps(arvif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006752
6753err:
6754 mutex_unlock(&ar->conf_mutex);
6755 return ret;
6756}
6757
6758static void
6759ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6760 struct ieee80211_vif *vif,
6761 struct ieee80211_chanctx_conf *ctx)
6762{
6763 struct ath10k *ar = hw->priv;
6764 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6765 int ret;
6766
6767 mutex_lock(&ar->conf_mutex);
6768
6769 ath10k_dbg(ar, ATH10K_DBG_MAC,
6770 "mac chanctx unassign ptr %p vdev_id %i\n",
6771 ctx, arvif->vdev_id);
6772
6773 WARN_ON(!arvif->is_started);
6774
6775 if (vif->type == NL80211_IFTYPE_MONITOR) {
6776 WARN_ON(!arvif->is_up);
6777
6778 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6779 if (ret)
6780 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6781 arvif->vdev_id, ret);
6782
6783 arvif->is_up = false;
6784 }
6785
6786 ret = ath10k_vdev_stop(arvif);
6787 if (ret)
6788 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6789 arvif->vdev_id, ret);
6790
6791 arvif->is_started = false;
6792
6793 mutex_unlock(&ar->conf_mutex);
6794}
6795
6796static int
6797ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6798 struct ieee80211_vif_chanctx_switch *vifs,
6799 int n_vifs,
6800 enum ieee80211_chanctx_switch_mode mode)
6801{
6802 struct ath10k *ar = hw->priv;
Michal Kazior500ff9f2015-03-31 10:26:21 +00006803
6804 mutex_lock(&ar->conf_mutex);
6805
6806 ath10k_dbg(ar, ATH10K_DBG_MAC,
6807 "mac chanctx switch n_vifs %d mode %d\n",
6808 n_vifs, mode);
Michal Kazior7be6d1b2015-09-03 10:44:51 +02006809 ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006810
6811 mutex_unlock(&ar->conf_mutex);
6812 return 0;
6813}
6814
Kalle Valo5e3dd152013-06-12 20:52:10 +03006815static const struct ieee80211_ops ath10k_ops = {
6816 .tx = ath10k_tx,
6817 .start = ath10k_start,
6818 .stop = ath10k_stop,
6819 .config = ath10k_config,
6820 .add_interface = ath10k_add_interface,
6821 .remove_interface = ath10k_remove_interface,
6822 .configure_filter = ath10k_configure_filter,
6823 .bss_info_changed = ath10k_bss_info_changed,
6824 .hw_scan = ath10k_hw_scan,
6825 .cancel_hw_scan = ath10k_cancel_hw_scan,
6826 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006827 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006828 .sta_state = ath10k_sta_state,
6829 .conf_tx = ath10k_conf_tx,
6830 .remain_on_channel = ath10k_remain_on_channel,
6831 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6832 .set_rts_threshold = ath10k_set_rts_threshold,
Michal Kazior92092fe2015-08-03 11:16:43 +02006833 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006834 .flush = ath10k_flush,
6835 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006836 .set_antenna = ath10k_set_antenna,
6837 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006838 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006839 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006840 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006841 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006842 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006843 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006844 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6845 .get_et_stats = ath10k_debug_get_et_stats,
6846 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006847 .add_chanctx = ath10k_mac_op_add_chanctx,
6848 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6849 .change_chanctx = ath10k_mac_op_change_chanctx,
6850 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6851 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6852 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006853
6854 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6855
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006856#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006857 .suspend = ath10k_wow_op_suspend,
6858 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006859#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006860#ifdef CONFIG_MAC80211_DEBUGFS
6861 .sta_add_debugfs = ath10k_sta_add_debugfs,
6862#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006863};
6864
Kalle Valo5e3dd152013-06-12 20:52:10 +03006865#define CHAN2G(_channel, _freq, _flags) { \
6866 .band = IEEE80211_BAND_2GHZ, \
6867 .hw_value = (_channel), \
6868 .center_freq = (_freq), \
6869 .flags = (_flags), \
6870 .max_antenna_gain = 0, \
6871 .max_power = 30, \
6872}
6873
6874#define CHAN5G(_channel, _freq, _flags) { \
6875 .band = IEEE80211_BAND_5GHZ, \
6876 .hw_value = (_channel), \
6877 .center_freq = (_freq), \
6878 .flags = (_flags), \
6879 .max_antenna_gain = 0, \
6880 .max_power = 30, \
6881}
6882
6883static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6884 CHAN2G(1, 2412, 0),
6885 CHAN2G(2, 2417, 0),
6886 CHAN2G(3, 2422, 0),
6887 CHAN2G(4, 2427, 0),
6888 CHAN2G(5, 2432, 0),
6889 CHAN2G(6, 2437, 0),
6890 CHAN2G(7, 2442, 0),
6891 CHAN2G(8, 2447, 0),
6892 CHAN2G(9, 2452, 0),
6893 CHAN2G(10, 2457, 0),
6894 CHAN2G(11, 2462, 0),
6895 CHAN2G(12, 2467, 0),
6896 CHAN2G(13, 2472, 0),
6897 CHAN2G(14, 2484, 0),
6898};
6899
6900static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006901 CHAN5G(36, 5180, 0),
6902 CHAN5G(40, 5200, 0),
6903 CHAN5G(44, 5220, 0),
6904 CHAN5G(48, 5240, 0),
6905 CHAN5G(52, 5260, 0),
6906 CHAN5G(56, 5280, 0),
6907 CHAN5G(60, 5300, 0),
6908 CHAN5G(64, 5320, 0),
6909 CHAN5G(100, 5500, 0),
6910 CHAN5G(104, 5520, 0),
6911 CHAN5G(108, 5540, 0),
6912 CHAN5G(112, 5560, 0),
6913 CHAN5G(116, 5580, 0),
6914 CHAN5G(120, 5600, 0),
6915 CHAN5G(124, 5620, 0),
6916 CHAN5G(128, 5640, 0),
6917 CHAN5G(132, 5660, 0),
6918 CHAN5G(136, 5680, 0),
6919 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006920 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006921 CHAN5G(149, 5745, 0),
6922 CHAN5G(153, 5765, 0),
6923 CHAN5G(157, 5785, 0),
6924 CHAN5G(161, 5805, 0),
6925 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006926};
6927
Michal Kaziore7b54192014-08-07 11:03:27 +02006928struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006929{
6930 struct ieee80211_hw *hw;
6931 struct ath10k *ar;
6932
Michal Kaziore7b54192014-08-07 11:03:27 +02006933 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006934 if (!hw)
6935 return NULL;
6936
6937 ar = hw->priv;
6938 ar->hw = hw;
6939
6940 return ar;
6941}
6942
6943void ath10k_mac_destroy(struct ath10k *ar)
6944{
6945 ieee80211_free_hw(ar->hw);
6946}
6947
6948static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6949 {
6950 .max = 8,
6951 .types = BIT(NL80211_IFTYPE_STATION)
6952 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006953 },
6954 {
6955 .max = 3,
6956 .types = BIT(NL80211_IFTYPE_P2P_GO)
6957 },
6958 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006959 .max = 1,
6960 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6961 },
6962 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006963 .max = 7,
6964 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006965#ifdef CONFIG_MAC80211_MESH
6966 | BIT(NL80211_IFTYPE_MESH_POINT)
6967#endif
Michal Kaziord531cb82013-07-31 10:55:13 +02006968 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006969};
6970
Bartosz Markowskif2595092013-12-10 16:20:39 +01006971static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006972 {
6973 .max = 8,
6974 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04006975#ifdef CONFIG_MAC80211_MESH
6976 | BIT(NL80211_IFTYPE_MESH_POINT)
6977#endif
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006978 },
6979};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006980
6981static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6982 {
6983 .limits = ath10k_if_limits,
6984 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6985 .max_interfaces = 8,
6986 .num_different_channels = 1,
6987 .beacon_int_infra_match = true,
6988 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006989};
6990
6991static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006992 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006993 .limits = ath10k_10x_if_limits,
6994 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006995 .max_interfaces = 8,
6996 .num_different_channels = 1,
6997 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006998#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006999 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7000 BIT(NL80211_CHAN_WIDTH_20) |
7001 BIT(NL80211_CHAN_WIDTH_40) |
7002 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02007003#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01007004 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03007005};
7006
Michal Kaziorcf327842015-03-31 10:26:25 +00007007static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
7008 {
7009 .max = 2,
Michal Kaziored25b112015-07-09 13:08:39 +02007010 .types = BIT(NL80211_IFTYPE_STATION),
7011 },
7012 {
7013 .max = 2,
7014 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007015#ifdef CONFIG_MAC80211_MESH
7016 BIT(NL80211_IFTYPE_MESH_POINT) |
7017#endif
Michal Kaziorcf327842015-03-31 10:26:25 +00007018 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7019 BIT(NL80211_IFTYPE_P2P_GO),
7020 },
7021 {
7022 .max = 1,
7023 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7024 },
7025};
7026
Michal Kaziored25b112015-07-09 13:08:39 +02007027static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
7028 {
7029 .max = 2,
7030 .types = BIT(NL80211_IFTYPE_STATION),
7031 },
7032 {
7033 .max = 2,
7034 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
7035 },
7036 {
7037 .max = 1,
7038 .types = BIT(NL80211_IFTYPE_AP) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007039#ifdef CONFIG_MAC80211_MESH
7040 BIT(NL80211_IFTYPE_MESH_POINT) |
7041#endif
Michal Kaziored25b112015-07-09 13:08:39 +02007042 BIT(NL80211_IFTYPE_P2P_GO),
7043 },
7044 {
7045 .max = 1,
7046 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
7047 },
7048};
7049
Michal Kaziorcf327842015-03-31 10:26:25 +00007050static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
7051 {
7052 .max = 1,
7053 .types = BIT(NL80211_IFTYPE_STATION),
7054 },
7055 {
7056 .max = 1,
7057 .types = BIT(NL80211_IFTYPE_ADHOC),
7058 },
7059};
7060
7061/* FIXME: This is not thouroughly tested. These combinations may over- or
7062 * underestimate hw/fw capabilities.
7063 */
7064static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
7065 {
7066 .limits = ath10k_tlv_if_limit,
7067 .num_different_channels = 1,
Michal Kaziored25b112015-07-09 13:08:39 +02007068 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00007069 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7070 },
7071 {
7072 .limits = ath10k_tlv_if_limit_ibss,
7073 .num_different_channels = 1,
7074 .max_interfaces = 2,
7075 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7076 },
7077};
7078
7079static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
7080 {
7081 .limits = ath10k_tlv_if_limit,
Michal Kaziored25b112015-07-09 13:08:39 +02007082 .num_different_channels = 1,
7083 .max_interfaces = 4,
Michal Kaziorcf327842015-03-31 10:26:25 +00007084 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
7085 },
7086 {
Michal Kaziored25b112015-07-09 13:08:39 +02007087 .limits = ath10k_tlv_qcs_if_limit,
7088 .num_different_channels = 2,
7089 .max_interfaces = 4,
7090 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
7091 },
7092 {
Michal Kaziorcf327842015-03-31 10:26:25 +00007093 .limits = ath10k_tlv_if_limit_ibss,
7094 .num_different_channels = 1,
7095 .max_interfaces = 2,
7096 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
7097 },
7098};
7099
Raja Manicf36fef2015-06-22 20:22:25 +05307100static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
7101 {
7102 .max = 1,
7103 .types = BIT(NL80211_IFTYPE_STATION),
7104 },
7105 {
7106 .max = 16,
7107 .types = BIT(NL80211_IFTYPE_AP)
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007108#ifdef CONFIG_MAC80211_MESH
7109 | BIT(NL80211_IFTYPE_MESH_POINT)
7110#endif
Raja Manicf36fef2015-06-22 20:22:25 +05307111 },
7112};
7113
7114static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
7115 {
7116 .limits = ath10k_10_4_if_limits,
7117 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
7118 .max_interfaces = 16,
7119 .num_different_channels = 1,
7120 .beacon_int_infra_match = true,
7121#ifdef CONFIG_ATH10K_DFS_CERTIFIED
7122 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7123 BIT(NL80211_CHAN_WIDTH_20) |
7124 BIT(NL80211_CHAN_WIDTH_40) |
7125 BIT(NL80211_CHAN_WIDTH_80),
7126#endif
7127 },
7128};
7129
Kalle Valo5e3dd152013-06-12 20:52:10 +03007130static void ath10k_get_arvif_iter(void *data, u8 *mac,
7131 struct ieee80211_vif *vif)
7132{
7133 struct ath10k_vif_iter *arvif_iter = data;
7134 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
7135
7136 if (arvif->vdev_id == arvif_iter->vdev_id)
7137 arvif_iter->arvif = arvif;
7138}
7139
7140struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
7141{
7142 struct ath10k_vif_iter arvif_iter;
7143 u32 flags;
7144
7145 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
7146 arvif_iter.vdev_id = vdev_id;
7147
7148 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
7149 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7150 flags,
7151 ath10k_get_arvif_iter,
7152 &arvif_iter);
7153 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007154 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007155 return NULL;
7156 }
7157
7158 return arvif_iter.arvif;
7159}
7160
7161int ath10k_mac_register(struct ath10k *ar)
7162{
Johannes Berg3cb10942015-01-22 21:38:45 +01007163 static const u32 cipher_suites[] = {
7164 WLAN_CIPHER_SUITE_WEP40,
7165 WLAN_CIPHER_SUITE_WEP104,
7166 WLAN_CIPHER_SUITE_TKIP,
7167 WLAN_CIPHER_SUITE_CCMP,
7168 WLAN_CIPHER_SUITE_AES_CMAC,
7169 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03007170 struct ieee80211_supported_band *band;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007171 void *channels;
7172 int ret;
7173
7174 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
7175
7176 SET_IEEE80211_DEV(ar->hw, ar->dev);
7177
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00007178 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
7179 ARRAY_SIZE(ath10k_5ghz_channels)) !=
7180 ATH10K_NUM_CHANS);
7181
Kalle Valo5e3dd152013-06-12 20:52:10 +03007182 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
7183 channels = kmemdup(ath10k_2ghz_channels,
7184 sizeof(ath10k_2ghz_channels),
7185 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02007186 if (!channels) {
7187 ret = -ENOMEM;
7188 goto err_free;
7189 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007190
7191 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
7192 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
7193 band->channels = channels;
7194 band->n_bitrates = ath10k_g_rates_size;
7195 band->bitrates = ath10k_g_rates;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007196
7197 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
7198 }
7199
7200 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
7201 channels = kmemdup(ath10k_5ghz_channels,
7202 sizeof(ath10k_5ghz_channels),
7203 GFP_KERNEL);
7204 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02007205 ret = -ENOMEM;
7206 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007207 }
7208
7209 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
7210 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
7211 band->channels = channels;
7212 band->n_bitrates = ath10k_a_rates_size;
7213 band->bitrates = ath10k_a_rates;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007214 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
7215 }
7216
Rajkumar Manoharan5036fe02015-10-27 17:51:14 +05307217 ath10k_mac_setup_ht_vht_cap(ar);
7218
Kalle Valo5e3dd152013-06-12 20:52:10 +03007219 ar->hw->wiphy->interface_modes =
7220 BIT(NL80211_IFTYPE_STATION) |
Bob Copelandb6c7baf2015-09-09 12:47:36 -04007221 BIT(NL80211_IFTYPE_AP) |
7222 BIT(NL80211_IFTYPE_MESH_POINT);
Bartosz Markowskid3541812013-12-10 16:20:40 +01007223
Rajkumar Manoharan166de3f2015-10-27 17:51:11 +05307224 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
7225 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
Ben Greear46acf7b2014-05-16 17:15:38 +03007226
Bartosz Markowskid3541812013-12-10 16:20:40 +01007227 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
7228 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01007229 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01007230 BIT(NL80211_IFTYPE_P2P_CLIENT) |
7231 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007232
Johannes Berg30686bf2015-06-02 21:39:54 +02007233 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
7234 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
7235 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
7236 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
7237 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
7238 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
7239 ieee80211_hw_set(ar->hw, AP_LINK_PS);
7240 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
Johannes Berg30686bf2015-06-02 21:39:54 +02007241 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
7242 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
7243 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
7244 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
7245 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
7246 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007247
David Liuccec9032015-07-24 20:25:32 +03007248 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7249 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
7250
Eliad Peller0d8614b2014-09-10 14:07:36 +03007251 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
Janusz Dziedzic0cd9bc12015-04-10 13:23:23 +00007252 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Eliad Peller0d8614b2014-09-10 14:07:36 +03007253
Kalle Valo5e3dd152013-06-12 20:52:10 +03007254 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03007255 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007256
7257 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
Johannes Berg30686bf2015-06-02 21:39:54 +02007258 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
7259 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007260 }
7261
7262 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
7263 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
7264
7265 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01007266 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007267
Kalle Valo5e3dd152013-06-12 20:52:10 +03007268 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
7269
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02007270 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
7271 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
7272
7273 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
7274 * that userspace (e.g. wpa_supplicant/hostapd) can generate
7275 * correct Probe Responses. This is more of a hack advert..
7276 */
7277 ar->hw->wiphy->probe_resp_offload |=
7278 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
7279 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
7280 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
7281 }
7282
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03007283 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
7284 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7285
Kalle Valo5e3dd152013-06-12 20:52:10 +03007286 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01007287 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007288 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
7289
7290 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02007291 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
7292
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01007293 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
7294
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02007295 ret = ath10k_wow_init(ar);
7296 if (ret) {
7297 ath10k_warn(ar, "failed to init wow: %d\n", ret);
7298 goto err_free;
7299 }
7300
Janusz Dziedzicc7025342015-06-15 14:46:41 +03007301 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
7302
Kalle Valo5e3dd152013-06-12 20:52:10 +03007303 /*
7304 * on LL hardware queues are managed entirely by the FW
7305 * so we only advertise to mac we can do the queues thing
7306 */
Michal Kazior96d828d2015-03-31 10:26:23 +00007307 ar->hw->queues = IEEE80211_MAX_QUEUES;
7308
7309 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
7310 * something that vdev_ids can't reach so that we don't stop the queue
7311 * accidentally.
7312 */
7313 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007314
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007315 switch (ar->wmi.op_version) {
7316 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01007317 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
7318 ar->hw->wiphy->n_iface_combinations =
7319 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03007320 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007321 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00007322 case ATH10K_FW_WMI_OP_VERSION_TLV:
7323 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
7324 ar->hw->wiphy->iface_combinations =
7325 ath10k_tlv_qcs_if_comb;
7326 ar->hw->wiphy->n_iface_combinations =
7327 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
7328 } else {
7329 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
7330 ar->hw->wiphy->n_iface_combinations =
7331 ARRAY_SIZE(ath10k_tlv_if_comb);
7332 }
7333 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
7334 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007335 case ATH10K_FW_WMI_OP_VERSION_10_1:
7336 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02007337 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007338 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
7339 ar->hw->wiphy->n_iface_combinations =
7340 ARRAY_SIZE(ath10k_10x_if_comb);
7341 break;
Raja Mani9bd21322015-06-22 20:10:09 +05307342 case ATH10K_FW_WMI_OP_VERSION_10_4:
Raja Manicf36fef2015-06-22 20:22:25 +05307343 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
7344 ar->hw->wiphy->n_iface_combinations =
7345 ARRAY_SIZE(ath10k_10_4_if_comb);
Raja Mani9bd21322015-06-22 20:10:09 +05307346 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02007347 case ATH10K_FW_WMI_OP_VERSION_UNSET:
7348 case ATH10K_FW_WMI_OP_VERSION_MAX:
7349 WARN_ON(1);
7350 ret = -EINVAL;
7351 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01007352 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03007353
David Liuccec9032015-07-24 20:25:32 +03007354 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
7355 ar->hw->netdev_features = NETIF_F_HW_CSUM;
Michal Kazior7c199992013-07-31 10:47:57 +02007356
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007357 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
7358 /* Init ath dfs pattern detector */
7359 ar->ath_common.debug_mask = ATH_DBG_DFS;
7360 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
7361 NL80211_DFS_UNSET);
7362
7363 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02007364 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007365 }
7366
Kalle Valo5e3dd152013-06-12 20:52:10 +03007367 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
7368 ath10k_reg_notifier);
7369 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007370 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007371 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007372 }
7373
Johannes Berg3cb10942015-01-22 21:38:45 +01007374 ar->hw->wiphy->cipher_suites = cipher_suites;
7375 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
7376
Kalle Valo5e3dd152013-06-12 20:52:10 +03007377 ret = ieee80211_register_hw(ar->hw);
7378 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02007379 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Jeff Johnson0e339442015-10-08 09:15:53 -07007380 goto err_dfs_detector_exit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007381 }
7382
7383 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
7384 ret = regulatory_hint(ar->hw->wiphy,
7385 ar->ath_common.regulatory.alpha2);
7386 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02007387 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03007388 }
7389
7390 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02007391
7392err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03007393 ieee80211_unregister_hw(ar->hw);
Jeff Johnson0e339442015-10-08 09:15:53 -07007394
7395err_dfs_detector_exit:
7396 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7397 ar->dfs_detector->exit(ar->dfs_detector);
7398
Michal Kaziord6015b22013-07-22 14:13:30 +02007399err_free:
7400 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7401 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7402
Jeff Johnson0e339442015-10-08 09:15:53 -07007403 SET_IEEE80211_DEV(ar->hw, NULL);
Kalle Valo5e3dd152013-06-12 20:52:10 +03007404 return ret;
7405}
7406
7407void ath10k_mac_unregister(struct ath10k *ar)
7408{
7409 ieee80211_unregister_hw(ar->hw);
7410
Janusz Dziedzic9702c682013-11-20 09:59:41 +02007411 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
7412 ar->dfs_detector->exit(ar->dfs_detector);
7413
Kalle Valo5e3dd152013-06-12 20:52:10 +03007414 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
7415 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
7416
7417 SET_IEEE80211_DEV(ar->hw, NULL);
7418}