blob: 6e04cbf4914b8c5a50eb886a293345a5192fe595 [file] [log] [blame]
Kalle Valo5e3dd152013-06-12 20:52:10 +03001/*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include "mac.h"
19
20#include <net/mac80211.h>
21#include <linux/etherdevice.h>
22
Michal Kazior8cd13ca2013-07-16 09:38:54 +020023#include "hif.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030024#include "core.h"
25#include "debug.h"
26#include "wmi.h"
27#include "htt.h"
28#include "txrx.h"
Kalle Valo43d2a302014-09-10 18:23:30 +030029#include "testmode.h"
Michal Kaziord7579d12014-12-03 10:10:54 +020030#include "wmi.h"
Michal Kaziorb4aa5392015-03-31 10:26:24 +000031#include "wmi-tlv.h"
Michal Kaziord7579d12014-12-03 10:10:54 +020032#include "wmi-ops.h"
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +020033#include "wow.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030034
Michal Kaziordcc33092015-03-30 09:51:54 +030035/*********/
36/* Rates */
37/*********/
38
Michal Kaziordcc33092015-03-30 09:51:54 +030039static struct ieee80211_rate ath10k_rates[] = {
Michal Kazior5528e032015-03-30 09:51:56 +030040 { .bitrate = 10,
41 .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
42 { .bitrate = 20,
43 .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
44 .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
45 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
46 { .bitrate = 55,
47 .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
48 .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
49 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
50 { .bitrate = 110,
51 .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
52 .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
53 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
Michal Kazior5653b392015-03-30 09:51:54 +030054
Michal Kazioraf001482015-03-30 09:51:56 +030055 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
56 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
57 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
58 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
59 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
60 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
61 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
62 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
Michal Kaziordcc33092015-03-30 09:51:54 +030063};
64
Michal Kazior8d7aa6b2015-03-30 09:51:57 +030065#define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
66
67#define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
68#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
69 ATH10K_MAC_FIRST_OFDM_RATE_IDX)
Michal Kaziordcc33092015-03-30 09:51:54 +030070#define ath10k_g_rates (ath10k_rates + 0)
71#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
72
Michal Kazior486017c2015-03-30 09:51:54 +030073static bool ath10k_mac_bitrate_is_cck(int bitrate)
74{
75 switch (bitrate) {
76 case 10:
77 case 20:
78 case 55:
79 case 110:
80 return true;
81 }
82
83 return false;
84}
85
86static u8 ath10k_mac_bitrate_to_rate(int bitrate)
87{
88 return DIV_ROUND_UP(bitrate, 5) |
89 (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
90}
91
Michal Kazior5528e032015-03-30 09:51:56 +030092u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
93 u8 hw_rate)
94{
95 const struct ieee80211_rate *rate;
96 int i;
97
98 for (i = 0; i < sband->n_bitrates; i++) {
99 rate = &sband->bitrates[i];
100
101 if (rate->hw_value == hw_rate)
102 return i;
103 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
104 rate->hw_value_short == hw_rate)
105 return i;
106 }
107
108 return 0;
109}
110
Michal Kazior01cebe12015-03-30 09:51:56 +0300111u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
112 u32 bitrate)
113{
114 int i;
115
116 for (i = 0; i < sband->n_bitrates; i++)
117 if (sband->bitrates[i].bitrate == bitrate)
118 return i;
119
120 return 0;
121}
122
Michal Kazior3ae54222015-03-31 10:49:20 +0000123static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
124{
125 switch ((mcs_map >> (2 * nss)) & 0x3) {
126 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
127 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
128 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
129 }
130 return 0;
131}
132
Kalle Valo5e3dd152013-06-12 20:52:10 +0300133/**********/
134/* Crypto */
135/**********/
136
137static int ath10k_send_key(struct ath10k_vif *arvif,
138 struct ieee80211_key_conf *key,
139 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100140 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300141{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200142 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300143 struct wmi_vdev_install_key_arg arg = {
144 .vdev_id = arvif->vdev_id,
145 .key_idx = key->keyidx,
146 .key_len = key->keylen,
147 .key_data = key->key,
Michal Kazior370e5672015-02-18 14:02:26 +0100148 .key_flags = flags,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300149 .macaddr = macaddr,
150 };
151
Michal Kazior548db542013-07-05 16:15:15 +0300152 lockdep_assert_held(&arvif->ar->conf_mutex);
153
Kalle Valo5e3dd152013-06-12 20:52:10 +0300154 switch (key->cipher) {
155 case WLAN_CIPHER_SUITE_CCMP:
156 arg.key_cipher = WMI_CIPHER_AES_CCM;
Marek Kwaczynskie4e82e92015-01-24 12:14:53 +0200157 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300158 break;
159 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300160 arg.key_cipher = WMI_CIPHER_TKIP;
161 arg.key_txmic_len = 8;
162 arg.key_rxmic_len = 8;
163 break;
164 case WLAN_CIPHER_SUITE_WEP40:
165 case WLAN_CIPHER_SUITE_WEP104:
166 arg.key_cipher = WMI_CIPHER_WEP;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300167 break;
Johannes Berg3cb10942015-01-22 21:38:45 +0100168 case WLAN_CIPHER_SUITE_AES_CMAC:
Bartosz Markowskid7131c02015-03-10 14:32:19 +0100169 WARN_ON(1);
170 return -EINVAL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300171 default:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200172 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300173 return -EOPNOTSUPP;
174 }
175
176 if (cmd == DISABLE_KEY) {
177 arg.key_cipher = WMI_CIPHER_NONE;
178 arg.key_data = NULL;
179 }
180
181 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
182}
183
184static int ath10k_install_key(struct ath10k_vif *arvif,
185 struct ieee80211_key_conf *key,
186 enum set_key_cmd cmd,
Michal Kazior370e5672015-02-18 14:02:26 +0100187 const u8 *macaddr, u32 flags)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300188{
189 struct ath10k *ar = arvif->ar;
190 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300191 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300192
Michal Kazior548db542013-07-05 16:15:15 +0300193 lockdep_assert_held(&ar->conf_mutex);
194
Wolfram Sang16735d02013-11-14 14:32:02 -0800195 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300196
Michal Kazior370e5672015-02-18 14:02:26 +0100197 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300198 if (ret)
199 return ret;
200
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300201 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
202 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300203 return -ETIMEDOUT;
204
205 return 0;
206}
207
208static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
209 const u8 *addr)
210{
211 struct ath10k *ar = arvif->ar;
212 struct ath10k_peer *peer;
213 int ret;
214 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100215 u32 flags;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300216
217 lockdep_assert_held(&ar->conf_mutex);
218
219 spin_lock_bh(&ar->data_lock);
220 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
221 spin_unlock_bh(&ar->data_lock);
222
223 if (!peer)
224 return -ENOENT;
225
226 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
227 if (arvif->wep_keys[i] == NULL)
228 continue;
Michal Kazior370e5672015-02-18 14:02:26 +0100229
230 flags = 0;
231 flags |= WMI_KEY_PAIRWISE;
232
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200233 /* set TX_USAGE flag for default key id */
234 if (arvif->def_wep_key_idx == i)
Michal Kazior370e5672015-02-18 14:02:26 +0100235 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300236
237 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
Michal Kazior370e5672015-02-18 14:02:26 +0100238 addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300239 if (ret)
240 return ret;
241
Sujith Manoharanae167132014-11-25 11:46:59 +0530242 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300243 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530244 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300245 }
246
247 return 0;
248}
249
250static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
251 const u8 *addr)
252{
253 struct ath10k *ar = arvif->ar;
254 struct ath10k_peer *peer;
255 int first_errno = 0;
256 int ret;
257 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100258 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300259
260 lockdep_assert_held(&ar->conf_mutex);
261
262 spin_lock_bh(&ar->data_lock);
263 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
264 spin_unlock_bh(&ar->data_lock);
265
266 if (!peer)
267 return -ENOENT;
268
269 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
270 if (peer->keys[i] == NULL)
271 continue;
272
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200273 /* key flags are not required to delete the key */
Kalle Valo5e3dd152013-06-12 20:52:10 +0300274 ret = ath10k_install_key(arvif, peer->keys[i],
Michal Kazior370e5672015-02-18 14:02:26 +0100275 DISABLE_KEY, addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300276 if (ret && first_errno == 0)
277 first_errno = ret;
278
279 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200280 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300281 i, ret);
282
Sujith Manoharanae167132014-11-25 11:46:59 +0530283 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300284 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530285 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300286 }
287
288 return first_errno;
289}
290
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530291bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
292 u8 keyidx)
293{
294 struct ath10k_peer *peer;
295 int i;
296
297 lockdep_assert_held(&ar->data_lock);
298
299 /* We don't know which vdev this peer belongs to,
300 * since WMI doesn't give us that information.
301 *
302 * FIXME: multi-bss needs to be handled.
303 */
304 peer = ath10k_peer_find(ar, 0, addr);
305 if (!peer)
306 return false;
307
308 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
309 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
310 return true;
311 }
312
313 return false;
314}
315
Kalle Valo5e3dd152013-06-12 20:52:10 +0300316static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
317 struct ieee80211_key_conf *key)
318{
319 struct ath10k *ar = arvif->ar;
320 struct ath10k_peer *peer;
321 u8 addr[ETH_ALEN];
322 int first_errno = 0;
323 int ret;
324 int i;
Michal Kazior370e5672015-02-18 14:02:26 +0100325 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300326
327 lockdep_assert_held(&ar->conf_mutex);
328
329 for (;;) {
330 /* since ath10k_install_key we can't hold data_lock all the
331 * time, so we try to remove the keys incrementally */
332 spin_lock_bh(&ar->data_lock);
333 i = 0;
334 list_for_each_entry(peer, &ar->peers, list) {
335 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
336 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300337 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300338 peer->keys[i] = NULL;
339 break;
340 }
341 }
342
343 if (i < ARRAY_SIZE(peer->keys))
344 break;
345 }
346 spin_unlock_bh(&ar->data_lock);
347
348 if (i == ARRAY_SIZE(peer->keys))
349 break;
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +0200350 /* key flags are not required to delete the key */
Michal Kazior370e5672015-02-18 14:02:26 +0100351 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300352 if (ret && first_errno == 0)
353 first_errno = ret;
354
355 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200356 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200357 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300358 }
359
360 return first_errno;
361}
362
Michal Kazior370e5672015-02-18 14:02:26 +0100363static int ath10k_mac_vif_sta_fix_wep_key(struct ath10k_vif *arvif)
364{
365 struct ath10k *ar = arvif->ar;
366 enum nl80211_iftype iftype = arvif->vif->type;
367 struct ieee80211_key_conf *key;
368 u32 flags = 0;
369 int num = 0;
370 int i;
371 int ret;
372
373 lockdep_assert_held(&ar->conf_mutex);
374
375 if (iftype != NL80211_IFTYPE_STATION)
376 return 0;
377
378 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
379 if (arvif->wep_keys[i]) {
380 key = arvif->wep_keys[i];
381 ++num;
382 }
383 }
384
385 if (num != 1)
386 return 0;
387
388 flags |= WMI_KEY_PAIRWISE;
389 flags |= WMI_KEY_TX_USAGE;
390
391 ret = ath10k_install_key(arvif, key, SET_KEY, arvif->bssid, flags);
392 if (ret) {
393 ath10k_warn(ar, "failed to install key %i on vdev %i: %d\n",
394 key->keyidx, arvif->vdev_id, ret);
395 return ret;
396 }
397
398 return 0;
399}
400
Michal Kaziorad325cb2015-02-18 14:02:27 +0100401static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
402 struct ieee80211_key_conf *key)
403{
404 struct ath10k *ar = arvif->ar;
405 struct ath10k_peer *peer;
406 int ret;
407
408 lockdep_assert_held(&ar->conf_mutex);
409
410 list_for_each_entry(peer, &ar->peers, list) {
411 if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
412 continue;
413
414 if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
415 continue;
416
417 if (peer->keys[key->keyidx] == key)
418 continue;
419
420 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
421 arvif->vdev_id, key->keyidx);
422
423 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
424 if (ret) {
425 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
426 arvif->vdev_id, peer->addr, ret);
427 return ret;
428 }
429 }
430
431 return 0;
432}
433
Kalle Valo5e3dd152013-06-12 20:52:10 +0300434/*********************/
435/* General utilities */
436/*********************/
437
438static inline enum wmi_phy_mode
439chan_to_phymode(const struct cfg80211_chan_def *chandef)
440{
441 enum wmi_phy_mode phymode = MODE_UNKNOWN;
442
443 switch (chandef->chan->band) {
444 case IEEE80211_BAND_2GHZ:
445 switch (chandef->width) {
446 case NL80211_CHAN_WIDTH_20_NOHT:
Peter Oh6faab122014-12-18 10:13:00 -0800447 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
448 phymode = MODE_11B;
449 else
450 phymode = MODE_11G;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300451 break;
452 case NL80211_CHAN_WIDTH_20:
453 phymode = MODE_11NG_HT20;
454 break;
455 case NL80211_CHAN_WIDTH_40:
456 phymode = MODE_11NG_HT40;
457 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400458 case NL80211_CHAN_WIDTH_5:
459 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300460 case NL80211_CHAN_WIDTH_80:
461 case NL80211_CHAN_WIDTH_80P80:
462 case NL80211_CHAN_WIDTH_160:
463 phymode = MODE_UNKNOWN;
464 break;
465 }
466 break;
467 case IEEE80211_BAND_5GHZ:
468 switch (chandef->width) {
469 case NL80211_CHAN_WIDTH_20_NOHT:
470 phymode = MODE_11A;
471 break;
472 case NL80211_CHAN_WIDTH_20:
473 phymode = MODE_11NA_HT20;
474 break;
475 case NL80211_CHAN_WIDTH_40:
476 phymode = MODE_11NA_HT40;
477 break;
478 case NL80211_CHAN_WIDTH_80:
479 phymode = MODE_11AC_VHT80;
480 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400481 case NL80211_CHAN_WIDTH_5:
482 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300483 case NL80211_CHAN_WIDTH_80P80:
484 case NL80211_CHAN_WIDTH_160:
485 phymode = MODE_UNKNOWN;
486 break;
487 }
488 break;
489 default:
490 break;
491 }
492
493 WARN_ON(phymode == MODE_UNKNOWN);
494 return phymode;
495}
496
497static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
498{
499/*
500 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
501 * 0 for no restriction
502 * 1 for 1/4 us
503 * 2 for 1/2 us
504 * 3 for 1 us
505 * 4 for 2 us
506 * 5 for 4 us
507 * 6 for 8 us
508 * 7 for 16 us
509 */
510 switch (mpdudensity) {
511 case 0:
512 return 0;
513 case 1:
514 case 2:
515 case 3:
516 /* Our lower layer calculations limit our precision to
517 1 microsecond */
518 return 1;
519 case 4:
520 return 2;
521 case 5:
522 return 4;
523 case 6:
524 return 8;
525 case 7:
526 return 16;
527 default:
528 return 0;
529 }
530}
531
Michal Kazior500ff9f2015-03-31 10:26:21 +0000532int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
533 struct cfg80211_chan_def *def)
534{
535 struct ieee80211_chanctx_conf *conf;
536
537 rcu_read_lock();
538 conf = rcu_dereference(vif->chanctx_conf);
539 if (!conf) {
540 rcu_read_unlock();
541 return -ENOENT;
542 }
543
544 *def = conf->def;
545 rcu_read_unlock();
546
547 return 0;
548}
549
550static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
551 struct ieee80211_chanctx_conf *conf,
552 void *data)
553{
554 int *num = data;
555
556 (*num)++;
557}
558
559static int ath10k_mac_num_chanctxs(struct ath10k *ar)
560{
561 int num = 0;
562
563 ieee80211_iter_chan_contexts_atomic(ar->hw,
564 ath10k_mac_num_chanctxs_iter,
565 &num);
566
567 return num;
568}
569
570static void
571ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
572 struct ieee80211_chanctx_conf *conf,
573 void *data)
574{
575 struct cfg80211_chan_def **def = data;
576
577 *def = &conf->def;
578}
579
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300580static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr,
581 enum wmi_peer_type peer_type)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300582{
583 int ret;
584
585 lockdep_assert_held(&ar->conf_mutex);
586
Michal Kaziorcfd10612014-11-25 15:16:05 +0100587 if (ar->num_peers >= ar->max_num_peers)
588 return -ENOBUFS;
589
Marek Puzyniak7390ed32015-03-30 09:51:52 +0300590 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
Ben Greear479398b2013-11-04 09:19:34 -0800591 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200592 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200593 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300594 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800595 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300596
597 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800598 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200599 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200600 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300601 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800602 }
Michal Kazior292a7532014-11-25 15:16:04 +0100603
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100604 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300605
606 return 0;
607}
608
Kalle Valo5a13e762014-01-20 11:01:46 +0200609static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
610{
611 struct ath10k *ar = arvif->ar;
612 u32 param;
613 int ret;
614
615 param = ar->wmi.pdev_param->sta_kickout_th;
616 ret = ath10k_wmi_pdev_set_param(ar, param,
617 ATH10K_KICKOUT_THRESHOLD);
618 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200619 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200620 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200621 return ret;
622 }
623
624 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
625 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
626 ATH10K_KEEPALIVE_MIN_IDLE);
627 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200628 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200629 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200630 return ret;
631 }
632
633 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
634 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
635 ATH10K_KEEPALIVE_MAX_IDLE);
636 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200637 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200638 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200639 return ret;
640 }
641
642 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
643 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
644 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
645 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200646 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200647 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200648 return ret;
649 }
650
651 return 0;
652}
653
Vivek Natarajanacab6402014-11-26 09:06:12 +0200654static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200655{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200656 struct ath10k *ar = arvif->ar;
657 u32 vdev_param;
658
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200659 vdev_param = ar->wmi.vdev_param->rts_threshold;
660 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200661}
662
663static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
664{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200665 struct ath10k *ar = arvif->ar;
666 u32 vdev_param;
667
Michal Kazior424121c2013-07-22 14:13:31 +0200668 if (value != 0xFFFFFFFF)
669 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
670 ATH10K_FRAGMT_THRESHOLD_MIN,
671 ATH10K_FRAGMT_THRESHOLD_MAX);
672
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200673 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
674 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200675}
676
Kalle Valo5e3dd152013-06-12 20:52:10 +0300677static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
678{
679 int ret;
680
681 lockdep_assert_held(&ar->conf_mutex);
682
683 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
684 if (ret)
685 return ret;
686
687 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
688 if (ret)
689 return ret;
690
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100691 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100692
Kalle Valo5e3dd152013-06-12 20:52:10 +0300693 return 0;
694}
695
696static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
697{
698 struct ath10k_peer *peer, *tmp;
699
700 lockdep_assert_held(&ar->conf_mutex);
701
702 spin_lock_bh(&ar->data_lock);
703 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
704 if (peer->vdev_id != vdev_id)
705 continue;
706
Michal Kazior7aa7a722014-08-25 12:09:38 +0200707 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300708 peer->addr, vdev_id);
709
710 list_del(&peer->list);
711 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100712 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300713 }
714 spin_unlock_bh(&ar->data_lock);
715}
716
Michal Kaziora96d7742013-07-16 09:38:56 +0200717static void ath10k_peer_cleanup_all(struct ath10k *ar)
718{
719 struct ath10k_peer *peer, *tmp;
720
721 lockdep_assert_held(&ar->conf_mutex);
722
723 spin_lock_bh(&ar->data_lock);
724 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
725 list_del(&peer->list);
726 kfree(peer);
727 }
728 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100729
730 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100731 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200732}
733
Marek Puzyniak75d85fd2015-03-30 09:51:53 +0300734static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
735 struct ieee80211_sta *sta,
736 enum wmi_tdls_peer_state state)
737{
738 int ret;
739 struct wmi_tdls_peer_update_cmd_arg arg = {};
740 struct wmi_tdls_peer_capab_arg cap = {};
741 struct wmi_channel_arg chan_arg = {};
742
743 lockdep_assert_held(&ar->conf_mutex);
744
745 arg.vdev_id = vdev_id;
746 arg.peer_state = state;
747 ether_addr_copy(arg.addr, sta->addr);
748
749 cap.peer_max_sp = sta->max_sp;
750 cap.peer_uapsd_queues = sta->uapsd_queues;
751
752 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
753 !sta->tdls_initiator)
754 cap.is_peer_responder = 1;
755
756 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
757 if (ret) {
758 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
759 arg.addr, vdev_id, ret);
760 return ret;
761 }
762
763 return 0;
764}
765
Kalle Valo5e3dd152013-06-12 20:52:10 +0300766/************************/
767/* Interface management */
768/************************/
769
Michal Kazior64badcb2014-09-18 11:18:02 +0300770void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
771{
772 struct ath10k *ar = arvif->ar;
773
774 lockdep_assert_held(&ar->data_lock);
775
776 if (!arvif->beacon)
777 return;
778
779 if (!arvif->beacon_buf)
780 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
781 arvif->beacon->len, DMA_TO_DEVICE);
782
Michal Kazioraf213192015-01-29 14:29:52 +0200783 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
784 arvif->beacon_state != ATH10K_BEACON_SENT))
785 return;
786
Michal Kazior64badcb2014-09-18 11:18:02 +0300787 dev_kfree_skb_any(arvif->beacon);
788
789 arvif->beacon = NULL;
Michal Kazioraf213192015-01-29 14:29:52 +0200790 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
Michal Kazior64badcb2014-09-18 11:18:02 +0300791}
792
793static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
794{
795 struct ath10k *ar = arvif->ar;
796
797 lockdep_assert_held(&ar->data_lock);
798
799 ath10k_mac_vif_beacon_free(arvif);
800
801 if (arvif->beacon_buf) {
802 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
803 arvif->beacon_buf, arvif->beacon_paddr);
804 arvif->beacon_buf = NULL;
805 }
806}
807
Kalle Valo5e3dd152013-06-12 20:52:10 +0300808static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
809{
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300810 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300811
Michal Kazior548db542013-07-05 16:15:15 +0300812 lockdep_assert_held(&ar->conf_mutex);
813
Michal Kazior7962b0d2014-10-28 10:34:38 +0100814 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
815 return -ESHUTDOWN;
816
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +0300817 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
818 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
819 if (time_left == 0)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300820 return -ETIMEDOUT;
821
822 return 0;
823}
824
Michal Kazior1bbc0972014-04-08 09:45:47 +0300825static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300826{
Michal Kazior500ff9f2015-03-31 10:26:21 +0000827 struct cfg80211_chan_def *chandef = NULL;
Michal Kaziorc930f742014-01-23 11:38:25 +0100828 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300829 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300830 int ret = 0;
831
832 lockdep_assert_held(&ar->conf_mutex);
833
Michal Kazior500ff9f2015-03-31 10:26:21 +0000834 ieee80211_iter_chan_contexts_atomic(ar->hw,
835 ath10k_mac_get_any_chandef_iter,
836 &chandef);
837 if (WARN_ON_ONCE(!chandef))
838 return -ENOENT;
839
840 channel = chandef->chan;
841
Kalle Valo5e3dd152013-06-12 20:52:10 +0300842 arg.vdev_id = vdev_id;
843 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100844 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300845
846 /* TODO setup this dynamically, what in case we
847 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100848 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200849 arg.channel.chan_radar =
850 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300851
Michal Kazior89c5c842013-10-23 04:02:13 -0700852 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700853 arg.channel.max_power = channel->max_power * 2;
854 arg.channel.max_reg_power = channel->max_reg_power * 2;
855 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300856
Michal Kazior7962b0d2014-10-28 10:34:38 +0100857 reinit_completion(&ar->vdev_setup_done);
858
Kalle Valo5e3dd152013-06-12 20:52:10 +0300859 ret = ath10k_wmi_vdev_start(ar, &arg);
860 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200861 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200862 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300863 return ret;
864 }
865
866 ret = ath10k_vdev_setup_sync(ar);
867 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +0200868 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200869 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300870 return ret;
871 }
872
873 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
874 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200875 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200876 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300877 goto vdev_stop;
878 }
879
880 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300881
Michal Kazior7aa7a722014-08-25 12:09:38 +0200882 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300883 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300884 return 0;
885
886vdev_stop:
887 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
888 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200889 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200890 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300891
892 return ret;
893}
894
Michal Kazior1bbc0972014-04-08 09:45:47 +0300895static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300896{
897 int ret = 0;
898
899 lockdep_assert_held(&ar->conf_mutex);
900
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200901 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
902 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200903 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200904 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300905
Michal Kazior7962b0d2014-10-28 10:34:38 +0100906 reinit_completion(&ar->vdev_setup_done);
907
Kalle Valo5e3dd152013-06-12 20:52:10 +0300908 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
909 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200910 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200911 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300912
913 ret = ath10k_vdev_setup_sync(ar);
914 if (ret)
Ben Greear60028a82015-02-15 16:50:39 +0200915 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200916 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300917
Michal Kazior7aa7a722014-08-25 12:09:38 +0200918 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300919 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300920 return ret;
921}
922
Michal Kazior1bbc0972014-04-08 09:45:47 +0300923static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300924{
925 int bit, ret = 0;
926
927 lockdep_assert_held(&ar->conf_mutex);
928
Ben Greeara9aefb32014-08-12 11:02:19 +0300929 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200930 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300931 return -ENOMEM;
932 }
933
Ben Greear16c11172014-09-23 14:17:16 -0700934 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300935
Ben Greear16c11172014-09-23 14:17:16 -0700936 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300937
938 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
939 WMI_VDEV_TYPE_MONITOR,
940 0, ar->mac_addr);
941 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200942 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200943 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300944 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300945 }
946
Ben Greear16c11172014-09-23 14:17:16 -0700947 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200948 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300949 ar->monitor_vdev_id);
950
Kalle Valo5e3dd152013-06-12 20:52:10 +0300951 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300952}
953
Michal Kazior1bbc0972014-04-08 09:45:47 +0300954static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955{
956 int ret = 0;
957
958 lockdep_assert_held(&ar->conf_mutex);
959
Kalle Valo5e3dd152013-06-12 20:52:10 +0300960 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
961 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200962 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200963 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300964 return ret;
965 }
966
Ben Greear16c11172014-09-23 14:17:16 -0700967 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300968
Michal Kazior7aa7a722014-08-25 12:09:38 +0200969 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300970 ar->monitor_vdev_id);
971 return ret;
972}
973
Michal Kazior1bbc0972014-04-08 09:45:47 +0300974static int ath10k_monitor_start(struct ath10k *ar)
975{
976 int ret;
977
978 lockdep_assert_held(&ar->conf_mutex);
979
Michal Kazior1bbc0972014-04-08 09:45:47 +0300980 ret = ath10k_monitor_vdev_create(ar);
981 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200982 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300983 return ret;
984 }
985
986 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
987 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200988 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300989 ath10k_monitor_vdev_delete(ar);
990 return ret;
991 }
992
993 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200994 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +0300995
996 return 0;
997}
998
Michal Kazior19337472014-08-28 12:58:16 +0200999static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +03001000{
1001 int ret;
1002
1003 lockdep_assert_held(&ar->conf_mutex);
1004
Michal Kazior1bbc0972014-04-08 09:45:47 +03001005 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001006 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001007 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001008 return ret;
1009 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001010
1011 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001012 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001013 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +02001014 return ret;
1015 }
Michal Kazior1bbc0972014-04-08 09:45:47 +03001016
1017 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +02001018 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +02001019
1020 return 0;
1021}
1022
Vasanthakumar Thiagarajan54846212015-03-02 17:45:28 +05301023static bool ath10k_mac_should_disable_promisc(struct ath10k *ar)
1024{
1025 struct ath10k_vif *arvif;
1026
1027 if (!(ar->filter_flags & FIF_PROMISC_IN_BSS))
1028 return true;
1029
1030 if (!ar->num_started_vdevs)
1031 return false;
1032
1033 list_for_each_entry(arvif, &ar->arvifs, list)
1034 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1035 return false;
1036
1037 ath10k_dbg(ar, ATH10K_DBG_MAC,
1038 "mac disabling promiscuous mode because vdev is started\n");
1039 return true;
1040}
1041
Michal Kazior500ff9f2015-03-31 10:26:21 +00001042static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1043{
1044 int num_ctx;
1045
1046 /* At least one chanctx is required to derive a channel to start
1047 * monitor vdev on.
1048 */
1049 num_ctx = ath10k_mac_num_chanctxs(ar);
1050 if (num_ctx == 0)
1051 return false;
1052
1053 /* If there's already an existing special monitor interface then don't
1054 * bother creating another monitor vdev.
1055 */
1056 if (ar->monitor_arvif)
1057 return false;
1058
1059 return ar->monitor ||
1060 !ath10k_mac_should_disable_promisc(ar) ||
1061 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1062}
1063
1064static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1065{
1066 int num_ctx;
1067
1068 num_ctx = ath10k_mac_num_chanctxs(ar);
1069
1070 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1071 * shouldn't allow this but make sure to prevent handling the following
1072 * case anyway since multi-channel DFS hasn't been tested at all.
1073 */
1074 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1075 return false;
1076
1077 return true;
1078}
1079
Michal Kazior19337472014-08-28 12:58:16 +02001080static int ath10k_monitor_recalc(struct ath10k *ar)
1081{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001082 bool needed;
1083 bool allowed;
1084 int ret;
Michal Kazior19337472014-08-28 12:58:16 +02001085
1086 lockdep_assert_held(&ar->conf_mutex);
1087
Michal Kazior500ff9f2015-03-31 10:26:21 +00001088 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1089 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
Michal Kazior19337472014-08-28 12:58:16 +02001090
1091 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior500ff9f2015-03-31 10:26:21 +00001092 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1093 ar->monitor_started, needed, allowed);
Michal Kazior19337472014-08-28 12:58:16 +02001094
Michal Kazior500ff9f2015-03-31 10:26:21 +00001095 if (WARN_ON(needed && !allowed)) {
1096 if (ar->monitor_started) {
1097 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1098
1099 ret = ath10k_monitor_stop(ar);
1100 if (ret)
1101 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n", ret);
1102 /* not serious */
1103 }
1104
1105 return -EPERM;
1106 }
1107
1108 if (needed == ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02001109 return 0;
1110
Michal Kazior500ff9f2015-03-31 10:26:21 +00001111 if (needed)
Michal Kazior19337472014-08-28 12:58:16 +02001112 return ath10k_monitor_start(ar);
Michal Kazior500ff9f2015-03-31 10:26:21 +00001113 else
1114 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001115}
1116
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001117static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1118{
1119 struct ath10k *ar = arvif->ar;
1120 u32 vdev_param, rts_cts = 0;
1121
1122 lockdep_assert_held(&ar->conf_mutex);
1123
1124 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1125
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001126 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001127
1128 if (arvif->num_legacy_stations > 0)
1129 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1130 WMI_RTSCTS_PROFILE);
Rajkumar Manoharan9a5ab0f2015-03-19 16:03:29 +02001131 else
1132 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1133 WMI_RTSCTS_PROFILE);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001134
1135 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1136 rts_cts);
1137}
1138
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001139static int ath10k_start_cac(struct ath10k *ar)
1140{
1141 int ret;
1142
1143 lockdep_assert_held(&ar->conf_mutex);
1144
1145 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1146
Michal Kazior19337472014-08-28 12:58:16 +02001147 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001148 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001149 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001150 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1151 return ret;
1152 }
1153
Michal Kazior7aa7a722014-08-25 12:09:38 +02001154 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001155 ar->monitor_vdev_id);
1156
1157 return 0;
1158}
1159
1160static int ath10k_stop_cac(struct ath10k *ar)
1161{
1162 lockdep_assert_held(&ar->conf_mutex);
1163
1164 /* CAC is not running - do nothing */
1165 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1166 return 0;
1167
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001168 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +03001169 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001170
Michal Kazior7aa7a722014-08-25 12:09:38 +02001171 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001172
1173 return 0;
1174}
1175
Michal Kazior500ff9f2015-03-31 10:26:21 +00001176static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1177 struct ieee80211_chanctx_conf *conf,
1178 void *data)
1179{
1180 bool *ret = data;
1181
1182 if (!*ret && conf->radar_enabled)
1183 *ret = true;
1184}
1185
1186static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1187{
1188 bool has_radar = false;
1189
1190 ieee80211_iter_chan_contexts_atomic(ar->hw,
1191 ath10k_mac_has_radar_iter,
1192 &has_radar);
1193
1194 return has_radar;
1195}
1196
Michal Kaziord6500972014-04-08 09:56:09 +03001197static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001198{
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001199 int ret;
1200
1201 lockdep_assert_held(&ar->conf_mutex);
1202
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001203 ath10k_stop_cac(ar);
1204
Michal Kazior500ff9f2015-03-31 10:26:21 +00001205 if (!ath10k_mac_has_radar_enabled(ar))
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001206 return;
1207
Michal Kaziord6500972014-04-08 09:56:09 +03001208 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001209 return;
1210
1211 ret = ath10k_start_cac(ar);
1212 if (ret) {
1213 /*
1214 * Not possible to start CAC on current channel so starting
1215 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1216 * by indicating that radar was detected.
1217 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001218 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001219 ieee80211_radar_detected(ar->hw);
1220 }
1221}
1222
Vasanthakumar Thiagarajan822b7e02015-03-02 17:45:27 +05301223static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1224{
1225 struct ath10k *ar = arvif->ar;
1226 int ret;
1227
1228 lockdep_assert_held(&ar->conf_mutex);
1229
1230 reinit_completion(&ar->vdev_setup_done);
1231
1232 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1233 if (ret) {
1234 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1235 arvif->vdev_id, ret);
1236 return ret;
1237 }
1238
1239 ret = ath10k_vdev_setup_sync(ar);
1240 if (ret) {
1241 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
1242 arvif->vdev_id, ret);
1243 return ret;
1244 }
1245
1246 WARN_ON(ar->num_started_vdevs == 0);
1247
1248 if (ar->num_started_vdevs != 0) {
1249 ar->num_started_vdevs--;
1250 ath10k_recalc_radar_detection(ar);
1251 }
1252
1253 return ret;
1254}
1255
Michal Kazior500ff9f2015-03-31 10:26:21 +00001256static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1257 const struct cfg80211_chan_def *chandef,
1258 bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +03001259{
1260 struct ath10k *ar = arvif->ar;
Michal Kazior72654fa2014-04-08 09:56:09 +03001261 struct wmi_vdev_start_request_arg arg = {};
Vasanthakumar Thiagarajan54846212015-03-02 17:45:28 +05301262 int ret = 0, ret2;
Michal Kazior72654fa2014-04-08 09:56:09 +03001263
1264 lockdep_assert_held(&ar->conf_mutex);
1265
1266 reinit_completion(&ar->vdev_setup_done);
1267
1268 arg.vdev_id = arvif->vdev_id;
1269 arg.dtim_period = arvif->dtim_period;
1270 arg.bcn_intval = arvif->beacon_interval;
1271
1272 arg.channel.freq = chandef->chan->center_freq;
1273 arg.channel.band_center_freq1 = chandef->center_freq1;
1274 arg.channel.mode = chan_to_phymode(chandef);
1275
1276 arg.channel.min_power = 0;
1277 arg.channel.max_power = chandef->chan->max_power * 2;
1278 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1279 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1280
1281 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1282 arg.ssid = arvif->u.ap.ssid;
1283 arg.ssid_len = arvif->u.ap.ssid_len;
1284 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1285
1286 /* For now allow DFS for AP mode */
1287 arg.channel.chan_radar =
1288 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1289 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1290 arg.ssid = arvif->vif->bss_conf.ssid;
1291 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1292 }
1293
Michal Kazior7aa7a722014-08-25 12:09:38 +02001294 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +03001295 "mac vdev %d start center_freq %d phymode %s\n",
1296 arg.vdev_id, arg.channel.freq,
1297 ath10k_wmi_phymode_str(arg.channel.mode));
1298
Michal Kaziordc55e302014-07-29 12:53:36 +03001299 if (restart)
1300 ret = ath10k_wmi_vdev_restart(ar, &arg);
1301 else
1302 ret = ath10k_wmi_vdev_start(ar, &arg);
1303
Michal Kazior72654fa2014-04-08 09:56:09 +03001304 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001305 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +03001306 arg.vdev_id, ret);
1307 return ret;
1308 }
1309
1310 ret = ath10k_vdev_setup_sync(ar);
1311 if (ret) {
Ben Greear60028a82015-02-15 16:50:39 +02001312 ath10k_warn(ar,
1313 "failed to synchronize setup for vdev %i restart %d: %d\n",
1314 arg.vdev_id, restart, ret);
Michal Kazior72654fa2014-04-08 09:56:09 +03001315 return ret;
1316 }
1317
Michal Kaziord6500972014-04-08 09:56:09 +03001318 ar->num_started_vdevs++;
1319 ath10k_recalc_radar_detection(ar);
1320
Vasanthakumar Thiagarajan54846212015-03-02 17:45:28 +05301321 ret = ath10k_monitor_recalc(ar);
1322 if (ret) {
1323 ath10k_warn(ar, "mac failed to recalc monitor for vdev %i restart %d: %d\n",
1324 arg.vdev_id, restart, ret);
1325 ret2 = ath10k_vdev_stop(arvif);
1326 if (ret2)
1327 ath10k_warn(ar, "mac failed to stop vdev %i restart %d: %d\n",
1328 arg.vdev_id, restart, ret2);
1329 }
1330
Michal Kazior72654fa2014-04-08 09:56:09 +03001331 return ret;
1332}
1333
Michal Kazior500ff9f2015-03-31 10:26:21 +00001334static int ath10k_vdev_start(struct ath10k_vif *arvif,
1335 const struct cfg80211_chan_def *def)
Michal Kaziordc55e302014-07-29 12:53:36 +03001336{
Michal Kazior500ff9f2015-03-31 10:26:21 +00001337 return ath10k_vdev_start_restart(arvif, def, false);
Michal Kaziordc55e302014-07-29 12:53:36 +03001338}
1339
Michal Kazior500ff9f2015-03-31 10:26:21 +00001340static int ath10k_vdev_restart(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, true);
Michal Kaziordc55e302014-07-29 12:53:36 +03001344}
1345
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001346static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1347 struct sk_buff *bcn)
1348{
1349 struct ath10k *ar = arvif->ar;
1350 struct ieee80211_mgmt *mgmt;
1351 const u8 *p2p_ie;
1352 int ret;
1353
1354 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1355 return 0;
1356
1357 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1358 return 0;
1359
1360 mgmt = (void *)bcn->data;
1361 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1362 mgmt->u.beacon.variable,
1363 bcn->len - (mgmt->u.beacon.variable -
1364 bcn->data));
1365 if (!p2p_ie)
1366 return -ENOENT;
1367
1368 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1369 if (ret) {
1370 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1371 arvif->vdev_id, ret);
1372 return ret;
1373 }
1374
1375 return 0;
1376}
1377
1378static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1379 u8 oui_type, size_t ie_offset)
1380{
1381 size_t len;
1382 const u8 *next;
1383 const u8 *end;
1384 u8 *ie;
1385
1386 if (WARN_ON(skb->len < ie_offset))
1387 return -EINVAL;
1388
1389 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1390 skb->data + ie_offset,
1391 skb->len - ie_offset);
1392 if (!ie)
1393 return -ENOENT;
1394
1395 len = ie[1] + 2;
1396 end = skb->data + skb->len;
1397 next = ie + len;
1398
1399 if (WARN_ON(next > end))
1400 return -EINVAL;
1401
1402 memmove(ie, next, end - next);
1403 skb_trim(skb, skb->len - len);
1404
1405 return 0;
1406}
1407
1408static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1409{
1410 struct ath10k *ar = arvif->ar;
1411 struct ieee80211_hw *hw = ar->hw;
1412 struct ieee80211_vif *vif = arvif->vif;
1413 struct ieee80211_mutable_offsets offs = {};
1414 struct sk_buff *bcn;
1415 int ret;
1416
1417 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1418 return 0;
1419
Michal Kazior81a9a172015-03-05 16:02:17 +02001420 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1421 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1422 return 0;
1423
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001424 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1425 if (!bcn) {
1426 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1427 return -EPERM;
1428 }
1429
1430 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1431 if (ret) {
1432 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1433 kfree_skb(bcn);
1434 return ret;
1435 }
1436
1437 /* P2P IE is inserted by firmware automatically (as configured above)
1438 * so remove it from the base beacon template to avoid duplicate P2P
1439 * IEs in beacon frames.
1440 */
1441 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1442 offsetof(struct ieee80211_mgmt,
1443 u.beacon.variable));
1444
1445 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1446 0, NULL, 0);
1447 kfree_skb(bcn);
1448
1449 if (ret) {
1450 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1451 ret);
1452 return ret;
1453 }
1454
1455 return 0;
1456}
1457
1458static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1459{
1460 struct ath10k *ar = arvif->ar;
1461 struct ieee80211_hw *hw = ar->hw;
1462 struct ieee80211_vif *vif = arvif->vif;
1463 struct sk_buff *prb;
1464 int ret;
1465
1466 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1467 return 0;
1468
Michal Kazior81a9a172015-03-05 16:02:17 +02001469 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1470 return 0;
1471
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02001472 prb = ieee80211_proberesp_get(hw, vif);
1473 if (!prb) {
1474 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1475 return -EPERM;
1476 }
1477
1478 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1479 kfree_skb(prb);
1480
1481 if (ret) {
1482 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1483 ret);
1484 return ret;
1485 }
1486
1487 return 0;
1488}
1489
Michal Kazior500ff9f2015-03-31 10:26:21 +00001490static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1491{
1492 struct ath10k *ar = arvif->ar;
1493 struct cfg80211_chan_def def;
1494 int ret;
1495
1496 /* When originally vdev is started during assign_vif_chanctx() some
1497 * information is missing, notably SSID. Firmware revisions with beacon
1498 * offloading require the SSID to be provided during vdev (re)start to
1499 * handle hidden SSID properly.
1500 *
1501 * Vdev restart must be done after vdev has been both started and
1502 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1503 * deliver vdev restart response event causing timeouts during vdev
1504 * syncing in ath10k.
1505 *
1506 * Note: The vdev down/up and template reinstallation could be skipped
1507 * since only wmi-tlv firmware are known to have beacon offload and
1508 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1509 * response delivery. It's probably more robust to keep it as is.
1510 */
1511 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1512 return 0;
1513
1514 if (WARN_ON(!arvif->is_started))
1515 return -EINVAL;
1516
1517 if (WARN_ON(!arvif->is_up))
1518 return -EINVAL;
1519
1520 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1521 return -EINVAL;
1522
1523 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1524 if (ret) {
1525 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1526 arvif->vdev_id, ret);
1527 return ret;
1528 }
1529
1530 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1531 * firmware will crash upon vdev up.
1532 */
1533
1534 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1535 if (ret) {
1536 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1537 return ret;
1538 }
1539
1540 ret = ath10k_mac_setup_prb_tmpl(arvif);
1541 if (ret) {
1542 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1543 return ret;
1544 }
1545
1546 ret = ath10k_vdev_restart(arvif, &def);
1547 if (ret) {
1548 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1549 arvif->vdev_id, ret);
1550 return ret;
1551 }
1552
1553 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1554 arvif->bssid);
1555 if (ret) {
1556 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1557 arvif->vdev_id, ret);
1558 return ret;
1559 }
1560
1561 return 0;
1562}
1563
Kalle Valo5e3dd152013-06-12 20:52:10 +03001564static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +03001565 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001566{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001567 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001568 int ret = 0;
1569
Michal Kazior548db542013-07-05 16:15:15 +03001570 lockdep_assert_held(&arvif->ar->conf_mutex);
1571
Kalle Valo5e3dd152013-06-12 20:52:10 +03001572 if (!info->enable_beacon) {
Michal Kazior500ff9f2015-03-31 10:26:21 +00001573 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1574 if (ret)
1575 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1576 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001577
Michal Kaziorc930f742014-01-23 11:38:25 +01001578 arvif->is_up = false;
Michal Kazior8513d952015-03-09 14:19:24 +01001579
1580 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03001581 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +01001582 spin_unlock_bh(&arvif->ar->data_lock);
1583
Kalle Valo5e3dd152013-06-12 20:52:10 +03001584 return;
1585 }
1586
1587 arvif->tx_seq_no = 0x1000;
1588
Michal Kaziorc930f742014-01-23 11:38:25 +01001589 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +03001590 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001591
1592 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1593 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001594 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001595 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001596 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001597 return;
1598 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001599
Michal Kaziorc930f742014-01-23 11:38:25 +01001600 arvif->is_up = true;
1601
Michal Kazior500ff9f2015-03-31 10:26:21 +00001602 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1603 if (ret) {
1604 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1605 arvif->vdev_id, ret);
1606 return;
1607 }
1608
Michal Kazior7aa7a722014-08-25 12:09:38 +02001609 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001610}
1611
1612static void ath10k_control_ibss(struct ath10k_vif *arvif,
1613 struct ieee80211_bss_conf *info,
1614 const u8 self_peer[ETH_ALEN])
1615{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001616 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001617 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001618 int ret = 0;
1619
Michal Kazior548db542013-07-05 16:15:15 +03001620 lockdep_assert_held(&arvif->ar->conf_mutex);
1621
Kalle Valo5e3dd152013-06-12 20:52:10 +03001622 if (!info->ibss_joined) {
Michal Kaziorc930f742014-01-23 11:38:25 +01001623 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001624 return;
1625
Michal Kaziorc930f742014-01-23 11:38:25 +01001626 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001627
1628 return;
1629 }
1630
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001631 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1632 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001633 ATH10K_DEFAULT_ATIM);
1634 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001635 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001636 arvif->vdev_id, ret);
1637}
1638
Michal Kazior9f9b5742014-12-12 12:41:36 +01001639static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1640{
1641 struct ath10k *ar = arvif->ar;
1642 u32 param;
1643 u32 value;
1644 int ret;
1645
1646 lockdep_assert_held(&arvif->ar->conf_mutex);
1647
1648 if (arvif->u.sta.uapsd)
1649 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1650 else
1651 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1652
1653 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1654 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1655 if (ret) {
1656 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1657 value, arvif->vdev_id, ret);
1658 return ret;
1659 }
1660
1661 return 0;
1662}
1663
1664static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1665{
1666 struct ath10k *ar = arvif->ar;
1667 u32 param;
1668 u32 value;
1669 int ret;
1670
1671 lockdep_assert_held(&arvif->ar->conf_mutex);
1672
1673 if (arvif->u.sta.uapsd)
1674 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1675 else
1676 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1677
1678 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1679 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1680 param, value);
1681 if (ret) {
1682 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1683 value, arvif->vdev_id, ret);
1684 return ret;
1685 }
1686
1687 return 0;
1688}
1689
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001690static int ath10k_mac_ps_vif_count(struct ath10k *ar)
1691{
1692 struct ath10k_vif *arvif;
1693 int num = 0;
1694
1695 lockdep_assert_held(&ar->conf_mutex);
1696
1697 list_for_each_entry(arvif, &ar->arvifs, list)
1698 if (arvif->ps)
1699 num++;
1700
1701 return num;
1702}
1703
Michal Kaziorad088bf2013-10-16 15:44:46 +03001704static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001705{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001706 struct ath10k *ar = arvif->ar;
Michal Kazior526549a2014-12-12 12:41:37 +01001707 struct ieee80211_vif *vif = arvif->vif;
Michal Kaziorad088bf2013-10-16 15:44:46 +03001708 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001709 enum wmi_sta_powersave_param param;
1710 enum wmi_sta_ps_mode psmode;
1711 int ret;
Michal Kazior526549a2014-12-12 12:41:37 +01001712 int ps_timeout;
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001713 bool enable_ps;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001714
Michal Kazior548db542013-07-05 16:15:15 +03001715 lockdep_assert_held(&arvif->ar->conf_mutex);
1716
Michal Kaziorad088bf2013-10-16 15:44:46 +03001717 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1718 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001719
Michal Kaziorcffb41f2015-02-13 13:30:16 +01001720 enable_ps = arvif->ps;
1721
1722 if (enable_ps && ath10k_mac_ps_vif_count(ar) > 1 &&
1723 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1724 ar->fw_features)) {
1725 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1726 arvif->vdev_id);
1727 enable_ps = false;
1728 }
1729
1730 if (enable_ps) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001731 psmode = WMI_STA_PS_MODE_ENABLED;
1732 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1733
Michal Kazior526549a2014-12-12 12:41:37 +01001734 ps_timeout = conf->dynamic_ps_timeout;
1735 if (ps_timeout == 0) {
1736 /* Firmware doesn't like 0 */
1737 ps_timeout = ieee80211_tu_to_usec(
1738 vif->bss_conf.beacon_int) / 1000;
1739 }
1740
Michal Kaziorad088bf2013-10-16 15:44:46 +03001741 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Michal Kazior526549a2014-12-12 12:41:37 +01001742 ps_timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001743 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001744 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001745 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001746 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001747 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001748 } else {
1749 psmode = WMI_STA_PS_MODE_DISABLED;
1750 }
1751
Michal Kazior7aa7a722014-08-25 12:09:38 +02001752 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001753 arvif->vdev_id, psmode ? "enable" : "disable");
1754
Michal Kaziorad088bf2013-10-16 15:44:46 +03001755 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1756 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001757 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001758 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001759 return ret;
1760 }
1761
1762 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001763}
1764
Michal Kazior46725b152015-01-28 09:57:49 +02001765static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1766{
1767 struct ath10k *ar = arvif->ar;
1768 struct wmi_sta_keepalive_arg arg = {};
1769 int ret;
1770
1771 lockdep_assert_held(&arvif->ar->conf_mutex);
1772
1773 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1774 return 0;
1775
1776 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1777 return 0;
1778
1779 /* Some firmware revisions have a bug and ignore the `enabled` field.
1780 * Instead use the interval to disable the keepalive.
1781 */
1782 arg.vdev_id = arvif->vdev_id;
1783 arg.enabled = 1;
1784 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
1785 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
1786
1787 ret = ath10k_wmi_sta_keepalive(ar, &arg);
1788 if (ret) {
1789 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
1790 arvif->vdev_id, ret);
1791 return ret;
1792 }
1793
1794 return 0;
1795}
1796
Michal Kazior81a9a172015-03-05 16:02:17 +02001797static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
1798{
1799 struct ath10k *ar = arvif->ar;
1800 struct ieee80211_vif *vif = arvif->vif;
1801 int ret;
1802
Michal Kazior8513d952015-03-09 14:19:24 +01001803 lockdep_assert_held(&arvif->ar->conf_mutex);
1804
1805 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
1806 return;
1807
Michal Kazior81a9a172015-03-05 16:02:17 +02001808 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1809 return;
1810
1811 if (!vif->csa_active)
1812 return;
1813
1814 if (!arvif->is_up)
1815 return;
1816
1817 if (!ieee80211_csa_is_complete(vif)) {
1818 ieee80211_csa_update_counter(vif);
1819
1820 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1821 if (ret)
1822 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
1823 ret);
1824
1825 ret = ath10k_mac_setup_prb_tmpl(arvif);
1826 if (ret)
1827 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
1828 ret);
1829 } else {
1830 ieee80211_csa_finish(vif);
1831 }
1832}
1833
1834static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
1835{
1836 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1837 ap_csa_work);
1838 struct ath10k *ar = arvif->ar;
1839
1840 mutex_lock(&ar->conf_mutex);
1841 ath10k_mac_vif_ap_csa_count_down(arvif);
1842 mutex_unlock(&ar->conf_mutex);
1843}
1844
Michal Kaziorcc9904e2015-03-10 16:22:01 +02001845static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
1846 struct ieee80211_vif *vif)
1847{
1848 struct sk_buff *skb = data;
1849 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1850 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1851
1852 if (vif->type != NL80211_IFTYPE_STATION)
1853 return;
1854
1855 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1856 return;
1857
1858 cancel_delayed_work(&arvif->connection_loss_work);
1859}
1860
1861void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
1862{
1863 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1864 IEEE80211_IFACE_ITER_NORMAL,
1865 ath10k_mac_handle_beacon_iter,
1866 skb);
1867}
1868
1869static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1870 struct ieee80211_vif *vif)
1871{
1872 u32 *vdev_id = data;
1873 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1874 struct ath10k *ar = arvif->ar;
1875 struct ieee80211_hw *hw = ar->hw;
1876
1877 if (arvif->vdev_id != *vdev_id)
1878 return;
1879
1880 if (!arvif->is_up)
1881 return;
1882
1883 ieee80211_beacon_loss(vif);
1884
1885 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1886 * (done by mac80211) succeeds but beacons do not resume then it
1887 * doesn't make sense to continue operation. Queue connection loss work
1888 * which can be cancelled when beacon is received.
1889 */
1890 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1891 ATH10K_CONNECTION_LOSS_HZ);
1892}
1893
1894void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
1895{
1896 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1897 IEEE80211_IFACE_ITER_NORMAL,
1898 ath10k_mac_handle_beacon_miss_iter,
1899 &vdev_id);
1900}
1901
1902static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1903{
1904 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1905 connection_loss_work.work);
1906 struct ieee80211_vif *vif = arvif->vif;
1907
1908 if (!arvif->is_up)
1909 return;
1910
1911 ieee80211_connection_loss(vif);
1912}
1913
Kalle Valo5e3dd152013-06-12 20:52:10 +03001914/**********************/
1915/* Station management */
1916/**********************/
1917
Michal Kazior590922a2014-10-21 10:10:29 +03001918static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1919 struct ieee80211_vif *vif)
1920{
1921 /* Some firmware revisions have unstable STA powersave when listen
1922 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1923 * generate NullFunc frames properly even if buffered frames have been
1924 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1925 * buffered frames. Often pinging the device from AP would simply fail.
1926 *
1927 * As a workaround set it to 1.
1928 */
1929 if (vif->type == NL80211_IFTYPE_STATION)
1930 return 1;
1931
1932 return ar->hw->conf.listen_interval;
1933}
1934
Kalle Valo5e3dd152013-06-12 20:52:10 +03001935static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001936 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001937 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001938 struct wmi_peer_assoc_complete_arg *arg)
1939{
Michal Kazior590922a2014-10-21 10:10:29 +03001940 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorc51880e2015-03-30 09:51:57 +03001941 u32 aid;
Michal Kazior590922a2014-10-21 10:10:29 +03001942
Michal Kazior548db542013-07-05 16:15:15 +03001943 lockdep_assert_held(&ar->conf_mutex);
1944
Michal Kaziorc51880e2015-03-30 09:51:57 +03001945 if (vif->type == NL80211_IFTYPE_STATION)
1946 aid = vif->bss_conf.aid;
1947 else
1948 aid = sta->aid;
1949
Kalle Valob25f32c2014-09-14 12:50:49 +03001950 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001951 arg->vdev_id = arvif->vdev_id;
Michal Kaziorc51880e2015-03-30 09:51:57 +03001952 arg->peer_aid = aid;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001953 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001954 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001955 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001956 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001957}
1958
1959static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001960 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001961 struct wmi_peer_assoc_complete_arg *arg)
1962{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001963 struct ieee80211_bss_conf *info = &vif->bss_conf;
Michal Kazior500ff9f2015-03-31 10:26:21 +00001964 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001965 struct cfg80211_bss *bss;
1966 const u8 *rsnie = NULL;
1967 const u8 *wpaie = NULL;
1968
Michal Kazior548db542013-07-05 16:15:15 +03001969 lockdep_assert_held(&ar->conf_mutex);
1970
Michal Kazior500ff9f2015-03-31 10:26:21 +00001971 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
1972 return;
1973
1974 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1975 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001976 if (bss) {
1977 const struct cfg80211_bss_ies *ies;
1978
1979 rcu_read_lock();
1980 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1981
1982 ies = rcu_dereference(bss->ies);
1983
1984 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001985 WLAN_OUI_TYPE_MICROSOFT_WPA,
1986 ies->data,
1987 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001988 rcu_read_unlock();
1989 cfg80211_put_bss(ar->hw->wiphy, bss);
1990 }
1991
1992 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1993 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001994 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001995 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1996 }
1997
1998 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001999 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002000 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
2001 }
2002}
2003
2004static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002005 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002006 struct ieee80211_sta *sta,
2007 struct wmi_peer_assoc_complete_arg *arg)
2008{
2009 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002010 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002011 const struct ieee80211_supported_band *sband;
2012 const struct ieee80211_rate *rates;
2013 u32 ratemask;
Michal Kazior486017c2015-03-30 09:51:54 +03002014 u8 rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002015 int i;
2016
Michal Kazior548db542013-07-05 16:15:15 +03002017 lockdep_assert_held(&ar->conf_mutex);
2018
Michal Kazior500ff9f2015-03-31 10:26:21 +00002019 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2020 return;
2021
2022 sband = ar->hw->wiphy->bands[def.chan->band];
2023 ratemask = sta->supp_rates[def.chan->band];
Kalle Valo5e3dd152013-06-12 20:52:10 +03002024 rates = sband->bitrates;
2025
2026 rateset->num_rates = 0;
2027
2028 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2029 if (!(ratemask & 1))
2030 continue;
2031
Michal Kazior486017c2015-03-30 09:51:54 +03002032 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2033 rateset->rates[rateset->num_rates] = rate;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002034 rateset->num_rates++;
2035 }
2036}
2037
2038static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2039 struct ieee80211_sta *sta,
2040 struct wmi_peer_assoc_complete_arg *arg)
2041{
2042 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002043 int i, n;
Kalle Valoaf762c02014-09-14 12:50:17 +03002044 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002045
Michal Kazior548db542013-07-05 16:15:15 +03002046 lockdep_assert_held(&ar->conf_mutex);
2047
Kalle Valo5e3dd152013-06-12 20:52:10 +03002048 if (!ht_cap->ht_supported)
2049 return;
2050
2051 arg->peer_flags |= WMI_PEER_HT;
2052 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2053 ht_cap->ampdu_factor)) - 1;
2054
2055 arg->peer_mpdu_density =
2056 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2057
2058 arg->peer_ht_caps = ht_cap->cap;
2059 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2060
2061 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2062 arg->peer_flags |= WMI_PEER_LDPC;
2063
2064 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2065 arg->peer_flags |= WMI_PEER_40MHZ;
2066 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2067 }
2068
2069 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2070 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2071
2072 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2073 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2074
2075 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2076 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2077 arg->peer_flags |= WMI_PEER_STBC;
2078 }
2079
2080 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002081 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2082 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2083 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2084 arg->peer_rate_caps |= stbc;
2085 arg->peer_flags |= WMI_PEER_STBC;
2086 }
2087
Kalle Valo5e3dd152013-06-12 20:52:10 +03002088 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2089 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2090 else if (ht_cap->mcs.rx_mask[1])
2091 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2092
2093 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
2094 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
2095 arg->peer_ht_rates.rates[n++] = i;
2096
Bartosz Markowskifd71f802014-02-10 13:12:55 +01002097 /*
2098 * This is a workaround for HT-enabled STAs which break the spec
2099 * and have no HT capabilities RX mask (no HT RX MCS map).
2100 *
2101 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2102 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2103 *
2104 * Firmware asserts if such situation occurs.
2105 */
2106 if (n == 0) {
2107 arg->peer_ht_rates.num_rates = 8;
2108 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2109 arg->peer_ht_rates.rates[i] = i;
2110 } else {
2111 arg->peer_ht_rates.num_rates = n;
2112 arg->peer_num_spatial_streams = sta->rx_nss;
2113 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002114
Michal Kazior7aa7a722014-08-25 12:09:38 +02002115 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002116 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002117 arg->peer_ht_rates.num_rates,
2118 arg->peer_num_spatial_streams);
2119}
2120
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002121static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2122 struct ath10k_vif *arvif,
2123 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002124{
2125 u32 uapsd = 0;
2126 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002127 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002128
Michal Kazior548db542013-07-05 16:15:15 +03002129 lockdep_assert_held(&ar->conf_mutex);
2130
Kalle Valo5e3dd152013-06-12 20:52:10 +03002131 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002132 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002133 sta->uapsd_queues, sta->max_sp);
2134
Kalle Valo5e3dd152013-06-12 20:52:10 +03002135 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2136 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2137 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2138 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2139 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2140 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2141 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2142 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2143 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2144 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2145 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2146 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2147
Kalle Valo5e3dd152013-06-12 20:52:10 +03002148 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2149 max_sp = sta->max_sp;
2150
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002151 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2152 sta->addr,
2153 WMI_AP_PS_PEER_PARAM_UAPSD,
2154 uapsd);
2155 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002156 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002157 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002158 return ret;
2159 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002160
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002161 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2162 sta->addr,
2163 WMI_AP_PS_PEER_PARAM_MAX_SP,
2164 max_sp);
2165 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002166 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002167 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002168 return ret;
2169 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002170
2171 /* TODO setup this based on STA listen interval and
2172 beacon interval. Currently we don't know
2173 sta->listen_interval - mac80211 patch required.
2174 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002175 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03002176 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2177 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002178 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002179 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002180 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002181 return ret;
2182 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002183 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002184
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002185 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002186}
2187
2188static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
Michal Kazior500ff9f2015-03-31 10:26:21 +00002189 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002190 struct ieee80211_sta *sta,
2191 struct wmi_peer_assoc_complete_arg *arg)
2192{
2193 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Michal Kazior500ff9f2015-03-31 10:26:21 +00002194 struct cfg80211_chan_def def;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002195 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002196
Michal Kazior500ff9f2015-03-31 10:26:21 +00002197 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2198 return;
2199
Kalle Valo5e3dd152013-06-12 20:52:10 +03002200 if (!vht_cap->vht_supported)
2201 return;
2202
2203 arg->peer_flags |= WMI_PEER_VHT;
Yanbo Lid68bb122015-01-23 08:18:20 +08002204
Michal Kazior500ff9f2015-03-31 10:26:21 +00002205 if (def.chan->band == IEEE80211_BAND_2GHZ)
Yanbo Lid68bb122015-01-23 08:18:20 +08002206 arg->peer_flags |= WMI_PEER_VHT_2G;
2207
Kalle Valo5e3dd152013-06-12 20:52:10 +03002208 arg->peer_vht_caps = vht_cap->cap;
2209
Sujith Manoharana24b88b2013-10-07 19:51:57 -07002210 ampdu_factor = (vht_cap->cap &
2211 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2212 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2213
2214 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2215 * zero in VHT IE. Using it would result in degraded throughput.
2216 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2217 * it if VHT max_mpdu is smaller. */
2218 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2219 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2220 ampdu_factor)) - 1);
2221
Kalle Valo5e3dd152013-06-12 20:52:10 +03002222 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2223 arg->peer_flags |= WMI_PEER_80MHZ;
2224
2225 arg->peer_vht_rates.rx_max_rate =
2226 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2227 arg->peer_vht_rates.rx_mcs_set =
2228 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2229 arg->peer_vht_rates.tx_max_rate =
2230 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2231 arg->peer_vht_rates.tx_mcs_set =
2232 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2233
Michal Kazior7aa7a722014-08-25 12:09:38 +02002234 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002235 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002236}
2237
2238static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002239 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002240 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002241 struct wmi_peer_assoc_complete_arg *arg)
2242{
Michal Kazior590922a2014-10-21 10:10:29 +03002243 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2244
Kalle Valo5e3dd152013-06-12 20:52:10 +03002245 switch (arvif->vdev_type) {
2246 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002247 if (sta->wme)
2248 arg->peer_flags |= WMI_PEER_QOS;
2249
2250 if (sta->wme && sta->uapsd_queues) {
2251 arg->peer_flags |= WMI_PEER_APSD;
2252 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2253 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002254 break;
2255 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03002256 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01002257 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002258 break;
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002259 case WMI_VDEV_TYPE_IBSS:
2260 if (sta->wme)
2261 arg->peer_flags |= WMI_PEER_QOS;
2262 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002263 default:
2264 break;
2265 }
Janusz Dziedzic627d9842014-12-17 12:29:54 +02002266
2267 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2268 sta->addr, !!(arg->peer_flags & WMI_PEER_QOS));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002269}
2270
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002271static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
Michal Kazior91b12082014-12-12 12:41:35 +01002272{
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002273 return sta->supp_rates[IEEE80211_BAND_2GHZ] >>
2274 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
Michal Kazior91b12082014-12-12 12:41:35 +01002275}
2276
Kalle Valo5e3dd152013-06-12 20:52:10 +03002277static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002278 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002279 struct ieee80211_sta *sta,
2280 struct wmi_peer_assoc_complete_arg *arg)
2281{
Michal Kazior500ff9f2015-03-31 10:26:21 +00002282 struct cfg80211_chan_def def;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002283 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2284
Michal Kazior500ff9f2015-03-31 10:26:21 +00002285 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2286 return;
2287
2288 switch (def.chan->band) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002289 case IEEE80211_BAND_2GHZ:
Yanbo Lid68bb122015-01-23 08:18:20 +08002290 if (sta->vht_cap.vht_supported) {
2291 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2292 phymode = MODE_11AC_VHT40;
2293 else
2294 phymode = MODE_11AC_VHT20;
2295 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002296 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2297 phymode = MODE_11NG_HT40;
2298 else
2299 phymode = MODE_11NG_HT20;
Michal Kazior8d7aa6b2015-03-30 09:51:57 +03002300 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002301 phymode = MODE_11G;
Michal Kazior91b12082014-12-12 12:41:35 +01002302 } else {
2303 phymode = MODE_11B;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002304 }
2305
2306 break;
2307 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03002308 /*
2309 * Check VHT first.
2310 */
2311 if (sta->vht_cap.vht_supported) {
2312 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2313 phymode = MODE_11AC_VHT80;
2314 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2315 phymode = MODE_11AC_VHT40;
2316 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2317 phymode = MODE_11AC_VHT20;
2318 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002319 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2320 phymode = MODE_11NA_HT40;
2321 else
2322 phymode = MODE_11NA_HT20;
2323 } else {
2324 phymode = MODE_11A;
2325 }
2326
2327 break;
2328 default:
2329 break;
2330 }
2331
Michal Kazior7aa7a722014-08-25 12:09:38 +02002332 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03002333 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03002334
Kalle Valo5e3dd152013-06-12 20:52:10 +03002335 arg->peer_phymode = phymode;
2336 WARN_ON(phymode == MODE_UNKNOWN);
2337}
2338
Kalle Valob9ada652013-10-16 15:44:46 +03002339static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03002340 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03002341 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03002342 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002343{
Michal Kazior548db542013-07-05 16:15:15 +03002344 lockdep_assert_held(&ar->conf_mutex);
2345
Kalle Valob9ada652013-10-16 15:44:46 +03002346 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002347
Michal Kazior590922a2014-10-21 10:10:29 +03002348 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2349 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002350 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
Kalle Valob9ada652013-10-16 15:44:46 +03002351 ath10k_peer_assoc_h_ht(ar, sta, arg);
Michal Kazior500ff9f2015-03-31 10:26:21 +00002352 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03002353 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2354 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002355
Kalle Valob9ada652013-10-16 15:44:46 +03002356 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002357}
2358
Michal Kazior90046f52014-02-14 14:45:51 +01002359static const u32 ath10k_smps_map[] = {
2360 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2361 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2362 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2363 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2364};
2365
2366static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2367 const u8 *addr,
2368 const struct ieee80211_sta_ht_cap *ht_cap)
2369{
2370 int smps;
2371
2372 if (!ht_cap->ht_supported)
2373 return 0;
2374
2375 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2376 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2377
2378 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2379 return -EINVAL;
2380
2381 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2382 WMI_PEER_SMPS_STATE,
2383 ath10k_smps_map[smps]);
2384}
2385
Michal Kazior139e1702015-02-15 16:50:42 +02002386static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2387 struct ieee80211_vif *vif,
2388 struct ieee80211_sta_vht_cap vht_cap)
2389{
2390 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2391 int ret;
2392 u32 param;
2393 u32 value;
2394
2395 if (!(ar->vht_cap_info &
2396 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2397 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2398 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2399 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2400 return 0;
2401
2402 param = ar->wmi.vdev_param->txbf;
2403 value = 0;
2404
2405 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2406 return 0;
2407
2408 /* The following logic is correct. If a remote STA advertises support
2409 * for being a beamformer then we should enable us being a beamformee.
2410 */
2411
2412 if (ar->vht_cap_info &
2413 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2414 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2415 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2416 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2417
2418 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2419 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2420 }
2421
2422 if (ar->vht_cap_info &
2423 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2424 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2425 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2426 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2427
2428 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2429 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2430 }
2431
2432 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2433 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2434
2435 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2436 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2437
2438 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2439 if (ret) {
2440 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2441 value, ret);
2442 return ret;
2443 }
2444
2445 return 0;
2446}
2447
Kalle Valo5e3dd152013-06-12 20:52:10 +03002448/* can be called only in mac80211 callbacks due to `key_count` usage */
2449static void ath10k_bss_assoc(struct ieee80211_hw *hw,
2450 struct ieee80211_vif *vif,
2451 struct ieee80211_bss_conf *bss_conf)
2452{
2453 struct ath10k *ar = hw->priv;
2454 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01002455 struct ieee80211_sta_ht_cap ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002456 struct ieee80211_sta_vht_cap vht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03002457 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002458 struct ieee80211_sta *ap_sta;
2459 int ret;
2460
Michal Kazior548db542013-07-05 16:15:15 +03002461 lockdep_assert_held(&ar->conf_mutex);
2462
Michal Kazior077efc82014-10-21 10:10:29 +03002463 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2464 arvif->vdev_id, arvif->bssid, arvif->aid);
2465
Kalle Valo5e3dd152013-06-12 20:52:10 +03002466 rcu_read_lock();
2467
2468 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2469 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002470 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002471 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002472 rcu_read_unlock();
2473 return;
2474 }
2475
Michal Kazior90046f52014-02-14 14:45:51 +01002476 /* ap_sta must be accessed only within rcu section which must be left
2477 * before calling ath10k_setup_peer_smps() which might sleep. */
2478 ht_cap = ap_sta->ht_cap;
Michal Kazior139e1702015-02-15 16:50:42 +02002479 vht_cap = ap_sta->vht_cap;
Michal Kazior90046f52014-02-14 14:45:51 +01002480
Michal Kazior590922a2014-10-21 10:10:29 +03002481 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002482 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002483 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002484 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002485 rcu_read_unlock();
2486 return;
2487 }
2488
2489 rcu_read_unlock();
2490
Kalle Valob9ada652013-10-16 15:44:46 +03002491 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2492 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002493 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002494 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002495 return;
2496 }
2497
Michal Kazior90046f52014-02-14 14:45:51 +01002498 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
2499 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002500 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002501 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01002502 return;
2503 }
2504
Michal Kazior139e1702015-02-15 16:50:42 +02002505 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2506 if (ret) {
2507 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2508 arvif->vdev_id, bss_conf->bssid, ret);
2509 return;
2510 }
2511
Michal Kazior7aa7a722014-08-25 12:09:38 +02002512 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002513 "mac vdev %d up (associated) bssid %pM aid %d\n",
2514 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2515
Michal Kazior077efc82014-10-21 10:10:29 +03002516 WARN_ON(arvif->is_up);
2517
Michal Kaziorc930f742014-01-23 11:38:25 +01002518 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03002519 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01002520
2521 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2522 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002523 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002524 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01002525 return;
2526 }
2527
2528 arvif->is_up = true;
Michal Kazior0a987fb2015-02-13 13:30:15 +01002529
2530 /* Workaround: Some firmware revisions (tested with qca6174
2531 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2532 * poked with peer param command.
2533 */
2534 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
2535 WMI_PEER_DUMMY_VAR, 1);
2536 if (ret) {
2537 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2538 arvif->bssid, arvif->vdev_id, ret);
2539 return;
2540 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002541}
2542
Kalle Valo5e3dd152013-06-12 20:52:10 +03002543static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
2544 struct ieee80211_vif *vif)
2545{
2546 struct ath10k *ar = hw->priv;
2547 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior139e1702015-02-15 16:50:42 +02002548 struct ieee80211_sta_vht_cap vht_cap = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +03002549 int ret;
2550
Michal Kazior548db542013-07-05 16:15:15 +03002551 lockdep_assert_held(&ar->conf_mutex);
2552
Michal Kazior077efc82014-10-21 10:10:29 +03002553 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2554 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002555
Kalle Valo5e3dd152013-06-12 20:52:10 +03002556 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03002557 if (ret)
2558 ath10k_warn(ar, "faield to down vdev %i: %d\n",
2559 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002560
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002561 arvif->def_wep_key_idx = -1;
2562
Michal Kazior139e1702015-02-15 16:50:42 +02002563 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
2564 if (ret) {
2565 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
2566 arvif->vdev_id, ret);
2567 return;
2568 }
2569
Michal Kaziorc930f742014-01-23 11:38:25 +01002570 arvif->is_up = false;
Michal Kaziorcc9904e2015-03-10 16:22:01 +02002571
2572 cancel_delayed_work_sync(&arvif->connection_loss_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002573}
2574
Michal Kazior590922a2014-10-21 10:10:29 +03002575static int ath10k_station_assoc(struct ath10k *ar,
2576 struct ieee80211_vif *vif,
2577 struct ieee80211_sta *sta,
2578 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002579{
Michal Kazior590922a2014-10-21 10:10:29 +03002580 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03002581 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002582 int ret = 0;
2583
Michal Kazior548db542013-07-05 16:15:15 +03002584 lockdep_assert_held(&ar->conf_mutex);
2585
Michal Kazior590922a2014-10-21 10:10:29 +03002586 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002587 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002588 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002589 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03002590 return ret;
2591 }
2592
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02002593 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03002594 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
2595 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002596 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002597 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002598 return ret;
2599 }
2600
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002601 /* Re-assoc is run only to update supported rates for given station. It
2602 * doesn't make much sense to reconfigure the peer completely.
2603 */
2604 if (!reassoc) {
2605 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
2606 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002607 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002608 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002609 arvif->vdev_id, ret);
2610 return ret;
2611 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002612
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002613 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
2614 if (ret) {
2615 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
2616 sta->addr, arvif->vdev_id, ret);
2617 return ret;
2618 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002619
Michal Kaziorb1ecde32014-10-21 10:10:29 +03002620 if (!sta->wme) {
2621 arvif->num_legacy_stations++;
2622 ret = ath10k_recalc_rtscts_prot(arvif);
2623 if (ret) {
2624 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2625 arvif->vdev_id, ret);
2626 return ret;
2627 }
2628 }
2629
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02002630 /* Plumb cached keys only for static WEP */
2631 if (arvif->def_wep_key_idx != -1) {
2632 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
2633 if (ret) {
2634 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
2635 arvif->vdev_id, ret);
2636 return ret;
2637 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002638 }
2639 }
2640
Kalle Valo5e3dd152013-06-12 20:52:10 +03002641 return ret;
2642}
2643
Michal Kazior590922a2014-10-21 10:10:29 +03002644static int ath10k_station_disassoc(struct ath10k *ar,
2645 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002646 struct ieee80211_sta *sta)
2647{
Michal Kazior590922a2014-10-21 10:10:29 +03002648 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002649 int ret = 0;
2650
2651 lockdep_assert_held(&ar->conf_mutex);
2652
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002653 if (!sta->wme) {
2654 arvif->num_legacy_stations--;
2655 ret = ath10k_recalc_rtscts_prot(arvif);
2656 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002657 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002658 arvif->vdev_id, ret);
2659 return ret;
2660 }
2661 }
2662
Kalle Valo5e3dd152013-06-12 20:52:10 +03002663 ret = ath10k_clear_peer_keys(arvif, sta->addr);
2664 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002665 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002666 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002667 return ret;
2668 }
2669
2670 return ret;
2671}
2672
2673/**************/
2674/* Regulatory */
2675/**************/
2676
2677static int ath10k_update_channel_list(struct ath10k *ar)
2678{
2679 struct ieee80211_hw *hw = ar->hw;
2680 struct ieee80211_supported_band **bands;
2681 enum ieee80211_band band;
2682 struct ieee80211_channel *channel;
2683 struct wmi_scan_chan_list_arg arg = {0};
2684 struct wmi_channel_arg *ch;
2685 bool passive;
2686 int len;
2687 int ret;
2688 int i;
2689
Michal Kazior548db542013-07-05 16:15:15 +03002690 lockdep_assert_held(&ar->conf_mutex);
2691
Kalle Valo5e3dd152013-06-12 20:52:10 +03002692 bands = hw->wiphy->bands;
2693 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2694 if (!bands[band])
2695 continue;
2696
2697 for (i = 0; i < bands[band]->n_channels; i++) {
2698 if (bands[band]->channels[i].flags &
2699 IEEE80211_CHAN_DISABLED)
2700 continue;
2701
2702 arg.n_channels++;
2703 }
2704 }
2705
2706 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
2707 arg.channels = kzalloc(len, GFP_KERNEL);
2708 if (!arg.channels)
2709 return -ENOMEM;
2710
2711 ch = arg.channels;
2712 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2713 if (!bands[band])
2714 continue;
2715
2716 for (i = 0; i < bands[band]->n_channels; i++) {
2717 channel = &bands[band]->channels[i];
2718
2719 if (channel->flags & IEEE80211_CHAN_DISABLED)
2720 continue;
2721
2722 ch->allow_ht = true;
2723
2724 /* FIXME: when should we really allow VHT? */
2725 ch->allow_vht = true;
2726
2727 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002728 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002729
2730 ch->ht40plus =
2731 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
2732
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002733 ch->chan_radar =
2734 !!(channel->flags & IEEE80211_CHAN_RADAR);
2735
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02002736 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002737 ch->passive = passive;
2738
2739 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02002740 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07002741 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07002742 ch->max_power = channel->max_power * 2;
2743 ch->max_reg_power = channel->max_reg_power * 2;
2744 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002745 ch->reg_class_id = 0; /* FIXME */
2746
2747 /* FIXME: why use only legacy modes, why not any
2748 * HT/VHT modes? Would that even make any
2749 * difference? */
2750 if (channel->band == IEEE80211_BAND_2GHZ)
2751 ch->mode = MODE_11G;
2752 else
2753 ch->mode = MODE_11A;
2754
2755 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
2756 continue;
2757
Michal Kazior7aa7a722014-08-25 12:09:38 +02002758 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03002759 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2760 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002761 ch->freq, ch->max_power, ch->max_reg_power,
2762 ch->max_antenna_gain, ch->mode);
2763
2764 ch++;
2765 }
2766 }
2767
2768 ret = ath10k_wmi_scan_chan_list(ar, &arg);
2769 kfree(arg.channels);
2770
2771 return ret;
2772}
2773
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002774static enum wmi_dfs_region
2775ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
2776{
2777 switch (dfs_region) {
2778 case NL80211_DFS_UNSET:
2779 return WMI_UNINIT_DFS_DOMAIN;
2780 case NL80211_DFS_FCC:
2781 return WMI_FCC_DFS_DOMAIN;
2782 case NL80211_DFS_ETSI:
2783 return WMI_ETSI_DFS_DOMAIN;
2784 case NL80211_DFS_JP:
2785 return WMI_MKK4_DFS_DOMAIN;
2786 }
2787 return WMI_UNINIT_DFS_DOMAIN;
2788}
2789
Michal Kaziorf7843d72013-07-16 09:38:52 +02002790static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002791{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002792 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002793 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002794 enum wmi_dfs_region wmi_dfs_reg;
2795 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002796
Michal Kaziorf7843d72013-07-16 09:38:52 +02002797 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002798
2799 ret = ath10k_update_channel_list(ar);
2800 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002801 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002802
2803 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002804
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002805 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
2806 nl_dfs_reg = ar->dfs_detector->region;
2807 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
2808 } else {
2809 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
2810 }
2811
Kalle Valo5e3dd152013-06-12 20:52:10 +03002812 /* Target allows setting up per-band regdomain but ath_common provides
2813 * a combined one only */
2814 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02002815 regpair->reg_domain,
2816 regpair->reg_domain, /* 2ghz */
2817 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002818 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02002819 regpair->reg_5ghz_ctl,
2820 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002821 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002822 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02002823}
Michal Kazior548db542013-07-05 16:15:15 +03002824
Michal Kaziorf7843d72013-07-16 09:38:52 +02002825static void ath10k_reg_notifier(struct wiphy *wiphy,
2826 struct regulatory_request *request)
2827{
2828 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2829 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002830 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002831
2832 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
2833
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002834 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002835 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002836 request->dfs_region);
2837 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
2838 request->dfs_region);
2839 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002840 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02002841 request->dfs_region);
2842 }
2843
Michal Kaziorf7843d72013-07-16 09:38:52 +02002844 mutex_lock(&ar->conf_mutex);
2845 if (ar->state == ATH10K_STATE_ON)
2846 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03002847 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002848}
2849
2850/***************/
2851/* TX handlers */
2852/***************/
2853
Michal Kazior96d828d2015-03-31 10:26:23 +00002854void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
2855{
2856 lockdep_assert_held(&ar->htt.tx_lock);
2857
2858 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2859 ar->tx_paused |= BIT(reason);
2860 ieee80211_stop_queues(ar->hw);
2861}
2862
2863static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
2864 struct ieee80211_vif *vif)
2865{
2866 struct ath10k *ar = data;
2867 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2868
2869 if (arvif->tx_paused)
2870 return;
2871
2872 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
2873}
2874
2875void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
2876{
2877 lockdep_assert_held(&ar->htt.tx_lock);
2878
2879 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
2880 ar->tx_paused &= ~BIT(reason);
2881
2882 if (ar->tx_paused)
2883 return;
2884
2885 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2886 IEEE80211_IFACE_ITER_RESUME_ALL,
2887 ath10k_mac_tx_unlock_iter,
2888 ar);
2889}
2890
2891void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
2892{
2893 struct ath10k *ar = arvif->ar;
2894
2895 lockdep_assert_held(&ar->htt.tx_lock);
2896
2897 WARN_ON(reason >= BITS_PER_LONG);
2898 arvif->tx_paused |= BIT(reason);
2899 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
2900}
2901
2902void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
2903{
2904 struct ath10k *ar = arvif->ar;
2905
2906 lockdep_assert_held(&ar->htt.tx_lock);
2907
2908 WARN_ON(reason >= BITS_PER_LONG);
2909 arvif->tx_paused &= ~BIT(reason);
2910
2911 if (ar->tx_paused)
2912 return;
2913
2914 if (arvif->tx_paused)
2915 return;
2916
2917 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
2918}
2919
Michal Kaziorb4aa5392015-03-31 10:26:24 +00002920static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
2921 enum wmi_tlv_tx_pause_id pause_id,
2922 enum wmi_tlv_tx_pause_action action)
2923{
2924 struct ath10k *ar = arvif->ar;
2925
2926 lockdep_assert_held(&ar->htt.tx_lock);
2927
2928 switch (pause_id) {
2929 case WMI_TLV_TX_PAUSE_ID_MCC:
2930 case WMI_TLV_TX_PAUSE_ID_P2P_CLI_NOA:
2931 case WMI_TLV_TX_PAUSE_ID_P2P_GO_PS:
2932 case WMI_TLV_TX_PAUSE_ID_AP_PS:
2933 case WMI_TLV_TX_PAUSE_ID_IBSS_PS:
2934 switch (action) {
2935 case WMI_TLV_TX_PAUSE_ACTION_STOP:
2936 ath10k_mac_vif_tx_lock(arvif, pause_id);
2937 break;
2938 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
2939 ath10k_mac_vif_tx_unlock(arvif, pause_id);
2940 break;
2941 default:
2942 ath10k_warn(ar, "received unknown tx pause action %d on vdev %i, ignoring\n",
2943 action, arvif->vdev_id);
2944 break;
2945 }
2946 break;
2947 case WMI_TLV_TX_PAUSE_ID_AP_PEER_PS:
2948 case WMI_TLV_TX_PAUSE_ID_AP_PEER_UAPSD:
2949 case WMI_TLV_TX_PAUSE_ID_STA_ADD_BA:
2950 case WMI_TLV_TX_PAUSE_ID_HOST:
2951 default:
2952 /* FIXME: Some pause_ids aren't vdev specific. Instead they
2953 * target peer_id and tid. Implementing these could improve
2954 * traffic scheduling fairness across multiple connected
2955 * stations in AP/IBSS modes.
2956 */
2957 ath10k_dbg(ar, ATH10K_DBG_MAC,
2958 "mac ignoring unsupported tx pause vdev %i id %d\n",
2959 arvif->vdev_id, pause_id);
2960 break;
2961 }
2962}
2963
2964struct ath10k_mac_tx_pause {
2965 u32 vdev_id;
2966 enum wmi_tlv_tx_pause_id pause_id;
2967 enum wmi_tlv_tx_pause_action action;
2968};
2969
2970static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
2971 struct ieee80211_vif *vif)
2972{
2973 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2974 struct ath10k_mac_tx_pause *arg = data;
2975
2976 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
2977}
2978
2979void ath10k_mac_handle_tx_pause(struct ath10k *ar, u32 vdev_id,
2980 enum wmi_tlv_tx_pause_id pause_id,
2981 enum wmi_tlv_tx_pause_action action)
2982{
2983 struct ath10k_mac_tx_pause arg = {
2984 .vdev_id = vdev_id,
2985 .pause_id = pause_id,
2986 .action = action,
2987 };
2988
2989 spin_lock_bh(&ar->htt.tx_lock);
2990 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2991 IEEE80211_IFACE_ITER_RESUME_ALL,
2992 ath10k_mac_handle_tx_pause_iter,
2993 &arg);
2994 spin_unlock_bh(&ar->htt.tx_lock);
2995}
2996
Michal Kazior42c3aa62013-10-02 11:03:38 +02002997static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
2998{
2999 if (ieee80211_is_mgmt(hdr->frame_control))
3000 return HTT_DATA_TX_EXT_TID_MGMT;
3001
3002 if (!ieee80211_is_data_qos(hdr->frame_control))
3003 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3004
3005 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
3006 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
3007
3008 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
3009}
3010
Michal Kazior2b37c292014-09-02 11:00:22 +03003011static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003012{
Michal Kazior2b37c292014-09-02 11:00:22 +03003013 if (vif)
3014 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003015
Michal Kazior1bbc0972014-04-08 09:45:47 +03003016 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003017 return ar->monitor_vdev_id;
3018
Michal Kazior7aa7a722014-08-25 12:09:38 +02003019 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02003020 return 0;
3021}
3022
Michal Kaziord740d8f2015-03-30 09:51:51 +03003023static enum ath10k_hw_txrx_mode
3024ath10k_tx_h_get_txmode(struct ath10k *ar, struct ieee80211_vif *vif,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003025 struct ieee80211_sta *sta, struct sk_buff *skb)
Michal Kaziord740d8f2015-03-30 09:51:51 +03003026{
3027 const struct ieee80211_hdr *hdr = (void *)skb->data;
3028 __le16 fc = hdr->frame_control;
3029
3030 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3031 return ATH10K_HW_TXRX_RAW;
3032
3033 if (ieee80211_is_mgmt(fc))
3034 return ATH10K_HW_TXRX_MGMT;
3035
3036 /* Workaround:
3037 *
3038 * NullFunc frames are mostly used to ping if a client or AP are still
3039 * reachable and responsive. This implies tx status reports must be
3040 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3041 * come to a conclusion that the other end disappeared and tear down
3042 * BSS connection or it can never disconnect from BSS/client (which is
3043 * the case).
3044 *
3045 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3046 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3047 * which seems to deliver correct tx reports for NullFunc frames. The
3048 * downside of using it is it ignores client powersave state so it can
3049 * end up disconnecting sleeping clients in AP mode. It should fix STA
3050 * mode though because AP don't sleep.
3051 */
3052 if (ar->htt.target_version_major < 3 &&
3053 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3054 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, ar->fw_features))
3055 return ATH10K_HW_TXRX_MGMT;
3056
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003057 /* Workaround:
3058 *
3059 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3060 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3061 * to work with Ethernet txmode so use it.
3062 */
3063 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3064 return ATH10K_HW_TXRX_ETHERNET;
3065
Michal Kaziord740d8f2015-03-30 09:51:51 +03003066 return ATH10K_HW_TXRX_NATIVE_WIFI;
3067}
3068
Michal Kazior4b604552014-07-21 21:03:09 +03003069/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3070 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03003071 */
Michal Kazior4b604552014-07-21 21:03:09 +03003072static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003073{
3074 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003075 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003076 u8 *qos_ctl;
3077
3078 if (!ieee80211_is_data_qos(hdr->frame_control))
3079 return;
3080
3081 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02003082 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3083 skb->data, (void *)qos_ctl - (void *)skb->data);
3084 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003085
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003086 /* Some firmware revisions don't handle sending QoS NullFunc well.
3087 * These frames are mainly used for CQM purposes so it doesn't really
3088 * matter whether QoS NullFunc or NullFunc are sent.
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003089 */
Michal Kaziorbf0a26d2015-01-24 12:14:51 +02003090 hdr = (void *)skb->data;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003091 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
Michal Kaziorc21c64d2014-07-21 21:03:10 +03003092 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
Michal Kazior8bad8dc2015-03-11 14:25:26 +01003093
3094 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003095}
3096
Michal Kaziord740d8f2015-03-30 09:51:51 +03003097static void ath10k_tx_h_8023(struct sk_buff *skb)
3098{
3099 struct ieee80211_hdr *hdr;
3100 struct rfc1042_hdr *rfc1042;
3101 struct ethhdr *eth;
3102 size_t hdrlen;
3103 u8 da[ETH_ALEN];
3104 u8 sa[ETH_ALEN];
3105 __be16 type;
3106
3107 hdr = (void *)skb->data;
3108 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3109 rfc1042 = (void *)skb->data + hdrlen;
3110
3111 ether_addr_copy(da, ieee80211_get_DA(hdr));
3112 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3113 type = rfc1042->snap_type;
3114
3115 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3116 skb_push(skb, sizeof(*eth));
3117
3118 eth = (void *)skb->data;
3119 ether_addr_copy(eth->h_dest, da);
3120 ether_addr_copy(eth->h_source, sa);
3121 eth->h_proto = type;
3122}
3123
Michal Kazior4b604552014-07-21 21:03:09 +03003124static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3125 struct ieee80211_vif *vif,
3126 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003127{
3128 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003129 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3130
3131 /* This is case only for P2P_GO */
3132 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
3133 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
3134 return;
3135
3136 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3137 spin_lock_bh(&ar->data_lock);
3138 if (arvif->u.ap.noa_data)
3139 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3140 GFP_ATOMIC))
3141 memcpy(skb_put(skb, arvif->u.ap.noa_len),
3142 arvif->u.ap.noa_data,
3143 arvif->u.ap.noa_len);
3144 spin_unlock_bh(&ar->data_lock);
3145 }
3146}
3147
Michal Kazior8d6d3622014-11-24 14:58:31 +01003148static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
3149{
3150 /* FIXME: Not really sure since when the behaviour changed. At some
3151 * point new firmware stopped requiring creation of peer entries for
3152 * offchannel tx (and actually creating them causes issues with wmi-htc
3153 * tx credit replenishment and reliability). Assuming it's at least 3.4
3154 * because that's when the `freq` was introduced to TX_FRM HTT command.
3155 */
3156 return !(ar->htt.target_version_major >= 3 &&
3157 ar->htt.target_version_minor >= 4);
3158}
3159
Michal Kaziord740d8f2015-03-30 09:51:51 +03003160static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003161{
Michal Kaziord740d8f2015-03-30 09:51:51 +03003162 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003163 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003164
Michal Kaziord740d8f2015-03-30 09:51:51 +03003165 spin_lock_bh(&ar->data_lock);
3166
3167 if (skb_queue_len(q) == ATH10K_MAX_NUM_MGMT_PENDING) {
3168 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3169 ret = -ENOSPC;
3170 goto unlock;
Michal Kazior961d4c32013-08-09 10:13:34 +02003171 }
3172
Michal Kaziord740d8f2015-03-30 09:51:51 +03003173 __skb_queue_tail(q, skb);
3174 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3175
3176unlock:
3177 spin_unlock_bh(&ar->data_lock);
3178
3179 return ret;
3180}
3181
3182static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
3183{
3184 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3185 struct ath10k_htt *htt = &ar->htt;
3186 int ret = 0;
3187
3188 switch (cb->txmode) {
3189 case ATH10K_HW_TXRX_RAW:
3190 case ATH10K_HW_TXRX_NATIVE_WIFI:
3191 case ATH10K_HW_TXRX_ETHERNET:
3192 ret = ath10k_htt_tx(htt, skb);
3193 break;
3194 case ATH10K_HW_TXRX_MGMT:
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003195 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
Michal Kaziord740d8f2015-03-30 09:51:51 +03003196 ar->fw_features))
3197 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3198 else if (ar->htt.target_version_major >= 3)
3199 ret = ath10k_htt_tx(htt, skb);
3200 else
3201 ret = ath10k_htt_mgmt_tx(htt, skb);
3202 break;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003203 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003204
3205 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003206 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3207 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003208 ieee80211_free_txskb(ar->hw, skb);
3209 }
3210}
3211
3212void ath10k_offchan_tx_purge(struct ath10k *ar)
3213{
3214 struct sk_buff *skb;
3215
3216 for (;;) {
3217 skb = skb_dequeue(&ar->offchan_tx_queue);
3218 if (!skb)
3219 break;
3220
3221 ieee80211_free_txskb(ar->hw, skb);
3222 }
3223}
3224
3225void ath10k_offchan_tx_work(struct work_struct *work)
3226{
3227 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
3228 struct ath10k_peer *peer;
3229 struct ieee80211_hdr *hdr;
3230 struct sk_buff *skb;
3231 const u8 *peer_addr;
3232 int vdev_id;
3233 int ret;
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003234 unsigned long time_left;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003235
3236 /* FW requirement: We must create a peer before FW will send out
3237 * an offchannel frame. Otherwise the frame will be stuck and
3238 * never transmitted. We delete the peer upon tx completion.
3239 * It is unlikely that a peer for offchannel tx will already be
3240 * present. However it may be in some rare cases so account for that.
3241 * Otherwise we might remove a legitimate peer and break stuff. */
3242
3243 for (;;) {
3244 skb = skb_dequeue(&ar->offchan_tx_queue);
3245 if (!skb)
3246 break;
3247
3248 mutex_lock(&ar->conf_mutex);
3249
Michal Kazior7aa7a722014-08-25 12:09:38 +02003250 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003251 skb);
3252
3253 hdr = (struct ieee80211_hdr *)skb->data;
3254 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003255 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003256
3257 spin_lock_bh(&ar->data_lock);
3258 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
3259 spin_unlock_bh(&ar->data_lock);
3260
3261 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03003262 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003263 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003264 peer_addr, vdev_id);
3265
3266 if (!peer) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03003267 ret = ath10k_peer_create(ar, vdev_id, peer_addr,
3268 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003269 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003270 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003271 peer_addr, vdev_id, ret);
3272 }
3273
3274 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08003275 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003276 ar->offchan_tx_skb = skb;
3277 spin_unlock_bh(&ar->data_lock);
3278
Michal Kaziord740d8f2015-03-30 09:51:51 +03003279 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003280
Nicholas Mc Guire8e9904f52015-03-30 15:39:19 +03003281 time_left =
3282 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
3283 if (time_left == 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003284 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003285 skb);
3286
3287 if (!peer) {
3288 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
3289 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003290 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003291 peer_addr, vdev_id, ret);
3292 }
3293
3294 mutex_unlock(&ar->conf_mutex);
3295 }
3296}
3297
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003298void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
3299{
3300 struct sk_buff *skb;
3301
3302 for (;;) {
3303 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3304 if (!skb)
3305 break;
3306
3307 ieee80211_free_txskb(ar->hw, skb);
3308 }
3309}
3310
3311void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
3312{
3313 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
3314 struct sk_buff *skb;
3315 int ret;
3316
3317 for (;;) {
3318 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
3319 if (!skb)
3320 break;
3321
3322 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003323 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003324 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02003325 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01003326 ieee80211_free_txskb(ar->hw, skb);
3327 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003328 }
3329}
3330
Kalle Valo5e3dd152013-06-12 20:52:10 +03003331/************/
3332/* Scanning */
3333/************/
3334
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003335void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003336{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003337 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003338
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003339 switch (ar->scan.state) {
3340 case ATH10K_SCAN_IDLE:
3341 break;
3342 case ATH10K_SCAN_RUNNING:
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003343 if (ar->scan.is_roc)
3344 ieee80211_remain_on_channel_expired(ar->hw);
John W. Linvillef6eaf1e2015-01-12 16:07:02 -05003345 /* fall through */
Michal Kazior7305d3e2014-11-24 14:58:33 +01003346 case ATH10K_SCAN_ABORTING:
3347 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003348 ieee80211_scan_completed(ar->hw,
3349 (ar->scan.state ==
3350 ATH10K_SCAN_ABORTING));
3351 /* fall through */
3352 case ATH10K_SCAN_STARTING:
3353 ar->scan.state = ATH10K_SCAN_IDLE;
3354 ar->scan_channel = NULL;
3355 ath10k_offchan_tx_purge(ar);
3356 cancel_delayed_work(&ar->scan.timeout);
3357 complete_all(&ar->scan.completed);
3358 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003359 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003360}
Kalle Valo5e3dd152013-06-12 20:52:10 +03003361
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003362void ath10k_scan_finish(struct ath10k *ar)
3363{
3364 spin_lock_bh(&ar->data_lock);
3365 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003366 spin_unlock_bh(&ar->data_lock);
3367}
3368
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003369static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003370{
3371 struct wmi_stop_scan_arg arg = {
3372 .req_id = 1, /* FIXME */
3373 .req_type = WMI_SCAN_STOP_ONE,
3374 .u.scan_id = ATH10K_SCAN_ID,
3375 };
3376 int ret;
3377
3378 lockdep_assert_held(&ar->conf_mutex);
3379
Kalle Valo5e3dd152013-06-12 20:52:10 +03003380 ret = ath10k_wmi_stop_scan(ar, &arg);
3381 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003382 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003383 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003384 }
3385
Kalle Valo5e3dd152013-06-12 20:52:10 +03003386 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003387 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003388 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003389 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003390 } else if (ret > 0) {
3391 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003392 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003393
3394out:
3395 /* Scan state should be updated upon scan completion but in case
3396 * firmware fails to deliver the event (for whatever reason) it is
3397 * desired to clean up scan state anyway. Firmware may have just
3398 * dropped the scan completion event delivery due to transport pipe
3399 * being overflown with data and/or it can recover on its own before
3400 * next scan request is submitted.
3401 */
3402 spin_lock_bh(&ar->data_lock);
3403 if (ar->scan.state != ATH10K_SCAN_IDLE)
3404 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003405 spin_unlock_bh(&ar->data_lock);
3406
3407 return ret;
3408}
3409
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003410static void ath10k_scan_abort(struct ath10k *ar)
3411{
3412 int ret;
3413
3414 lockdep_assert_held(&ar->conf_mutex);
3415
3416 spin_lock_bh(&ar->data_lock);
3417
3418 switch (ar->scan.state) {
3419 case ATH10K_SCAN_IDLE:
3420 /* This can happen if timeout worker kicked in and called
3421 * abortion while scan completion was being processed.
3422 */
3423 break;
3424 case ATH10K_SCAN_STARTING:
3425 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02003426 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003427 ath10k_scan_state_str(ar->scan.state),
3428 ar->scan.state);
3429 break;
3430 case ATH10K_SCAN_RUNNING:
3431 ar->scan.state = ATH10K_SCAN_ABORTING;
3432 spin_unlock_bh(&ar->data_lock);
3433
3434 ret = ath10k_scan_stop(ar);
3435 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003436 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003437
3438 spin_lock_bh(&ar->data_lock);
3439 break;
3440 }
3441
3442 spin_unlock_bh(&ar->data_lock);
3443}
3444
3445void ath10k_scan_timeout_work(struct work_struct *work)
3446{
3447 struct ath10k *ar = container_of(work, struct ath10k,
3448 scan.timeout.work);
3449
3450 mutex_lock(&ar->conf_mutex);
3451 ath10k_scan_abort(ar);
3452 mutex_unlock(&ar->conf_mutex);
3453}
3454
Kalle Valo5e3dd152013-06-12 20:52:10 +03003455static int ath10k_start_scan(struct ath10k *ar,
3456 const struct wmi_start_scan_arg *arg)
3457{
3458 int ret;
3459
3460 lockdep_assert_held(&ar->conf_mutex);
3461
3462 ret = ath10k_wmi_start_scan(ar, arg);
3463 if (ret)
3464 return ret;
3465
Kalle Valo5e3dd152013-06-12 20:52:10 +03003466 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
3467 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003468 ret = ath10k_scan_stop(ar);
3469 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003470 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003471
3472 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003473 }
3474
Ben Greear2f9eec02015-02-15 16:50:38 +02003475 /* If we failed to start the scan, return error code at
3476 * this point. This is probably due to some issue in the
3477 * firmware, but no need to wedge the driver due to that...
3478 */
3479 spin_lock_bh(&ar->data_lock);
3480 if (ar->scan.state == ATH10K_SCAN_IDLE) {
3481 spin_unlock_bh(&ar->data_lock);
3482 return -EINVAL;
3483 }
3484 spin_unlock_bh(&ar->data_lock);
3485
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003486 /* Add a 200ms margin to account for event/command processing */
3487 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3488 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03003489 return 0;
3490}
3491
3492/**********************/
3493/* mac80211 callbacks */
3494/**********************/
3495
3496static void ath10k_tx(struct ieee80211_hw *hw,
3497 struct ieee80211_tx_control *control,
3498 struct sk_buff *skb)
3499{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003500 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03003501 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3502 struct ieee80211_vif *vif = info->control.vif;
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003503 struct ieee80211_sta *sta = control->sta;
Michal Kazior4b604552014-07-21 21:03:09 +03003504 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Michal Kaziord740d8f2015-03-30 09:51:51 +03003505 __le16 fc = hdr->frame_control;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003506
3507 /* We should disable CCK RATE due to P2P */
3508 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003509 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003510
Michal Kazior4b604552014-07-21 21:03:09 +03003511 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Michal Kazior6fcafef2015-03-30 09:51:51 +03003512 ATH10K_SKB_CB(skb)->htt.freq = 0;
Michal Kazior4b604552014-07-21 21:03:09 +03003513 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
Michal Kazior2b37c292014-09-02 11:00:22 +03003514 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03003515 ATH10K_SKB_CB(skb)->txmode = ath10k_tx_h_get_txmode(ar, vif, sta, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003516 ATH10K_SKB_CB(skb)->is_protected = ieee80211_has_protected(fc);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003517
Michal Kaziord740d8f2015-03-30 09:51:51 +03003518 switch (ATH10K_SKB_CB(skb)->txmode) {
3519 case ATH10K_HW_TXRX_MGMT:
3520 case ATH10K_HW_TXRX_NATIVE_WIFI:
Michal Kazior4b604552014-07-21 21:03:09 +03003521 ath10k_tx_h_nwifi(hw, skb);
Michal Kazior4b604552014-07-21 21:03:09 +03003522 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
3523 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziord740d8f2015-03-30 09:51:51 +03003524 break;
3525 case ATH10K_HW_TXRX_ETHERNET:
3526 ath10k_tx_h_8023(skb);
3527 break;
3528 case ATH10K_HW_TXRX_RAW:
3529 /* FIXME: Packet injection isn't implemented. It should be
3530 * doable with firmware 10.2 on qca988x.
3531 */
3532 WARN_ON_ONCE(1);
3533 ieee80211_free_txskb(hw, skb);
3534 return;
Michal Kaziorcf84bd42013-07-16 11:04:54 +02003535 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003536
Kalle Valo5e3dd152013-06-12 20:52:10 +03003537 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
3538 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01003539 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02003540 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003541 spin_unlock_bh(&ar->data_lock);
3542
Michal Kazior8d6d3622014-11-24 14:58:31 +01003543 if (ath10k_mac_need_offchan_tx_work(ar)) {
3544 ATH10K_SKB_CB(skb)->htt.freq = 0;
3545 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003546
Michal Kazior8d6d3622014-11-24 14:58:31 +01003547 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
3548 skb);
3549
3550 skb_queue_tail(&ar->offchan_tx_queue, skb);
3551 ieee80211_queue_work(hw, &ar->offchan_tx_work);
3552 return;
3553 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003554 }
3555
Michal Kaziord740d8f2015-03-30 09:51:51 +03003556 ath10k_mac_tx(ar, skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003557}
3558
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003559/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01003560void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003561{
3562 /* make sure rcu-protected mac80211 tx path itself is drained */
3563 synchronize_net();
3564
3565 ath10k_offchan_tx_purge(ar);
3566 ath10k_mgmt_over_wmi_tx_purge(ar);
3567
3568 cancel_work_sync(&ar->offchan_tx_work);
3569 cancel_work_sync(&ar->wmi_mgmt_tx_work);
3570}
3571
Michal Kazioraffd3212013-07-16 09:54:35 +02003572void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02003573{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03003574 struct ath10k_vif *arvif;
3575
Michal Kazior818bdd12013-07-16 09:38:57 +02003576 lockdep_assert_held(&ar->conf_mutex);
3577
Michal Kazior19337472014-08-28 12:58:16 +02003578 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
3579 ar->filter_flags = 0;
3580 ar->monitor = false;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003581 ar->monitor_arvif = NULL;
Michal Kazior19337472014-08-28 12:58:16 +02003582
3583 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03003584 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02003585
3586 ar->monitor_started = false;
Michal Kazior96d828d2015-03-31 10:26:23 +00003587 ar->tx_paused = 0;
Michal Kazior1bbc0972014-04-08 09:45:47 +03003588
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003589 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02003590 ath10k_peer_cleanup_all(ar);
3591 ath10k_core_stop(ar);
3592 ath10k_hif_power_down(ar);
3593
3594 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003595 list_for_each_entry(arvif, &ar->arvifs, list)
3596 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02003597 spin_unlock_bh(&ar->data_lock);
3598}
3599
Ben Greear46acf7b2014-05-16 17:15:38 +03003600static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
3601{
3602 struct ath10k *ar = hw->priv;
3603
3604 mutex_lock(&ar->conf_mutex);
3605
3606 if (ar->cfg_tx_chainmask) {
3607 *tx_ant = ar->cfg_tx_chainmask;
3608 *rx_ant = ar->cfg_rx_chainmask;
3609 } else {
3610 *tx_ant = ar->supp_tx_chainmask;
3611 *rx_ant = ar->supp_rx_chainmask;
3612 }
3613
3614 mutex_unlock(&ar->conf_mutex);
3615
3616 return 0;
3617}
3618
Ben Greear5572a952014-11-24 16:22:10 +02003619static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
3620{
3621 /* It is not clear that allowing gaps in chainmask
3622 * is helpful. Probably it will not do what user
3623 * is hoping for, so warn in that case.
3624 */
3625 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
3626 return;
3627
3628 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
3629 dbg, cm);
3630}
3631
Ben Greear46acf7b2014-05-16 17:15:38 +03003632static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
3633{
3634 int ret;
3635
3636 lockdep_assert_held(&ar->conf_mutex);
3637
Ben Greear5572a952014-11-24 16:22:10 +02003638 ath10k_check_chain_mask(ar, tx_ant, "tx");
3639 ath10k_check_chain_mask(ar, rx_ant, "rx");
3640
Ben Greear46acf7b2014-05-16 17:15:38 +03003641 ar->cfg_tx_chainmask = tx_ant;
3642 ar->cfg_rx_chainmask = rx_ant;
3643
3644 if ((ar->state != ATH10K_STATE_ON) &&
3645 (ar->state != ATH10K_STATE_RESTARTED))
3646 return 0;
3647
3648 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
3649 tx_ant);
3650 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003651 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003652 ret, tx_ant);
3653 return ret;
3654 }
3655
3656 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
3657 rx_ant);
3658 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003659 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03003660 ret, rx_ant);
3661 return ret;
3662 }
3663
3664 return 0;
3665}
3666
3667static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
3668{
3669 struct ath10k *ar = hw->priv;
3670 int ret;
3671
3672 mutex_lock(&ar->conf_mutex);
3673 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
3674 mutex_unlock(&ar->conf_mutex);
3675 return ret;
3676}
3677
Kalle Valo5e3dd152013-06-12 20:52:10 +03003678static int ath10k_start(struct ieee80211_hw *hw)
3679{
3680 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02003681 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003682
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003683 /*
3684 * This makes sense only when restarting hw. It is harmless to call
3685 * uncoditionally. This is necessary to make sure no HTT/WMI tx
3686 * commands will be submitted while restarting.
3687 */
3688 ath10k_drain_tx(ar);
3689
Michal Kazior548db542013-07-05 16:15:15 +03003690 mutex_lock(&ar->conf_mutex);
3691
Michal Kaziorc5058f52014-05-26 12:46:03 +03003692 switch (ar->state) {
3693 case ATH10K_STATE_OFF:
3694 ar->state = ATH10K_STATE_ON;
3695 break;
3696 case ATH10K_STATE_RESTARTING:
3697 ath10k_halt(ar);
3698 ar->state = ATH10K_STATE_RESTARTED;
3699 break;
3700 case ATH10K_STATE_ON:
3701 case ATH10K_STATE_RESTARTED:
3702 case ATH10K_STATE_WEDGED:
3703 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02003704 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03003705 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03003706 case ATH10K_STATE_UTF:
3707 ret = -EBUSY;
3708 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02003709 }
3710
3711 ret = ath10k_hif_power_up(ar);
3712 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003713 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003714 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02003715 }
3716
Kalle Valo43d2a302014-09-10 18:23:30 +03003717 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02003718 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003719 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003720 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02003721 }
3722
Bartosz Markowski226a3392013-09-26 17:47:16 +02003723 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003724 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003725 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003726 goto err_core_stop;
3727 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003728
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01003729 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03003730 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003731 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003732 goto err_core_stop;
3733 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003734
Michal Kaziorcf327842015-03-31 10:26:25 +00003735 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
3736 ret = ath10k_wmi_adaptive_qcs(ar, true);
3737 if (ret) {
3738 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
3739 ret);
3740 goto err_core_stop;
3741 }
3742 }
3743
Ben Greear46acf7b2014-05-16 17:15:38 +03003744 if (ar->cfg_tx_chainmask)
3745 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
3746 ar->cfg_rx_chainmask);
3747
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003748 /*
3749 * By default FW set ARP frames ac to voice (6). In that case ARP
3750 * exchange is not working properly for UAPSD enabled AP. ARP requests
3751 * which arrives with access category 0 are processed by network stack
3752 * and send back with access category 0, but FW changes access category
3753 * to 6. Set ARP frames access category to best effort (0) solves
3754 * this problem.
3755 */
3756
3757 ret = ath10k_wmi_pdev_set_param(ar,
3758 ar->wmi.pdev_param->arp_ac_override, 0);
3759 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003760 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003761 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03003762 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02003763 }
3764
Ashok Raj Nagarajan575f1c32015-03-19 16:37:59 +05303765 ret = ath10k_wmi_pdev_set_param(ar,
3766 ar->wmi.pdev_param->ani_enable, 1);
3767 if (ret) {
3768 ath10k_warn(ar, "failed to enable ani by default: %d\n",
3769 ret);
3770 goto err_core_stop;
3771 }
3772
Ashok Raj Nagarajanb3e71d72015-03-19 16:38:00 +05303773 ar->ani_enabled = true;
3774
Michal Kaziord6500972014-04-08 09:56:09 +03003775 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02003776 ath10k_regd_update(ar);
3777
Simon Wunderlich855aed12014-08-02 09:12:54 +03003778 ath10k_spectral_start(ar);
Rajkumar Manoharan8515b5c2015-03-15 20:36:22 +05303779 ath10k_thermal_set_throttling(ar);
Simon Wunderlich855aed12014-08-02 09:12:54 +03003780
Michal Kaziorae254432014-05-26 12:46:02 +03003781 mutex_unlock(&ar->conf_mutex);
3782 return 0;
3783
3784err_core_stop:
3785 ath10k_core_stop(ar);
3786
3787err_power_down:
3788 ath10k_hif_power_down(ar);
3789
3790err_off:
3791 ar->state = ATH10K_STATE_OFF;
3792
3793err:
Michal Kazior548db542013-07-05 16:15:15 +03003794 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01003795 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003796}
3797
3798static void ath10k_stop(struct ieee80211_hw *hw)
3799{
3800 struct ath10k *ar = hw->priv;
3801
Michal Kaziorbca7baf2014-05-26 12:46:03 +03003802 ath10k_drain_tx(ar);
3803
Michal Kazior548db542013-07-05 16:15:15 +03003804 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003805 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02003806 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03003807 ar->state = ATH10K_STATE_OFF;
3808 }
Michal Kazior548db542013-07-05 16:15:15 +03003809 mutex_unlock(&ar->conf_mutex);
3810
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003811 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02003812 cancel_work_sync(&ar->restart_work);
3813}
3814
Michal Kaziorad088bf2013-10-16 15:44:46 +03003815static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02003816{
Michal Kaziorad088bf2013-10-16 15:44:46 +03003817 struct ath10k_vif *arvif;
3818 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02003819
3820 lockdep_assert_held(&ar->conf_mutex);
3821
Michal Kaziorad088bf2013-10-16 15:44:46 +03003822 list_for_each_entry(arvif, &ar->arvifs, list) {
3823 ret = ath10k_mac_vif_setup_ps(arvif);
3824 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003825 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003826 break;
3827 }
3828 }
Michal Kazioraffd3212013-07-16 09:54:35 +02003829
Michal Kaziorad088bf2013-10-16 15:44:46 +03003830 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003831}
3832
Michal Kazior500ff9f2015-03-31 10:26:21 +00003833static void ath10k_mac_chan_reconfigure(struct ath10k *ar)
Michal Kaziorc930f742014-01-23 11:38:25 +01003834{
3835 struct ath10k_vif *arvif;
Michal Kazior500ff9f2015-03-31 10:26:21 +00003836 struct cfg80211_chan_def def;
Michal Kaziorc930f742014-01-23 11:38:25 +01003837 int ret;
3838
3839 lockdep_assert_held(&ar->conf_mutex);
3840
Michal Kazior500ff9f2015-03-31 10:26:21 +00003841 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac chan reconfigure\n");
Michal Kaziorc930f742014-01-23 11:38:25 +01003842
3843 /* First stop monitor interface. Some FW versions crash if there's a
3844 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03003845 if (ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02003846 ath10k_monitor_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01003847
3848 list_for_each_entry(arvif, &ar->arvifs, list) {
3849 if (!arvif->is_started)
3850 continue;
3851
Michal Kaziordc55e302014-07-29 12:53:36 +03003852 if (!arvif->is_up)
3853 continue;
3854
Michal Kaziorc930f742014-01-23 11:38:25 +01003855 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
3856 continue;
3857
Michal Kaziordc55e302014-07-29 12:53:36 +03003858 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01003859 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003860 ath10k_warn(ar, "failed to down vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01003861 arvif->vdev_id, ret);
3862 continue;
3863 }
3864 }
3865
Michal Kaziordc55e302014-07-29 12:53:36 +03003866 /* all vdevs are downed now - attempt to restart and re-up them */
Michal Kaziorc930f742014-01-23 11:38:25 +01003867
3868 list_for_each_entry(arvif, &ar->arvifs, list) {
3869 if (!arvif->is_started)
3870 continue;
3871
3872 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
3873 continue;
3874
Michal Kazior81a9a172015-03-05 16:02:17 +02003875 ret = ath10k_mac_setup_bcn_tmpl(arvif);
3876 if (ret)
3877 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
3878 ret);
3879
3880 ret = ath10k_mac_setup_prb_tmpl(arvif);
3881 if (ret)
3882 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
3883 ret);
3884
Michal Kazior500ff9f2015-03-31 10:26:21 +00003885 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
3886 continue;
3887
3888 ret = ath10k_vdev_restart(arvif, &def);
Michal Kaziorc930f742014-01-23 11:38:25 +01003889 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003890 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01003891 arvif->vdev_id, ret);
3892 continue;
3893 }
3894
3895 if (!arvif->is_up)
3896 continue;
3897
3898 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
3899 arvif->bssid);
3900 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003901 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01003902 arvif->vdev_id, ret);
3903 continue;
3904 }
3905 }
3906
Michal Kazior19337472014-08-28 12:58:16 +02003907 ath10k_monitor_recalc(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01003908}
3909
Michal Kazior7d9d5582014-10-21 10:40:15 +03003910static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
3911{
3912 int ret;
3913 u32 param;
3914
3915 lockdep_assert_held(&ar->conf_mutex);
3916
3917 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
3918
3919 param = ar->wmi.pdev_param->txpower_limit2g;
3920 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3921 if (ret) {
3922 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
3923 txpower, ret);
3924 return ret;
3925 }
3926
3927 param = ar->wmi.pdev_param->txpower_limit5g;
3928 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
3929 if (ret) {
3930 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
3931 txpower, ret);
3932 return ret;
3933 }
3934
3935 return 0;
3936}
3937
3938static int ath10k_mac_txpower_recalc(struct ath10k *ar)
3939{
3940 struct ath10k_vif *arvif;
3941 int ret, txpower = -1;
3942
3943 lockdep_assert_held(&ar->conf_mutex);
3944
3945 list_for_each_entry(arvif, &ar->arvifs, list) {
3946 WARN_ON(arvif->txpower < 0);
3947
3948 if (txpower == -1)
3949 txpower = arvif->txpower;
3950 else
3951 txpower = min(txpower, arvif->txpower);
3952 }
3953
3954 if (WARN_ON(txpower == -1))
3955 return -EINVAL;
3956
3957 ret = ath10k_mac_txpower_setup(ar, txpower);
3958 if (ret) {
3959 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
3960 txpower, ret);
3961 return ret;
3962 }
3963
3964 return 0;
3965}
3966
Kalle Valo5e3dd152013-06-12 20:52:10 +03003967static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
3968{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003969 struct ath10k *ar = hw->priv;
3970 struct ieee80211_conf *conf = &hw->conf;
3971 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003972
3973 mutex_lock(&ar->conf_mutex);
3974
Michal Kazioraffd3212013-07-16 09:54:35 +02003975 if (changed & IEEE80211_CONF_CHANGE_PS)
3976 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003977
3978 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02003979 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
3980 ret = ath10k_monitor_recalc(ar);
3981 if (ret)
3982 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003983 }
3984
3985 mutex_unlock(&ar->conf_mutex);
3986 return ret;
3987}
3988
Ben Greear5572a952014-11-24 16:22:10 +02003989static u32 get_nss_from_chainmask(u16 chain_mask)
3990{
3991 if ((chain_mask & 0x15) == 0x15)
3992 return 4;
3993 else if ((chain_mask & 0x7) == 0x7)
3994 return 3;
3995 else if ((chain_mask & 0x3) == 0x3)
3996 return 2;
3997 return 1;
3998}
3999
Kalle Valo5e3dd152013-06-12 20:52:10 +03004000/*
4001 * TODO:
4002 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4003 * because we will send mgmt frames without CCK. This requirement
4004 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4005 * in the TX packet.
4006 */
4007static int ath10k_add_interface(struct ieee80211_hw *hw,
4008 struct ieee80211_vif *vif)
4009{
4010 struct ath10k *ar = hw->priv;
4011 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4012 enum wmi_sta_powersave_param param;
4013 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02004014 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004015 int bit;
Michal Kazior96d828d2015-03-31 10:26:23 +00004016 int i;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004017 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004018
Johannes Berg848955c2014-11-11 12:48:42 +01004019 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
4020
Kalle Valo5e3dd152013-06-12 20:52:10 +03004021 mutex_lock(&ar->conf_mutex);
4022
Michal Kazior0dbd09e2013-07-31 10:55:14 +02004023 memset(arvif, 0, sizeof(*arvif));
4024
Kalle Valo5e3dd152013-06-12 20:52:10 +03004025 arvif->ar = ar;
4026 arvif->vif = vif;
4027
Ben Greeare63b33f2013-10-22 14:54:14 -07004028 INIT_LIST_HEAD(&arvif->list);
Michal Kazior81a9a172015-03-05 16:02:17 +02004029 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004030 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4031 ath10k_mac_vif_sta_connection_loss_work);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03004032
Ben Greeara9aefb32014-08-12 11:02:19 +03004033 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004034 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004035 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03004036 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004037 }
Ben Greear16c11172014-09-23 14:17:16 -07004038 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004039
Ben Greear16c11172014-09-23 14:17:16 -07004040 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
4041 bit, ar->free_vdev_map);
4042
4043 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004044 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004045
Kalle Valo5e3dd152013-06-12 20:52:10 +03004046 switch (vif->type) {
Michal Kazior75d2bd42014-12-12 12:41:39 +01004047 case NL80211_IFTYPE_P2P_DEVICE:
4048 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4049 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
4050 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004051 case NL80211_IFTYPE_UNSPECIFIED:
4052 case NL80211_IFTYPE_STATION:
4053 arvif->vdev_type = WMI_VDEV_TYPE_STA;
4054 if (vif->p2p)
4055 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
4056 break;
4057 case NL80211_IFTYPE_ADHOC:
4058 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
4059 break;
4060 case NL80211_IFTYPE_AP:
4061 arvif->vdev_type = WMI_VDEV_TYPE_AP;
4062
4063 if (vif->p2p)
4064 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
4065 break;
4066 case NL80211_IFTYPE_MONITOR:
4067 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
4068 break;
4069 default:
4070 WARN_ON(1);
4071 break;
4072 }
4073
Michal Kazior96d828d2015-03-31 10:26:23 +00004074 /* Using vdev_id as queue number will make it very easy to do per-vif
4075 * tx queue locking. This shouldn't wrap due to interface combinations
4076 * but do a modulo for correctness sake and prevent using offchannel tx
4077 * queues for regular vif tx.
4078 */
4079 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4080 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
4081 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
4082
Michal Kazior64badcb2014-09-18 11:18:02 +03004083 /* Some firmware revisions don't wait for beacon tx completion before
4084 * sending another SWBA event. This could lead to hardware using old
4085 * (freed) beacon data in some cases, e.g. tx credit starvation
4086 * combined with missed TBTT. This is very very rare.
4087 *
4088 * On non-IOMMU-enabled hosts this could be a possible security issue
4089 * because hw could beacon some random data on the air. On
4090 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4091 * device would crash.
4092 *
4093 * Since there are no beacon tx completions (implicit nor explicit)
4094 * propagated to host the only workaround for this is to allocate a
4095 * DMA-coherent buffer for a lifetime of a vif and use it for all
4096 * beacon tx commands. Worst case for this approach is some beacons may
4097 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4098 */
4099 if (vif->type == NL80211_IFTYPE_ADHOC ||
4100 vif->type == NL80211_IFTYPE_AP) {
4101 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
4102 IEEE80211_MAX_FRAME_LEN,
4103 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05304104 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03004105 if (!arvif->beacon_buf) {
4106 ret = -ENOMEM;
4107 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
4108 ret);
4109 goto err;
4110 }
4111 }
4112
4113 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4114 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
4115 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03004116
4117 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
4118 arvif->vdev_subtype, vif->addr);
4119 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004120 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004121 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004122 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004123 }
4124
Ben Greear16c11172014-09-23 14:17:16 -07004125 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03004126 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004127
Michal Kazior46725b152015-01-28 09:57:49 +02004128 /* It makes no sense to have firmware do keepalives. mac80211 already
4129 * takes care of this with idle connection polling.
4130 */
4131 ret = ath10k_mac_vif_disable_keepalive(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004132 if (ret) {
Michal Kazior46725b152015-01-28 09:57:49 +02004133 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004134 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004135 goto err_vdev_delete;
4136 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004137
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004138 arvif->def_wep_key_idx = -1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004139
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004140 vdev_param = ar->wmi.vdev_param->tx_encap_type;
4141 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004142 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02004143 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03004144 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004145 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004146 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004147 goto err_vdev_delete;
4148 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004149
Ben Greear5572a952014-11-24 16:22:10 +02004150 if (ar->cfg_tx_chainmask) {
4151 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4152
4153 vdev_param = ar->wmi.vdev_param->nss;
4154 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4155 nss);
4156 if (ret) {
4157 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4158 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
4159 ret);
4160 goto err_vdev_delete;
4161 }
4162 }
4163
Michal Kaziore57e0572015-03-24 13:14:03 +00004164 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4165 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Marek Puzyniak7390ed32015-03-30 09:51:52 +03004166 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr,
4167 WMI_PEER_TYPE_DEFAULT);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004168 if (ret) {
Michal Kaziore57e0572015-03-24 13:14:03 +00004169 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004170 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004171 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004172 }
Michal Kaziore57e0572015-03-24 13:14:03 +00004173 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01004174
Michal Kaziore57e0572015-03-24 13:14:03 +00004175 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Kalle Valo5a13e762014-01-20 11:01:46 +02004176 ret = ath10k_mac_set_kickout(arvif);
4177 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004178 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004179 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02004180 goto err_peer_delete;
4181 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004182 }
4183
4184 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4185 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
4186 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4187 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4188 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004189 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004190 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004191 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004192 goto err_peer_delete;
4193 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004194
Michal Kazior9f9b5742014-12-12 12:41:36 +01004195 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004196 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004197 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004198 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004199 goto err_peer_delete;
4200 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004201
Michal Kazior9f9b5742014-12-12 12:41:36 +01004202 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004203 if (ret) {
Michal Kazior9f9b5742014-12-12 12:41:36 +01004204 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004205 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004206 goto err_peer_delete;
4207 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004208 }
4209
Michal Kazior424121c2013-07-22 14:13:31 +02004210 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004211 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004212 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004213 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004214 goto err_peer_delete;
4215 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004216
Michal Kazior424121c2013-07-22 14:13:31 +02004217 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004218 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004219 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03004220 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004221 goto err_peer_delete;
4222 }
Michal Kazior679c54a2013-07-05 16:15:04 +03004223
Michal Kazior7d9d5582014-10-21 10:40:15 +03004224 arvif->txpower = vif->bss_conf.txpower;
4225 ret = ath10k_mac_txpower_recalc(ar);
4226 if (ret) {
4227 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4228 goto err_peer_delete;
4229 }
4230
Michal Kazior500ff9f2015-03-31 10:26:21 +00004231 if (vif->type == NL80211_IFTYPE_MONITOR) {
4232 ar->monitor_arvif = arvif;
4233 ret = ath10k_monitor_recalc(ar);
4234 if (ret) {
4235 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4236 goto err_peer_delete;
4237 }
4238 }
4239
Kalle Valo5e3dd152013-06-12 20:52:10 +03004240 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004241 return 0;
4242
4243err_peer_delete:
Michal Kaziore57e0572015-03-24 13:14:03 +00004244 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4245 arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
Michal Kazior9dad14a2013-10-16 15:44:45 +03004246 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
4247
4248err_vdev_delete:
4249 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07004250 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004251 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03004252
4253err:
Michal Kazior64badcb2014-09-18 11:18:02 +03004254 if (arvif->beacon_buf) {
4255 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
4256 arvif->beacon_buf, arvif->beacon_paddr);
4257 arvif->beacon_buf = NULL;
4258 }
4259
Michal Kazior9dad14a2013-10-16 15:44:45 +03004260 mutex_unlock(&ar->conf_mutex);
4261
Kalle Valo5e3dd152013-06-12 20:52:10 +03004262 return ret;
4263}
4264
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004265static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
4266{
4267 int i;
4268
4269 for (i = 0; i < BITS_PER_LONG; i++)
4270 ath10k_mac_vif_tx_unlock(arvif, i);
4271}
4272
Kalle Valo5e3dd152013-06-12 20:52:10 +03004273static void ath10k_remove_interface(struct ieee80211_hw *hw,
4274 struct ieee80211_vif *vif)
4275{
4276 struct ath10k *ar = hw->priv;
4277 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4278 int ret;
4279
Michal Kazior81a9a172015-03-05 16:02:17 +02004280 cancel_work_sync(&arvif->ap_csa_work);
Michal Kaziorcc9904e2015-03-10 16:22:01 +02004281 cancel_delayed_work_sync(&arvif->connection_loss_work);
Michal Kazior81a9a172015-03-05 16:02:17 +02004282
Sujith Manoharan5d011f52014-11-25 11:47:00 +05304283 mutex_lock(&ar->conf_mutex);
4284
Michal Kaziored543882013-09-13 14:16:56 +02004285 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03004286 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02004287 spin_unlock_bh(&ar->data_lock);
4288
Simon Wunderlich855aed12014-08-02 09:12:54 +03004289 ret = ath10k_spectral_vif_stop(arvif);
4290 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004291 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03004292 arvif->vdev_id, ret);
4293
Ben Greear16c11172014-09-23 14:17:16 -07004294 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03004295 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004296
Michal Kaziore57e0572015-03-24 13:14:03 +00004297 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4298 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004299 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
4300 vif->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004301 if (ret)
Michal Kaziore57e0572015-03-24 13:14:03 +00004302 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004303 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004304
4305 kfree(arvif->u.ap.noa_data);
4306 }
4307
Michal Kazior7aa7a722014-08-25 12:09:38 +02004308 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004309 arvif->vdev_id);
4310
Kalle Valo5e3dd152013-06-12 20:52:10 +03004311 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
4312 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004313 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004314 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004315
Michal Kazior2c512052015-02-15 16:50:40 +02004316 /* Some firmware revisions don't notify host about self-peer removal
4317 * until after associated vdev is deleted.
4318 */
Michal Kaziore57e0572015-03-24 13:14:03 +00004319 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
4320 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
Michal Kazior2c512052015-02-15 16:50:40 +02004321 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
4322 vif->addr);
4323 if (ret)
4324 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
4325 arvif->vdev_id, ret);
4326
4327 spin_lock_bh(&ar->data_lock);
4328 ar->num_peers--;
4329 spin_unlock_bh(&ar->data_lock);
4330 }
4331
Kalle Valo5e3dd152013-06-12 20:52:10 +03004332 ath10k_peer_cleanup(ar, arvif->vdev_id);
4333
Michal Kazior500ff9f2015-03-31 10:26:21 +00004334 if (vif->type == NL80211_IFTYPE_MONITOR) {
4335 ar->monitor_arvif = NULL;
4336 ret = ath10k_monitor_recalc(ar);
4337 if (ret)
4338 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
4339 }
4340
Michal Kaziorb4aa5392015-03-31 10:26:24 +00004341 spin_lock_bh(&ar->htt.tx_lock);
4342 ath10k_mac_vif_tx_unlock_all(arvif);
4343 spin_unlock_bh(&ar->htt.tx_lock);
4344
Kalle Valo5e3dd152013-06-12 20:52:10 +03004345 mutex_unlock(&ar->conf_mutex);
4346}
4347
4348/*
4349 * FIXME: Has to be verified.
4350 */
4351#define SUPPORTED_FILTERS \
4352 (FIF_PROMISC_IN_BSS | \
4353 FIF_ALLMULTI | \
4354 FIF_CONTROL | \
4355 FIF_PSPOLL | \
4356 FIF_OTHER_BSS | \
4357 FIF_BCN_PRBRESP_PROMISC | \
4358 FIF_PROBE_REQ | \
4359 FIF_FCSFAIL)
4360
4361static void ath10k_configure_filter(struct ieee80211_hw *hw,
4362 unsigned int changed_flags,
4363 unsigned int *total_flags,
4364 u64 multicast)
4365{
4366 struct ath10k *ar = hw->priv;
4367 int ret;
4368
4369 mutex_lock(&ar->conf_mutex);
4370
4371 changed_flags &= SUPPORTED_FILTERS;
4372 *total_flags &= SUPPORTED_FILTERS;
4373 ar->filter_flags = *total_flags;
4374
Michal Kazior19337472014-08-28 12:58:16 +02004375 ret = ath10k_monitor_recalc(ar);
4376 if (ret)
4377 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004378
4379 mutex_unlock(&ar->conf_mutex);
4380}
4381
4382static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
4383 struct ieee80211_vif *vif,
4384 struct ieee80211_bss_conf *info,
4385 u32 changed)
4386{
4387 struct ath10k *ar = hw->priv;
4388 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4389 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03004390 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004391
4392 mutex_lock(&ar->conf_mutex);
4393
4394 if (changed & BSS_CHANGED_IBSS)
4395 ath10k_control_ibss(arvif, info, vif->addr);
4396
4397 if (changed & BSS_CHANGED_BEACON_INT) {
4398 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004399 vdev_param = ar->wmi.vdev_param->beacon_interval;
4400 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004401 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02004402 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004403 "mac vdev %d beacon_interval %d\n",
4404 arvif->vdev_id, arvif->beacon_interval);
4405
Kalle Valo5e3dd152013-06-12 20:52:10 +03004406 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004407 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004408 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004409 }
4410
4411 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004412 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004413 "vdev %d set beacon tx mode to staggered\n",
4414 arvif->vdev_id);
4415
Bartosz Markowski226a3392013-09-26 17:47:16 +02004416 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
4417 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004418 WMI_BEACON_STAGGERED_MODE);
4419 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004420 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004421 arvif->vdev_id, ret);
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004422
4423 ret = ath10k_mac_setup_bcn_tmpl(arvif);
4424 if (ret)
4425 ath10k_warn(ar, "failed to update beacon template: %d\n",
4426 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004427 }
4428
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02004429 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
4430 ret = ath10k_mac_setup_prb_tmpl(arvif);
4431 if (ret)
4432 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
4433 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004434 }
4435
Michal Kaziorba2479f2015-01-24 12:14:51 +02004436 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004437 arvif->dtim_period = info->dtim_period;
4438
Michal Kazior7aa7a722014-08-25 12:09:38 +02004439 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004440 "mac vdev %d dtim_period %d\n",
4441 arvif->vdev_id, arvif->dtim_period);
4442
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004443 vdev_param = ar->wmi.vdev_param->dtim_period;
4444 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004445 arvif->dtim_period);
4446 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004447 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004448 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004449 }
4450
4451 if (changed & BSS_CHANGED_SSID &&
4452 vif->type == NL80211_IFTYPE_AP) {
4453 arvif->u.ap.ssid_len = info->ssid_len;
4454 if (info->ssid_len)
4455 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
4456 arvif->u.ap.hidden_ssid = info->hidden_ssid;
4457 }
4458
Michal Kazior077efc82014-10-21 10:10:29 +03004459 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4460 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004461
4462 if (changed & BSS_CHANGED_BEACON_ENABLED)
4463 ath10k_control_beaconing(arvif, info);
4464
4465 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004466 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02004467 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004468 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03004469
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02004470 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004471 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004472 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004473 arvif->vdev_id, ret);
Michal Kaziora87fd4b2015-03-02 11:21:17 +01004474
4475 vdev_param = ar->wmi.vdev_param->protection_mode;
4476 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4477 info->use_cts_prot ? 1 : 0);
4478 if (ret)
4479 ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n",
4480 info->use_cts_prot, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004481 }
4482
4483 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004484 if (info->use_short_slot)
4485 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4486
4487 else
4488 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4489
Michal Kazior7aa7a722014-08-25 12:09:38 +02004490 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03004491 arvif->vdev_id, slottime);
4492
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004493 vdev_param = ar->wmi.vdev_param->slot_time;
4494 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004495 slottime);
4496 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004497 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004498 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004499 }
4500
4501 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03004502 if (info->use_short_preamble)
4503 preamble = WMI_VDEV_PREAMBLE_SHORT;
4504 else
4505 preamble = WMI_VDEV_PREAMBLE_LONG;
4506
Michal Kazior7aa7a722014-08-25 12:09:38 +02004507 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03004508 "mac vdev %d preamble %dn",
4509 arvif->vdev_id, preamble);
4510
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02004511 vdev_param = ar->wmi.vdev_param->preamble;
4512 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03004513 preamble);
4514 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004515 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02004516 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004517 }
4518
4519 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02004520 if (info->assoc) {
4521 /* Workaround: Make sure monitor vdev is not running
4522 * when associating to prevent some firmware revisions
4523 * (e.g. 10.1 and 10.2) from crashing.
4524 */
4525 if (ar->monitor_started)
4526 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004527 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02004528 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03004529 } else {
4530 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02004531 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004532 }
4533
Michal Kazior7d9d5582014-10-21 10:40:15 +03004534 if (changed & BSS_CHANGED_TXPOWER) {
4535 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4536 arvif->vdev_id, info->txpower);
4537
4538 arvif->txpower = info->txpower;
4539 ret = ath10k_mac_txpower_recalc(ar);
4540 if (ret)
4541 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
4542 }
4543
Michal Kaziorbf14e652014-12-12 12:41:38 +01004544 if (changed & BSS_CHANGED_PS) {
Michal Kaziorcffb41f2015-02-13 13:30:16 +01004545 arvif->ps = vif->bss_conf.ps;
4546
4547 ret = ath10k_config_ps(ar);
Michal Kaziorbf14e652014-12-12 12:41:38 +01004548 if (ret)
4549 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
4550 arvif->vdev_id, ret);
4551 }
4552
Kalle Valo5e3dd152013-06-12 20:52:10 +03004553 mutex_unlock(&ar->conf_mutex);
4554}
4555
4556static int ath10k_hw_scan(struct ieee80211_hw *hw,
4557 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02004558 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004559{
4560 struct ath10k *ar = hw->priv;
4561 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02004562 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004563 struct wmi_start_scan_arg arg;
4564 int ret = 0;
4565 int i;
4566
4567 mutex_lock(&ar->conf_mutex);
4568
4569 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004570 switch (ar->scan.state) {
4571 case ATH10K_SCAN_IDLE:
4572 reinit_completion(&ar->scan.started);
4573 reinit_completion(&ar->scan.completed);
4574 ar->scan.state = ATH10K_SCAN_STARTING;
4575 ar->scan.is_roc = false;
4576 ar->scan.vdev_id = arvif->vdev_id;
4577 ret = 0;
4578 break;
4579 case ATH10K_SCAN_STARTING:
4580 case ATH10K_SCAN_RUNNING:
4581 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004582 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004583 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004584 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004585 spin_unlock_bh(&ar->data_lock);
4586
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004587 if (ret)
4588 goto exit;
4589
Kalle Valo5e3dd152013-06-12 20:52:10 +03004590 memset(&arg, 0, sizeof(arg));
4591 ath10k_wmi_start_scan_init(ar, &arg);
4592 arg.vdev_id = arvif->vdev_id;
4593 arg.scan_id = ATH10K_SCAN_ID;
4594
4595 if (!req->no_cck)
4596 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
4597
4598 if (req->ie_len) {
4599 arg.ie_len = req->ie_len;
4600 memcpy(arg.ie, req->ie, arg.ie_len);
4601 }
4602
4603 if (req->n_ssids) {
4604 arg.n_ssids = req->n_ssids;
4605 for (i = 0; i < arg.n_ssids; i++) {
4606 arg.ssids[i].len = req->ssids[i].ssid_len;
4607 arg.ssids[i].ssid = req->ssids[i].ssid;
4608 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02004609 } else {
4610 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004611 }
4612
4613 if (req->n_channels) {
4614 arg.n_channels = req->n_channels;
4615 for (i = 0; i < arg.n_channels; i++)
4616 arg.channels[i] = req->channels[i]->center_freq;
4617 }
4618
4619 ret = ath10k_start_scan(ar, &arg);
4620 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004621 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004622 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004623 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004624 spin_unlock_bh(&ar->data_lock);
4625 }
4626
4627exit:
4628 mutex_unlock(&ar->conf_mutex);
4629 return ret;
4630}
4631
4632static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
4633 struct ieee80211_vif *vif)
4634{
4635 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004636
4637 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02004638 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004639 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01004640
4641 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004642}
4643
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004644static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
4645 struct ath10k_vif *arvif,
4646 enum set_key_cmd cmd,
4647 struct ieee80211_key_conf *key)
4648{
4649 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
4650 int ret;
4651
4652 /* 10.1 firmware branch requires default key index to be set to group
4653 * key index after installing it. Otherwise FW/HW Txes corrupted
4654 * frames with multi-vif APs. This is not required for main firmware
4655 * branch (e.g. 636).
4656 *
4657 * FIXME: This has been tested only in AP. It remains unknown if this
4658 * is required for multi-vif STA interfaces on 10.1 */
4659
4660 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
4661 return;
4662
4663 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
4664 return;
4665
4666 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
4667 return;
4668
4669 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4670 return;
4671
4672 if (cmd != SET_KEY)
4673 return;
4674
4675 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4676 key->keyidx);
4677 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004678 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004679 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004680}
4681
Kalle Valo5e3dd152013-06-12 20:52:10 +03004682static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4683 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4684 struct ieee80211_key_conf *key)
4685{
4686 struct ath10k *ar = hw->priv;
4687 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4688 struct ath10k_peer *peer;
4689 const u8 *peer_addr;
4690 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4691 key->cipher == WLAN_CIPHER_SUITE_WEP104;
4692 int ret = 0;
Michal Kazior370e5672015-02-18 14:02:26 +01004693 u32 flags = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004694
Bartosz Markowskid7131c02015-03-10 14:32:19 +01004695 /* this one needs to be done in software */
4696 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
4697 return 1;
4698
Kalle Valo5e3dd152013-06-12 20:52:10 +03004699 if (key->keyidx > WMI_MAX_KEY_INDEX)
4700 return -ENOSPC;
4701
4702 mutex_lock(&ar->conf_mutex);
4703
4704 if (sta)
4705 peer_addr = sta->addr;
4706 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4707 peer_addr = vif->bss_conf.bssid;
4708 else
4709 peer_addr = vif->addr;
4710
4711 key->hw_key_idx = key->keyidx;
4712
4713 /* the peer should not disappear in mid-way (unless FW goes awry) since
4714 * we already hold conf_mutex. we just make sure its there now. */
4715 spin_lock_bh(&ar->data_lock);
4716 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4717 spin_unlock_bh(&ar->data_lock);
4718
4719 if (!peer) {
4720 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004721 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03004722 peer_addr);
4723 ret = -EOPNOTSUPP;
4724 goto exit;
4725 } else {
4726 /* if the peer doesn't exist there is no key to disable
4727 * anymore */
4728 goto exit;
4729 }
4730 }
4731
Michal Kazior7cc45732015-03-09 14:24:17 +01004732 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4733 flags |= WMI_KEY_PAIRWISE;
4734 else
4735 flags |= WMI_KEY_GROUP;
4736
Kalle Valo5e3dd152013-06-12 20:52:10 +03004737 if (is_wep) {
4738 if (cmd == SET_KEY)
4739 arvif->wep_keys[key->keyidx] = key;
4740 else
4741 arvif->wep_keys[key->keyidx] = NULL;
4742
4743 if (cmd == DISABLE_KEY)
4744 ath10k_clear_vdev_key(arvif, key);
Michal Kazior370e5672015-02-18 14:02:26 +01004745
Michal Kaziorad325cb2015-02-18 14:02:27 +01004746 /* When WEP keys are uploaded it's possible that there are
4747 * stations associated already (e.g. when merging) without any
4748 * keys. Static WEP needs an explicit per-peer key upload.
4749 */
4750 if (vif->type == NL80211_IFTYPE_ADHOC &&
4751 cmd == SET_KEY)
4752 ath10k_mac_vif_update_wep_key(arvif, key);
4753
Michal Kazior370e5672015-02-18 14:02:26 +01004754 /* 802.1x never sets the def_wep_key_idx so each set_key()
4755 * call changes default tx key.
4756 *
4757 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
4758 * after first set_key().
4759 */
4760 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
4761 flags |= WMI_KEY_TX_USAGE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004762
Michal Kazior7cc45732015-03-09 14:24:17 +01004763 /* mac80211 uploads static WEP keys as groupwise while fw/hw
4764 * requires pairwise keys for non-self peers, i.e. BSSID in STA
4765 * mode and associated stations in AP/IBSS.
4766 *
4767 * Static WEP keys for peer_addr=vif->addr and 802.1X WEP keys
4768 * work fine when mapped directly from mac80211.
4769 *
4770 * Note: When installing first static WEP groupwise key (which
4771 * should be pairwise) def_wep_key_idx isn't known yet (it's
4772 * equal to -1). Since .set_default_unicast_key is called only
4773 * for static WEP it's used to re-upload the key as pairwise.
4774 */
4775 if (arvif->def_wep_key_idx >= 0 &&
4776 memcmp(peer_addr, arvif->vif->addr, ETH_ALEN)) {
4777 flags &= ~WMI_KEY_GROUP;
4778 flags |= WMI_KEY_PAIRWISE;
4779 }
Michal Kazior370e5672015-02-18 14:02:26 +01004780 }
4781
4782 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004783 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004784 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02004785 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004786 goto exit;
4787 }
4788
Michal Kaziorcfb27d22013-12-02 09:06:36 +01004789 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
4790
Kalle Valo5e3dd152013-06-12 20:52:10 +03004791 spin_lock_bh(&ar->data_lock);
4792 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
4793 if (peer && cmd == SET_KEY)
4794 peer->keys[key->keyidx] = key;
4795 else if (peer && cmd == DISABLE_KEY)
4796 peer->keys[key->keyidx] = NULL;
4797 else if (peer == NULL)
4798 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004799 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004800 spin_unlock_bh(&ar->data_lock);
4801
4802exit:
4803 mutex_unlock(&ar->conf_mutex);
4804 return ret;
4805}
4806
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004807static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
4808 struct ieee80211_vif *vif,
4809 int keyidx)
4810{
4811 struct ath10k *ar = hw->priv;
4812 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4813 int ret;
4814
4815 mutex_lock(&arvif->ar->conf_mutex);
4816
4817 if (arvif->ar->state != ATH10K_STATE_ON)
4818 goto unlock;
4819
4820 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
4821 arvif->vdev_id, keyidx);
4822
4823 ret = ath10k_wmi_vdev_set_param(arvif->ar,
4824 arvif->vdev_id,
4825 arvif->ar->wmi.vdev_param->def_keyid,
4826 keyidx);
4827
4828 if (ret) {
4829 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
4830 arvif->vdev_id,
4831 ret);
4832 goto unlock;
4833 }
4834
4835 arvif->def_wep_key_idx = keyidx;
Michal Kazior370e5672015-02-18 14:02:26 +01004836
4837 ret = ath10k_mac_vif_sta_fix_wep_key(arvif);
4838 if (ret) {
4839 ath10k_warn(ar, "failed to fix sta wep key on vdev %i: %d\n",
4840 arvif->vdev_id, ret);
4841 goto unlock;
4842 }
4843
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02004844unlock:
4845 mutex_unlock(&arvif->ar->conf_mutex);
4846}
4847
Michal Kazior9797feb2014-02-14 14:49:48 +01004848static void ath10k_sta_rc_update_wk(struct work_struct *wk)
4849{
4850 struct ath10k *ar;
4851 struct ath10k_vif *arvif;
4852 struct ath10k_sta *arsta;
4853 struct ieee80211_sta *sta;
4854 u32 changed, bw, nss, smps;
4855 int err;
4856
4857 arsta = container_of(wk, struct ath10k_sta, update_wk);
4858 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4859 arvif = arsta->arvif;
4860 ar = arvif->ar;
4861
4862 spin_lock_bh(&ar->data_lock);
4863
4864 changed = arsta->changed;
4865 arsta->changed = 0;
4866
4867 bw = arsta->bw;
4868 nss = arsta->nss;
4869 smps = arsta->smps;
4870
4871 spin_unlock_bh(&ar->data_lock);
4872
4873 mutex_lock(&ar->conf_mutex);
4874
4875 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004876 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004877 sta->addr, bw);
4878
4879 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
4880 WMI_PEER_CHAN_WIDTH, bw);
4881 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004882 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004883 sta->addr, bw, err);
4884 }
4885
4886 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004887 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004888 sta->addr, nss);
4889
4890 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
4891 WMI_PEER_NSS, nss);
4892 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004893 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004894 sta->addr, nss, err);
4895 }
4896
4897 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004898 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004899 sta->addr, smps);
4900
4901 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
4902 WMI_PEER_SMPS_STATE, smps);
4903 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004904 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01004905 sta->addr, smps, err);
4906 }
4907
Janusz Dziedzic55884c02014-12-17 12:30:02 +02004908 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED ||
4909 changed & IEEE80211_RC_NSS_CHANGED) {
4910 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates/nss\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02004911 sta->addr);
4912
Michal Kazior590922a2014-10-21 10:10:29 +03004913 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02004914 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004915 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02004916 sta->addr);
4917 }
4918
Michal Kazior9797feb2014-02-14 14:49:48 +01004919 mutex_unlock(&ar->conf_mutex);
4920}
4921
Marek Puzyniak7c354242015-03-30 09:51:52 +03004922static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
4923 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01004924{
4925 struct ath10k *ar = arvif->ar;
4926
4927 lockdep_assert_held(&ar->conf_mutex);
4928
Marek Puzyniak7c354242015-03-30 09:51:52 +03004929 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01004930 return 0;
4931
4932 if (ar->num_stations >= ar->max_num_stations)
4933 return -ENOBUFS;
4934
4935 ar->num_stations++;
4936
4937 return 0;
4938}
4939
Marek Puzyniak7c354242015-03-30 09:51:52 +03004940static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
4941 struct ieee80211_sta *sta)
Michal Kaziorcfd10612014-11-25 15:16:05 +01004942{
4943 struct ath10k *ar = arvif->ar;
4944
4945 lockdep_assert_held(&ar->conf_mutex);
4946
Marek Puzyniak7c354242015-03-30 09:51:52 +03004947 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
Michal Kaziorcfd10612014-11-25 15:16:05 +01004948 return;
4949
4950 ar->num_stations--;
4951}
4952
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03004953struct ath10k_mac_tdls_iter_data {
4954 u32 num_tdls_stations;
4955 struct ieee80211_vif *curr_vif;
4956};
4957
4958static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
4959 struct ieee80211_sta *sta)
4960{
4961 struct ath10k_mac_tdls_iter_data *iter_data = data;
4962 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4963 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
4964
4965 if (sta->tdls && sta_vif == iter_data->curr_vif)
4966 iter_data->num_tdls_stations++;
4967}
4968
4969static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
4970 struct ieee80211_vif *vif)
4971{
4972 struct ath10k_mac_tdls_iter_data data = {};
4973
4974 data.curr_vif = vif;
4975
4976 ieee80211_iterate_stations_atomic(hw,
4977 ath10k_mac_tdls_vif_stations_count_iter,
4978 &data);
4979 return data.num_tdls_stations;
4980}
4981
4982static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
4983 struct ieee80211_vif *vif)
4984{
4985 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4986 int *num_tdls_vifs = data;
4987
4988 if (vif->type != NL80211_IFTYPE_STATION)
4989 return;
4990
4991 if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
4992 (*num_tdls_vifs)++;
4993}
4994
4995static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
4996{
4997 int num_tdls_vifs = 0;
4998
4999 ieee80211_iterate_active_interfaces_atomic(hw,
5000 IEEE80211_IFACE_ITER_NORMAL,
5001 ath10k_mac_tdls_vifs_count_iter,
5002 &num_tdls_vifs);
5003 return num_tdls_vifs;
5004}
5005
Kalle Valo5e3dd152013-06-12 20:52:10 +03005006static int ath10k_sta_state(struct ieee80211_hw *hw,
5007 struct ieee80211_vif *vif,
5008 struct ieee80211_sta *sta,
5009 enum ieee80211_sta_state old_state,
5010 enum ieee80211_sta_state new_state)
5011{
5012 struct ath10k *ar = hw->priv;
5013 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005014 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005015 int ret = 0;
5016
Michal Kazior76f90022014-02-25 09:29:57 +02005017 if (old_state == IEEE80211_STA_NOTEXIST &&
5018 new_state == IEEE80211_STA_NONE) {
5019 memset(arsta, 0, sizeof(*arsta));
5020 arsta->arvif = arvif;
5021 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
5022 }
5023
Michal Kazior9797feb2014-02-14 14:49:48 +01005024 /* cancel must be done outside the mutex to avoid deadlock */
5025 if ((old_state == IEEE80211_STA_NONE &&
5026 new_state == IEEE80211_STA_NOTEXIST))
5027 cancel_work_sync(&arsta->update_wk);
5028
Kalle Valo5e3dd152013-06-12 20:52:10 +03005029 mutex_lock(&ar->conf_mutex);
5030
5031 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03005032 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005033 /*
5034 * New station addition.
5035 */
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005036 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
5037 u32 num_tdls_stations;
5038 u32 num_tdls_vifs;
5039
Michal Kaziorcfd10612014-11-25 15:16:05 +01005040 ath10k_dbg(ar, ATH10K_DBG_MAC,
5041 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5042 arvif->vdev_id, sta->addr,
5043 ar->num_stations + 1, ar->max_num_stations,
5044 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005045
Marek Puzyniak7c354242015-03-30 09:51:52 +03005046 ret = ath10k_mac_inc_num_stations(arvif, sta);
Michal Kaziorcfd10612014-11-25 15:16:05 +01005047 if (ret) {
5048 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
5049 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005050 goto exit;
5051 }
5052
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005053 if (sta->tdls)
5054 peer_type = WMI_PEER_TYPE_TDLS;
5055
Marek Puzyniak7390ed32015-03-30 09:51:52 +03005056 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr,
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005057 peer_type);
Michal Kaziora52c0282014-11-25 15:16:03 +01005058 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005059 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 -08005060 sta->addr, arvif->vdev_id, ret);
Marek Puzyniak7c354242015-03-30 09:51:52 +03005061 ath10k_mac_dec_num_stations(arvif, sta);
Michal Kaziora52c0282014-11-25 15:16:03 +01005062 goto exit;
5063 }
Michal Kazior077efc82014-10-21 10:10:29 +03005064
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005065 if (!sta->tdls)
5066 goto exit;
5067
5068 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
5069 num_tdls_vifs = ath10k_mac_tdls_vifs_count(hw);
5070
5071 if (num_tdls_vifs >= ar->max_num_tdls_vdevs &&
5072 num_tdls_stations == 0) {
5073 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
5074 arvif->vdev_id, ar->max_num_tdls_vdevs);
5075 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5076 ath10k_mac_dec_num_stations(arvif, sta);
5077 ret = -ENOBUFS;
5078 goto exit;
5079 }
5080
5081 if (num_tdls_stations == 0) {
5082 /* This is the first tdls peer in current vif */
5083 enum wmi_tdls_state state = WMI_TDLS_ENABLE_ACTIVE;
5084
5085 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5086 state);
5087 if (ret) {
5088 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5089 arvif->vdev_id, ret);
5090 ath10k_peer_delete(ar, arvif->vdev_id,
5091 sta->addr);
5092 ath10k_mac_dec_num_stations(arvif, sta);
5093 goto exit;
5094 }
5095 }
5096
5097 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5098 WMI_TDLS_PEER_STATE_PEERING);
5099 if (ret) {
5100 ath10k_warn(ar,
5101 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
5102 sta->addr, arvif->vdev_id, ret);
5103 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5104 ath10k_mac_dec_num_stations(arvif, sta);
5105
5106 if (num_tdls_stations != 0)
5107 goto exit;
5108 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5109 WMI_TDLS_DISABLE);
5110 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005111 } else if ((old_state == IEEE80211_STA_NONE &&
5112 new_state == IEEE80211_STA_NOTEXIST)) {
5113 /*
5114 * Existing station deletion.
5115 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005116 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03005117 "mac vdev %d peer delete %pM (sta gone)\n",
5118 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03005119
Kalle Valo5e3dd152013-06-12 20:52:10 +03005120 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
5121 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005122 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005123 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005124
Marek Puzyniak7c354242015-03-30 09:51:52 +03005125 ath10k_mac_dec_num_stations(arvif, sta);
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005126
5127 if (!sta->tdls)
5128 goto exit;
5129
5130 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
5131 goto exit;
5132
5133 /* This was the last tdls peer in current vif */
5134 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
5135 WMI_TDLS_DISABLE);
5136 if (ret) {
5137 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
5138 arvif->vdev_id, ret);
5139 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005140 } else if (old_state == IEEE80211_STA_AUTH &&
5141 new_state == IEEE80211_STA_ASSOC &&
5142 (vif->type == NL80211_IFTYPE_AP ||
5143 vif->type == NL80211_IFTYPE_ADHOC)) {
5144 /*
5145 * New association.
5146 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005147 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005148 sta->addr);
5149
Michal Kazior590922a2014-10-21 10:10:29 +03005150 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005151 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005152 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005153 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005154 } else if (old_state == IEEE80211_STA_ASSOC &&
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03005155 new_state == IEEE80211_STA_AUTHORIZED &&
5156 sta->tdls) {
5157 /*
5158 * Tdls station authorized.
5159 */
5160 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac tdls sta %pM authorized\n",
5161 sta->addr);
5162
5163 ret = ath10k_station_assoc(ar, vif, sta, false);
5164 if (ret) {
5165 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
5166 sta->addr, arvif->vdev_id, ret);
5167 goto exit;
5168 }
5169
5170 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
5171 WMI_TDLS_PEER_STATE_CONNECTED);
5172 if (ret)
5173 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
5174 sta->addr, arvif->vdev_id, ret);
5175 } else if (old_state == IEEE80211_STA_ASSOC &&
5176 new_state == IEEE80211_STA_AUTH &&
5177 (vif->type == NL80211_IFTYPE_AP ||
5178 vif->type == NL80211_IFTYPE_ADHOC)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03005179 /*
5180 * Disassociation.
5181 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02005182 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03005183 sta->addr);
5184
Michal Kazior590922a2014-10-21 10:10:29 +03005185 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005186 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005187 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02005188 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005189 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01005190exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005191 mutex_unlock(&ar->conf_mutex);
5192 return ret;
5193}
5194
5195static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03005196 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005197{
5198 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kaziorb0e56152015-01-24 12:14:52 +02005199 struct wmi_sta_uapsd_auto_trig_arg arg = {};
5200 u32 prio = 0, acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005201 u32 value = 0;
5202 int ret = 0;
5203
Michal Kazior548db542013-07-05 16:15:15 +03005204 lockdep_assert_held(&ar->conf_mutex);
5205
Kalle Valo5e3dd152013-06-12 20:52:10 +03005206 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5207 return 0;
5208
5209 switch (ac) {
5210 case IEEE80211_AC_VO:
5211 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5212 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005213 prio = 7;
5214 acc = 3;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005215 break;
5216 case IEEE80211_AC_VI:
5217 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5218 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005219 prio = 5;
5220 acc = 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005221 break;
5222 case IEEE80211_AC_BE:
5223 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5224 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005225 prio = 2;
5226 acc = 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005227 break;
5228 case IEEE80211_AC_BK:
5229 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5230 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
Michal Kaziorb0e56152015-01-24 12:14:52 +02005231 prio = 0;
5232 acc = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005233 break;
5234 }
5235
5236 if (enable)
5237 arvif->u.sta.uapsd |= value;
5238 else
5239 arvif->u.sta.uapsd &= ~value;
5240
5241 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5242 WMI_STA_PS_PARAM_UAPSD,
5243 arvif->u.sta.uapsd);
5244 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005245 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005246 goto exit;
5247 }
5248
5249 if (arvif->u.sta.uapsd)
5250 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5251 else
5252 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5253
5254 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5255 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5256 value);
5257 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005258 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005259
Michal Kazior9f9b5742014-12-12 12:41:36 +01005260 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5261 if (ret) {
5262 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5263 arvif->vdev_id, ret);
5264 return ret;
5265 }
5266
5267 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5268 if (ret) {
5269 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5270 arvif->vdev_id, ret);
5271 return ret;
5272 }
5273
Michal Kaziorb0e56152015-01-24 12:14:52 +02005274 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
5275 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
5276 /* Only userspace can make an educated decision when to send
5277 * trigger frame. The following effectively disables u-UAPSD
5278 * autotrigger in firmware (which is enabled by default
5279 * provided the autotrigger service is available).
5280 */
5281
5282 arg.wmm_ac = acc;
5283 arg.user_priority = prio;
5284 arg.service_interval = 0;
5285 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5286 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
5287
5288 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
5289 arvif->bssid, &arg, 1);
5290 if (ret) {
5291 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
5292 ret);
5293 return ret;
5294 }
5295 }
5296
Kalle Valo5e3dd152013-06-12 20:52:10 +03005297exit:
5298 return ret;
5299}
5300
5301static int ath10k_conf_tx(struct ieee80211_hw *hw,
5302 struct ieee80211_vif *vif, u16 ac,
5303 const struct ieee80211_tx_queue_params *params)
5304{
5305 struct ath10k *ar = hw->priv;
Michal Kazior5e752e42015-01-19 09:53:41 +01005306 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005307 struct wmi_wmm_params_arg *p = NULL;
5308 int ret;
5309
5310 mutex_lock(&ar->conf_mutex);
5311
5312 switch (ac) {
5313 case IEEE80211_AC_VO:
Michal Kazior5e752e42015-01-19 09:53:41 +01005314 p = &arvif->wmm_params.ac_vo;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005315 break;
5316 case IEEE80211_AC_VI:
Michal Kazior5e752e42015-01-19 09:53:41 +01005317 p = &arvif->wmm_params.ac_vi;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005318 break;
5319 case IEEE80211_AC_BE:
Michal Kazior5e752e42015-01-19 09:53:41 +01005320 p = &arvif->wmm_params.ac_be;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005321 break;
5322 case IEEE80211_AC_BK:
Michal Kazior5e752e42015-01-19 09:53:41 +01005323 p = &arvif->wmm_params.ac_bk;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005324 break;
5325 }
5326
5327 if (WARN_ON(!p)) {
5328 ret = -EINVAL;
5329 goto exit;
5330 }
5331
5332 p->cwmin = params->cw_min;
5333 p->cwmax = params->cw_max;
5334 p->aifs = params->aifs;
5335
5336 /*
5337 * The channel time duration programmed in the HW is in absolute
5338 * microseconds, while mac80211 gives the txop in units of
5339 * 32 microseconds.
5340 */
5341 p->txop = params->txop * 32;
5342
Michal Kazior7fc979a2015-01-28 09:57:28 +02005343 if (ar->wmi.ops->gen_vdev_wmm_conf) {
5344 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
5345 &arvif->wmm_params);
5346 if (ret) {
5347 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
5348 arvif->vdev_id, ret);
5349 goto exit;
5350 }
5351 } else {
5352 /* This won't work well with multi-interface cases but it's
5353 * better than nothing.
5354 */
5355 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
5356 if (ret) {
5357 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
5358 goto exit;
5359 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005360 }
5361
5362 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5363 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005364 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005365
5366exit:
5367 mutex_unlock(&ar->conf_mutex);
5368 return ret;
5369}
5370
5371#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
5372
5373static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
5374 struct ieee80211_vif *vif,
5375 struct ieee80211_channel *chan,
5376 int duration,
5377 enum ieee80211_roc_type type)
5378{
5379 struct ath10k *ar = hw->priv;
5380 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5381 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005382 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005383
5384 mutex_lock(&ar->conf_mutex);
5385
5386 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005387 switch (ar->scan.state) {
5388 case ATH10K_SCAN_IDLE:
5389 reinit_completion(&ar->scan.started);
5390 reinit_completion(&ar->scan.completed);
5391 reinit_completion(&ar->scan.on_channel);
5392 ar->scan.state = ATH10K_SCAN_STARTING;
5393 ar->scan.is_roc = true;
5394 ar->scan.vdev_id = arvif->vdev_id;
5395 ar->scan.roc_freq = chan->center_freq;
5396 ret = 0;
5397 break;
5398 case ATH10K_SCAN_STARTING:
5399 case ATH10K_SCAN_RUNNING:
5400 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005401 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005402 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005403 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005404 spin_unlock_bh(&ar->data_lock);
5405
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005406 if (ret)
5407 goto exit;
5408
Michal Kaziordcca0bd2014-11-24 14:58:32 +01005409 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
5410
Kalle Valo5e3dd152013-06-12 20:52:10 +03005411 memset(&arg, 0, sizeof(arg));
5412 ath10k_wmi_start_scan_init(ar, &arg);
5413 arg.vdev_id = arvif->vdev_id;
5414 arg.scan_id = ATH10K_SCAN_ID;
5415 arg.n_channels = 1;
5416 arg.channels[0] = chan->center_freq;
5417 arg.dwell_time_active = duration;
5418 arg.dwell_time_passive = duration;
5419 arg.max_scan_time = 2 * duration;
5420 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
5421 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
5422
5423 ret = ath10k_start_scan(ar, &arg);
5424 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005425 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005426 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005427 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005428 spin_unlock_bh(&ar->data_lock);
5429 goto exit;
5430 }
5431
5432 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
5433 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005434 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005435
5436 ret = ath10k_scan_stop(ar);
5437 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005438 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005439
Kalle Valo5e3dd152013-06-12 20:52:10 +03005440 ret = -ETIMEDOUT;
5441 goto exit;
5442 }
5443
5444 ret = 0;
5445exit:
5446 mutex_unlock(&ar->conf_mutex);
5447 return ret;
5448}
5449
5450static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
5451{
5452 struct ath10k *ar = hw->priv;
5453
5454 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02005455 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005456 mutex_unlock(&ar->conf_mutex);
5457
Michal Kazior4eb2e162014-10-28 10:23:09 +01005458 cancel_delayed_work_sync(&ar->scan.timeout);
5459
Kalle Valo5e3dd152013-06-12 20:52:10 +03005460 return 0;
5461}
5462
5463/*
5464 * Both RTS and Fragmentation threshold are interface-specific
5465 * in ath10k, but device-specific in mac80211.
5466 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03005467
5468static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
5469{
Kalle Valo5e3dd152013-06-12 20:52:10 +03005470 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03005471 struct ath10k_vif *arvif;
5472 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03005473
Michal Kaziorad088bf2013-10-16 15:44:46 +03005474 mutex_lock(&ar->conf_mutex);
5475 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005476 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005477 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03005478
Michal Kaziorad088bf2013-10-16 15:44:46 +03005479 ret = ath10k_mac_set_rts(arvif, value);
5480 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005481 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03005482 arvif->vdev_id, ret);
5483 break;
5484 }
5485 }
5486 mutex_unlock(&ar->conf_mutex);
5487
5488 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005489}
5490
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02005491static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5492 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03005493{
5494 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02005495 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005496 int ret;
5497
5498 /* mac80211 doesn't care if we really xmit queued frames or not
5499 * we'll collect those frames either way if we stop/delete vdevs */
5500 if (drop)
5501 return;
5502
Michal Kazior548db542013-07-05 16:15:15 +03005503 mutex_lock(&ar->conf_mutex);
5504
Michal Kazioraffd3212013-07-16 09:54:35 +02005505 if (ar->state == ATH10K_STATE_WEDGED)
5506 goto skip;
5507
Michal Kazioredb82362013-07-05 16:15:14 +03005508 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03005509 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02005510
Michal Kazioredb82362013-07-05 16:15:14 +03005511 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02005512 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03005513 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02005514
Michal Kazior7962b0d2014-10-28 10:34:38 +01005515 skip = (ar->state == ATH10K_STATE_WEDGED) ||
5516 test_bit(ATH10K_FLAG_CRASH_FLUSH,
5517 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02005518
5519 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005520 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02005521
5522 if (ret <= 0 || skip)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005523 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
Ben Greear9ba4c782014-02-25 09:29:57 +02005524 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03005525
Michal Kazioraffd3212013-07-16 09:54:35 +02005526skip:
Michal Kazior548db542013-07-05 16:15:15 +03005527 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005528}
5529
5530/* TODO: Implement this function properly
5531 * For now it is needed to reply to Probe Requests in IBSS mode.
5532 * Propably we need this information from FW.
5533 */
5534static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
5535{
5536 return 1;
5537}
5538
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005539static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
5540 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02005541{
5542 struct ath10k *ar = hw->priv;
5543
Eliad Pellercf2c92d2014-11-04 11:43:54 +02005544 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
5545 return;
5546
Michal Kazioraffd3212013-07-16 09:54:35 +02005547 mutex_lock(&ar->conf_mutex);
5548
5549 /* If device failed to restart it will be in a different state, e.g.
5550 * ATH10K_STATE_WEDGED */
5551 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005552 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02005553 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01005554 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02005555 }
5556
5557 mutex_unlock(&ar->conf_mutex);
5558}
5559
Michal Kazior2e1dea42013-07-31 10:32:40 +02005560static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
5561 struct survey_info *survey)
5562{
5563 struct ath10k *ar = hw->priv;
5564 struct ieee80211_supported_band *sband;
5565 struct survey_info *ar_survey = &ar->survey[idx];
5566 int ret = 0;
5567
5568 mutex_lock(&ar->conf_mutex);
5569
5570 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
5571 if (sband && idx >= sband->n_channels) {
5572 idx -= sband->n_channels;
5573 sband = NULL;
5574 }
5575
5576 if (!sband)
5577 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
5578
5579 if (!sband || idx >= sband->n_channels) {
5580 ret = -ENOENT;
5581 goto exit;
5582 }
5583
5584 spin_lock_bh(&ar->data_lock);
5585 memcpy(survey, ar_survey, sizeof(*survey));
5586 spin_unlock_bh(&ar->data_lock);
5587
5588 survey->channel = &sband->channels[idx];
5589
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03005590 if (ar->rx_channel == survey->channel)
5591 survey->filled |= SURVEY_INFO_IN_USE;
5592
Michal Kazior2e1dea42013-07-31 10:32:40 +02005593exit:
5594 mutex_unlock(&ar->conf_mutex);
5595 return ret;
5596}
5597
Michal Kazior3ae54222015-03-31 10:49:20 +00005598static bool
5599ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
5600 enum ieee80211_band band,
5601 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005602{
Michal Kazior3ae54222015-03-31 10:49:20 +00005603 int num_rates = 0;
5604 int i;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005605
Michal Kazior3ae54222015-03-31 10:49:20 +00005606 num_rates += hweight32(mask->control[band].legacy);
5607
5608 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
5609 num_rates += hweight8(mask->control[band].ht_mcs[i]);
5610
5611 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5612 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5613
5614 return num_rates == 1;
5615}
5616
5617static bool
5618ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
5619 enum ieee80211_band band,
5620 const struct cfg80211_bitrate_mask *mask,
5621 int *nss)
5622{
5623 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5624 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5625 u8 ht_nss_mask = 0;
5626 u8 vht_nss_mask = 0;
5627 int i;
5628
5629 if (mask->control[band].legacy)
5630 return false;
5631
5632 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5633 if (mask->control[band].ht_mcs[i] == 0)
5634 continue;
5635 else if (mask->control[band].ht_mcs[i] ==
5636 sband->ht_cap.mcs.rx_mask[i])
5637 ht_nss_mask |= BIT(i);
5638 else
5639 return false;
5640 }
5641
5642 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5643 if (mask->control[band].vht_mcs[i] == 0)
5644 continue;
5645 else if (mask->control[band].vht_mcs[i] ==
5646 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
5647 vht_nss_mask |= BIT(i);
5648 else
5649 return false;
5650 }
5651
5652 if (ht_nss_mask != vht_nss_mask)
5653 return false;
5654
5655 if (ht_nss_mask == 0)
5656 return false;
5657
5658 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
5659 return false;
5660
5661 *nss = fls(ht_nss_mask);
5662
5663 return true;
5664}
5665
5666static int
5667ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
5668 enum ieee80211_band band,
5669 const struct cfg80211_bitrate_mask *mask,
5670 u8 *rate, u8 *nss)
5671{
5672 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
5673 int rate_idx;
5674 int i;
5675 u16 bitrate;
5676 u8 preamble;
5677 u8 hw_rate;
5678
5679 if (hweight32(mask->control[band].legacy) == 1) {
5680 rate_idx = ffs(mask->control[band].legacy) - 1;
5681
5682 hw_rate = sband->bitrates[rate_idx].hw_value;
5683 bitrate = sband->bitrates[rate_idx].bitrate;
5684
5685 if (ath10k_mac_bitrate_is_cck(bitrate))
5686 preamble = WMI_RATE_PREAMBLE_CCK;
5687 else
5688 preamble = WMI_RATE_PREAMBLE_OFDM;
5689
5690 *nss = 1;
5691 *rate = preamble << 6 |
5692 (*nss - 1) << 4 |
5693 hw_rate << 0;
5694
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005695 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005696 }
5697
Michal Kazior3ae54222015-03-31 10:49:20 +00005698 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
5699 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
5700 *nss = i + 1;
5701 *rate = WMI_RATE_PREAMBLE_HT << 6 |
5702 (*nss - 1) << 4 |
5703 (ffs(mask->control[band].ht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005704
Michal Kazior3ae54222015-03-31 10:49:20 +00005705 return 0;
5706 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005707 }
5708
Michal Kazior3ae54222015-03-31 10:49:20 +00005709 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5710 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5711 *nss = i + 1;
5712 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
5713 (*nss - 1) << 4 |
5714 (ffs(mask->control[band].vht_mcs[i]) - 1);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005715
Michal Kazior3ae54222015-03-31 10:49:20 +00005716 return 0;
5717 }
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005718 }
5719
Michal Kazior3ae54222015-03-31 10:49:20 +00005720 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005721}
5722
Michal Kazior3ae54222015-03-31 10:49:20 +00005723static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
5724 u8 rate, u8 nss, u8 sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005725{
5726 struct ath10k *ar = arvif->ar;
5727 u32 vdev_param;
Michal Kazior3ae54222015-03-31 10:49:20 +00005728 int ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005729
Michal Kazior3ae54222015-03-31 10:49:20 +00005730 lockdep_assert_held(&ar->conf_mutex);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005731
Michal Kazior3ae54222015-03-31 10:49:20 +00005732 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
5733 arvif->vdev_id, rate, nss, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005734
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005735 vdev_param = ar->wmi.vdev_param->fixed_rate;
Michal Kazior3ae54222015-03-31 10:49:20 +00005736 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005737 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005738 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Michal Kazior3ae54222015-03-31 10:49:20 +00005739 rate, ret);
5740 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005741 }
5742
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005743 vdev_param = ar->wmi.vdev_param->nss;
Michal Kazior3ae54222015-03-31 10:49:20 +00005744 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005745 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005746 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
5747 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005748 }
5749
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005750 vdev_param = ar->wmi.vdev_param->sgi;
Michal Kazior3ae54222015-03-31 10:49:20 +00005751 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005752 if (ret) {
Michal Kazior3ae54222015-03-31 10:49:20 +00005753 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
5754 return ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005755 }
5756
Michal Kazior3ae54222015-03-31 10:49:20 +00005757 return 0;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005758}
5759
Michal Kazior3ae54222015-03-31 10:49:20 +00005760static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
5761 struct ieee80211_vif *vif,
5762 const struct cfg80211_bitrate_mask *mask)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005763{
5764 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior500ff9f2015-03-31 10:26:21 +00005765 struct cfg80211_chan_def def;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005766 struct ath10k *ar = arvif->ar;
Michal Kazior500ff9f2015-03-31 10:26:21 +00005767 enum ieee80211_band band;
Michal Kazior3ae54222015-03-31 10:49:20 +00005768 u8 rate;
5769 u8 nss;
5770 u8 sgi;
5771 int single_nss;
5772 int ret;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005773
Michal Kazior500ff9f2015-03-31 10:26:21 +00005774 if (ath10k_mac_vif_chan(vif, &def))
5775 return -EPERM;
5776
Michal Kazior500ff9f2015-03-31 10:26:21 +00005777 band = def.chan->band;
5778
Michal Kazior3ae54222015-03-31 10:49:20 +00005779 sgi = mask->control[band].gi;
5780 if (sgi == NL80211_TXRATE_FORCE_LGI)
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005781 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005782
Michal Kazior3ae54222015-03-31 10:49:20 +00005783 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask)) {
5784 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
5785 &rate, &nss);
5786 if (ret) {
5787 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
5788 arvif->vdev_id, ret);
5789 return ret;
5790 }
5791 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
5792 &single_nss)) {
5793 rate = WMI_FIXED_RATE_NONE;
5794 nss = single_nss;
5795 } else {
5796 rate = WMI_FIXED_RATE_NONE;
5797 nss = ar->num_rf_chains;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005798 }
5799
Michal Kazior3ae54222015-03-31 10:49:20 +00005800 mutex_lock(&ar->conf_mutex);
5801
5802 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi);
5803 if (ret) {
5804 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
5805 arvif->vdev_id, ret);
5806 goto exit;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01005807 }
5808
Michal Kazior3ae54222015-03-31 10:49:20 +00005809exit:
5810 mutex_unlock(&ar->conf_mutex);
5811
5812 return ret;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01005813}
5814
Michal Kazior9797feb2014-02-14 14:49:48 +01005815static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
5816 struct ieee80211_vif *vif,
5817 struct ieee80211_sta *sta,
5818 u32 changed)
5819{
5820 struct ath10k *ar = hw->priv;
5821 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
5822 u32 bw, smps;
5823
5824 spin_lock_bh(&ar->data_lock);
5825
Michal Kazior7aa7a722014-08-25 12:09:38 +02005826 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01005827 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5828 sta->addr, changed, sta->bandwidth, sta->rx_nss,
5829 sta->smps_mode);
5830
5831 if (changed & IEEE80211_RC_BW_CHANGED) {
5832 bw = WMI_PEER_CHWIDTH_20MHZ;
5833
5834 switch (sta->bandwidth) {
5835 case IEEE80211_STA_RX_BW_20:
5836 bw = WMI_PEER_CHWIDTH_20MHZ;
5837 break;
5838 case IEEE80211_STA_RX_BW_40:
5839 bw = WMI_PEER_CHWIDTH_40MHZ;
5840 break;
5841 case IEEE80211_STA_RX_BW_80:
5842 bw = WMI_PEER_CHWIDTH_80MHZ;
5843 break;
5844 case IEEE80211_STA_RX_BW_160:
Michal Kazior7aa7a722014-08-25 12:09:38 +02005845 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02005846 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01005847 bw = WMI_PEER_CHWIDTH_20MHZ;
5848 break;
5849 }
5850
5851 arsta->bw = bw;
5852 }
5853
5854 if (changed & IEEE80211_RC_NSS_CHANGED)
5855 arsta->nss = sta->rx_nss;
5856
5857 if (changed & IEEE80211_RC_SMPS_CHANGED) {
5858 smps = WMI_PEER_SMPS_PS_NONE;
5859
5860 switch (sta->smps_mode) {
5861 case IEEE80211_SMPS_AUTOMATIC:
5862 case IEEE80211_SMPS_OFF:
5863 smps = WMI_PEER_SMPS_PS_NONE;
5864 break;
5865 case IEEE80211_SMPS_STATIC:
5866 smps = WMI_PEER_SMPS_STATIC;
5867 break;
5868 case IEEE80211_SMPS_DYNAMIC:
5869 smps = WMI_PEER_SMPS_DYNAMIC;
5870 break;
5871 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02005872 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02005873 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01005874 smps = WMI_PEER_SMPS_PS_NONE;
5875 break;
5876 }
5877
5878 arsta->smps = smps;
5879 }
5880
Michal Kazior9797feb2014-02-14 14:49:48 +01005881 arsta->changed |= changed;
5882
5883 spin_unlock_bh(&ar->data_lock);
5884
5885 ieee80211_queue_work(hw, &arsta->update_wk);
5886}
5887
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02005888static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
5889{
5890 /*
5891 * FIXME: Return 0 for time being. Need to figure out whether FW
5892 * has the API to fetch 64-bit local TSF
5893 */
5894
5895 return 0;
5896}
5897
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02005898static int ath10k_ampdu_action(struct ieee80211_hw *hw,
5899 struct ieee80211_vif *vif,
5900 enum ieee80211_ampdu_mlme_action action,
5901 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
5902 u8 buf_size)
5903{
Michal Kazior7aa7a722014-08-25 12:09:38 +02005904 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02005905 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
5906
Michal Kazior7aa7a722014-08-25 12:09:38 +02005907 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 +02005908 arvif->vdev_id, sta->addr, tid, action);
5909
5910 switch (action) {
5911 case IEEE80211_AMPDU_RX_START:
5912 case IEEE80211_AMPDU_RX_STOP:
5913 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
5914 * creation/removal. Do we need to verify this?
5915 */
5916 return 0;
5917 case IEEE80211_AMPDU_TX_START:
5918 case IEEE80211_AMPDU_TX_STOP_CONT:
5919 case IEEE80211_AMPDU_TX_STOP_FLUSH:
5920 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5921 case IEEE80211_AMPDU_TX_OPERATIONAL:
5922 /* Firmware offloads Tx aggregation entirely so deny mac80211
5923 * Tx aggregation requests.
5924 */
5925 return -EOPNOTSUPP;
5926 }
5927
5928 return -EINVAL;
5929}
5930
Michal Kazior500ff9f2015-03-31 10:26:21 +00005931static void
5932ath10k_mac_update_rx_channel(struct ath10k *ar)
5933{
5934 struct cfg80211_chan_def *def = NULL;
5935
5936 /* Both locks are required because ar->rx_channel is modified. This
5937 * allows readers to hold either lock.
5938 */
5939 lockdep_assert_held(&ar->conf_mutex);
5940 lockdep_assert_held(&ar->data_lock);
5941
5942 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
5943 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
5944 * ppdu on Rx may reduce performance on low-end systems. It should be
5945 * possible to make tables/hashmaps to speed the lookup up (be vary of
5946 * cpu data cache lines though regarding sizes) but to keep the initial
5947 * implementation simple and less intrusive fallback to the slow lookup
5948 * only for multi-channel cases. Single-channel cases will remain to
5949 * use the old channel derival and thus performance should not be
5950 * affected much.
5951 */
5952 rcu_read_lock();
5953 if (ath10k_mac_num_chanctxs(ar) == 1) {
5954 ieee80211_iter_chan_contexts_atomic(ar->hw,
5955 ath10k_mac_get_any_chandef_iter,
5956 &def);
5957 ar->rx_channel = def->chan;
5958 } else {
5959 ar->rx_channel = NULL;
5960 }
5961 rcu_read_unlock();
5962}
5963
5964static void
5965ath10k_mac_chan_ctx_init(struct ath10k *ar,
5966 struct ath10k_chanctx *arctx,
5967 struct ieee80211_chanctx_conf *conf)
5968{
5969 lockdep_assert_held(&ar->conf_mutex);
5970 lockdep_assert_held(&ar->data_lock);
5971
5972 memset(arctx, 0, sizeof(*arctx));
5973
5974 arctx->conf = *conf;
5975}
5976
5977static int
5978ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
5979 struct ieee80211_chanctx_conf *ctx)
5980{
5981 struct ath10k *ar = hw->priv;
5982 struct ath10k_chanctx *arctx = (void *)ctx->drv_priv;
5983
5984 ath10k_dbg(ar, ATH10K_DBG_MAC,
5985 "mac chanctx add freq %hu width %d ptr %p\n",
5986 ctx->def.chan->center_freq, ctx->def.width, ctx);
5987
5988 mutex_lock(&ar->conf_mutex);
5989
5990 spin_lock_bh(&ar->data_lock);
5991 ath10k_mac_chan_ctx_init(ar, arctx, ctx);
5992 ath10k_mac_update_rx_channel(ar);
5993 spin_unlock_bh(&ar->data_lock);
5994
5995 ath10k_recalc_radar_detection(ar);
5996 ath10k_monitor_recalc(ar);
5997
5998 mutex_unlock(&ar->conf_mutex);
5999
6000 return 0;
6001}
6002
6003static void
6004ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6005 struct ieee80211_chanctx_conf *ctx)
6006{
6007 struct ath10k *ar = hw->priv;
6008
6009 ath10k_dbg(ar, ATH10K_DBG_MAC,
6010 "mac chanctx remove freq %hu width %d ptr %p\n",
6011 ctx->def.chan->center_freq, ctx->def.width, ctx);
6012
6013 mutex_lock(&ar->conf_mutex);
6014
6015 spin_lock_bh(&ar->data_lock);
6016 ath10k_mac_update_rx_channel(ar);
6017 spin_unlock_bh(&ar->data_lock);
6018
6019 ath10k_recalc_radar_detection(ar);
6020 ath10k_monitor_recalc(ar);
6021
6022 mutex_unlock(&ar->conf_mutex);
6023}
6024
6025static void
6026ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6027 struct ieee80211_chanctx_conf *ctx,
6028 u32 changed)
6029{
6030 struct ath10k *ar = hw->priv;
6031 struct ath10k_chanctx *arctx = (void *)ctx->drv_priv;
6032
6033 mutex_lock(&ar->conf_mutex);
6034
6035 ath10k_dbg(ar, ATH10K_DBG_MAC,
6036 "mac chanctx change freq %hu->%hu width %d->%d ptr %p changed %x\n",
6037 arctx->conf.def.chan->center_freq,
6038 ctx->def.chan->center_freq,
6039 arctx->conf.def.width, ctx->def.width,
6040 ctx, changed);
6041
6042 /* This shouldn't really happen because channel switching should use
6043 * switch_vif_chanctx().
6044 */
6045 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6046 goto unlock;
6047
6048 spin_lock_bh(&ar->data_lock);
6049 arctx->conf = *ctx;
6050 spin_unlock_bh(&ar->data_lock);
6051
6052 ath10k_recalc_radar_detection(ar);
6053
6054 /* FIXME: How to configure Rx chains properly? */
6055
6056 /* No other actions are actually necessary. Firmware maintains channel
6057 * definitions per vdev internally and there's no host-side channel
6058 * context abstraction to configure, e.g. channel width.
6059 */
6060
6061unlock:
6062 mutex_unlock(&ar->conf_mutex);
6063}
6064
6065static int
6066ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6067 struct ieee80211_vif *vif,
6068 struct ieee80211_chanctx_conf *ctx)
6069{
6070 struct ath10k *ar = hw->priv;
6071 struct ath10k_chanctx *arctx = (void *)ctx->drv_priv;
6072 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6073 int ret;
6074
6075 mutex_lock(&ar->conf_mutex);
6076
6077 ath10k_dbg(ar, ATH10K_DBG_MAC,
6078 "mac chanctx assign ptr %p vdev_id %i\n",
6079 ctx, arvif->vdev_id);
6080
6081 if (WARN_ON(arvif->is_started)) {
6082 mutex_unlock(&ar->conf_mutex);
6083 return -EBUSY;
6084 }
6085
6086 ret = ath10k_vdev_start(arvif, &arctx->conf.def);
6087 if (ret) {
6088 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
6089 arvif->vdev_id, vif->addr,
6090 arctx->conf.def.chan->center_freq, ret);
6091 goto err;
6092 }
6093
6094 arvif->is_started = true;
6095
6096 if (vif->type == NL80211_IFTYPE_MONITOR) {
6097 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
6098 if (ret) {
6099 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
6100 arvif->vdev_id, ret);
6101 goto err_stop;
6102 }
6103
6104 arvif->is_up = true;
6105 }
6106
6107 mutex_unlock(&ar->conf_mutex);
6108 return 0;
6109
6110err_stop:
6111 ath10k_vdev_stop(arvif);
6112 arvif->is_started = false;
6113
6114err:
6115 mutex_unlock(&ar->conf_mutex);
6116 return ret;
6117}
6118
6119static void
6120ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6121 struct ieee80211_vif *vif,
6122 struct ieee80211_chanctx_conf *ctx)
6123{
6124 struct ath10k *ar = hw->priv;
6125 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6126 int ret;
6127
6128 mutex_lock(&ar->conf_mutex);
6129
6130 ath10k_dbg(ar, ATH10K_DBG_MAC,
6131 "mac chanctx unassign ptr %p vdev_id %i\n",
6132 ctx, arvif->vdev_id);
6133
6134 WARN_ON(!arvif->is_started);
6135
6136 if (vif->type == NL80211_IFTYPE_MONITOR) {
6137 WARN_ON(!arvif->is_up);
6138
6139 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
6140 if (ret)
6141 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
6142 arvif->vdev_id, ret);
6143
6144 arvif->is_up = false;
6145 }
6146
6147 ret = ath10k_vdev_stop(arvif);
6148 if (ret)
6149 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
6150 arvif->vdev_id, ret);
6151
6152 arvif->is_started = false;
6153
6154 mutex_unlock(&ar->conf_mutex);
6155}
6156
6157static int
6158ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6159 struct ieee80211_vif_chanctx_switch *vifs,
6160 int n_vifs,
6161 enum ieee80211_chanctx_switch_mode mode)
6162{
6163 struct ath10k *ar = hw->priv;
6164 struct ath10k_vif *arvif;
6165 struct ath10k_chanctx *arctx_new, *arctx_old;
6166 int i;
6167
6168 mutex_lock(&ar->conf_mutex);
6169
6170 ath10k_dbg(ar, ATH10K_DBG_MAC,
6171 "mac chanctx switch n_vifs %d mode %d\n",
6172 n_vifs, mode);
6173
6174 spin_lock_bh(&ar->data_lock);
6175 for (i = 0; i < n_vifs; i++) {
6176 arvif = ath10k_vif_to_arvif(vifs[i].vif);
6177 arctx_new = (void *)vifs[i].new_ctx->drv_priv;
6178 arctx_old = (void *)vifs[i].old_ctx->drv_priv;
6179
6180 ath10k_dbg(ar, ATH10K_DBG_MAC,
6181 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d ptr %p->%p\n",
6182 arvif->vdev_id,
6183 vifs[i].old_ctx->def.chan->center_freq,
6184 vifs[i].new_ctx->def.chan->center_freq,
6185 vifs[i].old_ctx->def.width,
6186 vifs[i].new_ctx->def.width,
6187 arctx_old, arctx_new);
6188
6189 if (mode == CHANCTX_SWMODE_SWAP_CONTEXTS) {
6190 ath10k_mac_chan_ctx_init(ar, arctx_new,
6191 vifs[i].new_ctx);
6192 }
6193
6194 arctx_new->conf = *vifs[i].new_ctx;
6195
6196 /* FIXME: ath10k_mac_chan_reconfigure() uses current, i.e. not
6197 * yet updated chanctx_conf pointer.
6198 */
6199 arctx_old->conf = *vifs[i].new_ctx;
6200 }
6201 ath10k_mac_update_rx_channel(ar);
6202 spin_unlock_bh(&ar->data_lock);
6203
6204 /* FIXME: Reconfigure only affected vifs */
6205 ath10k_mac_chan_reconfigure(ar);
6206
6207 mutex_unlock(&ar->conf_mutex);
6208 return 0;
6209}
6210
Kalle Valo5e3dd152013-06-12 20:52:10 +03006211static const struct ieee80211_ops ath10k_ops = {
6212 .tx = ath10k_tx,
6213 .start = ath10k_start,
6214 .stop = ath10k_stop,
6215 .config = ath10k_config,
6216 .add_interface = ath10k_add_interface,
6217 .remove_interface = ath10k_remove_interface,
6218 .configure_filter = ath10k_configure_filter,
6219 .bss_info_changed = ath10k_bss_info_changed,
6220 .hw_scan = ath10k_hw_scan,
6221 .cancel_hw_scan = ath10k_cancel_hw_scan,
6222 .set_key = ath10k_set_key,
SenthilKumar Jegadeesan627613f2015-01-29 13:50:38 +02006223 .set_default_unicast_key = ath10k_set_default_unicast_key,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006224 .sta_state = ath10k_sta_state,
6225 .conf_tx = ath10k_conf_tx,
6226 .remain_on_channel = ath10k_remain_on_channel,
6227 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
6228 .set_rts_threshold = ath10k_set_rts_threshold,
Kalle Valo5e3dd152013-06-12 20:52:10 +03006229 .flush = ath10k_flush,
6230 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03006231 .set_antenna = ath10k_set_antenna,
6232 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02006233 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02006234 .get_survey = ath10k_get_survey,
Michal Kazior3ae54222015-03-31 10:49:20 +00006235 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01006236 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02006237 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02006238 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03006239 .get_et_sset_count = ath10k_debug_get_et_sset_count,
6240 .get_et_stats = ath10k_debug_get_et_stats,
6241 .get_et_strings = ath10k_debug_get_et_strings,
Michal Kazior500ff9f2015-03-31 10:26:21 +00006242 .add_chanctx = ath10k_mac_op_add_chanctx,
6243 .remove_chanctx = ath10k_mac_op_remove_chanctx,
6244 .change_chanctx = ath10k_mac_op_change_chanctx,
6245 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
6246 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
6247 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
Kalle Valo43d2a302014-09-10 18:23:30 +03006248
6249 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
6250
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006251#ifdef CONFIG_PM
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006252 .suspend = ath10k_wow_op_suspend,
6253 .resume = ath10k_wow_op_resume,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02006254#endif
Rajkumar Manoharanf5045982015-01-12 14:07:27 +02006255#ifdef CONFIG_MAC80211_DEBUGFS
6256 .sta_add_debugfs = ath10k_sta_add_debugfs,
6257#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03006258};
6259
Kalle Valo5e3dd152013-06-12 20:52:10 +03006260#define CHAN2G(_channel, _freq, _flags) { \
6261 .band = IEEE80211_BAND_2GHZ, \
6262 .hw_value = (_channel), \
6263 .center_freq = (_freq), \
6264 .flags = (_flags), \
6265 .max_antenna_gain = 0, \
6266 .max_power = 30, \
6267}
6268
6269#define CHAN5G(_channel, _freq, _flags) { \
6270 .band = IEEE80211_BAND_5GHZ, \
6271 .hw_value = (_channel), \
6272 .center_freq = (_freq), \
6273 .flags = (_flags), \
6274 .max_antenna_gain = 0, \
6275 .max_power = 30, \
6276}
6277
6278static const struct ieee80211_channel ath10k_2ghz_channels[] = {
6279 CHAN2G(1, 2412, 0),
6280 CHAN2G(2, 2417, 0),
6281 CHAN2G(3, 2422, 0),
6282 CHAN2G(4, 2427, 0),
6283 CHAN2G(5, 2432, 0),
6284 CHAN2G(6, 2437, 0),
6285 CHAN2G(7, 2442, 0),
6286 CHAN2G(8, 2447, 0),
6287 CHAN2G(9, 2452, 0),
6288 CHAN2G(10, 2457, 0),
6289 CHAN2G(11, 2462, 0),
6290 CHAN2G(12, 2467, 0),
6291 CHAN2G(13, 2472, 0),
6292 CHAN2G(14, 2484, 0),
6293};
6294
6295static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02006296 CHAN5G(36, 5180, 0),
6297 CHAN5G(40, 5200, 0),
6298 CHAN5G(44, 5220, 0),
6299 CHAN5G(48, 5240, 0),
6300 CHAN5G(52, 5260, 0),
6301 CHAN5G(56, 5280, 0),
6302 CHAN5G(60, 5300, 0),
6303 CHAN5G(64, 5320, 0),
6304 CHAN5G(100, 5500, 0),
6305 CHAN5G(104, 5520, 0),
6306 CHAN5G(108, 5540, 0),
6307 CHAN5G(112, 5560, 0),
6308 CHAN5G(116, 5580, 0),
6309 CHAN5G(120, 5600, 0),
6310 CHAN5G(124, 5620, 0),
6311 CHAN5G(128, 5640, 0),
6312 CHAN5G(132, 5660, 0),
6313 CHAN5G(136, 5680, 0),
6314 CHAN5G(140, 5700, 0),
Peter Oh4a7898f2015-03-18 11:39:18 -07006315 CHAN5G(144, 5720, 0),
Michal Kazior429ff562013-06-26 08:54:54 +02006316 CHAN5G(149, 5745, 0),
6317 CHAN5G(153, 5765, 0),
6318 CHAN5G(157, 5785, 0),
6319 CHAN5G(161, 5805, 0),
6320 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03006321};
6322
Michal Kaziore7b54192014-08-07 11:03:27 +02006323struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006324{
6325 struct ieee80211_hw *hw;
6326 struct ath10k *ar;
6327
Michal Kaziore7b54192014-08-07 11:03:27 +02006328 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006329 if (!hw)
6330 return NULL;
6331
6332 ar = hw->priv;
6333 ar->hw = hw;
6334
6335 return ar;
6336}
6337
6338void ath10k_mac_destroy(struct ath10k *ar)
6339{
6340 ieee80211_free_hw(ar->hw);
6341}
6342
6343static const struct ieee80211_iface_limit ath10k_if_limits[] = {
6344 {
6345 .max = 8,
6346 .types = BIT(NL80211_IFTYPE_STATION)
6347 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02006348 },
6349 {
6350 .max = 3,
6351 .types = BIT(NL80211_IFTYPE_P2P_GO)
6352 },
6353 {
Michal Kazior75d2bd42014-12-12 12:41:39 +01006354 .max = 1,
6355 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
6356 },
6357 {
Michal Kaziord531cb82013-07-31 10:55:13 +02006358 .max = 7,
6359 .types = BIT(NL80211_IFTYPE_AP)
6360 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006361};
6362
Bartosz Markowskif2595092013-12-10 16:20:39 +01006363static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006364 {
6365 .max = 8,
6366 .types = BIT(NL80211_IFTYPE_AP)
6367 },
6368};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006369
6370static const struct ieee80211_iface_combination ath10k_if_comb[] = {
6371 {
6372 .limits = ath10k_if_limits,
6373 .n_limits = ARRAY_SIZE(ath10k_if_limits),
6374 .max_interfaces = 8,
6375 .num_different_channels = 1,
6376 .beacon_int_infra_match = true,
6377 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01006378};
6379
6380static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006381 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01006382 .limits = ath10k_10x_if_limits,
6383 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006384 .max_interfaces = 8,
6385 .num_different_channels = 1,
6386 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01006387#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006388 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
6389 BIT(NL80211_CHAN_WIDTH_20) |
6390 BIT(NL80211_CHAN_WIDTH_40) |
6391 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02006392#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01006393 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03006394};
6395
Michal Kaziorcf327842015-03-31 10:26:25 +00006396static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
6397 {
6398 .max = 2,
6399 .types = BIT(NL80211_IFTYPE_STATION) |
6400 BIT(NL80211_IFTYPE_AP) |
6401 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6402 BIT(NL80211_IFTYPE_P2P_GO),
6403 },
6404 {
6405 .max = 1,
6406 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
6407 },
6408};
6409
6410static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
6411 {
6412 .max = 1,
6413 .types = BIT(NL80211_IFTYPE_STATION),
6414 },
6415 {
6416 .max = 1,
6417 .types = BIT(NL80211_IFTYPE_ADHOC),
6418 },
6419};
6420
6421/* FIXME: This is not thouroughly tested. These combinations may over- or
6422 * underestimate hw/fw capabilities.
6423 */
6424static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
6425 {
6426 .limits = ath10k_tlv_if_limit,
6427 .num_different_channels = 1,
6428 .max_interfaces = 3,
6429 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6430 },
6431 {
6432 .limits = ath10k_tlv_if_limit_ibss,
6433 .num_different_channels = 1,
6434 .max_interfaces = 2,
6435 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6436 },
6437};
6438
6439static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
6440 {
6441 .limits = ath10k_tlv_if_limit,
6442 .num_different_channels = 2,
6443 .max_interfaces = 3,
6444 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
6445 },
6446 {
6447 .limits = ath10k_tlv_if_limit_ibss,
6448 .num_different_channels = 1,
6449 .max_interfaces = 2,
6450 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
6451 },
6452};
6453
Kalle Valo5e3dd152013-06-12 20:52:10 +03006454static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
6455{
6456 struct ieee80211_sta_vht_cap vht_cap = {0};
6457 u16 mcs_map;
Michal Kaziorbc657a362015-02-26 11:11:22 +01006458 u32 val;
Michal Kazior8865bee42013-07-24 12:36:46 +02006459 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006460
6461 vht_cap.vht_supported = 1;
6462 vht_cap.cap = ar->vht_cap_info;
6463
Michal Kaziorbc657a362015-02-26 11:11:22 +01006464 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
6465 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
6466 val = ar->num_rf_chains - 1;
6467 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
6468 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
6469
6470 vht_cap.cap |= val;
6471 }
6472
6473 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
6474 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
6475 val = ar->num_rf_chains - 1;
6476 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
6477 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
6478
6479 vht_cap.cap |= val;
6480 }
6481
Michal Kazior8865bee42013-07-24 12:36:46 +02006482 mcs_map = 0;
6483 for (i = 0; i < 8; i++) {
6484 if (i < ar->num_rf_chains)
6485 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
6486 else
6487 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
6488 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006489
6490 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
6491 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
6492
6493 return vht_cap;
6494}
6495
6496static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
6497{
6498 int i;
6499 struct ieee80211_sta_ht_cap ht_cap = {0};
6500
6501 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
6502 return ht_cap;
6503
6504 ht_cap.ht_supported = 1;
6505 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6506 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
6507 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6508 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6509 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
6510
6511 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
6512 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6513
6514 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
6515 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6516
6517 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
6518 u32 smps;
6519
6520 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
6521 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
6522
6523 ht_cap.cap |= smps;
6524 }
6525
6526 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
6527 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
6528
6529 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
6530 u32 stbc;
6531
6532 stbc = ar->ht_cap_info;
6533 stbc &= WMI_HT_CAP_RX_STBC;
6534 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
6535 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
6536 stbc &= IEEE80211_HT_CAP_RX_STBC;
6537
6538 ht_cap.cap |= stbc;
6539 }
6540
6541 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
6542 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
6543
6544 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
6545 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
6546
6547 /* max AMSDU is implicitly taken from vht_cap_info */
6548 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
6549 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
6550
Michal Kazior8865bee42013-07-24 12:36:46 +02006551 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03006552 ht_cap.mcs.rx_mask[i] = 0xFF;
6553
6554 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
6555
6556 return ht_cap;
6557}
6558
Kalle Valo5e3dd152013-06-12 20:52:10 +03006559static void ath10k_get_arvif_iter(void *data, u8 *mac,
6560 struct ieee80211_vif *vif)
6561{
6562 struct ath10k_vif_iter *arvif_iter = data;
6563 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
6564
6565 if (arvif->vdev_id == arvif_iter->vdev_id)
6566 arvif_iter->arvif = arvif;
6567}
6568
6569struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
6570{
6571 struct ath10k_vif_iter arvif_iter;
6572 u32 flags;
6573
6574 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
6575 arvif_iter.vdev_id = vdev_id;
6576
6577 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
6578 ieee80211_iterate_active_interfaces_atomic(ar->hw,
6579 flags,
6580 ath10k_get_arvif_iter,
6581 &arvif_iter);
6582 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006583 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006584 return NULL;
6585 }
6586
6587 return arvif_iter.arvif;
6588}
6589
6590int ath10k_mac_register(struct ath10k *ar)
6591{
Johannes Berg3cb10942015-01-22 21:38:45 +01006592 static const u32 cipher_suites[] = {
6593 WLAN_CIPHER_SUITE_WEP40,
6594 WLAN_CIPHER_SUITE_WEP104,
6595 WLAN_CIPHER_SUITE_TKIP,
6596 WLAN_CIPHER_SUITE_CCMP,
6597 WLAN_CIPHER_SUITE_AES_CMAC,
6598 };
Kalle Valo5e3dd152013-06-12 20:52:10 +03006599 struct ieee80211_supported_band *band;
6600 struct ieee80211_sta_vht_cap vht_cap;
6601 struct ieee80211_sta_ht_cap ht_cap;
6602 void *channels;
6603 int ret;
6604
6605 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
6606
6607 SET_IEEE80211_DEV(ar->hw, ar->dev);
6608
6609 ht_cap = ath10k_get_ht_cap(ar);
6610 vht_cap = ath10k_create_vht_cap(ar);
6611
Michal Kaziorc94aa7e2015-03-24 12:38:11 +00006612 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
6613 ARRAY_SIZE(ath10k_5ghz_channels)) !=
6614 ATH10K_NUM_CHANS);
6615
Kalle Valo5e3dd152013-06-12 20:52:10 +03006616 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
6617 channels = kmemdup(ath10k_2ghz_channels,
6618 sizeof(ath10k_2ghz_channels),
6619 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02006620 if (!channels) {
6621 ret = -ENOMEM;
6622 goto err_free;
6623 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006624
6625 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
6626 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
6627 band->channels = channels;
6628 band->n_bitrates = ath10k_g_rates_size;
6629 band->bitrates = ath10k_g_rates;
6630 band->ht_cap = ht_cap;
6631
Yanbo Lid68bb122015-01-23 08:18:20 +08006632 /* Enable the VHT support at 2.4 GHz */
6633 band->vht_cap = vht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006634
6635 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
6636 }
6637
6638 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
6639 channels = kmemdup(ath10k_5ghz_channels,
6640 sizeof(ath10k_5ghz_channels),
6641 GFP_KERNEL);
6642 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02006643 ret = -ENOMEM;
6644 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006645 }
6646
6647 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
6648 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
6649 band->channels = channels;
6650 band->n_bitrates = ath10k_a_rates_size;
6651 band->bitrates = ath10k_a_rates;
6652 band->ht_cap = ht_cap;
6653 band->vht_cap = vht_cap;
6654 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
6655 }
6656
6657 ar->hw->wiphy->interface_modes =
6658 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01006659 BIT(NL80211_IFTYPE_AP);
6660
Ben Greear46acf7b2014-05-16 17:15:38 +03006661 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
6662 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
6663
Bartosz Markowskid3541812013-12-10 16:20:40 +01006664 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
6665 ar->hw->wiphy->interface_modes |=
Michal Kazior75d2bd42014-12-12 12:41:39 +01006666 BIT(NL80211_IFTYPE_P2P_DEVICE) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01006667 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6668 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006669
6670 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
6671 IEEE80211_HW_SUPPORTS_PS |
6672 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
Kalle Valo5e3dd152013-06-12 20:52:10 +03006673 IEEE80211_HW_MFP_CAPABLE |
6674 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
6675 IEEE80211_HW_HAS_RATE_CONTROL |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02006676 IEEE80211_HW_AP_LINK_PS |
Johannes Berg3cb10942015-01-22 21:38:45 +01006677 IEEE80211_HW_SPECTRUM_MGMT |
Michal Kaziorcc9904e2015-03-10 16:22:01 +02006678 IEEE80211_HW_SW_CRYPTO_CONTROL |
Michal Kazior500ff9f2015-03-31 10:26:21 +00006679 IEEE80211_HW_CONNECTION_MONITOR |
6680 IEEE80211_HW_WANT_MONITOR_VIF |
Michal Kazior96d828d2015-03-31 10:26:23 +00006681 IEEE80211_HW_CHANCTX_STA_CSA |
6682 IEEE80211_HW_QUEUE_CONTROL;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006683
Eliad Peller0d8614b2014-09-10 14:07:36 +03006684 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
6685
Kalle Valo5e3dd152013-06-12 20:52:10 +03006686 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03006687 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006688
6689 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
6690 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
6691 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
6692 }
6693
6694 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
6695 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
6696
6697 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01006698 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Michal Kazior500ff9f2015-03-31 10:26:21 +00006699 ar->hw->chanctx_data_size = sizeof(struct ath10k_chanctx);
Kalle Valo5e3dd152013-06-12 20:52:10 +03006700
Kalle Valo5e3dd152013-06-12 20:52:10 +03006701 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
6702
Michal Kaziorfbb8f1b2015-01-13 16:30:12 +02006703 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
6704 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
6705
6706 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
6707 * that userspace (e.g. wpa_supplicant/hostapd) can generate
6708 * correct Probe Responses. This is more of a hack advert..
6709 */
6710 ar->hw->wiphy->probe_resp_offload |=
6711 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
6712 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
6713 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
6714 }
6715
Marek Puzyniak75d85fd2015-03-30 09:51:53 +03006716 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map))
6717 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
6718
Kalle Valo5e3dd152013-06-12 20:52:10 +03006719 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01006720 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006721 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
6722
6723 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02006724 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
6725
Janusz.Dziedzic@tieto.com37a0b392015-03-12 13:11:41 +01006726 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
6727
Janusz Dziedzic5fd3ac32015-03-23 17:32:53 +02006728 ret = ath10k_wow_init(ar);
6729 if (ret) {
6730 ath10k_warn(ar, "failed to init wow: %d\n", ret);
6731 goto err_free;
6732 }
6733
Kalle Valo5e3dd152013-06-12 20:52:10 +03006734 /*
6735 * on LL hardware queues are managed entirely by the FW
6736 * so we only advertise to mac we can do the queues thing
6737 */
Michal Kazior96d828d2015-03-31 10:26:23 +00006738 ar->hw->queues = IEEE80211_MAX_QUEUES;
6739
6740 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
6741 * something that vdev_ids can't reach so that we don't stop the queue
6742 * accidentally.
6743 */
6744 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006745
Kalle Valo5cc7caf2014-12-17 12:20:54 +02006746 switch (ar->wmi.op_version) {
6747 case ATH10K_FW_WMI_OP_VERSION_MAIN:
Bartosz Markowskif2595092013-12-10 16:20:39 +01006748 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
6749 ar->hw->wiphy->n_iface_combinations =
6750 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03006751 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Kalle Valo5cc7caf2014-12-17 12:20:54 +02006752 break;
Michal Kaziorcf327842015-03-31 10:26:25 +00006753 case ATH10K_FW_WMI_OP_VERSION_TLV:
6754 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
6755 ar->hw->wiphy->iface_combinations =
6756 ath10k_tlv_qcs_if_comb;
6757 ar->hw->wiphy->n_iface_combinations =
6758 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
6759 } else {
6760 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
6761 ar->hw->wiphy->n_iface_combinations =
6762 ARRAY_SIZE(ath10k_tlv_if_comb);
6763 }
6764 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
6765 break;
Kalle Valo5cc7caf2014-12-17 12:20:54 +02006766 case ATH10K_FW_WMI_OP_VERSION_10_1:
6767 case ATH10K_FW_WMI_OP_VERSION_10_2:
Rajkumar Manoharan4a16fbe2014-12-17 12:21:12 +02006768 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
Kalle Valo5cc7caf2014-12-17 12:20:54 +02006769 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
6770 ar->hw->wiphy->n_iface_combinations =
6771 ARRAY_SIZE(ath10k_10x_if_comb);
6772 break;
6773 case ATH10K_FW_WMI_OP_VERSION_UNSET:
6774 case ATH10K_FW_WMI_OP_VERSION_MAX:
6775 WARN_ON(1);
6776 ret = -EINVAL;
6777 goto err_free;
Bartosz Markowskif2595092013-12-10 16:20:39 +01006778 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03006779
Michal Kazior7c199992013-07-31 10:47:57 +02006780 ar->hw->netdev_features = NETIF_F_HW_CSUM;
6781
Janusz Dziedzic9702c682013-11-20 09:59:41 +02006782 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
6783 /* Init ath dfs pattern detector */
6784 ar->ath_common.debug_mask = ATH_DBG_DFS;
6785 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
6786 NL80211_DFS_UNSET);
6787
6788 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02006789 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02006790 }
6791
Kalle Valo5e3dd152013-06-12 20:52:10 +03006792 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
6793 ath10k_reg_notifier);
6794 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006795 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02006796 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006797 }
6798
Johannes Berg3cb10942015-01-22 21:38:45 +01006799 ar->hw->wiphy->cipher_suites = cipher_suites;
6800 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6801
Kalle Valo5e3dd152013-06-12 20:52:10 +03006802 ret = ieee80211_register_hw(ar->hw);
6803 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02006804 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02006805 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006806 }
6807
6808 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
6809 ret = regulatory_hint(ar->hw->wiphy,
6810 ar->ath_common.regulatory.alpha2);
6811 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02006812 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03006813 }
6814
6815 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02006816
6817err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03006818 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02006819err_free:
6820 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
6821 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
6822
Kalle Valo5e3dd152013-06-12 20:52:10 +03006823 return ret;
6824}
6825
6826void ath10k_mac_unregister(struct ath10k *ar)
6827{
6828 ieee80211_unregister_hw(ar->hw);
6829
Janusz Dziedzic9702c682013-11-20 09:59:41 +02006830 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
6831 ar->dfs_detector->exit(ar->dfs_detector);
6832
Kalle Valo5e3dd152013-06-12 20:52:10 +03006833 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
6834 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
6835
6836 SET_IEEE80211_DEV(ar->hw, NULL);
6837}