blob: c4005670cba2e6ac934e8804629735e7b9180792 [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"
Kalle Valo5e3dd152013-06-12 20:52:10 +030030
31/**********/
32/* Crypto */
33/**********/
34
35static int ath10k_send_key(struct ath10k_vif *arvif,
36 struct ieee80211_key_conf *key,
37 enum set_key_cmd cmd,
38 const u8 *macaddr)
39{
Michal Kazior7aa7a722014-08-25 12:09:38 +020040 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +030041 struct wmi_vdev_install_key_arg arg = {
42 .vdev_id = arvif->vdev_id,
43 .key_idx = key->keyidx,
44 .key_len = key->keylen,
45 .key_data = key->key,
46 .macaddr = macaddr,
47 };
48
Michal Kazior548db542013-07-05 16:15:15 +030049 lockdep_assert_held(&arvif->ar->conf_mutex);
50
Kalle Valo5e3dd152013-06-12 20:52:10 +030051 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
52 arg.key_flags = WMI_KEY_PAIRWISE;
53 else
54 arg.key_flags = WMI_KEY_GROUP;
55
56 switch (key->cipher) {
57 case WLAN_CIPHER_SUITE_CCMP:
58 arg.key_cipher = WMI_CIPHER_AES_CCM;
Marek Kwaczynskieeab2662014-05-14 16:56:17 +030059 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
60 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
61 else
62 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
Kalle Valo5e3dd152013-06-12 20:52:10 +030063 break;
64 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +030065 arg.key_cipher = WMI_CIPHER_TKIP;
66 arg.key_txmic_len = 8;
67 arg.key_rxmic_len = 8;
68 break;
69 case WLAN_CIPHER_SUITE_WEP40:
70 case WLAN_CIPHER_SUITE_WEP104:
71 arg.key_cipher = WMI_CIPHER_WEP;
72 /* AP/IBSS mode requires self-key to be groupwise
73 * Otherwise pairwise key must be set */
74 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
75 arg.key_flags = WMI_KEY_PAIRWISE;
76 break;
77 default:
Michal Kazior7aa7a722014-08-25 12:09:38 +020078 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
Kalle Valo5e3dd152013-06-12 20:52:10 +030079 return -EOPNOTSUPP;
80 }
81
82 if (cmd == DISABLE_KEY) {
83 arg.key_cipher = WMI_CIPHER_NONE;
84 arg.key_data = NULL;
85 }
86
87 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
88}
89
90static int ath10k_install_key(struct ath10k_vif *arvif,
91 struct ieee80211_key_conf *key,
92 enum set_key_cmd cmd,
93 const u8 *macaddr)
94{
95 struct ath10k *ar = arvif->ar;
96 int ret;
97
Michal Kazior548db542013-07-05 16:15:15 +030098 lockdep_assert_held(&ar->conf_mutex);
99
Wolfram Sang16735d02013-11-14 14:32:02 -0800100 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300101
102 ret = ath10k_send_key(arvif, key, cmd, macaddr);
103 if (ret)
104 return ret;
105
106 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
107 if (ret == 0)
108 return -ETIMEDOUT;
109
110 return 0;
111}
112
113static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
114 const u8 *addr)
115{
116 struct ath10k *ar = arvif->ar;
117 struct ath10k_peer *peer;
118 int ret;
119 int i;
120
121 lockdep_assert_held(&ar->conf_mutex);
122
123 spin_lock_bh(&ar->data_lock);
124 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
125 spin_unlock_bh(&ar->data_lock);
126
127 if (!peer)
128 return -ENOENT;
129
130 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
131 if (arvif->wep_keys[i] == NULL)
132 continue;
133
134 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
135 addr);
136 if (ret)
137 return ret;
138
Sujith Manoharanae167132014-11-25 11:46:59 +0530139 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300140 peer->keys[i] = arvif->wep_keys[i];
Sujith Manoharanae167132014-11-25 11:46:59 +0530141 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300142 }
143
144 return 0;
145}
146
147static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
148 const u8 *addr)
149{
150 struct ath10k *ar = arvif->ar;
151 struct ath10k_peer *peer;
152 int first_errno = 0;
153 int ret;
154 int i;
155
156 lockdep_assert_held(&ar->conf_mutex);
157
158 spin_lock_bh(&ar->data_lock);
159 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
160 spin_unlock_bh(&ar->data_lock);
161
162 if (!peer)
163 return -ENOENT;
164
165 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
166 if (peer->keys[i] == NULL)
167 continue;
168
169 ret = ath10k_install_key(arvif, peer->keys[i],
170 DISABLE_KEY, addr);
171 if (ret && first_errno == 0)
172 first_errno = ret;
173
174 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200175 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300176 i, ret);
177
Sujith Manoharanae167132014-11-25 11:46:59 +0530178 spin_lock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300179 peer->keys[i] = NULL;
Sujith Manoharanae167132014-11-25 11:46:59 +0530180 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300181 }
182
183 return first_errno;
184}
185
Sujith Manoharan504f6cd2014-11-25 11:46:58 +0530186bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
187 u8 keyidx)
188{
189 struct ath10k_peer *peer;
190 int i;
191
192 lockdep_assert_held(&ar->data_lock);
193
194 /* We don't know which vdev this peer belongs to,
195 * since WMI doesn't give us that information.
196 *
197 * FIXME: multi-bss needs to be handled.
198 */
199 peer = ath10k_peer_find(ar, 0, addr);
200 if (!peer)
201 return false;
202
203 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
204 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
205 return true;
206 }
207
208 return false;
209}
210
Kalle Valo5e3dd152013-06-12 20:52:10 +0300211static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
212 struct ieee80211_key_conf *key)
213{
214 struct ath10k *ar = arvif->ar;
215 struct ath10k_peer *peer;
216 u8 addr[ETH_ALEN];
217 int first_errno = 0;
218 int ret;
219 int i;
220
221 lockdep_assert_held(&ar->conf_mutex);
222
223 for (;;) {
224 /* since ath10k_install_key we can't hold data_lock all the
225 * time, so we try to remove the keys incrementally */
226 spin_lock_bh(&ar->data_lock);
227 i = 0;
228 list_for_each_entry(peer, &ar->peers, list) {
229 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
230 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300231 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300232 peer->keys[i] = NULL;
233 break;
234 }
235 }
236
237 if (i < ARRAY_SIZE(peer->keys))
238 break;
239 }
240 spin_unlock_bh(&ar->data_lock);
241
242 if (i == ARRAY_SIZE(peer->keys))
243 break;
244
245 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
246 if (ret && first_errno == 0)
247 first_errno = ret;
248
249 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200250 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200251 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300252 }
253
254 return first_errno;
255}
256
Kalle Valo5e3dd152013-06-12 20:52:10 +0300257/*********************/
258/* General utilities */
259/*********************/
260
261static inline enum wmi_phy_mode
262chan_to_phymode(const struct cfg80211_chan_def *chandef)
263{
264 enum wmi_phy_mode phymode = MODE_UNKNOWN;
265
266 switch (chandef->chan->band) {
267 case IEEE80211_BAND_2GHZ:
268 switch (chandef->width) {
269 case NL80211_CHAN_WIDTH_20_NOHT:
270 phymode = MODE_11G;
271 break;
272 case NL80211_CHAN_WIDTH_20:
273 phymode = MODE_11NG_HT20;
274 break;
275 case NL80211_CHAN_WIDTH_40:
276 phymode = MODE_11NG_HT40;
277 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400278 case NL80211_CHAN_WIDTH_5:
279 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300280 case NL80211_CHAN_WIDTH_80:
281 case NL80211_CHAN_WIDTH_80P80:
282 case NL80211_CHAN_WIDTH_160:
283 phymode = MODE_UNKNOWN;
284 break;
285 }
286 break;
287 case IEEE80211_BAND_5GHZ:
288 switch (chandef->width) {
289 case NL80211_CHAN_WIDTH_20_NOHT:
290 phymode = MODE_11A;
291 break;
292 case NL80211_CHAN_WIDTH_20:
293 phymode = MODE_11NA_HT20;
294 break;
295 case NL80211_CHAN_WIDTH_40:
296 phymode = MODE_11NA_HT40;
297 break;
298 case NL80211_CHAN_WIDTH_80:
299 phymode = MODE_11AC_VHT80;
300 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400301 case NL80211_CHAN_WIDTH_5:
302 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300303 case NL80211_CHAN_WIDTH_80P80:
304 case NL80211_CHAN_WIDTH_160:
305 phymode = MODE_UNKNOWN;
306 break;
307 }
308 break;
309 default:
310 break;
311 }
312
313 WARN_ON(phymode == MODE_UNKNOWN);
314 return phymode;
315}
316
317static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
318{
319/*
320 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
321 * 0 for no restriction
322 * 1 for 1/4 us
323 * 2 for 1/2 us
324 * 3 for 1 us
325 * 4 for 2 us
326 * 5 for 4 us
327 * 6 for 8 us
328 * 7 for 16 us
329 */
330 switch (mpdudensity) {
331 case 0:
332 return 0;
333 case 1:
334 case 2:
335 case 3:
336 /* Our lower layer calculations limit our precision to
337 1 microsecond */
338 return 1;
339 case 4:
340 return 2;
341 case 5:
342 return 4;
343 case 6:
344 return 8;
345 case 7:
346 return 16;
347 default:
348 return 0;
349 }
350}
351
352static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
353{
354 int ret;
355
356 lockdep_assert_held(&ar->conf_mutex);
357
Michal Kaziorcfd10612014-11-25 15:16:05 +0100358 if (ar->num_peers >= ar->max_num_peers)
359 return -ENOBUFS;
360
Kalle Valo5e3dd152013-06-12 20:52:10 +0300361 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800362 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200363 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200364 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300365 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800366 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300367
368 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800369 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200370 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200371 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300372 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800373 }
Michal Kazior292a7532014-11-25 15:16:04 +0100374
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100375 ar->num_peers++;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300376
377 return 0;
378}
379
Kalle Valo5a13e762014-01-20 11:01:46 +0200380static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
381{
382 struct ath10k *ar = arvif->ar;
383 u32 param;
384 int ret;
385
386 param = ar->wmi.pdev_param->sta_kickout_th;
387 ret = ath10k_wmi_pdev_set_param(ar, param,
388 ATH10K_KICKOUT_THRESHOLD);
389 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200390 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200391 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200392 return ret;
393 }
394
395 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
396 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
397 ATH10K_KEEPALIVE_MIN_IDLE);
398 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200399 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200400 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200401 return ret;
402 }
403
404 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
405 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
406 ATH10K_KEEPALIVE_MAX_IDLE);
407 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200408 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200409 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200410 return ret;
411 }
412
413 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
414 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
415 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
416 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200417 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200418 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200419 return ret;
420 }
421
422 return 0;
423}
424
Vivek Natarajanacab6402014-11-26 09:06:12 +0200425static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
Michal Kazior424121c2013-07-22 14:13:31 +0200426{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200427 struct ath10k *ar = arvif->ar;
428 u32 vdev_param;
429
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200430 vdev_param = ar->wmi.vdev_param->rts_threshold;
431 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200432}
433
434static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
435{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200436 struct ath10k *ar = arvif->ar;
437 u32 vdev_param;
438
Michal Kazior424121c2013-07-22 14:13:31 +0200439 if (value != 0xFFFFFFFF)
440 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
441 ATH10K_FRAGMT_THRESHOLD_MIN,
442 ATH10K_FRAGMT_THRESHOLD_MAX);
443
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200444 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
445 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200446}
447
Kalle Valo5e3dd152013-06-12 20:52:10 +0300448static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
449{
450 int ret;
451
452 lockdep_assert_held(&ar->conf_mutex);
453
454 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
455 if (ret)
456 return ret;
457
458 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
459 if (ret)
460 return ret;
461
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100462 ar->num_peers--;
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100463
Kalle Valo5e3dd152013-06-12 20:52:10 +0300464 return 0;
465}
466
467static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
468{
469 struct ath10k_peer *peer, *tmp;
470
471 lockdep_assert_held(&ar->conf_mutex);
472
473 spin_lock_bh(&ar->data_lock);
474 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
475 if (peer->vdev_id != vdev_id)
476 continue;
477
Michal Kazior7aa7a722014-08-25 12:09:38 +0200478 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300479 peer->addr, vdev_id);
480
481 list_del(&peer->list);
482 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100483 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300484 }
485 spin_unlock_bh(&ar->data_lock);
486}
487
Michal Kaziora96d7742013-07-16 09:38:56 +0200488static void ath10k_peer_cleanup_all(struct ath10k *ar)
489{
490 struct ath10k_peer *peer, *tmp;
491
492 lockdep_assert_held(&ar->conf_mutex);
493
494 spin_lock_bh(&ar->data_lock);
495 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
496 list_del(&peer->list);
497 kfree(peer);
498 }
499 spin_unlock_bh(&ar->data_lock);
Michal Kazior292a7532014-11-25 15:16:04 +0100500
501 ar->num_peers = 0;
Michal Kaziorcfd10612014-11-25 15:16:05 +0100502 ar->num_stations = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200503}
504
Kalle Valo5e3dd152013-06-12 20:52:10 +0300505/************************/
506/* Interface management */
507/************************/
508
Michal Kazior64badcb2014-09-18 11:18:02 +0300509void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
510{
511 struct ath10k *ar = arvif->ar;
512
513 lockdep_assert_held(&ar->data_lock);
514
515 if (!arvif->beacon)
516 return;
517
518 if (!arvif->beacon_buf)
519 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
520 arvif->beacon->len, DMA_TO_DEVICE);
521
522 dev_kfree_skb_any(arvif->beacon);
523
524 arvif->beacon = NULL;
525 arvif->beacon_sent = false;
526}
527
528static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
529{
530 struct ath10k *ar = arvif->ar;
531
532 lockdep_assert_held(&ar->data_lock);
533
534 ath10k_mac_vif_beacon_free(arvif);
535
536 if (arvif->beacon_buf) {
537 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
538 arvif->beacon_buf, arvif->beacon_paddr);
539 arvif->beacon_buf = NULL;
540 }
541}
542
Kalle Valo5e3dd152013-06-12 20:52:10 +0300543static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
544{
545 int ret;
546
Michal Kazior548db542013-07-05 16:15:15 +0300547 lockdep_assert_held(&ar->conf_mutex);
548
Michal Kazior7962b0d2014-10-28 10:34:38 +0100549 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
550 return -ESHUTDOWN;
551
Kalle Valo5e3dd152013-06-12 20:52:10 +0300552 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
553 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
554 if (ret == 0)
555 return -ETIMEDOUT;
556
557 return 0;
558}
559
Michal Kazior1bbc0972014-04-08 09:45:47 +0300560static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300561{
Michal Kaziorc930f742014-01-23 11:38:25 +0100562 struct cfg80211_chan_def *chandef = &ar->chandef;
563 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300564 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300565 int ret = 0;
566
567 lockdep_assert_held(&ar->conf_mutex);
568
Kalle Valo5e3dd152013-06-12 20:52:10 +0300569 arg.vdev_id = vdev_id;
570 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100571 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300572
573 /* TODO setup this dynamically, what in case we
574 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100575 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200576 arg.channel.chan_radar =
577 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300578
Michal Kazior89c5c842013-10-23 04:02:13 -0700579 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700580 arg.channel.max_power = channel->max_power * 2;
581 arg.channel.max_reg_power = channel->max_reg_power * 2;
582 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300583
Michal Kazior7962b0d2014-10-28 10:34:38 +0100584 reinit_completion(&ar->vdev_setup_done);
585
Kalle Valo5e3dd152013-06-12 20:52:10 +0300586 ret = ath10k_wmi_vdev_start(ar, &arg);
587 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200588 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200589 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300590 return ret;
591 }
592
593 ret = ath10k_vdev_setup_sync(ar);
594 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200595 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200596 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300597 return ret;
598 }
599
600 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
601 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200602 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200603 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300604 goto vdev_stop;
605 }
606
607 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300608
Michal Kazior7aa7a722014-08-25 12:09:38 +0200609 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300610 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300611 return 0;
612
613vdev_stop:
614 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
615 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200616 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200617 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300618
619 return ret;
620}
621
Michal Kazior1bbc0972014-04-08 09:45:47 +0300622static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623{
624 int ret = 0;
625
626 lockdep_assert_held(&ar->conf_mutex);
627
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200628 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
629 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200630 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200631 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300632
Michal Kazior7962b0d2014-10-28 10:34:38 +0100633 reinit_completion(&ar->vdev_setup_done);
634
Kalle Valo5e3dd152013-06-12 20:52:10 +0300635 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
636 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200637 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200638 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300639
640 ret = ath10k_vdev_setup_sync(ar);
641 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200642 ath10k_warn(ar, "failed to synchronise monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200643 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300644
Michal Kazior7aa7a722014-08-25 12:09:38 +0200645 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300646 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300647 return ret;
648}
649
Michal Kazior1bbc0972014-04-08 09:45:47 +0300650static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300651{
652 int bit, ret = 0;
653
654 lockdep_assert_held(&ar->conf_mutex);
655
Ben Greeara9aefb32014-08-12 11:02:19 +0300656 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200657 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300658 return -ENOMEM;
659 }
660
Ben Greear16c11172014-09-23 14:17:16 -0700661 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300662
Ben Greear16c11172014-09-23 14:17:16 -0700663 ar->monitor_vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300664
665 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
666 WMI_VDEV_TYPE_MONITOR,
667 0, ar->mac_addr);
668 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200669 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200670 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300671 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300672 }
673
Ben Greear16c11172014-09-23 14:17:16 -0700674 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200675 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300676 ar->monitor_vdev_id);
677
Kalle Valo5e3dd152013-06-12 20:52:10 +0300678 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300679}
680
Michal Kazior1bbc0972014-04-08 09:45:47 +0300681static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300682{
683 int ret = 0;
684
685 lockdep_assert_held(&ar->conf_mutex);
686
Kalle Valo5e3dd152013-06-12 20:52:10 +0300687 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
688 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200689 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200690 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300691 return ret;
692 }
693
Ben Greear16c11172014-09-23 14:17:16 -0700694 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300695
Michal Kazior7aa7a722014-08-25 12:09:38 +0200696 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300697 ar->monitor_vdev_id);
698 return ret;
699}
700
Michal Kazior1bbc0972014-04-08 09:45:47 +0300701static int ath10k_monitor_start(struct ath10k *ar)
702{
703 int ret;
704
705 lockdep_assert_held(&ar->conf_mutex);
706
Michal Kazior1bbc0972014-04-08 09:45:47 +0300707 ret = ath10k_monitor_vdev_create(ar);
708 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200709 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300710 return ret;
711 }
712
713 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
714 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200715 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300716 ath10k_monitor_vdev_delete(ar);
717 return ret;
718 }
719
720 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200721 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +0300722
723 return 0;
724}
725
Michal Kazior19337472014-08-28 12:58:16 +0200726static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +0300727{
728 int ret;
729
730 lockdep_assert_held(&ar->conf_mutex);
731
Michal Kazior1bbc0972014-04-08 09:45:47 +0300732 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +0200733 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200734 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +0200735 return ret;
736 }
Michal Kazior1bbc0972014-04-08 09:45:47 +0300737
738 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +0200739 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200740 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +0200741 return ret;
742 }
Michal Kazior1bbc0972014-04-08 09:45:47 +0300743
744 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200745 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +0200746
747 return 0;
748}
749
750static int ath10k_monitor_recalc(struct ath10k *ar)
751{
752 bool should_start;
753
754 lockdep_assert_held(&ar->conf_mutex);
755
756 should_start = ar->monitor ||
757 ar->filter_flags & FIF_PROMISC_IN_BSS ||
758 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
759
760 ath10k_dbg(ar, ATH10K_DBG_MAC,
761 "mac monitor recalc started? %d should? %d\n",
762 ar->monitor_started, should_start);
763
764 if (should_start == ar->monitor_started)
765 return 0;
766
767 if (should_start)
768 return ath10k_monitor_start(ar);
Kalle Valod8bb26b2014-09-14 12:50:33 +0300769
770 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300771}
772
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200773static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
774{
775 struct ath10k *ar = arvif->ar;
776 u32 vdev_param, rts_cts = 0;
777
778 lockdep_assert_held(&ar->conf_mutex);
779
780 vdev_param = ar->wmi.vdev_param->enable_rtscts;
781
782 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
783 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
784
785 if (arvif->num_legacy_stations > 0)
786 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
787 WMI_RTSCTS_PROFILE);
788
789 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
790 rts_cts);
791}
792
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200793static int ath10k_start_cac(struct ath10k *ar)
794{
795 int ret;
796
797 lockdep_assert_held(&ar->conf_mutex);
798
799 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
800
Michal Kazior19337472014-08-28 12:58:16 +0200801 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200802 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200803 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200804 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
805 return ret;
806 }
807
Michal Kazior7aa7a722014-08-25 12:09:38 +0200808 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200809 ar->monitor_vdev_id);
810
811 return 0;
812}
813
814static int ath10k_stop_cac(struct ath10k *ar)
815{
816 lockdep_assert_held(&ar->conf_mutex);
817
818 /* CAC is not running - do nothing */
819 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
820 return 0;
821
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200822 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300823 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200824
Michal Kazior7aa7a722014-08-25 12:09:38 +0200825 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200826
827 return 0;
828}
829
Michal Kaziord6500972014-04-08 09:56:09 +0300830static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200831{
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200832 int ret;
833
834 lockdep_assert_held(&ar->conf_mutex);
835
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200836 ath10k_stop_cac(ar);
837
Michal Kaziord6500972014-04-08 09:56:09 +0300838 if (!ar->radar_enabled)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200839 return;
840
Michal Kaziord6500972014-04-08 09:56:09 +0300841 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200842 return;
843
844 ret = ath10k_start_cac(ar);
845 if (ret) {
846 /*
847 * Not possible to start CAC on current channel so starting
848 * radiation is not allowed, make this channel DFS_UNAVAILABLE
849 * by indicating that radar was detected.
850 */
Michal Kazior7aa7a722014-08-25 12:09:38 +0200851 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200852 ieee80211_radar_detected(ar->hw);
853 }
854}
855
Michal Kaziordc55e302014-07-29 12:53:36 +0300856static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +0300857{
858 struct ath10k *ar = arvif->ar;
859 struct cfg80211_chan_def *chandef = &ar->chandef;
860 struct wmi_vdev_start_request_arg arg = {};
861 int ret = 0;
862
863 lockdep_assert_held(&ar->conf_mutex);
864
865 reinit_completion(&ar->vdev_setup_done);
866
867 arg.vdev_id = arvif->vdev_id;
868 arg.dtim_period = arvif->dtim_period;
869 arg.bcn_intval = arvif->beacon_interval;
870
871 arg.channel.freq = chandef->chan->center_freq;
872 arg.channel.band_center_freq1 = chandef->center_freq1;
873 arg.channel.mode = chan_to_phymode(chandef);
874
875 arg.channel.min_power = 0;
876 arg.channel.max_power = chandef->chan->max_power * 2;
877 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
878 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
879
880 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
881 arg.ssid = arvif->u.ap.ssid;
882 arg.ssid_len = arvif->u.ap.ssid_len;
883 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
884
885 /* For now allow DFS for AP mode */
886 arg.channel.chan_radar =
887 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
888 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
889 arg.ssid = arvif->vif->bss_conf.ssid;
890 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
891 }
892
Michal Kazior7aa7a722014-08-25 12:09:38 +0200893 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +0300894 "mac vdev %d start center_freq %d phymode %s\n",
895 arg.vdev_id, arg.channel.freq,
896 ath10k_wmi_phymode_str(arg.channel.mode));
897
Michal Kaziordc55e302014-07-29 12:53:36 +0300898 if (restart)
899 ret = ath10k_wmi_vdev_restart(ar, &arg);
900 else
901 ret = ath10k_wmi_vdev_start(ar, &arg);
902
Michal Kazior72654fa2014-04-08 09:56:09 +0300903 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200904 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300905 arg.vdev_id, ret);
906 return ret;
907 }
908
909 ret = ath10k_vdev_setup_sync(ar);
910 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200911 ath10k_warn(ar, "failed to synchronise setup for vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300912 arg.vdev_id, ret);
913 return ret;
914 }
915
Michal Kaziord6500972014-04-08 09:56:09 +0300916 ar->num_started_vdevs++;
917 ath10k_recalc_radar_detection(ar);
918
Michal Kazior72654fa2014-04-08 09:56:09 +0300919 return ret;
920}
921
Michal Kaziordc55e302014-07-29 12:53:36 +0300922static int ath10k_vdev_start(struct ath10k_vif *arvif)
923{
924 return ath10k_vdev_start_restart(arvif, false);
925}
926
927static int ath10k_vdev_restart(struct ath10k_vif *arvif)
928{
929 return ath10k_vdev_start_restart(arvif, true);
930}
931
Michal Kazior72654fa2014-04-08 09:56:09 +0300932static int ath10k_vdev_stop(struct ath10k_vif *arvif)
933{
934 struct ath10k *ar = arvif->ar;
935 int ret;
936
937 lockdep_assert_held(&ar->conf_mutex);
938
939 reinit_completion(&ar->vdev_setup_done);
940
941 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
942 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200943 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300944 arvif->vdev_id, ret);
945 return ret;
946 }
947
948 ret = ath10k_vdev_setup_sync(ar);
949 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200950 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300951 arvif->vdev_id, ret);
952 return ret;
953 }
954
Michal Kaziord6500972014-04-08 09:56:09 +0300955 WARN_ON(ar->num_started_vdevs == 0);
956
957 if (ar->num_started_vdevs != 0) {
958 ar->num_started_vdevs--;
959 ath10k_recalc_radar_detection(ar);
960 }
961
Michal Kazior72654fa2014-04-08 09:56:09 +0300962 return ret;
963}
964
Kalle Valo5e3dd152013-06-12 20:52:10 +0300965static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +0300966 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300967{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200968 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300969 int ret = 0;
970
Michal Kazior548db542013-07-05 16:15:15 +0300971 lockdep_assert_held(&arvif->ar->conf_mutex);
972
Kalle Valo5e3dd152013-06-12 20:52:10 +0300973 if (!info->enable_beacon) {
974 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100975
976 arvif->is_started = false;
977 arvif->is_up = false;
978
Michal Kazior748afc42014-01-23 12:48:21 +0100979 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +0300980 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +0100981 spin_unlock_bh(&arvif->ar->data_lock);
982
Kalle Valo5e3dd152013-06-12 20:52:10 +0300983 return;
984 }
985
986 arvif->tx_seq_no = 0x1000;
987
988 ret = ath10k_vdev_start(arvif);
989 if (ret)
990 return;
991
Michal Kaziorc930f742014-01-23 11:38:25 +0100992 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +0300993 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +0100994
995 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
996 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300997 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200998 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200999 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001000 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001001 return;
1002 }
Michal Kaziorc930f742014-01-23 11:38:25 +01001003
1004 arvif->is_started = true;
1005 arvif->is_up = true;
1006
Michal Kazior7aa7a722014-08-25 12:09:38 +02001007 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001008}
1009
1010static void ath10k_control_ibss(struct ath10k_vif *arvif,
1011 struct ieee80211_bss_conf *info,
1012 const u8 self_peer[ETH_ALEN])
1013{
Michal Kazior7aa7a722014-08-25 12:09:38 +02001014 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001015 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001016 int ret = 0;
1017
Michal Kazior548db542013-07-05 16:15:15 +03001018 lockdep_assert_held(&arvif->ar->conf_mutex);
1019
Kalle Valo5e3dd152013-06-12 20:52:10 +03001020 if (!info->ibss_joined) {
1021 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
1022 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001023 ath10k_warn(ar, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001024 self_peer, arvif->vdev_id, ret);
1025
Michal Kaziorc930f742014-01-23 11:38:25 +01001026 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +03001027 return;
1028
Michal Kaziorc930f742014-01-23 11:38:25 +01001029 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001030
1031 return;
1032 }
1033
1034 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1035 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001036 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001037 self_peer, arvif->vdev_id, ret);
1038 return;
1039 }
1040
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001041 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1042 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001043 ATH10K_DEFAULT_ATIM);
1044 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001045 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001046 arvif->vdev_id, ret);
1047}
1048
1049/*
1050 * Review this when mac80211 gains per-interface powersave support.
1051 */
Michal Kaziorad088bf2013-10-16 15:44:46 +03001052static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001053{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001054 struct ath10k *ar = arvif->ar;
1055 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001056 enum wmi_sta_powersave_param param;
1057 enum wmi_sta_ps_mode psmode;
1058 int ret;
1059
Michal Kazior548db542013-07-05 16:15:15 +03001060 lockdep_assert_held(&arvif->ar->conf_mutex);
1061
Michal Kaziorad088bf2013-10-16 15:44:46 +03001062 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1063 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001064
1065 if (conf->flags & IEEE80211_CONF_PS) {
1066 psmode = WMI_STA_PS_MODE_ENABLED;
1067 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1068
Michal Kaziorad088bf2013-10-16 15:44:46 +03001069 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001070 conf->dynamic_ps_timeout);
1071 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001072 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001073 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001074 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001075 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001076 } else {
1077 psmode = WMI_STA_PS_MODE_DISABLED;
1078 }
1079
Michal Kazior7aa7a722014-08-25 12:09:38 +02001080 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001081 arvif->vdev_id, psmode ? "enable" : "disable");
1082
Michal Kaziorad088bf2013-10-16 15:44:46 +03001083 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1084 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001085 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001086 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001087 return ret;
1088 }
1089
1090 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001091}
1092
1093/**********************/
1094/* Station management */
1095/**********************/
1096
Michal Kazior590922a2014-10-21 10:10:29 +03001097static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1098 struct ieee80211_vif *vif)
1099{
1100 /* Some firmware revisions have unstable STA powersave when listen
1101 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1102 * generate NullFunc frames properly even if buffered frames have been
1103 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1104 * buffered frames. Often pinging the device from AP would simply fail.
1105 *
1106 * As a workaround set it to 1.
1107 */
1108 if (vif->type == NL80211_IFTYPE_STATION)
1109 return 1;
1110
1111 return ar->hw->conf.listen_interval;
1112}
1113
Kalle Valo5e3dd152013-06-12 20:52:10 +03001114static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001115 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001116 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001117 struct wmi_peer_assoc_complete_arg *arg)
1118{
Michal Kazior590922a2014-10-21 10:10:29 +03001119 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1120
Michal Kazior548db542013-07-05 16:15:15 +03001121 lockdep_assert_held(&ar->conf_mutex);
1122
Kalle Valob25f32c2014-09-14 12:50:49 +03001123 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001124 arg->vdev_id = arvif->vdev_id;
1125 arg->peer_aid = sta->aid;
1126 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001127 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001128 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001129 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001130}
1131
1132static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001133 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001134 struct wmi_peer_assoc_complete_arg *arg)
1135{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001136 struct ieee80211_bss_conf *info = &vif->bss_conf;
1137 struct cfg80211_bss *bss;
1138 const u8 *rsnie = NULL;
1139 const u8 *wpaie = NULL;
1140
Michal Kazior548db542013-07-05 16:15:15 +03001141 lockdep_assert_held(&ar->conf_mutex);
1142
Kalle Valo5e3dd152013-06-12 20:52:10 +03001143 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1144 info->bssid, NULL, 0, 0, 0);
1145 if (bss) {
1146 const struct cfg80211_bss_ies *ies;
1147
1148 rcu_read_lock();
1149 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1150
1151 ies = rcu_dereference(bss->ies);
1152
1153 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001154 WLAN_OUI_TYPE_MICROSOFT_WPA,
1155 ies->data,
1156 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001157 rcu_read_unlock();
1158 cfg80211_put_bss(ar->hw->wiphy, bss);
1159 }
1160
1161 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1162 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001163 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001164 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1165 }
1166
1167 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001168 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001169 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1170 }
1171}
1172
1173static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1174 struct ieee80211_sta *sta,
1175 struct wmi_peer_assoc_complete_arg *arg)
1176{
1177 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1178 const struct ieee80211_supported_band *sband;
1179 const struct ieee80211_rate *rates;
1180 u32 ratemask;
1181 int i;
1182
Michal Kazior548db542013-07-05 16:15:15 +03001183 lockdep_assert_held(&ar->conf_mutex);
1184
Kalle Valo5e3dd152013-06-12 20:52:10 +03001185 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1186 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1187 rates = sband->bitrates;
1188
1189 rateset->num_rates = 0;
1190
1191 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1192 if (!(ratemask & 1))
1193 continue;
1194
1195 rateset->rates[rateset->num_rates] = rates->hw_value;
1196 rateset->num_rates++;
1197 }
1198}
1199
1200static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1201 struct ieee80211_sta *sta,
1202 struct wmi_peer_assoc_complete_arg *arg)
1203{
1204 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001205 int i, n;
Kalle Valoaf762c02014-09-14 12:50:17 +03001206 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001207
Michal Kazior548db542013-07-05 16:15:15 +03001208 lockdep_assert_held(&ar->conf_mutex);
1209
Kalle Valo5e3dd152013-06-12 20:52:10 +03001210 if (!ht_cap->ht_supported)
1211 return;
1212
1213 arg->peer_flags |= WMI_PEER_HT;
1214 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1215 ht_cap->ampdu_factor)) - 1;
1216
1217 arg->peer_mpdu_density =
1218 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1219
1220 arg->peer_ht_caps = ht_cap->cap;
1221 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1222
1223 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1224 arg->peer_flags |= WMI_PEER_LDPC;
1225
1226 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1227 arg->peer_flags |= WMI_PEER_40MHZ;
1228 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1229 }
1230
1231 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1232 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1233
1234 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1235 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1236
1237 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1238 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1239 arg->peer_flags |= WMI_PEER_STBC;
1240 }
1241
1242 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001243 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1244 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1245 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1246 arg->peer_rate_caps |= stbc;
1247 arg->peer_flags |= WMI_PEER_STBC;
1248 }
1249
Kalle Valo5e3dd152013-06-12 20:52:10 +03001250 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1251 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1252 else if (ht_cap->mcs.rx_mask[1])
1253 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1254
1255 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1256 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1257 arg->peer_ht_rates.rates[n++] = i;
1258
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001259 /*
1260 * This is a workaround for HT-enabled STAs which break the spec
1261 * and have no HT capabilities RX mask (no HT RX MCS map).
1262 *
1263 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1264 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1265 *
1266 * Firmware asserts if such situation occurs.
1267 */
1268 if (n == 0) {
1269 arg->peer_ht_rates.num_rates = 8;
1270 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1271 arg->peer_ht_rates.rates[i] = i;
1272 } else {
1273 arg->peer_ht_rates.num_rates = n;
1274 arg->peer_num_spatial_streams = sta->rx_nss;
1275 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001276
Michal Kazior7aa7a722014-08-25 12:09:38 +02001277 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001278 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001279 arg->peer_ht_rates.num_rates,
1280 arg->peer_num_spatial_streams);
1281}
1282
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001283static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1284 struct ath10k_vif *arvif,
1285 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001286{
1287 u32 uapsd = 0;
1288 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001289 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001290
Michal Kazior548db542013-07-05 16:15:15 +03001291 lockdep_assert_held(&ar->conf_mutex);
1292
Kalle Valo5e3dd152013-06-12 20:52:10 +03001293 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001294 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001295 sta->uapsd_queues, sta->max_sp);
1296
Kalle Valo5e3dd152013-06-12 20:52:10 +03001297 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1298 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1299 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1300 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1301 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1302 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1303 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1304 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1305 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1306 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1307 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1308 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1309
Kalle Valo5e3dd152013-06-12 20:52:10 +03001310 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1311 max_sp = sta->max_sp;
1312
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001313 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1314 sta->addr,
1315 WMI_AP_PS_PEER_PARAM_UAPSD,
1316 uapsd);
1317 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001318 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001319 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001320 return ret;
1321 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001322
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001323 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1324 sta->addr,
1325 WMI_AP_PS_PEER_PARAM_MAX_SP,
1326 max_sp);
1327 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001328 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001329 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001330 return ret;
1331 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001332
1333 /* TODO setup this based on STA listen interval and
1334 beacon interval. Currently we don't know
1335 sta->listen_interval - mac80211 patch required.
1336 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001337 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03001338 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1339 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001340 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001341 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001342 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001343 return ret;
1344 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001345 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001346
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001347 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001348}
1349
1350static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1351 struct ieee80211_sta *sta,
1352 struct wmi_peer_assoc_complete_arg *arg)
1353{
1354 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001355 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001356
1357 if (!vht_cap->vht_supported)
1358 return;
1359
1360 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001361 arg->peer_vht_caps = vht_cap->cap;
1362
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001363 ampdu_factor = (vht_cap->cap &
1364 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1365 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1366
1367 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1368 * zero in VHT IE. Using it would result in degraded throughput.
1369 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1370 * it if VHT max_mpdu is smaller. */
1371 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1372 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1373 ampdu_factor)) - 1);
1374
Kalle Valo5e3dd152013-06-12 20:52:10 +03001375 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1376 arg->peer_flags |= WMI_PEER_80MHZ;
1377
1378 arg->peer_vht_rates.rx_max_rate =
1379 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1380 arg->peer_vht_rates.rx_mcs_set =
1381 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1382 arg->peer_vht_rates.tx_max_rate =
1383 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1384 arg->peer_vht_rates.tx_mcs_set =
1385 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1386
Michal Kazior7aa7a722014-08-25 12:09:38 +02001387 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001388 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001389}
1390
1391static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001392 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001393 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001394 struct wmi_peer_assoc_complete_arg *arg)
1395{
Michal Kazior590922a2014-10-21 10:10:29 +03001396 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1397
Kalle Valo5e3dd152013-06-12 20:52:10 +03001398 switch (arvif->vdev_type) {
1399 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001400 if (sta->wme)
1401 arg->peer_flags |= WMI_PEER_QOS;
1402
1403 if (sta->wme && sta->uapsd_queues) {
1404 arg->peer_flags |= WMI_PEER_APSD;
1405 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1406 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001407 break;
1408 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03001409 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001410 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001411 break;
1412 default:
1413 break;
1414 }
1415}
1416
1417static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001418 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001419 struct ieee80211_sta *sta,
1420 struct wmi_peer_assoc_complete_arg *arg)
1421{
1422 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1423
Kalle Valo5e3dd152013-06-12 20:52:10 +03001424 switch (ar->hw->conf.chandef.chan->band) {
1425 case IEEE80211_BAND_2GHZ:
1426 if (sta->ht_cap.ht_supported) {
1427 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1428 phymode = MODE_11NG_HT40;
1429 else
1430 phymode = MODE_11NG_HT20;
1431 } else {
1432 phymode = MODE_11G;
1433 }
1434
1435 break;
1436 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001437 /*
1438 * Check VHT first.
1439 */
1440 if (sta->vht_cap.vht_supported) {
1441 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1442 phymode = MODE_11AC_VHT80;
1443 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1444 phymode = MODE_11AC_VHT40;
1445 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1446 phymode = MODE_11AC_VHT20;
1447 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001448 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1449 phymode = MODE_11NA_HT40;
1450 else
1451 phymode = MODE_11NA_HT20;
1452 } else {
1453 phymode = MODE_11A;
1454 }
1455
1456 break;
1457 default:
1458 break;
1459 }
1460
Michal Kazior7aa7a722014-08-25 12:09:38 +02001461 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03001462 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001463
Kalle Valo5e3dd152013-06-12 20:52:10 +03001464 arg->peer_phymode = phymode;
1465 WARN_ON(phymode == MODE_UNKNOWN);
1466}
1467
Kalle Valob9ada652013-10-16 15:44:46 +03001468static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001469 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03001470 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03001471 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001472{
Michal Kazior548db542013-07-05 16:15:15 +03001473 lockdep_assert_held(&ar->conf_mutex);
1474
Kalle Valob9ada652013-10-16 15:44:46 +03001475 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001476
Michal Kazior590922a2014-10-21 10:10:29 +03001477 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1478 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Kalle Valob9ada652013-10-16 15:44:46 +03001479 ath10k_peer_assoc_h_rates(ar, sta, arg);
1480 ath10k_peer_assoc_h_ht(ar, sta, arg);
1481 ath10k_peer_assoc_h_vht(ar, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03001482 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1483 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001484
Kalle Valob9ada652013-10-16 15:44:46 +03001485 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001486}
1487
Michal Kazior90046f52014-02-14 14:45:51 +01001488static const u32 ath10k_smps_map[] = {
1489 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1490 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1491 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1492 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1493};
1494
1495static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1496 const u8 *addr,
1497 const struct ieee80211_sta_ht_cap *ht_cap)
1498{
1499 int smps;
1500
1501 if (!ht_cap->ht_supported)
1502 return 0;
1503
1504 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1505 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1506
1507 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1508 return -EINVAL;
1509
1510 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1511 WMI_PEER_SMPS_STATE,
1512 ath10k_smps_map[smps]);
1513}
1514
Kalle Valo5e3dd152013-06-12 20:52:10 +03001515/* can be called only in mac80211 callbacks due to `key_count` usage */
1516static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1517 struct ieee80211_vif *vif,
1518 struct ieee80211_bss_conf *bss_conf)
1519{
1520 struct ath10k *ar = hw->priv;
1521 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001522 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001523 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001524 struct ieee80211_sta *ap_sta;
1525 int ret;
1526
Michal Kazior548db542013-07-05 16:15:15 +03001527 lockdep_assert_held(&ar->conf_mutex);
1528
Michal Kazior077efc82014-10-21 10:10:29 +03001529 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
1530 arvif->vdev_id, arvif->bssid, arvif->aid);
1531
Kalle Valo5e3dd152013-06-12 20:52:10 +03001532 rcu_read_lock();
1533
1534 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1535 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001536 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001537 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001538 rcu_read_unlock();
1539 return;
1540 }
1541
Michal Kazior90046f52014-02-14 14:45:51 +01001542 /* ap_sta must be accessed only within rcu section which must be left
1543 * before calling ath10k_setup_peer_smps() which might sleep. */
1544 ht_cap = ap_sta->ht_cap;
1545
Michal Kazior590922a2014-10-21 10:10:29 +03001546 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001547 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001548 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001549 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001550 rcu_read_unlock();
1551 return;
1552 }
1553
1554 rcu_read_unlock();
1555
Kalle Valob9ada652013-10-16 15:44:46 +03001556 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1557 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001558 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001559 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001560 return;
1561 }
1562
Michal Kazior90046f52014-02-14 14:45:51 +01001563 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1564 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001565 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001566 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001567 return;
1568 }
1569
Michal Kazior7aa7a722014-08-25 12:09:38 +02001570 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001571 "mac vdev %d up (associated) bssid %pM aid %d\n",
1572 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1573
Michal Kazior077efc82014-10-21 10:10:29 +03001574 WARN_ON(arvif->is_up);
1575
Michal Kaziorc930f742014-01-23 11:38:25 +01001576 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03001577 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001578
1579 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1580 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001581 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001582 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001583 return;
1584 }
1585
1586 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001587}
1588
Kalle Valo5e3dd152013-06-12 20:52:10 +03001589static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1590 struct ieee80211_vif *vif)
1591{
1592 struct ath10k *ar = hw->priv;
1593 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1594 int ret;
1595
Michal Kazior548db542013-07-05 16:15:15 +03001596 lockdep_assert_held(&ar->conf_mutex);
1597
Michal Kazior077efc82014-10-21 10:10:29 +03001598 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
1599 arvif->vdev_id, arvif->bssid);
Kalle Valo60c3daa2013-09-08 17:56:07 +03001600
Kalle Valo5e3dd152013-06-12 20:52:10 +03001601 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kazior077efc82014-10-21 10:10:29 +03001602 if (ret)
1603 ath10k_warn(ar, "faield to down vdev %i: %d\n",
1604 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001605
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001606 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001607 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001608}
1609
Michal Kazior590922a2014-10-21 10:10:29 +03001610static int ath10k_station_assoc(struct ath10k *ar,
1611 struct ieee80211_vif *vif,
1612 struct ieee80211_sta *sta,
1613 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001614{
Michal Kazior590922a2014-10-21 10:10:29 +03001615 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03001616 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001617 int ret = 0;
1618
Michal Kazior548db542013-07-05 16:15:15 +03001619 lockdep_assert_held(&ar->conf_mutex);
1620
Michal Kazior590922a2014-10-21 10:10:29 +03001621 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001622 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001623 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001624 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001625 return ret;
1626 }
1627
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001628 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001629 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1630 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001631 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001632 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001633 return ret;
1634 }
1635
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001636 /* Re-assoc is run only to update supported rates for given station. It
1637 * doesn't make much sense to reconfigure the peer completely.
1638 */
1639 if (!reassoc) {
1640 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
1641 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001642 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001643 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001644 arvif->vdev_id, ret);
1645 return ret;
1646 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001647
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001648 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1649 if (ret) {
1650 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
1651 sta->addr, arvif->vdev_id, ret);
1652 return ret;
1653 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001654
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001655 if (!sta->wme) {
1656 arvif->num_legacy_stations++;
1657 ret = ath10k_recalc_rtscts_prot(arvif);
1658 if (ret) {
1659 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1660 arvif->vdev_id, ret);
1661 return ret;
1662 }
1663 }
1664
1665 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1666 if (ret) {
1667 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001668 arvif->vdev_id, ret);
1669 return ret;
1670 }
1671 }
1672
Kalle Valo5e3dd152013-06-12 20:52:10 +03001673 return ret;
1674}
1675
Michal Kazior590922a2014-10-21 10:10:29 +03001676static int ath10k_station_disassoc(struct ath10k *ar,
1677 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001678 struct ieee80211_sta *sta)
1679{
Michal Kazior590922a2014-10-21 10:10:29 +03001680 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001681 int ret = 0;
1682
1683 lockdep_assert_held(&ar->conf_mutex);
1684
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001685 if (!sta->wme) {
1686 arvif->num_legacy_stations--;
1687 ret = ath10k_recalc_rtscts_prot(arvif);
1688 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001689 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001690 arvif->vdev_id, ret);
1691 return ret;
1692 }
1693 }
1694
Kalle Valo5e3dd152013-06-12 20:52:10 +03001695 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1696 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001697 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001698 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001699 return ret;
1700 }
1701
1702 return ret;
1703}
1704
1705/**************/
1706/* Regulatory */
1707/**************/
1708
1709static int ath10k_update_channel_list(struct ath10k *ar)
1710{
1711 struct ieee80211_hw *hw = ar->hw;
1712 struct ieee80211_supported_band **bands;
1713 enum ieee80211_band band;
1714 struct ieee80211_channel *channel;
1715 struct wmi_scan_chan_list_arg arg = {0};
1716 struct wmi_channel_arg *ch;
1717 bool passive;
1718 int len;
1719 int ret;
1720 int i;
1721
Michal Kazior548db542013-07-05 16:15:15 +03001722 lockdep_assert_held(&ar->conf_mutex);
1723
Kalle Valo5e3dd152013-06-12 20:52:10 +03001724 bands = hw->wiphy->bands;
1725 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1726 if (!bands[band])
1727 continue;
1728
1729 for (i = 0; i < bands[band]->n_channels; i++) {
1730 if (bands[band]->channels[i].flags &
1731 IEEE80211_CHAN_DISABLED)
1732 continue;
1733
1734 arg.n_channels++;
1735 }
1736 }
1737
1738 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1739 arg.channels = kzalloc(len, GFP_KERNEL);
1740 if (!arg.channels)
1741 return -ENOMEM;
1742
1743 ch = arg.channels;
1744 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1745 if (!bands[band])
1746 continue;
1747
1748 for (i = 0; i < bands[band]->n_channels; i++) {
1749 channel = &bands[band]->channels[i];
1750
1751 if (channel->flags & IEEE80211_CHAN_DISABLED)
1752 continue;
1753
1754 ch->allow_ht = true;
1755
1756 /* FIXME: when should we really allow VHT? */
1757 ch->allow_vht = true;
1758
1759 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001760 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001761
1762 ch->ht40plus =
1763 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1764
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001765 ch->chan_radar =
1766 !!(channel->flags & IEEE80211_CHAN_RADAR);
1767
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001768 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001769 ch->passive = passive;
1770
1771 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02001772 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001773 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001774 ch->max_power = channel->max_power * 2;
1775 ch->max_reg_power = channel->max_reg_power * 2;
1776 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001777 ch->reg_class_id = 0; /* FIXME */
1778
1779 /* FIXME: why use only legacy modes, why not any
1780 * HT/VHT modes? Would that even make any
1781 * difference? */
1782 if (channel->band == IEEE80211_BAND_2GHZ)
1783 ch->mode = MODE_11G;
1784 else
1785 ch->mode = MODE_11A;
1786
1787 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1788 continue;
1789
Michal Kazior7aa7a722014-08-25 12:09:38 +02001790 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001791 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1792 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001793 ch->freq, ch->max_power, ch->max_reg_power,
1794 ch->max_antenna_gain, ch->mode);
1795
1796 ch++;
1797 }
1798 }
1799
1800 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1801 kfree(arg.channels);
1802
1803 return ret;
1804}
1805
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001806static enum wmi_dfs_region
1807ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1808{
1809 switch (dfs_region) {
1810 case NL80211_DFS_UNSET:
1811 return WMI_UNINIT_DFS_DOMAIN;
1812 case NL80211_DFS_FCC:
1813 return WMI_FCC_DFS_DOMAIN;
1814 case NL80211_DFS_ETSI:
1815 return WMI_ETSI_DFS_DOMAIN;
1816 case NL80211_DFS_JP:
1817 return WMI_MKK4_DFS_DOMAIN;
1818 }
1819 return WMI_UNINIT_DFS_DOMAIN;
1820}
1821
Michal Kaziorf7843d72013-07-16 09:38:52 +02001822static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001823{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001824 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001825 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001826 enum wmi_dfs_region wmi_dfs_reg;
1827 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001828
Michal Kaziorf7843d72013-07-16 09:38:52 +02001829 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001830
1831 ret = ath10k_update_channel_list(ar);
1832 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001833 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001834
1835 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001836
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001837 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1838 nl_dfs_reg = ar->dfs_detector->region;
1839 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1840 } else {
1841 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1842 }
1843
Kalle Valo5e3dd152013-06-12 20:52:10 +03001844 /* Target allows setting up per-band regdomain but ath_common provides
1845 * a combined one only */
1846 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001847 regpair->reg_domain,
1848 regpair->reg_domain, /* 2ghz */
1849 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001850 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001851 regpair->reg_5ghz_ctl,
1852 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001853 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001854 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001855}
Michal Kazior548db542013-07-05 16:15:15 +03001856
Michal Kaziorf7843d72013-07-16 09:38:52 +02001857static void ath10k_reg_notifier(struct wiphy *wiphy,
1858 struct regulatory_request *request)
1859{
1860 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1861 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001862 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001863
1864 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1865
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001866 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001867 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001868 request->dfs_region);
1869 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1870 request->dfs_region);
1871 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001872 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001873 request->dfs_region);
1874 }
1875
Michal Kaziorf7843d72013-07-16 09:38:52 +02001876 mutex_lock(&ar->conf_mutex);
1877 if (ar->state == ATH10K_STATE_ON)
1878 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001879 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001880}
1881
1882/***************/
1883/* TX handlers */
1884/***************/
1885
Michal Kazior42c3aa62013-10-02 11:03:38 +02001886static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1887{
1888 if (ieee80211_is_mgmt(hdr->frame_control))
1889 return HTT_DATA_TX_EXT_TID_MGMT;
1890
1891 if (!ieee80211_is_data_qos(hdr->frame_control))
1892 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1893
1894 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1895 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1896
1897 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1898}
1899
Michal Kazior2b37c292014-09-02 11:00:22 +03001900static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001901{
Michal Kazior2b37c292014-09-02 11:00:22 +03001902 if (vif)
1903 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001904
Michal Kazior1bbc0972014-04-08 09:45:47 +03001905 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001906 return ar->monitor_vdev_id;
1907
Michal Kazior7aa7a722014-08-25 12:09:38 +02001908 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001909 return 0;
1910}
1911
Michal Kazior4b604552014-07-21 21:03:09 +03001912/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1913 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03001914 */
Michal Kazior4b604552014-07-21 21:03:09 +03001915static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001916{
1917 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001918 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001919 u8 *qos_ctl;
1920
1921 if (!ieee80211_is_data_qos(hdr->frame_control))
1922 return;
1923
1924 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001925 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1926 skb->data, (void *)qos_ctl - (void *)skb->data);
1927 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001928
1929 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1930 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1931 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1932 * it is safe to downgrade to NullFunc.
1933 */
1934 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1935 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1936 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1937 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001938}
1939
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001940static void ath10k_tx_wep_key_work(struct work_struct *work)
1941{
1942 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1943 wep_key_work);
Michal Kazior7aa7a722014-08-25 12:09:38 +02001944 struct ath10k *ar = arvif->ar;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001945 int ret, keyidx = arvif->def_wep_key_newidx;
1946
Michal Kazior911e6c02014-05-26 12:46:03 +03001947 mutex_lock(&arvif->ar->conf_mutex);
1948
1949 if (arvif->ar->state != ATH10K_STATE_ON)
1950 goto unlock;
1951
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001952 if (arvif->def_wep_key_idx == keyidx)
Michal Kazior911e6c02014-05-26 12:46:03 +03001953 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001954
Michal Kazior7aa7a722014-08-25 12:09:38 +02001955 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001956 arvif->vdev_id, keyidx);
1957
1958 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1959 arvif->vdev_id,
1960 arvif->ar->wmi.vdev_param->def_keyid,
1961 keyidx);
1962 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001963 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001964 arvif->vdev_id,
1965 ret);
Michal Kazior911e6c02014-05-26 12:46:03 +03001966 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001967 }
1968
1969 arvif->def_wep_key_idx = keyidx;
Michal Kazior911e6c02014-05-26 12:46:03 +03001970
1971unlock:
1972 mutex_unlock(&arvif->ar->conf_mutex);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001973}
1974
Michal Kazior4b604552014-07-21 21:03:09 +03001975static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1976 struct ieee80211_key_conf *key,
1977 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001978{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001979 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1980 struct ath10k *ar = arvif->ar;
1981 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001982
Kalle Valo5e3dd152013-06-12 20:52:10 +03001983 if (!ieee80211_has_protected(hdr->frame_control))
1984 return;
1985
1986 if (!key)
1987 return;
1988
1989 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1990 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1991 return;
1992
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001993 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001994 return;
1995
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001996 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1997 * queueing frames until key index is updated is not an option because
1998 * sk_buff may need more processing to be done, e.g. offchannel */
1999 arvif->def_wep_key_newidx = key->keyidx;
2000 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002001}
2002
Michal Kazior4b604552014-07-21 21:03:09 +03002003static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
2004 struct ieee80211_vif *vif,
2005 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002006{
2007 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002008 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2009
2010 /* This is case only for P2P_GO */
2011 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
2012 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
2013 return;
2014
2015 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2016 spin_lock_bh(&ar->data_lock);
2017 if (arvif->u.ap.noa_data)
2018 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2019 GFP_ATOMIC))
2020 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2021 arvif->u.ap.noa_data,
2022 arvif->u.ap.noa_len);
2023 spin_unlock_bh(&ar->data_lock);
2024 }
2025}
2026
Michal Kazior8d6d3622014-11-24 14:58:31 +01002027static bool ath10k_mac_need_offchan_tx_work(struct ath10k *ar)
2028{
2029 /* FIXME: Not really sure since when the behaviour changed. At some
2030 * point new firmware stopped requiring creation of peer entries for
2031 * offchannel tx (and actually creating them causes issues with wmi-htc
2032 * tx credit replenishment and reliability). Assuming it's at least 3.4
2033 * because that's when the `freq` was introduced to TX_FRM HTT command.
2034 */
2035 return !(ar->htt.target_version_major >= 3 &&
2036 ar->htt.target_version_minor >= 4);
2037}
2038
Kalle Valo5e3dd152013-06-12 20:52:10 +03002039static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2040{
2041 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002042 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002043
Michal Kazior961d4c32013-08-09 10:13:34 +02002044 if (ar->htt.target_version_major >= 3) {
2045 /* Since HTT 3.0 there is no separate mgmt tx command */
2046 ret = ath10k_htt_tx(&ar->htt, skb);
2047 goto exit;
2048 }
2049
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002050 if (ieee80211_is_mgmt(hdr->frame_control)) {
2051 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2052 ar->fw_features)) {
2053 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2054 ATH10K_MAX_NUM_MGMT_PENDING) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002055 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002056 ret = -EBUSY;
2057 goto exit;
2058 }
2059
2060 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2061 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2062 } else {
2063 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2064 }
2065 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2066 ar->fw_features) &&
2067 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002068 /* FW does not report tx status properly for NullFunc frames
2069 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002070 * those frames when it detects link/beacon loss and depends
2071 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03002072 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002073 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03002074 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002075 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002076
Michal Kazior961d4c32013-08-09 10:13:34 +02002077exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002078 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002079 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2080 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002081 ieee80211_free_txskb(ar->hw, skb);
2082 }
2083}
2084
2085void ath10k_offchan_tx_purge(struct ath10k *ar)
2086{
2087 struct sk_buff *skb;
2088
2089 for (;;) {
2090 skb = skb_dequeue(&ar->offchan_tx_queue);
2091 if (!skb)
2092 break;
2093
2094 ieee80211_free_txskb(ar->hw, skb);
2095 }
2096}
2097
2098void ath10k_offchan_tx_work(struct work_struct *work)
2099{
2100 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2101 struct ath10k_peer *peer;
2102 struct ieee80211_hdr *hdr;
2103 struct sk_buff *skb;
2104 const u8 *peer_addr;
2105 int vdev_id;
2106 int ret;
2107
2108 /* FW requirement: We must create a peer before FW will send out
2109 * an offchannel frame. Otherwise the frame will be stuck and
2110 * never transmitted. We delete the peer upon tx completion.
2111 * It is unlikely that a peer for offchannel tx will already be
2112 * present. However it may be in some rare cases so account for that.
2113 * Otherwise we might remove a legitimate peer and break stuff. */
2114
2115 for (;;) {
2116 skb = skb_dequeue(&ar->offchan_tx_queue);
2117 if (!skb)
2118 break;
2119
2120 mutex_lock(&ar->conf_mutex);
2121
Michal Kazior7aa7a722014-08-25 12:09:38 +02002122 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002123 skb);
2124
2125 hdr = (struct ieee80211_hdr *)skb->data;
2126 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002127 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002128
2129 spin_lock_bh(&ar->data_lock);
2130 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2131 spin_unlock_bh(&ar->data_lock);
2132
2133 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002134 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02002135 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002136 peer_addr, vdev_id);
2137
2138 if (!peer) {
2139 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2140 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002141 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002142 peer_addr, vdev_id, ret);
2143 }
2144
2145 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002146 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002147 ar->offchan_tx_skb = skb;
2148 spin_unlock_bh(&ar->data_lock);
2149
2150 ath10k_tx_htt(ar, skb);
2151
2152 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2153 3 * HZ);
2154 if (ret <= 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002155 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002156 skb);
2157
2158 if (!peer) {
2159 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2160 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002161 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002162 peer_addr, vdev_id, ret);
2163 }
2164
2165 mutex_unlock(&ar->conf_mutex);
2166 }
2167}
2168
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002169void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2170{
2171 struct sk_buff *skb;
2172
2173 for (;;) {
2174 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2175 if (!skb)
2176 break;
2177
2178 ieee80211_free_txskb(ar->hw, skb);
2179 }
2180}
2181
2182void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2183{
2184 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2185 struct sk_buff *skb;
2186 int ret;
2187
2188 for (;;) {
2189 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2190 if (!skb)
2191 break;
2192
2193 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002194 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002195 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02002196 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002197 ieee80211_free_txskb(ar->hw, skb);
2198 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002199 }
2200}
2201
Kalle Valo5e3dd152013-06-12 20:52:10 +03002202/************/
2203/* Scanning */
2204/************/
2205
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002206void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002207{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002208 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002209
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002210 switch (ar->scan.state) {
2211 case ATH10K_SCAN_IDLE:
2212 break;
2213 case ATH10K_SCAN_RUNNING:
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002214 if (ar->scan.is_roc)
2215 ieee80211_remain_on_channel_expired(ar->hw);
Michal Kazior7305d3e2014-11-24 14:58:33 +01002216 case ATH10K_SCAN_ABORTING:
2217 if (!ar->scan.is_roc)
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002218 ieee80211_scan_completed(ar->hw,
2219 (ar->scan.state ==
2220 ATH10K_SCAN_ABORTING));
2221 /* fall through */
2222 case ATH10K_SCAN_STARTING:
2223 ar->scan.state = ATH10K_SCAN_IDLE;
2224 ar->scan_channel = NULL;
2225 ath10k_offchan_tx_purge(ar);
2226 cancel_delayed_work(&ar->scan.timeout);
2227 complete_all(&ar->scan.completed);
2228 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002229 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002230}
Kalle Valo5e3dd152013-06-12 20:52:10 +03002231
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002232void ath10k_scan_finish(struct ath10k *ar)
2233{
2234 spin_lock_bh(&ar->data_lock);
2235 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002236 spin_unlock_bh(&ar->data_lock);
2237}
2238
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002239static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002240{
2241 struct wmi_stop_scan_arg arg = {
2242 .req_id = 1, /* FIXME */
2243 .req_type = WMI_SCAN_STOP_ONE,
2244 .u.scan_id = ATH10K_SCAN_ID,
2245 };
2246 int ret;
2247
2248 lockdep_assert_held(&ar->conf_mutex);
2249
Kalle Valo5e3dd152013-06-12 20:52:10 +03002250 ret = ath10k_wmi_stop_scan(ar, &arg);
2251 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002252 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002253 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002254 }
2255
Kalle Valo5e3dd152013-06-12 20:52:10 +03002256 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002257 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002258 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002259 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002260 } else if (ret > 0) {
2261 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002262 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002263
2264out:
2265 /* Scan state should be updated upon scan completion but in case
2266 * firmware fails to deliver the event (for whatever reason) it is
2267 * desired to clean up scan state anyway. Firmware may have just
2268 * dropped the scan completion event delivery due to transport pipe
2269 * being overflown with data and/or it can recover on its own before
2270 * next scan request is submitted.
2271 */
2272 spin_lock_bh(&ar->data_lock);
2273 if (ar->scan.state != ATH10K_SCAN_IDLE)
2274 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002275 spin_unlock_bh(&ar->data_lock);
2276
2277 return ret;
2278}
2279
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002280static void ath10k_scan_abort(struct ath10k *ar)
2281{
2282 int ret;
2283
2284 lockdep_assert_held(&ar->conf_mutex);
2285
2286 spin_lock_bh(&ar->data_lock);
2287
2288 switch (ar->scan.state) {
2289 case ATH10K_SCAN_IDLE:
2290 /* This can happen if timeout worker kicked in and called
2291 * abortion while scan completion was being processed.
2292 */
2293 break;
2294 case ATH10K_SCAN_STARTING:
2295 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02002296 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002297 ath10k_scan_state_str(ar->scan.state),
2298 ar->scan.state);
2299 break;
2300 case ATH10K_SCAN_RUNNING:
2301 ar->scan.state = ATH10K_SCAN_ABORTING;
2302 spin_unlock_bh(&ar->data_lock);
2303
2304 ret = ath10k_scan_stop(ar);
2305 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002306 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002307
2308 spin_lock_bh(&ar->data_lock);
2309 break;
2310 }
2311
2312 spin_unlock_bh(&ar->data_lock);
2313}
2314
2315void ath10k_scan_timeout_work(struct work_struct *work)
2316{
2317 struct ath10k *ar = container_of(work, struct ath10k,
2318 scan.timeout.work);
2319
2320 mutex_lock(&ar->conf_mutex);
2321 ath10k_scan_abort(ar);
2322 mutex_unlock(&ar->conf_mutex);
2323}
2324
Kalle Valo5e3dd152013-06-12 20:52:10 +03002325static int ath10k_start_scan(struct ath10k *ar,
2326 const struct wmi_start_scan_arg *arg)
2327{
2328 int ret;
2329
2330 lockdep_assert_held(&ar->conf_mutex);
2331
2332 ret = ath10k_wmi_start_scan(ar, arg);
2333 if (ret)
2334 return ret;
2335
Kalle Valo5e3dd152013-06-12 20:52:10 +03002336 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2337 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002338 ret = ath10k_scan_stop(ar);
2339 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002340 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002341
2342 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002343 }
2344
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002345 /* Add a 200ms margin to account for event/command processing */
2346 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2347 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002348 return 0;
2349}
2350
2351/**********************/
2352/* mac80211 callbacks */
2353/**********************/
2354
2355static void ath10k_tx(struct ieee80211_hw *hw,
2356 struct ieee80211_tx_control *control,
2357 struct sk_buff *skb)
2358{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002359 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03002360 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2361 struct ieee80211_vif *vif = info->control.vif;
2362 struct ieee80211_key_conf *key = info->control.hw_key;
2363 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002364
2365 /* We should disable CCK RATE due to P2P */
2366 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002367 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002368
Michal Kazior4b604552014-07-21 21:03:09 +03002369 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2370 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
Michal Kazior2b37c292014-09-02 11:00:22 +03002371 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002372
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002373 /* it makes no sense to process injected frames like that */
Michal Kazior4b604552014-07-21 21:03:09 +03002374 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2375 ath10k_tx_h_nwifi(hw, skb);
2376 ath10k_tx_h_update_wep_key(vif, key, skb);
2377 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2378 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002379 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002380
Kalle Valo5e3dd152013-06-12 20:52:10 +03002381 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2382 spin_lock_bh(&ar->data_lock);
Michal Kazior8d6d3622014-11-24 14:58:31 +01002383 ATH10K_SKB_CB(skb)->htt.freq = ar->scan.roc_freq;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002384 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002385 spin_unlock_bh(&ar->data_lock);
2386
Michal Kazior8d6d3622014-11-24 14:58:31 +01002387 if (ath10k_mac_need_offchan_tx_work(ar)) {
2388 ATH10K_SKB_CB(skb)->htt.freq = 0;
2389 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002390
Michal Kazior8d6d3622014-11-24 14:58:31 +01002391 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2392 skb);
2393
2394 skb_queue_tail(&ar->offchan_tx_queue, skb);
2395 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2396 return;
2397 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002398 }
2399
2400 ath10k_tx_htt(ar, skb);
2401}
2402
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002403/* Must not be called with conf_mutex held as workers can use that also. */
Michal Kazior7962b0d2014-10-28 10:34:38 +01002404void ath10k_drain_tx(struct ath10k *ar)
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002405{
2406 /* make sure rcu-protected mac80211 tx path itself is drained */
2407 synchronize_net();
2408
2409 ath10k_offchan_tx_purge(ar);
2410 ath10k_mgmt_over_wmi_tx_purge(ar);
2411
2412 cancel_work_sync(&ar->offchan_tx_work);
2413 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2414}
2415
Michal Kazioraffd3212013-07-16 09:54:35 +02002416void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002417{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002418 struct ath10k_vif *arvif;
2419
Michal Kazior818bdd12013-07-16 09:38:57 +02002420 lockdep_assert_held(&ar->conf_mutex);
2421
Michal Kazior19337472014-08-28 12:58:16 +02002422 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2423 ar->filter_flags = 0;
2424 ar->monitor = false;
2425
2426 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03002427 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02002428
2429 ar->monitor_started = false;
Michal Kazior1bbc0972014-04-08 09:45:47 +03002430
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002431 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002432 ath10k_peer_cleanup_all(ar);
2433 ath10k_core_stop(ar);
2434 ath10k_hif_power_down(ar);
2435
2436 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03002437 list_for_each_entry(arvif, &ar->arvifs, list)
2438 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02002439 spin_unlock_bh(&ar->data_lock);
2440}
2441
Ben Greear46acf7b2014-05-16 17:15:38 +03002442static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2443{
2444 struct ath10k *ar = hw->priv;
2445
2446 mutex_lock(&ar->conf_mutex);
2447
2448 if (ar->cfg_tx_chainmask) {
2449 *tx_ant = ar->cfg_tx_chainmask;
2450 *rx_ant = ar->cfg_rx_chainmask;
2451 } else {
2452 *tx_ant = ar->supp_tx_chainmask;
2453 *rx_ant = ar->supp_rx_chainmask;
2454 }
2455
2456 mutex_unlock(&ar->conf_mutex);
2457
2458 return 0;
2459}
2460
Ben Greear5572a952014-11-24 16:22:10 +02002461static void ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
2462{
2463 /* It is not clear that allowing gaps in chainmask
2464 * is helpful. Probably it will not do what user
2465 * is hoping for, so warn in that case.
2466 */
2467 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
2468 return;
2469
2470 ath10k_warn(ar, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2471 dbg, cm);
2472}
2473
Ben Greear46acf7b2014-05-16 17:15:38 +03002474static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2475{
2476 int ret;
2477
2478 lockdep_assert_held(&ar->conf_mutex);
2479
Ben Greear5572a952014-11-24 16:22:10 +02002480 ath10k_check_chain_mask(ar, tx_ant, "tx");
2481 ath10k_check_chain_mask(ar, rx_ant, "rx");
2482
Ben Greear46acf7b2014-05-16 17:15:38 +03002483 ar->cfg_tx_chainmask = tx_ant;
2484 ar->cfg_rx_chainmask = rx_ant;
2485
2486 if ((ar->state != ATH10K_STATE_ON) &&
2487 (ar->state != ATH10K_STATE_RESTARTED))
2488 return 0;
2489
2490 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2491 tx_ant);
2492 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002493 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03002494 ret, tx_ant);
2495 return ret;
2496 }
2497
2498 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2499 rx_ant);
2500 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002501 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03002502 ret, rx_ant);
2503 return ret;
2504 }
2505
2506 return 0;
2507}
2508
2509static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2510{
2511 struct ath10k *ar = hw->priv;
2512 int ret;
2513
2514 mutex_lock(&ar->conf_mutex);
2515 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2516 mutex_unlock(&ar->conf_mutex);
2517 return ret;
2518}
2519
Kalle Valo5e3dd152013-06-12 20:52:10 +03002520static int ath10k_start(struct ieee80211_hw *hw)
2521{
2522 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002523 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002524
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002525 /*
2526 * This makes sense only when restarting hw. It is harmless to call
2527 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2528 * commands will be submitted while restarting.
2529 */
2530 ath10k_drain_tx(ar);
2531
Michal Kazior548db542013-07-05 16:15:15 +03002532 mutex_lock(&ar->conf_mutex);
2533
Michal Kaziorc5058f52014-05-26 12:46:03 +03002534 switch (ar->state) {
2535 case ATH10K_STATE_OFF:
2536 ar->state = ATH10K_STATE_ON;
2537 break;
2538 case ATH10K_STATE_RESTARTING:
2539 ath10k_halt(ar);
2540 ar->state = ATH10K_STATE_RESTARTED;
2541 break;
2542 case ATH10K_STATE_ON:
2543 case ATH10K_STATE_RESTARTED:
2544 case ATH10K_STATE_WEDGED:
2545 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02002546 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03002547 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03002548 case ATH10K_STATE_UTF:
2549 ret = -EBUSY;
2550 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02002551 }
2552
2553 ret = ath10k_hif_power_up(ar);
2554 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002555 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002556 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02002557 }
2558
Kalle Valo43d2a302014-09-10 18:23:30 +03002559 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02002560 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002561 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002562 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02002563 }
2564
Bartosz Markowski226a3392013-09-26 17:47:16 +02002565 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002566 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002567 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002568 goto err_core_stop;
2569 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002570
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002571 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002572 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002573 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002574 goto err_core_stop;
2575 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002576
Ben Greear46acf7b2014-05-16 17:15:38 +03002577 if (ar->cfg_tx_chainmask)
2578 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2579 ar->cfg_rx_chainmask);
2580
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002581 /*
2582 * By default FW set ARP frames ac to voice (6). In that case ARP
2583 * exchange is not working properly for UAPSD enabled AP. ARP requests
2584 * which arrives with access category 0 are processed by network stack
2585 * and send back with access category 0, but FW changes access category
2586 * to 6. Set ARP frames access category to best effort (0) solves
2587 * this problem.
2588 */
2589
2590 ret = ath10k_wmi_pdev_set_param(ar,
2591 ar->wmi.pdev_param->arp_ac_override, 0);
2592 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002593 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002594 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002595 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002596 }
2597
Michal Kaziord6500972014-04-08 09:56:09 +03002598 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002599 ath10k_regd_update(ar);
2600
Simon Wunderlich855aed12014-08-02 09:12:54 +03002601 ath10k_spectral_start(ar);
2602
Michal Kaziorae254432014-05-26 12:46:02 +03002603 mutex_unlock(&ar->conf_mutex);
2604 return 0;
2605
2606err_core_stop:
2607 ath10k_core_stop(ar);
2608
2609err_power_down:
2610 ath10k_hif_power_down(ar);
2611
2612err_off:
2613 ar->state = ATH10K_STATE_OFF;
2614
2615err:
Michal Kazior548db542013-07-05 16:15:15 +03002616 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002617 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002618}
2619
2620static void ath10k_stop(struct ieee80211_hw *hw)
2621{
2622 struct ath10k *ar = hw->priv;
2623
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002624 ath10k_drain_tx(ar);
2625
Michal Kazior548db542013-07-05 16:15:15 +03002626 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002627 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002628 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002629 ar->state = ATH10K_STATE_OFF;
2630 }
Michal Kazior548db542013-07-05 16:15:15 +03002631 mutex_unlock(&ar->conf_mutex);
2632
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002633 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02002634 cancel_work_sync(&ar->restart_work);
2635}
2636
Michal Kaziorad088bf2013-10-16 15:44:46 +03002637static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002638{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002639 struct ath10k_vif *arvif;
2640 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002641
2642 lockdep_assert_held(&ar->conf_mutex);
2643
Michal Kaziorad088bf2013-10-16 15:44:46 +03002644 list_for_each_entry(arvif, &ar->arvifs, list) {
2645 ret = ath10k_mac_vif_setup_ps(arvif);
2646 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002647 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03002648 break;
2649 }
2650 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002651
Michal Kaziorad088bf2013-10-16 15:44:46 +03002652 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002653}
2654
Michal Kaziorc930f742014-01-23 11:38:25 +01002655static const char *chandef_get_width(enum nl80211_chan_width width)
2656{
2657 switch (width) {
2658 case NL80211_CHAN_WIDTH_20_NOHT:
2659 return "20 (noht)";
2660 case NL80211_CHAN_WIDTH_20:
2661 return "20";
2662 case NL80211_CHAN_WIDTH_40:
2663 return "40";
2664 case NL80211_CHAN_WIDTH_80:
2665 return "80";
2666 case NL80211_CHAN_WIDTH_80P80:
2667 return "80+80";
2668 case NL80211_CHAN_WIDTH_160:
2669 return "160";
2670 case NL80211_CHAN_WIDTH_5:
2671 return "5";
2672 case NL80211_CHAN_WIDTH_10:
2673 return "10";
2674 }
2675 return "?";
2676}
2677
2678static void ath10k_config_chan(struct ath10k *ar)
2679{
2680 struct ath10k_vif *arvif;
Michal Kaziorc930f742014-01-23 11:38:25 +01002681 int ret;
2682
2683 lockdep_assert_held(&ar->conf_mutex);
2684
Michal Kazior7aa7a722014-08-25 12:09:38 +02002685 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziorc930f742014-01-23 11:38:25 +01002686 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2687 ar->chandef.chan->center_freq,
2688 ar->chandef.center_freq1,
2689 ar->chandef.center_freq2,
2690 chandef_get_width(ar->chandef.width));
2691
2692 /* First stop monitor interface. Some FW versions crash if there's a
2693 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03002694 if (ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02002695 ath10k_monitor_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002696
2697 list_for_each_entry(arvif, &ar->arvifs, list) {
2698 if (!arvif->is_started)
2699 continue;
2700
Michal Kaziordc55e302014-07-29 12:53:36 +03002701 if (!arvif->is_up)
2702 continue;
2703
Michal Kaziorc930f742014-01-23 11:38:25 +01002704 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2705 continue;
2706
Michal Kaziordc55e302014-07-29 12:53:36 +03002707 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002708 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002709 ath10k_warn(ar, "failed to down vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002710 arvif->vdev_id, ret);
2711 continue;
2712 }
2713 }
2714
Michal Kaziordc55e302014-07-29 12:53:36 +03002715 /* all vdevs are downed now - attempt to restart and re-up them */
Michal Kaziorc930f742014-01-23 11:38:25 +01002716
2717 list_for_each_entry(arvif, &ar->arvifs, list) {
2718 if (!arvif->is_started)
2719 continue;
2720
2721 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2722 continue;
2723
Michal Kaziordc55e302014-07-29 12:53:36 +03002724 ret = ath10k_vdev_restart(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002725 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002726 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002727 arvif->vdev_id, ret);
2728 continue;
2729 }
2730
2731 if (!arvif->is_up)
2732 continue;
2733
2734 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2735 arvif->bssid);
2736 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002737 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002738 arvif->vdev_id, ret);
2739 continue;
2740 }
2741 }
2742
Michal Kazior19337472014-08-28 12:58:16 +02002743 ath10k_monitor_recalc(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002744}
2745
Michal Kazior7d9d5582014-10-21 10:40:15 +03002746static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2747{
2748 int ret;
2749 u32 param;
2750
2751 lockdep_assert_held(&ar->conf_mutex);
2752
2753 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower %d\n", txpower);
2754
2755 param = ar->wmi.pdev_param->txpower_limit2g;
2756 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2757 if (ret) {
2758 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2759 txpower, ret);
2760 return ret;
2761 }
2762
2763 param = ar->wmi.pdev_param->txpower_limit5g;
2764 ret = ath10k_wmi_pdev_set_param(ar, param, txpower * 2);
2765 if (ret) {
2766 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2767 txpower, ret);
2768 return ret;
2769 }
2770
2771 return 0;
2772}
2773
2774static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2775{
2776 struct ath10k_vif *arvif;
2777 int ret, txpower = -1;
2778
2779 lockdep_assert_held(&ar->conf_mutex);
2780
2781 list_for_each_entry(arvif, &ar->arvifs, list) {
2782 WARN_ON(arvif->txpower < 0);
2783
2784 if (txpower == -1)
2785 txpower = arvif->txpower;
2786 else
2787 txpower = min(txpower, arvif->txpower);
2788 }
2789
2790 if (WARN_ON(txpower == -1))
2791 return -EINVAL;
2792
2793 ret = ath10k_mac_txpower_setup(ar, txpower);
2794 if (ret) {
2795 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
2796 txpower, ret);
2797 return ret;
2798 }
2799
2800 return 0;
2801}
2802
Kalle Valo5e3dd152013-06-12 20:52:10 +03002803static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2804{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002805 struct ath10k *ar = hw->priv;
2806 struct ieee80211_conf *conf = &hw->conf;
2807 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002808
2809 mutex_lock(&ar->conf_mutex);
2810
2811 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002812 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziord6500972014-04-08 09:56:09 +03002813 "mac config channel %dMHz flags 0x%x radar %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002814 conf->chandef.chan->center_freq,
Michal Kaziord6500972014-04-08 09:56:09 +03002815 conf->chandef.chan->flags,
2816 conf->radar_enabled);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002817
Kalle Valo5e3dd152013-06-12 20:52:10 +03002818 spin_lock_bh(&ar->data_lock);
2819 ar->rx_channel = conf->chandef.chan;
2820 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002821
Michal Kaziord6500972014-04-08 09:56:09 +03002822 ar->radar_enabled = conf->radar_enabled;
2823 ath10k_recalc_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002824
2825 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2826 ar->chandef = conf->chandef;
2827 ath10k_config_chan(ar);
2828 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002829 }
2830
Michal Kazioraffd3212013-07-16 09:54:35 +02002831 if (changed & IEEE80211_CONF_CHANGE_PS)
2832 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002833
2834 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02002835 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2836 ret = ath10k_monitor_recalc(ar);
2837 if (ret)
2838 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002839 }
2840
2841 mutex_unlock(&ar->conf_mutex);
2842 return ret;
2843}
2844
Ben Greear5572a952014-11-24 16:22:10 +02002845static u32 get_nss_from_chainmask(u16 chain_mask)
2846{
2847 if ((chain_mask & 0x15) == 0x15)
2848 return 4;
2849 else if ((chain_mask & 0x7) == 0x7)
2850 return 3;
2851 else if ((chain_mask & 0x3) == 0x3)
2852 return 2;
2853 return 1;
2854}
2855
Kalle Valo5e3dd152013-06-12 20:52:10 +03002856/*
2857 * TODO:
2858 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2859 * because we will send mgmt frames without CCK. This requirement
2860 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2861 * in the TX packet.
2862 */
2863static int ath10k_add_interface(struct ieee80211_hw *hw,
2864 struct ieee80211_vif *vif)
2865{
2866 struct ath10k *ar = hw->priv;
2867 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2868 enum wmi_sta_powersave_param param;
2869 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002870 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002871 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002872 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002873
2874 mutex_lock(&ar->conf_mutex);
2875
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002876 memset(arvif, 0, sizeof(*arvif));
2877
Kalle Valo5e3dd152013-06-12 20:52:10 +03002878 arvif->ar = ar;
2879 arvif->vif = vif;
2880
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002881 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002882 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002883
Ben Greeara9aefb32014-08-12 11:02:19 +03002884 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002885 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002886 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002887 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002888 }
Ben Greear16c11172014-09-23 14:17:16 -07002889 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002890
Ben Greear16c11172014-09-23 14:17:16 -07002891 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
2892 bit, ar->free_vdev_map);
2893
2894 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002895 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002896
2897 if (ar->p2p)
2898 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2899
2900 switch (vif->type) {
2901 case NL80211_IFTYPE_UNSPECIFIED:
2902 case NL80211_IFTYPE_STATION:
2903 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2904 if (vif->p2p)
2905 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2906 break;
2907 case NL80211_IFTYPE_ADHOC:
2908 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2909 break;
2910 case NL80211_IFTYPE_AP:
2911 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2912
2913 if (vif->p2p)
2914 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2915 break;
2916 case NL80211_IFTYPE_MONITOR:
2917 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2918 break;
2919 default:
2920 WARN_ON(1);
2921 break;
2922 }
2923
Michal Kazior64badcb2014-09-18 11:18:02 +03002924 /* Some firmware revisions don't wait for beacon tx completion before
2925 * sending another SWBA event. This could lead to hardware using old
2926 * (freed) beacon data in some cases, e.g. tx credit starvation
2927 * combined with missed TBTT. This is very very rare.
2928 *
2929 * On non-IOMMU-enabled hosts this could be a possible security issue
2930 * because hw could beacon some random data on the air. On
2931 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
2932 * device would crash.
2933 *
2934 * Since there are no beacon tx completions (implicit nor explicit)
2935 * propagated to host the only workaround for this is to allocate a
2936 * DMA-coherent buffer for a lifetime of a vif and use it for all
2937 * beacon tx commands. Worst case for this approach is some beacons may
2938 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
2939 */
2940 if (vif->type == NL80211_IFTYPE_ADHOC ||
2941 vif->type == NL80211_IFTYPE_AP) {
2942 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
2943 IEEE80211_MAX_FRAME_LEN,
2944 &arvif->beacon_paddr,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05302945 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03002946 if (!arvif->beacon_buf) {
2947 ret = -ENOMEM;
2948 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
2949 ret);
2950 goto err;
2951 }
2952 }
2953
2954 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
2955 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
2956 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002957
2958 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2959 arvif->vdev_subtype, vif->addr);
2960 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002961 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002962 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002963 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002964 }
2965
Ben Greear16c11172014-09-23 14:17:16 -07002966 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002967 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002968
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002969 vdev_param = ar->wmi.vdev_param->def_keyid;
2970 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002971 arvif->def_wep_key_idx);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002972 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002973 ath10k_warn(ar, "failed to set vdev %i default key id: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002974 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002975 goto err_vdev_delete;
2976 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002977
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002978 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2979 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002980 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002981 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03002982 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002983 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002984 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002985 goto err_vdev_delete;
2986 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002987
Ben Greear5572a952014-11-24 16:22:10 +02002988 if (ar->cfg_tx_chainmask) {
2989 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
2990
2991 vdev_param = ar->wmi.vdev_param->nss;
2992 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2993 nss);
2994 if (ret) {
2995 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
2996 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
2997 ret);
2998 goto err_vdev_delete;
2999 }
3000 }
3001
Kalle Valo5e3dd152013-06-12 20:52:10 +03003002 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3003 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
3004 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003005 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003006 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003007 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003008 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01003009
Kalle Valo5a13e762014-01-20 11:01:46 +02003010 ret = ath10k_mac_set_kickout(arvif);
3011 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003012 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003013 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02003014 goto err_peer_delete;
3015 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003016 }
3017
3018 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
3019 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
3020 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3021 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3022 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003023 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003024 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003025 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003026 goto err_peer_delete;
3027 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003028
3029 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
3030 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
3031 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3032 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003033 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003034 ath10k_warn(ar, "failed to set vdev %i TX wake thresh: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003035 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003036 goto err_peer_delete;
3037 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003038
3039 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
3040 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
3041 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3042 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003043 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003044 ath10k_warn(ar, "failed to set vdev %i PSPOLL count: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003045 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003046 goto err_peer_delete;
3047 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003048 }
3049
Michal Kazior424121c2013-07-22 14:13:31 +02003050 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003051 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003052 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03003053 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003054 goto err_peer_delete;
3055 }
Michal Kazior679c54a2013-07-05 16:15:04 +03003056
Michal Kazior424121c2013-07-22 14:13:31 +02003057 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003058 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003059 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03003060 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003061 goto err_peer_delete;
3062 }
Michal Kazior679c54a2013-07-05 16:15:04 +03003063
Michal Kazior7d9d5582014-10-21 10:40:15 +03003064 arvif->txpower = vif->bss_conf.txpower;
3065 ret = ath10k_mac_txpower_recalc(ar);
3066 if (ret) {
3067 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3068 goto err_peer_delete;
3069 }
3070
Kalle Valo5e3dd152013-06-12 20:52:10 +03003071 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003072 return 0;
3073
3074err_peer_delete:
3075 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
3076 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
3077
3078err_vdev_delete:
3079 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greear16c11172014-09-23 14:17:16 -07003080 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03003081 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03003082
3083err:
Michal Kazior64badcb2014-09-18 11:18:02 +03003084 if (arvif->beacon_buf) {
3085 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
3086 arvif->beacon_buf, arvif->beacon_paddr);
3087 arvif->beacon_buf = NULL;
3088 }
3089
Michal Kazior9dad14a2013-10-16 15:44:45 +03003090 mutex_unlock(&ar->conf_mutex);
3091
Kalle Valo5e3dd152013-06-12 20:52:10 +03003092 return ret;
3093}
3094
3095static void ath10k_remove_interface(struct ieee80211_hw *hw,
3096 struct ieee80211_vif *vif)
3097{
3098 struct ath10k *ar = hw->priv;
3099 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3100 int ret;
3101
Michal Kaziorcc4827b2013-10-16 15:44:45 +03003102 cancel_work_sync(&arvif->wep_key_work);
3103
Sujith Manoharan5d011f52014-11-25 11:47:00 +05303104 mutex_lock(&ar->conf_mutex);
3105
Michal Kaziored543882013-09-13 14:16:56 +02003106 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03003107 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02003108 spin_unlock_bh(&ar->data_lock);
3109
Simon Wunderlich855aed12014-08-02 09:12:54 +03003110 ret = ath10k_spectral_vif_stop(arvif);
3111 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003112 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03003113 arvif->vdev_id, ret);
3114
Ben Greear16c11172014-09-23 14:17:16 -07003115 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03003116 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003117
3118 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3119 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
3120 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003121 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003122 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003123
3124 kfree(arvif->u.ap.noa_data);
3125 }
3126
Michal Kazior7aa7a722014-08-25 12:09:38 +02003127 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003128 arvif->vdev_id);
3129
Kalle Valo5e3dd152013-06-12 20:52:10 +03003130 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3131 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003132 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003133 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003134
Kalle Valo5e3dd152013-06-12 20:52:10 +03003135 ath10k_peer_cleanup(ar, arvif->vdev_id);
3136
3137 mutex_unlock(&ar->conf_mutex);
3138}
3139
3140/*
3141 * FIXME: Has to be verified.
3142 */
3143#define SUPPORTED_FILTERS \
3144 (FIF_PROMISC_IN_BSS | \
3145 FIF_ALLMULTI | \
3146 FIF_CONTROL | \
3147 FIF_PSPOLL | \
3148 FIF_OTHER_BSS | \
3149 FIF_BCN_PRBRESP_PROMISC | \
3150 FIF_PROBE_REQ | \
3151 FIF_FCSFAIL)
3152
3153static void ath10k_configure_filter(struct ieee80211_hw *hw,
3154 unsigned int changed_flags,
3155 unsigned int *total_flags,
3156 u64 multicast)
3157{
3158 struct ath10k *ar = hw->priv;
3159 int ret;
3160
3161 mutex_lock(&ar->conf_mutex);
3162
3163 changed_flags &= SUPPORTED_FILTERS;
3164 *total_flags &= SUPPORTED_FILTERS;
3165 ar->filter_flags = *total_flags;
3166
Michal Kazior19337472014-08-28 12:58:16 +02003167 ret = ath10k_monitor_recalc(ar);
3168 if (ret)
3169 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003170
3171 mutex_unlock(&ar->conf_mutex);
3172}
3173
3174static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3175 struct ieee80211_vif *vif,
3176 struct ieee80211_bss_conf *info,
3177 u32 changed)
3178{
3179 struct ath10k *ar = hw->priv;
3180 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3181 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03003182 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003183
3184 mutex_lock(&ar->conf_mutex);
3185
3186 if (changed & BSS_CHANGED_IBSS)
3187 ath10k_control_ibss(arvif, info, vif->addr);
3188
3189 if (changed & BSS_CHANGED_BEACON_INT) {
3190 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003191 vdev_param = ar->wmi.vdev_param->beacon_interval;
3192 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003193 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02003194 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003195 "mac vdev %d beacon_interval %d\n",
3196 arvif->vdev_id, arvif->beacon_interval);
3197
Kalle Valo5e3dd152013-06-12 20:52:10 +03003198 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003199 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003200 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003201 }
3202
3203 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003204 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003205 "vdev %d set beacon tx mode to staggered\n",
3206 arvif->vdev_id);
3207
Bartosz Markowski226a3392013-09-26 17:47:16 +02003208 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3209 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003210 WMI_BEACON_STAGGERED_MODE);
3211 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003212 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003213 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003214 }
3215
John W. Linvilleb70727e2013-06-13 13:34:29 -04003216 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003217 arvif->dtim_period = info->dtim_period;
3218
Michal Kazior7aa7a722014-08-25 12:09:38 +02003219 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003220 "mac vdev %d dtim_period %d\n",
3221 arvif->vdev_id, arvif->dtim_period);
3222
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003223 vdev_param = ar->wmi.vdev_param->dtim_period;
3224 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003225 arvif->dtim_period);
3226 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003227 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003228 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003229 }
3230
3231 if (changed & BSS_CHANGED_SSID &&
3232 vif->type == NL80211_IFTYPE_AP) {
3233 arvif->u.ap.ssid_len = info->ssid_len;
3234 if (info->ssid_len)
3235 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3236 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3237 }
3238
Michal Kazior077efc82014-10-21 10:10:29 +03003239 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3240 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003241
3242 if (changed & BSS_CHANGED_BEACON_ENABLED)
3243 ath10k_control_beaconing(arvif, info);
3244
3245 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003246 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02003247 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003248 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003249
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003250 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003251 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003252 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003253 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003254 }
3255
3256 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003257 if (info->use_short_slot)
3258 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3259
3260 else
3261 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3262
Michal Kazior7aa7a722014-08-25 12:09:38 +02003263 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003264 arvif->vdev_id, slottime);
3265
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003266 vdev_param = ar->wmi.vdev_param->slot_time;
3267 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003268 slottime);
3269 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003270 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003271 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003272 }
3273
3274 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003275 if (info->use_short_preamble)
3276 preamble = WMI_VDEV_PREAMBLE_SHORT;
3277 else
3278 preamble = WMI_VDEV_PREAMBLE_LONG;
3279
Michal Kazior7aa7a722014-08-25 12:09:38 +02003280 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003281 "mac vdev %d preamble %dn",
3282 arvif->vdev_id, preamble);
3283
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003284 vdev_param = ar->wmi.vdev_param->preamble;
3285 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003286 preamble);
3287 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003288 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003289 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003290 }
3291
3292 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02003293 if (info->assoc) {
3294 /* Workaround: Make sure monitor vdev is not running
3295 * when associating to prevent some firmware revisions
3296 * (e.g. 10.1 and 10.2) from crashing.
3297 */
3298 if (ar->monitor_started)
3299 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003300 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02003301 ath10k_monitor_recalc(ar);
Michal Kazior077efc82014-10-21 10:10:29 +03003302 } else {
3303 ath10k_bss_disassoc(hw, vif);
Michal Kaziore556f112014-08-28 12:58:17 +02003304 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003305 }
3306
Michal Kazior7d9d5582014-10-21 10:40:15 +03003307 if (changed & BSS_CHANGED_TXPOWER) {
3308 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3309 arvif->vdev_id, info->txpower);
3310
3311 arvif->txpower = info->txpower;
3312 ret = ath10k_mac_txpower_recalc(ar);
3313 if (ret)
3314 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
3315 }
3316
Kalle Valo5e3dd152013-06-12 20:52:10 +03003317 mutex_unlock(&ar->conf_mutex);
3318}
3319
3320static int ath10k_hw_scan(struct ieee80211_hw *hw,
3321 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02003322 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003323{
3324 struct ath10k *ar = hw->priv;
3325 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02003326 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003327 struct wmi_start_scan_arg arg;
3328 int ret = 0;
3329 int i;
3330
3331 mutex_lock(&ar->conf_mutex);
3332
3333 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003334 switch (ar->scan.state) {
3335 case ATH10K_SCAN_IDLE:
3336 reinit_completion(&ar->scan.started);
3337 reinit_completion(&ar->scan.completed);
3338 ar->scan.state = ATH10K_SCAN_STARTING;
3339 ar->scan.is_roc = false;
3340 ar->scan.vdev_id = arvif->vdev_id;
3341 ret = 0;
3342 break;
3343 case ATH10K_SCAN_STARTING:
3344 case ATH10K_SCAN_RUNNING:
3345 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003346 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003347 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003348 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003349 spin_unlock_bh(&ar->data_lock);
3350
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003351 if (ret)
3352 goto exit;
3353
Kalle Valo5e3dd152013-06-12 20:52:10 +03003354 memset(&arg, 0, sizeof(arg));
3355 ath10k_wmi_start_scan_init(ar, &arg);
3356 arg.vdev_id = arvif->vdev_id;
3357 arg.scan_id = ATH10K_SCAN_ID;
3358
3359 if (!req->no_cck)
3360 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3361
3362 if (req->ie_len) {
3363 arg.ie_len = req->ie_len;
3364 memcpy(arg.ie, req->ie, arg.ie_len);
3365 }
3366
3367 if (req->n_ssids) {
3368 arg.n_ssids = req->n_ssids;
3369 for (i = 0; i < arg.n_ssids; i++) {
3370 arg.ssids[i].len = req->ssids[i].ssid_len;
3371 arg.ssids[i].ssid = req->ssids[i].ssid;
3372 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02003373 } else {
3374 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003375 }
3376
3377 if (req->n_channels) {
3378 arg.n_channels = req->n_channels;
3379 for (i = 0; i < arg.n_channels; i++)
3380 arg.channels[i] = req->channels[i]->center_freq;
3381 }
3382
3383 ret = ath10k_start_scan(ar, &arg);
3384 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003385 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003386 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003387 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003388 spin_unlock_bh(&ar->data_lock);
3389 }
3390
3391exit:
3392 mutex_unlock(&ar->conf_mutex);
3393 return ret;
3394}
3395
3396static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3397 struct ieee80211_vif *vif)
3398{
3399 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003400
3401 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003402 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003403 mutex_unlock(&ar->conf_mutex);
Michal Kazior4eb2e162014-10-28 10:23:09 +01003404
3405 cancel_delayed_work_sync(&ar->scan.timeout);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003406}
3407
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003408static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3409 struct ath10k_vif *arvif,
3410 enum set_key_cmd cmd,
3411 struct ieee80211_key_conf *key)
3412{
3413 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3414 int ret;
3415
3416 /* 10.1 firmware branch requires default key index to be set to group
3417 * key index after installing it. Otherwise FW/HW Txes corrupted
3418 * frames with multi-vif APs. This is not required for main firmware
3419 * branch (e.g. 636).
3420 *
3421 * FIXME: This has been tested only in AP. It remains unknown if this
3422 * is required for multi-vif STA interfaces on 10.1 */
3423
3424 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3425 return;
3426
3427 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3428 return;
3429
3430 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3431 return;
3432
3433 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3434 return;
3435
3436 if (cmd != SET_KEY)
3437 return;
3438
3439 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3440 key->keyidx);
3441 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003442 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003443 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003444}
3445
Kalle Valo5e3dd152013-06-12 20:52:10 +03003446static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3447 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3448 struct ieee80211_key_conf *key)
3449{
3450 struct ath10k *ar = hw->priv;
3451 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3452 struct ath10k_peer *peer;
3453 const u8 *peer_addr;
3454 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3455 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3456 int ret = 0;
3457
3458 if (key->keyidx > WMI_MAX_KEY_INDEX)
3459 return -ENOSPC;
3460
3461 mutex_lock(&ar->conf_mutex);
3462
3463 if (sta)
3464 peer_addr = sta->addr;
3465 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3466 peer_addr = vif->bss_conf.bssid;
3467 else
3468 peer_addr = vif->addr;
3469
3470 key->hw_key_idx = key->keyidx;
3471
3472 /* the peer should not disappear in mid-way (unless FW goes awry) since
3473 * we already hold conf_mutex. we just make sure its there now. */
3474 spin_lock_bh(&ar->data_lock);
3475 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3476 spin_unlock_bh(&ar->data_lock);
3477
3478 if (!peer) {
3479 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003480 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003481 peer_addr);
3482 ret = -EOPNOTSUPP;
3483 goto exit;
3484 } else {
3485 /* if the peer doesn't exist there is no key to disable
3486 * anymore */
3487 goto exit;
3488 }
3489 }
3490
3491 if (is_wep) {
3492 if (cmd == SET_KEY)
3493 arvif->wep_keys[key->keyidx] = key;
3494 else
3495 arvif->wep_keys[key->keyidx] = NULL;
3496
3497 if (cmd == DISABLE_KEY)
3498 ath10k_clear_vdev_key(arvif, key);
3499 }
3500
3501 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3502 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003503 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003504 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003505 goto exit;
3506 }
3507
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003508 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3509
Kalle Valo5e3dd152013-06-12 20:52:10 +03003510 spin_lock_bh(&ar->data_lock);
3511 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3512 if (peer && cmd == SET_KEY)
3513 peer->keys[key->keyidx] = key;
3514 else if (peer && cmd == DISABLE_KEY)
3515 peer->keys[key->keyidx] = NULL;
3516 else if (peer == NULL)
3517 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003518 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003519 spin_unlock_bh(&ar->data_lock);
3520
3521exit:
3522 mutex_unlock(&ar->conf_mutex);
3523 return ret;
3524}
3525
Michal Kazior9797feb2014-02-14 14:49:48 +01003526static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3527{
3528 struct ath10k *ar;
3529 struct ath10k_vif *arvif;
3530 struct ath10k_sta *arsta;
3531 struct ieee80211_sta *sta;
3532 u32 changed, bw, nss, smps;
3533 int err;
3534
3535 arsta = container_of(wk, struct ath10k_sta, update_wk);
3536 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3537 arvif = arsta->arvif;
3538 ar = arvif->ar;
3539
3540 spin_lock_bh(&ar->data_lock);
3541
3542 changed = arsta->changed;
3543 arsta->changed = 0;
3544
3545 bw = arsta->bw;
3546 nss = arsta->nss;
3547 smps = arsta->smps;
3548
3549 spin_unlock_bh(&ar->data_lock);
3550
3551 mutex_lock(&ar->conf_mutex);
3552
3553 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003554 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003555 sta->addr, bw);
3556
3557 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3558 WMI_PEER_CHAN_WIDTH, bw);
3559 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003560 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003561 sta->addr, bw, err);
3562 }
3563
3564 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003565 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003566 sta->addr, nss);
3567
3568 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3569 WMI_PEER_NSS, nss);
3570 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003571 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003572 sta->addr, nss, err);
3573 }
3574
3575 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003576 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003577 sta->addr, smps);
3578
3579 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3580 WMI_PEER_SMPS_STATE, smps);
3581 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003582 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003583 sta->addr, smps, err);
3584 }
3585
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003586 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003587 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003588 sta->addr);
3589
Michal Kazior590922a2014-10-21 10:10:29 +03003590 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003591 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003592 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003593 sta->addr);
3594 }
3595
Michal Kazior9797feb2014-02-14 14:49:48 +01003596 mutex_unlock(&ar->conf_mutex);
3597}
3598
Michal Kaziorcfd10612014-11-25 15:16:05 +01003599static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif)
3600{
3601 struct ath10k *ar = arvif->ar;
3602
3603 lockdep_assert_held(&ar->conf_mutex);
3604
3605 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3606 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3607 return 0;
3608
3609 if (ar->num_stations >= ar->max_num_stations)
3610 return -ENOBUFS;
3611
3612 ar->num_stations++;
3613
3614 return 0;
3615}
3616
3617static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif)
3618{
3619 struct ath10k *ar = arvif->ar;
3620
3621 lockdep_assert_held(&ar->conf_mutex);
3622
3623 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
3624 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
3625 return;
3626
3627 ar->num_stations--;
3628}
3629
Kalle Valo5e3dd152013-06-12 20:52:10 +03003630static int ath10k_sta_state(struct ieee80211_hw *hw,
3631 struct ieee80211_vif *vif,
3632 struct ieee80211_sta *sta,
3633 enum ieee80211_sta_state old_state,
3634 enum ieee80211_sta_state new_state)
3635{
3636 struct ath10k *ar = hw->priv;
3637 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01003638 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003639 int ret = 0;
3640
Michal Kazior76f90022014-02-25 09:29:57 +02003641 if (old_state == IEEE80211_STA_NOTEXIST &&
3642 new_state == IEEE80211_STA_NONE) {
3643 memset(arsta, 0, sizeof(*arsta));
3644 arsta->arvif = arvif;
3645 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3646 }
3647
Michal Kazior9797feb2014-02-14 14:49:48 +01003648 /* cancel must be done outside the mutex to avoid deadlock */
3649 if ((old_state == IEEE80211_STA_NONE &&
3650 new_state == IEEE80211_STA_NOTEXIST))
3651 cancel_work_sync(&arsta->update_wk);
3652
Kalle Valo5e3dd152013-06-12 20:52:10 +03003653 mutex_lock(&ar->conf_mutex);
3654
3655 if (old_state == IEEE80211_STA_NOTEXIST &&
Michal Kazior077efc82014-10-21 10:10:29 +03003656 new_state == IEEE80211_STA_NONE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003657 /*
3658 * New station addition.
3659 */
Michal Kaziorcfd10612014-11-25 15:16:05 +01003660 ath10k_dbg(ar, ATH10K_DBG_MAC,
3661 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
3662 arvif->vdev_id, sta->addr,
3663 ar->num_stations + 1, ar->max_num_stations,
3664 ar->num_peers + 1, ar->max_num_peers);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003665
Michal Kaziorcfd10612014-11-25 15:16:05 +01003666 ret = ath10k_mac_inc_num_stations(arvif);
3667 if (ret) {
3668 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
3669 ar->max_num_stations);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003670 goto exit;
3671 }
3672
Kalle Valo5e3dd152013-06-12 20:52:10 +03003673 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
Michal Kaziora52c0282014-11-25 15:16:03 +01003674 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003675 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 -08003676 sta->addr, arvif->vdev_id, ret);
Michal Kaziorcfd10612014-11-25 15:16:05 +01003677 ath10k_mac_dec_num_stations(arvif);
Michal Kaziora52c0282014-11-25 15:16:03 +01003678 goto exit;
3679 }
Michal Kazior077efc82014-10-21 10:10:29 +03003680
3681 if (vif->type == NL80211_IFTYPE_STATION) {
3682 WARN_ON(arvif->is_started);
3683
3684 ret = ath10k_vdev_start(arvif);
3685 if (ret) {
3686 ath10k_warn(ar, "failed to start vdev %i: %d\n",
3687 arvif->vdev_id, ret);
3688 WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
3689 sta->addr));
Michal Kaziorcfd10612014-11-25 15:16:05 +01003690 ath10k_mac_dec_num_stations(arvif);
Michal Kazior077efc82014-10-21 10:10:29 +03003691 goto exit;
3692 }
3693
3694 arvif->is_started = true;
3695 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003696 } else if ((old_state == IEEE80211_STA_NONE &&
3697 new_state == IEEE80211_STA_NOTEXIST)) {
3698 /*
3699 * Existing station deletion.
3700 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003701 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003702 "mac vdev %d peer delete %pM (sta gone)\n",
3703 arvif->vdev_id, sta->addr);
Michal Kazior077efc82014-10-21 10:10:29 +03003704
3705 if (vif->type == NL80211_IFTYPE_STATION) {
3706 WARN_ON(!arvif->is_started);
3707
3708 ret = ath10k_vdev_stop(arvif);
3709 if (ret)
3710 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
3711 arvif->vdev_id, ret);
3712
3713 arvif->is_started = false;
3714 }
3715
Kalle Valo5e3dd152013-06-12 20:52:10 +03003716 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3717 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003718 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003719 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003720
Michal Kaziorcfd10612014-11-25 15:16:05 +01003721 ath10k_mac_dec_num_stations(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003722 } else if (old_state == IEEE80211_STA_AUTH &&
3723 new_state == IEEE80211_STA_ASSOC &&
3724 (vif->type == NL80211_IFTYPE_AP ||
3725 vif->type == NL80211_IFTYPE_ADHOC)) {
3726 /*
3727 * New association.
3728 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003729 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003730 sta->addr);
3731
Michal Kazior590922a2014-10-21 10:10:29 +03003732 ret = ath10k_station_assoc(ar, vif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003733 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003734 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003735 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003736 } else if (old_state == IEEE80211_STA_ASSOC &&
3737 new_state == IEEE80211_STA_AUTH &&
3738 (vif->type == NL80211_IFTYPE_AP ||
3739 vif->type == NL80211_IFTYPE_ADHOC)) {
3740 /*
3741 * Disassociation.
3742 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003743 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003744 sta->addr);
3745
Michal Kazior590922a2014-10-21 10:10:29 +03003746 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003747 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003748 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003749 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003750 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003751exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003752 mutex_unlock(&ar->conf_mutex);
3753 return ret;
3754}
3755
3756static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03003757 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003758{
3759 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3760 u32 value = 0;
3761 int ret = 0;
3762
Michal Kazior548db542013-07-05 16:15:15 +03003763 lockdep_assert_held(&ar->conf_mutex);
3764
Kalle Valo5e3dd152013-06-12 20:52:10 +03003765 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3766 return 0;
3767
3768 switch (ac) {
3769 case IEEE80211_AC_VO:
3770 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3771 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3772 break;
3773 case IEEE80211_AC_VI:
3774 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3775 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3776 break;
3777 case IEEE80211_AC_BE:
3778 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3779 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3780 break;
3781 case IEEE80211_AC_BK:
3782 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3783 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3784 break;
3785 }
3786
3787 if (enable)
3788 arvif->u.sta.uapsd |= value;
3789 else
3790 arvif->u.sta.uapsd &= ~value;
3791
3792 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3793 WMI_STA_PS_PARAM_UAPSD,
3794 arvif->u.sta.uapsd);
3795 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003796 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003797 goto exit;
3798 }
3799
3800 if (arvif->u.sta.uapsd)
3801 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3802 else
3803 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3804
3805 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3806 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3807 value);
3808 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003809 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003810
3811exit:
3812 return ret;
3813}
3814
3815static int ath10k_conf_tx(struct ieee80211_hw *hw,
3816 struct ieee80211_vif *vif, u16 ac,
3817 const struct ieee80211_tx_queue_params *params)
3818{
3819 struct ath10k *ar = hw->priv;
3820 struct wmi_wmm_params_arg *p = NULL;
3821 int ret;
3822
3823 mutex_lock(&ar->conf_mutex);
3824
3825 switch (ac) {
3826 case IEEE80211_AC_VO:
3827 p = &ar->wmm_params.ac_vo;
3828 break;
3829 case IEEE80211_AC_VI:
3830 p = &ar->wmm_params.ac_vi;
3831 break;
3832 case IEEE80211_AC_BE:
3833 p = &ar->wmm_params.ac_be;
3834 break;
3835 case IEEE80211_AC_BK:
3836 p = &ar->wmm_params.ac_bk;
3837 break;
3838 }
3839
3840 if (WARN_ON(!p)) {
3841 ret = -EINVAL;
3842 goto exit;
3843 }
3844
3845 p->cwmin = params->cw_min;
3846 p->cwmax = params->cw_max;
3847 p->aifs = params->aifs;
3848
3849 /*
3850 * The channel time duration programmed in the HW is in absolute
3851 * microseconds, while mac80211 gives the txop in units of
3852 * 32 microseconds.
3853 */
3854 p->txop = params->txop * 32;
3855
3856 /* FIXME: FW accepts wmm params per hw, not per vif */
3857 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3858 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003859 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003860 goto exit;
3861 }
3862
3863 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3864 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003865 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003866
3867exit:
3868 mutex_unlock(&ar->conf_mutex);
3869 return ret;
3870}
3871
3872#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3873
3874static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3875 struct ieee80211_vif *vif,
3876 struct ieee80211_channel *chan,
3877 int duration,
3878 enum ieee80211_roc_type type)
3879{
3880 struct ath10k *ar = hw->priv;
3881 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3882 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003883 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003884
3885 mutex_lock(&ar->conf_mutex);
3886
3887 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003888 switch (ar->scan.state) {
3889 case ATH10K_SCAN_IDLE:
3890 reinit_completion(&ar->scan.started);
3891 reinit_completion(&ar->scan.completed);
3892 reinit_completion(&ar->scan.on_channel);
3893 ar->scan.state = ATH10K_SCAN_STARTING;
3894 ar->scan.is_roc = true;
3895 ar->scan.vdev_id = arvif->vdev_id;
3896 ar->scan.roc_freq = chan->center_freq;
3897 ret = 0;
3898 break;
3899 case ATH10K_SCAN_STARTING:
3900 case ATH10K_SCAN_RUNNING:
3901 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003902 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003903 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003904 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003905 spin_unlock_bh(&ar->data_lock);
3906
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003907 if (ret)
3908 goto exit;
3909
Michal Kaziordcca0bd2014-11-24 14:58:32 +01003910 duration = max(duration, WMI_SCAN_CHAN_MIN_TIME_MSEC);
3911
Kalle Valo5e3dd152013-06-12 20:52:10 +03003912 memset(&arg, 0, sizeof(arg));
3913 ath10k_wmi_start_scan_init(ar, &arg);
3914 arg.vdev_id = arvif->vdev_id;
3915 arg.scan_id = ATH10K_SCAN_ID;
3916 arg.n_channels = 1;
3917 arg.channels[0] = chan->center_freq;
3918 arg.dwell_time_active = duration;
3919 arg.dwell_time_passive = duration;
3920 arg.max_scan_time = 2 * duration;
3921 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3922 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3923
3924 ret = ath10k_start_scan(ar, &arg);
3925 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003926 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003927 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003928 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003929 spin_unlock_bh(&ar->data_lock);
3930 goto exit;
3931 }
3932
3933 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3934 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003935 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003936
3937 ret = ath10k_scan_stop(ar);
3938 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003939 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003940
Kalle Valo5e3dd152013-06-12 20:52:10 +03003941 ret = -ETIMEDOUT;
3942 goto exit;
3943 }
3944
3945 ret = 0;
3946exit:
3947 mutex_unlock(&ar->conf_mutex);
3948 return ret;
3949}
3950
3951static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3952{
3953 struct ath10k *ar = hw->priv;
3954
3955 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003956 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003957 mutex_unlock(&ar->conf_mutex);
3958
Michal Kazior4eb2e162014-10-28 10:23:09 +01003959 cancel_delayed_work_sync(&ar->scan.timeout);
3960
Kalle Valo5e3dd152013-06-12 20:52:10 +03003961 return 0;
3962}
3963
3964/*
3965 * Both RTS and Fragmentation threshold are interface-specific
3966 * in ath10k, but device-specific in mac80211.
3967 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003968
3969static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3970{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003971 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003972 struct ath10k_vif *arvif;
3973 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003974
Michal Kaziorad088bf2013-10-16 15:44:46 +03003975 mutex_lock(&ar->conf_mutex);
3976 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003977 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003978 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003979
Michal Kaziorad088bf2013-10-16 15:44:46 +03003980 ret = ath10k_mac_set_rts(arvif, value);
3981 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003982 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003983 arvif->vdev_id, ret);
3984 break;
3985 }
3986 }
3987 mutex_unlock(&ar->conf_mutex);
3988
3989 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003990}
3991
3992static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3993{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003994 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003995 struct ath10k_vif *arvif;
3996 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003997
Kalle Valo5e3dd152013-06-12 20:52:10 +03003998 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003999 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004000 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03004001 arvif->vdev_id, value);
4002
Michal Kazior56a0dee2014-10-23 17:04:29 +03004003 ret = ath10k_mac_set_frag(arvif, value);
Michal Kaziorad088bf2013-10-16 15:44:46 +03004004 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004005 ath10k_warn(ar, "failed to set fragmentation threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03004006 arvif->vdev_id, ret);
4007 break;
4008 }
4009 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004010 mutex_unlock(&ar->conf_mutex);
4011
Michal Kaziorad088bf2013-10-16 15:44:46 +03004012 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004013}
4014
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02004015static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4016 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004017{
4018 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02004019 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004020 int ret;
4021
4022 /* mac80211 doesn't care if we really xmit queued frames or not
4023 * we'll collect those frames either way if we stop/delete vdevs */
4024 if (drop)
4025 return;
4026
Michal Kazior548db542013-07-05 16:15:15 +03004027 mutex_lock(&ar->conf_mutex);
4028
Michal Kazioraffd3212013-07-16 09:54:35 +02004029 if (ar->state == ATH10K_STATE_WEDGED)
4030 goto skip;
4031
Michal Kazioredb82362013-07-05 16:15:14 +03004032 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03004033 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02004034
Michal Kazioredb82362013-07-05 16:15:14 +03004035 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02004036 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03004037 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02004038
Michal Kazior7962b0d2014-10-28 10:34:38 +01004039 skip = (ar->state == ATH10K_STATE_WEDGED) ||
4040 test_bit(ATH10K_FLAG_CRASH_FLUSH,
4041 &ar->dev_flags);
Michal Kazioraffd3212013-07-16 09:54:35 +02004042
4043 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004044 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02004045
4046 if (ret <= 0 || skip)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004047 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
Ben Greear9ba4c782014-02-25 09:29:57 +02004048 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03004049
Michal Kazioraffd3212013-07-16 09:54:35 +02004050skip:
Michal Kazior548db542013-07-05 16:15:15 +03004051 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004052}
4053
4054/* TODO: Implement this function properly
4055 * For now it is needed to reply to Probe Requests in IBSS mode.
4056 * Propably we need this information from FW.
4057 */
4058static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
4059{
4060 return 1;
4061}
4062
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004063#ifdef CONFIG_PM
4064static int ath10k_suspend(struct ieee80211_hw *hw,
4065 struct cfg80211_wowlan *wowlan)
4066{
4067 struct ath10k *ar = hw->priv;
4068 int ret;
4069
Marek Puzyniak9042e172014-02-10 17:14:23 +01004070 mutex_lock(&ar->conf_mutex);
4071
Marek Puzyniak00f54822014-02-10 17:14:24 +01004072 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004073 if (ret) {
Marek Puzyniak00f54822014-02-10 17:14:24 +01004074 if (ret == -ETIMEDOUT)
4075 goto resume;
Marek Puzyniak9042e172014-02-10 17:14:23 +01004076 ret = 1;
4077 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004078 }
4079
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004080 ret = ath10k_hif_suspend(ar);
4081 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004082 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004083 goto resume;
4084 }
4085
Marek Puzyniak9042e172014-02-10 17:14:23 +01004086 ret = 0;
4087 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004088resume:
4089 ret = ath10k_wmi_pdev_resume_target(ar);
4090 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004091 ath10k_warn(ar, "failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01004092
4093 ret = 1;
4094exit:
4095 mutex_unlock(&ar->conf_mutex);
4096 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004097}
4098
4099static int ath10k_resume(struct ieee80211_hw *hw)
4100{
4101 struct ath10k *ar = hw->priv;
4102 int ret;
4103
Marek Puzyniak9042e172014-02-10 17:14:23 +01004104 mutex_lock(&ar->conf_mutex);
4105
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004106 ret = ath10k_hif_resume(ar);
4107 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004108 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01004109 ret = 1;
4110 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004111 }
4112
4113 ret = ath10k_wmi_pdev_resume_target(ar);
4114 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004115 ath10k_warn(ar, "failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01004116 ret = 1;
4117 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004118 }
4119
Marek Puzyniak9042e172014-02-10 17:14:23 +01004120 ret = 0;
4121exit:
4122 mutex_unlock(&ar->conf_mutex);
4123 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004124}
4125#endif
4126
Eliad Pellercf2c92d2014-11-04 11:43:54 +02004127static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
4128 enum ieee80211_reconfig_type reconfig_type)
Michal Kazioraffd3212013-07-16 09:54:35 +02004129{
4130 struct ath10k *ar = hw->priv;
4131
Eliad Pellercf2c92d2014-11-04 11:43:54 +02004132 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
4133 return;
4134
Michal Kazioraffd3212013-07-16 09:54:35 +02004135 mutex_lock(&ar->conf_mutex);
4136
4137 /* If device failed to restart it will be in a different state, e.g.
4138 * ATH10K_STATE_WEDGED */
4139 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004140 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02004141 ar->state = ATH10K_STATE_ON;
Michal Kazior7962b0d2014-10-28 10:34:38 +01004142 ieee80211_wake_queues(ar->hw);
Michal Kazioraffd3212013-07-16 09:54:35 +02004143 }
4144
4145 mutex_unlock(&ar->conf_mutex);
4146}
4147
Michal Kazior2e1dea42013-07-31 10:32:40 +02004148static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
4149 struct survey_info *survey)
4150{
4151 struct ath10k *ar = hw->priv;
4152 struct ieee80211_supported_band *sband;
4153 struct survey_info *ar_survey = &ar->survey[idx];
4154 int ret = 0;
4155
4156 mutex_lock(&ar->conf_mutex);
4157
4158 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4159 if (sband && idx >= sband->n_channels) {
4160 idx -= sband->n_channels;
4161 sband = NULL;
4162 }
4163
4164 if (!sband)
4165 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4166
4167 if (!sband || idx >= sband->n_channels) {
4168 ret = -ENOENT;
4169 goto exit;
4170 }
4171
4172 spin_lock_bh(&ar->data_lock);
4173 memcpy(survey, ar_survey, sizeof(*survey));
4174 spin_unlock_bh(&ar->data_lock);
4175
4176 survey->channel = &sband->channels[idx];
4177
Felix Fietkaufa1d4df2014-10-23 17:04:28 +03004178 if (ar->rx_channel == survey->channel)
4179 survey->filled |= SURVEY_INFO_IN_USE;
4180
Michal Kazior2e1dea42013-07-31 10:32:40 +02004181exit:
4182 mutex_unlock(&ar->conf_mutex);
4183 return ret;
4184}
4185
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004186/* Helper table for legacy fixed_rate/bitrate_mask */
4187static const u8 cck_ofdm_rate[] = {
4188 /* CCK */
4189 3, /* 1Mbps */
4190 2, /* 2Mbps */
4191 1, /* 5.5Mbps */
4192 0, /* 11Mbps */
4193 /* OFDM */
4194 3, /* 6Mbps */
4195 7, /* 9Mbps */
4196 2, /* 12Mbps */
4197 6, /* 18Mbps */
4198 1, /* 24Mbps */
4199 5, /* 36Mbps */
4200 0, /* 48Mbps */
4201 4, /* 54Mbps */
4202};
4203
4204/* Check if only one bit set */
4205static int ath10k_check_single_mask(u32 mask)
4206{
4207 int bit;
4208
4209 bit = ffs(mask);
4210 if (!bit)
4211 return 0;
4212
4213 mask &= ~BIT(bit - 1);
4214 if (mask)
4215 return 2;
4216
4217 return 1;
4218}
4219
4220static bool
4221ath10k_default_bitrate_mask(struct ath10k *ar,
4222 enum ieee80211_band band,
4223 const struct cfg80211_bitrate_mask *mask)
4224{
4225 u32 legacy = 0x00ff;
4226 u8 ht = 0xff, i;
4227 u16 vht = 0x3ff;
Ben Greearb116ea12014-11-24 16:22:10 +02004228 u16 nrf = ar->num_rf_chains;
4229
4230 if (ar->cfg_tx_chainmask)
4231 nrf = get_nss_from_chainmask(ar->cfg_tx_chainmask);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004232
4233 switch (band) {
4234 case IEEE80211_BAND_2GHZ:
4235 legacy = 0x00fff;
4236 vht = 0;
4237 break;
4238 case IEEE80211_BAND_5GHZ:
4239 break;
4240 default:
4241 return false;
4242 }
4243
4244 if (mask->control[band].legacy != legacy)
4245 return false;
4246
Ben Greearb116ea12014-11-24 16:22:10 +02004247 for (i = 0; i < nrf; i++)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004248 if (mask->control[band].ht_mcs[i] != ht)
4249 return false;
4250
Ben Greearb116ea12014-11-24 16:22:10 +02004251 for (i = 0; i < nrf; i++)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004252 if (mask->control[band].vht_mcs[i] != vht)
4253 return false;
4254
4255 return true;
4256}
4257
4258static bool
4259ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4260 enum ieee80211_band band,
4261 u8 *fixed_nss)
4262{
4263 int ht_nss = 0, vht_nss = 0, i;
4264
4265 /* check legacy */
4266 if (ath10k_check_single_mask(mask->control[band].legacy))
4267 return false;
4268
4269 /* check HT */
4270 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4271 if (mask->control[band].ht_mcs[i] == 0xff)
4272 continue;
4273 else if (mask->control[band].ht_mcs[i] == 0x00)
4274 break;
Kalle Valod8bb26b2014-09-14 12:50:33 +03004275
4276 return false;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004277 }
4278
4279 ht_nss = i;
4280
4281 /* check VHT */
4282 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4283 if (mask->control[band].vht_mcs[i] == 0x03ff)
4284 continue;
4285 else if (mask->control[band].vht_mcs[i] == 0x0000)
4286 break;
Kalle Valod8bb26b2014-09-14 12:50:33 +03004287
4288 return false;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004289 }
4290
4291 vht_nss = i;
4292
4293 if (ht_nss > 0 && vht_nss > 0)
4294 return false;
4295
4296 if (ht_nss)
4297 *fixed_nss = ht_nss;
4298 else if (vht_nss)
4299 *fixed_nss = vht_nss;
4300 else
4301 return false;
4302
4303 return true;
4304}
4305
4306static bool
4307ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4308 enum ieee80211_band band,
4309 enum wmi_rate_preamble *preamble)
4310{
4311 int legacy = 0, ht = 0, vht = 0, i;
4312
4313 *preamble = WMI_RATE_PREAMBLE_OFDM;
4314
4315 /* check legacy */
4316 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4317 if (legacy > 1)
4318 return false;
4319
4320 /* check HT */
4321 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4322 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4323 if (ht > 1)
4324 return false;
4325
4326 /* check VHT */
4327 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4328 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4329 if (vht > 1)
4330 return false;
4331
4332 /* Currently we support only one fixed_rate */
4333 if ((legacy + ht + vht) != 1)
4334 return false;
4335
4336 if (ht)
4337 *preamble = WMI_RATE_PREAMBLE_HT;
4338 else if (vht)
4339 *preamble = WMI_RATE_PREAMBLE_VHT;
4340
4341 return true;
4342}
4343
4344static bool
Michal Kazior7aa7a722014-08-25 12:09:38 +02004345ath10k_bitrate_mask_rate(struct ath10k *ar,
4346 const struct cfg80211_bitrate_mask *mask,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004347 enum ieee80211_band band,
4348 u8 *fixed_rate,
4349 u8 *fixed_nss)
4350{
4351 u8 rate = 0, pream = 0, nss = 0, i;
4352 enum wmi_rate_preamble preamble;
4353
4354 /* Check if single rate correct */
4355 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4356 return false;
4357
4358 pream = preamble;
4359
4360 switch (preamble) {
4361 case WMI_RATE_PREAMBLE_CCK:
4362 case WMI_RATE_PREAMBLE_OFDM:
4363 i = ffs(mask->control[band].legacy) - 1;
4364
4365 if (band == IEEE80211_BAND_2GHZ && i < 4)
4366 pream = WMI_RATE_PREAMBLE_CCK;
4367
4368 if (band == IEEE80211_BAND_5GHZ)
4369 i += 4;
4370
4371 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4372 return false;
4373
4374 rate = cck_ofdm_rate[i];
4375 break;
4376 case WMI_RATE_PREAMBLE_HT:
4377 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4378 if (mask->control[band].ht_mcs[i])
4379 break;
4380
4381 if (i == IEEE80211_HT_MCS_MASK_LEN)
4382 return false;
4383
4384 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4385 nss = i;
4386 break;
4387 case WMI_RATE_PREAMBLE_VHT:
4388 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4389 if (mask->control[band].vht_mcs[i])
4390 break;
4391
4392 if (i == NL80211_VHT_NSS_MAX)
4393 return false;
4394
4395 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4396 nss = i;
4397 break;
4398 }
4399
4400 *fixed_nss = nss + 1;
4401 nss <<= 4;
4402 pream <<= 6;
4403
Michal Kazior7aa7a722014-08-25 12:09:38 +02004404 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004405 pream, nss, rate);
4406
4407 *fixed_rate = pream | nss | rate;
4408
4409 return true;
4410}
4411
Michal Kazior7aa7a722014-08-25 12:09:38 +02004412static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4413 const struct cfg80211_bitrate_mask *mask,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004414 enum ieee80211_band band,
4415 u8 *fixed_rate,
4416 u8 *fixed_nss)
4417{
4418 /* First check full NSS mask, if we can simply limit NSS */
4419 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4420 return true;
4421
4422 /* Next Check single rate is set */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004423 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004424}
4425
4426static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4427 u8 fixed_rate,
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004428 u8 fixed_nss,
4429 u8 force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004430{
4431 struct ath10k *ar = arvif->ar;
4432 u32 vdev_param;
4433 int ret = 0;
4434
4435 mutex_lock(&ar->conf_mutex);
4436
4437 if (arvif->fixed_rate == fixed_rate &&
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004438 arvif->fixed_nss == fixed_nss &&
4439 arvif->force_sgi == force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004440 goto exit;
4441
4442 if (fixed_rate == WMI_FIXED_RATE_NONE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004443 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004444
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004445 if (force_sgi)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004446 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004447
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004448 vdev_param = ar->wmi.vdev_param->fixed_rate;
4449 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4450 vdev_param, fixed_rate);
4451 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004452 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004453 fixed_rate, ret);
4454 ret = -EINVAL;
4455 goto exit;
4456 }
4457
4458 arvif->fixed_rate = fixed_rate;
4459
4460 vdev_param = ar->wmi.vdev_param->nss;
4461 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4462 vdev_param, fixed_nss);
4463
4464 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004465 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004466 fixed_nss, ret);
4467 ret = -EINVAL;
4468 goto exit;
4469 }
4470
4471 arvif->fixed_nss = fixed_nss;
4472
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004473 vdev_param = ar->wmi.vdev_param->sgi;
4474 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4475 force_sgi);
4476
4477 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004478 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004479 force_sgi, ret);
4480 ret = -EINVAL;
4481 goto exit;
4482 }
4483
4484 arvif->force_sgi = force_sgi;
4485
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004486exit:
4487 mutex_unlock(&ar->conf_mutex);
4488 return ret;
4489}
4490
4491static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4492 struct ieee80211_vif *vif,
4493 const struct cfg80211_bitrate_mask *mask)
4494{
4495 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4496 struct ath10k *ar = arvif->ar;
4497 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4498 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4499 u8 fixed_nss = ar->num_rf_chains;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004500 u8 force_sgi;
4501
Ben Greearb116ea12014-11-24 16:22:10 +02004502 if (ar->cfg_tx_chainmask)
4503 fixed_nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
4504
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004505 force_sgi = mask->control[band].gi;
4506 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4507 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004508
4509 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004510 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004511 &fixed_rate,
4512 &fixed_nss))
4513 return -EINVAL;
4514 }
4515
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004516 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004517 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004518 return -EINVAL;
4519 }
4520
4521 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4522 fixed_nss, force_sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004523}
4524
Michal Kazior9797feb2014-02-14 14:49:48 +01004525static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4526 struct ieee80211_vif *vif,
4527 struct ieee80211_sta *sta,
4528 u32 changed)
4529{
4530 struct ath10k *ar = hw->priv;
4531 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4532 u32 bw, smps;
4533
4534 spin_lock_bh(&ar->data_lock);
4535
Michal Kazior7aa7a722014-08-25 12:09:38 +02004536 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01004537 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4538 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4539 sta->smps_mode);
4540
4541 if (changed & IEEE80211_RC_BW_CHANGED) {
4542 bw = WMI_PEER_CHWIDTH_20MHZ;
4543
4544 switch (sta->bandwidth) {
4545 case IEEE80211_STA_RX_BW_20:
4546 bw = WMI_PEER_CHWIDTH_20MHZ;
4547 break;
4548 case IEEE80211_STA_RX_BW_40:
4549 bw = WMI_PEER_CHWIDTH_40MHZ;
4550 break;
4551 case IEEE80211_STA_RX_BW_80:
4552 bw = WMI_PEER_CHWIDTH_80MHZ;
4553 break;
4554 case IEEE80211_STA_RX_BW_160:
Michal Kazior7aa7a722014-08-25 12:09:38 +02004555 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02004556 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004557 bw = WMI_PEER_CHWIDTH_20MHZ;
4558 break;
4559 }
4560
4561 arsta->bw = bw;
4562 }
4563
4564 if (changed & IEEE80211_RC_NSS_CHANGED)
4565 arsta->nss = sta->rx_nss;
4566
4567 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4568 smps = WMI_PEER_SMPS_PS_NONE;
4569
4570 switch (sta->smps_mode) {
4571 case IEEE80211_SMPS_AUTOMATIC:
4572 case IEEE80211_SMPS_OFF:
4573 smps = WMI_PEER_SMPS_PS_NONE;
4574 break;
4575 case IEEE80211_SMPS_STATIC:
4576 smps = WMI_PEER_SMPS_STATIC;
4577 break;
4578 case IEEE80211_SMPS_DYNAMIC:
4579 smps = WMI_PEER_SMPS_DYNAMIC;
4580 break;
4581 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02004582 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02004583 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004584 smps = WMI_PEER_SMPS_PS_NONE;
4585 break;
4586 }
4587
4588 arsta->smps = smps;
4589 }
4590
Michal Kazior9797feb2014-02-14 14:49:48 +01004591 arsta->changed |= changed;
4592
4593 spin_unlock_bh(&ar->data_lock);
4594
4595 ieee80211_queue_work(hw, &arsta->update_wk);
4596}
4597
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004598static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4599{
4600 /*
4601 * FIXME: Return 0 for time being. Need to figure out whether FW
4602 * has the API to fetch 64-bit local TSF
4603 */
4604
4605 return 0;
4606}
4607
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004608static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4609 struct ieee80211_vif *vif,
4610 enum ieee80211_ampdu_mlme_action action,
4611 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4612 u8 buf_size)
4613{
Michal Kazior7aa7a722014-08-25 12:09:38 +02004614 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004615 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4616
Michal Kazior7aa7a722014-08-25 12:09:38 +02004617 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 +02004618 arvif->vdev_id, sta->addr, tid, action);
4619
4620 switch (action) {
4621 case IEEE80211_AMPDU_RX_START:
4622 case IEEE80211_AMPDU_RX_STOP:
4623 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4624 * creation/removal. Do we need to verify this?
4625 */
4626 return 0;
4627 case IEEE80211_AMPDU_TX_START:
4628 case IEEE80211_AMPDU_TX_STOP_CONT:
4629 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4630 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4631 case IEEE80211_AMPDU_TX_OPERATIONAL:
4632 /* Firmware offloads Tx aggregation entirely so deny mac80211
4633 * Tx aggregation requests.
4634 */
4635 return -EOPNOTSUPP;
4636 }
4637
4638 return -EINVAL;
4639}
4640
Kalle Valo5e3dd152013-06-12 20:52:10 +03004641static const struct ieee80211_ops ath10k_ops = {
4642 .tx = ath10k_tx,
4643 .start = ath10k_start,
4644 .stop = ath10k_stop,
4645 .config = ath10k_config,
4646 .add_interface = ath10k_add_interface,
4647 .remove_interface = ath10k_remove_interface,
4648 .configure_filter = ath10k_configure_filter,
4649 .bss_info_changed = ath10k_bss_info_changed,
4650 .hw_scan = ath10k_hw_scan,
4651 .cancel_hw_scan = ath10k_cancel_hw_scan,
4652 .set_key = ath10k_set_key,
4653 .sta_state = ath10k_sta_state,
4654 .conf_tx = ath10k_conf_tx,
4655 .remain_on_channel = ath10k_remain_on_channel,
4656 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4657 .set_rts_threshold = ath10k_set_rts_threshold,
4658 .set_frag_threshold = ath10k_set_frag_threshold,
4659 .flush = ath10k_flush,
4660 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03004661 .set_antenna = ath10k_set_antenna,
4662 .get_antenna = ath10k_get_antenna,
Eliad Pellercf2c92d2014-11-04 11:43:54 +02004663 .reconfig_complete = ath10k_reconfig_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02004664 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004665 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01004666 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004667 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004668 .ampdu_action = ath10k_ampdu_action,
Ben Greear6cddcc72014-09-29 14:41:46 +03004669 .get_et_sset_count = ath10k_debug_get_et_sset_count,
4670 .get_et_stats = ath10k_debug_get_et_stats,
4671 .get_et_strings = ath10k_debug_get_et_strings,
Kalle Valo43d2a302014-09-10 18:23:30 +03004672
4673 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4674
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004675#ifdef CONFIG_PM
4676 .suspend = ath10k_suspend,
4677 .resume = ath10k_resume,
4678#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004679};
4680
4681#define RATETAB_ENT(_rate, _rateid, _flags) { \
4682 .bitrate = (_rate), \
4683 .flags = (_flags), \
4684 .hw_value = (_rateid), \
4685}
4686
4687#define CHAN2G(_channel, _freq, _flags) { \
4688 .band = IEEE80211_BAND_2GHZ, \
4689 .hw_value = (_channel), \
4690 .center_freq = (_freq), \
4691 .flags = (_flags), \
4692 .max_antenna_gain = 0, \
4693 .max_power = 30, \
4694}
4695
4696#define CHAN5G(_channel, _freq, _flags) { \
4697 .band = IEEE80211_BAND_5GHZ, \
4698 .hw_value = (_channel), \
4699 .center_freq = (_freq), \
4700 .flags = (_flags), \
4701 .max_antenna_gain = 0, \
4702 .max_power = 30, \
4703}
4704
4705static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4706 CHAN2G(1, 2412, 0),
4707 CHAN2G(2, 2417, 0),
4708 CHAN2G(3, 2422, 0),
4709 CHAN2G(4, 2427, 0),
4710 CHAN2G(5, 2432, 0),
4711 CHAN2G(6, 2437, 0),
4712 CHAN2G(7, 2442, 0),
4713 CHAN2G(8, 2447, 0),
4714 CHAN2G(9, 2452, 0),
4715 CHAN2G(10, 2457, 0),
4716 CHAN2G(11, 2462, 0),
4717 CHAN2G(12, 2467, 0),
4718 CHAN2G(13, 2472, 0),
4719 CHAN2G(14, 2484, 0),
4720};
4721
4722static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004723 CHAN5G(36, 5180, 0),
4724 CHAN5G(40, 5200, 0),
4725 CHAN5G(44, 5220, 0),
4726 CHAN5G(48, 5240, 0),
4727 CHAN5G(52, 5260, 0),
4728 CHAN5G(56, 5280, 0),
4729 CHAN5G(60, 5300, 0),
4730 CHAN5G(64, 5320, 0),
4731 CHAN5G(100, 5500, 0),
4732 CHAN5G(104, 5520, 0),
4733 CHAN5G(108, 5540, 0),
4734 CHAN5G(112, 5560, 0),
4735 CHAN5G(116, 5580, 0),
4736 CHAN5G(120, 5600, 0),
4737 CHAN5G(124, 5620, 0),
4738 CHAN5G(128, 5640, 0),
4739 CHAN5G(132, 5660, 0),
4740 CHAN5G(136, 5680, 0),
4741 CHAN5G(140, 5700, 0),
4742 CHAN5G(149, 5745, 0),
4743 CHAN5G(153, 5765, 0),
4744 CHAN5G(157, 5785, 0),
4745 CHAN5G(161, 5805, 0),
4746 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004747};
4748
4749static struct ieee80211_rate ath10k_rates[] = {
4750 /* CCK */
4751 RATETAB_ENT(10, 0x82, 0),
4752 RATETAB_ENT(20, 0x84, 0),
4753 RATETAB_ENT(55, 0x8b, 0),
4754 RATETAB_ENT(110, 0x96, 0),
4755 /* OFDM */
4756 RATETAB_ENT(60, 0x0c, 0),
4757 RATETAB_ENT(90, 0x12, 0),
4758 RATETAB_ENT(120, 0x18, 0),
4759 RATETAB_ENT(180, 0x24, 0),
4760 RATETAB_ENT(240, 0x30, 0),
4761 RATETAB_ENT(360, 0x48, 0),
4762 RATETAB_ENT(480, 0x60, 0),
4763 RATETAB_ENT(540, 0x6c, 0),
4764};
4765
4766#define ath10k_a_rates (ath10k_rates + 4)
4767#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4768#define ath10k_g_rates (ath10k_rates + 0)
4769#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4770
Michal Kaziore7b54192014-08-07 11:03:27 +02004771struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004772{
4773 struct ieee80211_hw *hw;
4774 struct ath10k *ar;
4775
Michal Kaziore7b54192014-08-07 11:03:27 +02004776 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004777 if (!hw)
4778 return NULL;
4779
4780 ar = hw->priv;
4781 ar->hw = hw;
4782
4783 return ar;
4784}
4785
4786void ath10k_mac_destroy(struct ath10k *ar)
4787{
4788 ieee80211_free_hw(ar->hw);
4789}
4790
4791static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4792 {
4793 .max = 8,
4794 .types = BIT(NL80211_IFTYPE_STATION)
4795 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004796 },
4797 {
4798 .max = 3,
4799 .types = BIT(NL80211_IFTYPE_P2P_GO)
4800 },
4801 {
4802 .max = 7,
4803 .types = BIT(NL80211_IFTYPE_AP)
4804 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004805};
4806
Bartosz Markowskif2595092013-12-10 16:20:39 +01004807static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004808 {
4809 .max = 8,
4810 .types = BIT(NL80211_IFTYPE_AP)
4811 },
4812};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004813
4814static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4815 {
4816 .limits = ath10k_if_limits,
4817 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4818 .max_interfaces = 8,
4819 .num_different_channels = 1,
4820 .beacon_int_infra_match = true,
4821 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004822};
4823
4824static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004825 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004826 .limits = ath10k_10x_if_limits,
4827 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004828 .max_interfaces = 8,
4829 .num_different_channels = 1,
4830 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004831#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004832 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4833 BIT(NL80211_CHAN_WIDTH_20) |
4834 BIT(NL80211_CHAN_WIDTH_40) |
4835 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004836#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004837 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004838};
4839
4840static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4841{
4842 struct ieee80211_sta_vht_cap vht_cap = {0};
4843 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004844 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004845
4846 vht_cap.vht_supported = 1;
4847 vht_cap.cap = ar->vht_cap_info;
4848
Michal Kazior8865bee42013-07-24 12:36:46 +02004849 mcs_map = 0;
4850 for (i = 0; i < 8; i++) {
4851 if (i < ar->num_rf_chains)
4852 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4853 else
4854 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4855 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004856
4857 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4858 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4859
4860 return vht_cap;
4861}
4862
4863static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4864{
4865 int i;
4866 struct ieee80211_sta_ht_cap ht_cap = {0};
4867
4868 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4869 return ht_cap;
4870
4871 ht_cap.ht_supported = 1;
4872 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4873 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4874 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4875 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4876 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4877
4878 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4879 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4880
4881 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4882 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4883
4884 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4885 u32 smps;
4886
4887 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4888 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4889
4890 ht_cap.cap |= smps;
4891 }
4892
4893 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4894 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4895
4896 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4897 u32 stbc;
4898
4899 stbc = ar->ht_cap_info;
4900 stbc &= WMI_HT_CAP_RX_STBC;
4901 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4902 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4903 stbc &= IEEE80211_HT_CAP_RX_STBC;
4904
4905 ht_cap.cap |= stbc;
4906 }
4907
4908 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4909 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4910
4911 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4912 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4913
4914 /* max AMSDU is implicitly taken from vht_cap_info */
4915 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4916 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4917
Michal Kazior8865bee42013-07-24 12:36:46 +02004918 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004919 ht_cap.mcs.rx_mask[i] = 0xFF;
4920
4921 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4922
4923 return ht_cap;
4924}
4925
Kalle Valo5e3dd152013-06-12 20:52:10 +03004926static void ath10k_get_arvif_iter(void *data, u8 *mac,
4927 struct ieee80211_vif *vif)
4928{
4929 struct ath10k_vif_iter *arvif_iter = data;
4930 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4931
4932 if (arvif->vdev_id == arvif_iter->vdev_id)
4933 arvif_iter->arvif = arvif;
4934}
4935
4936struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4937{
4938 struct ath10k_vif_iter arvif_iter;
4939 u32 flags;
4940
4941 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4942 arvif_iter.vdev_id = vdev_id;
4943
4944 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4945 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4946 flags,
4947 ath10k_get_arvif_iter,
4948 &arvif_iter);
4949 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004950 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004951 return NULL;
4952 }
4953
4954 return arvif_iter.arvif;
4955}
4956
4957int ath10k_mac_register(struct ath10k *ar)
4958{
4959 struct ieee80211_supported_band *band;
4960 struct ieee80211_sta_vht_cap vht_cap;
4961 struct ieee80211_sta_ht_cap ht_cap;
4962 void *channels;
4963 int ret;
4964
4965 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4966
4967 SET_IEEE80211_DEV(ar->hw, ar->dev);
4968
4969 ht_cap = ath10k_get_ht_cap(ar);
4970 vht_cap = ath10k_create_vht_cap(ar);
4971
4972 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4973 channels = kmemdup(ath10k_2ghz_channels,
4974 sizeof(ath10k_2ghz_channels),
4975 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004976 if (!channels) {
4977 ret = -ENOMEM;
4978 goto err_free;
4979 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004980
4981 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4982 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4983 band->channels = channels;
4984 band->n_bitrates = ath10k_g_rates_size;
4985 band->bitrates = ath10k_g_rates;
4986 band->ht_cap = ht_cap;
4987
4988 /* vht is not supported in 2.4 GHz */
4989
4990 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4991 }
4992
4993 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4994 channels = kmemdup(ath10k_5ghz_channels,
4995 sizeof(ath10k_5ghz_channels),
4996 GFP_KERNEL);
4997 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004998 ret = -ENOMEM;
4999 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005000 }
5001
5002 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
5003 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
5004 band->channels = channels;
5005 band->n_bitrates = ath10k_a_rates_size;
5006 band->bitrates = ath10k_a_rates;
5007 band->ht_cap = ht_cap;
5008 band->vht_cap = vht_cap;
5009 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
5010 }
5011
5012 ar->hw->wiphy->interface_modes =
5013 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01005014 BIT(NL80211_IFTYPE_AP);
5015
Ben Greear46acf7b2014-05-16 17:15:38 +03005016 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
5017 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
5018
Bartosz Markowskid3541812013-12-10 16:20:40 +01005019 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
5020 ar->hw->wiphy->interface_modes |=
5021 BIT(NL80211_IFTYPE_P2P_CLIENT) |
5022 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005023
5024 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
5025 IEEE80211_HW_SUPPORTS_PS |
5026 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
5027 IEEE80211_HW_SUPPORTS_UAPSD |
5028 IEEE80211_HW_MFP_CAPABLE |
5029 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
5030 IEEE80211_HW_HAS_RATE_CONTROL |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02005031 IEEE80211_HW_AP_LINK_PS |
5032 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005033
Eliad Peller0d8614b2014-09-10 14:07:36 +03005034 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
5035
Kalle Valo5e3dd152013-06-12 20:52:10 +03005036 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
Eliad Peller0d8614b2014-09-10 14:07:36 +03005037 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005038
5039 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
5040 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
5041 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
5042 }
5043
5044 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
5045 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
5046
5047 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01005048 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03005049
Kalle Valo5e3dd152013-06-12 20:52:10 +03005050 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
5051
5052 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01005053 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005054 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
5055
5056 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
Rajkumar Manoharan78157a12014-11-17 16:44:15 +02005057 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
5058
Kalle Valo5e3dd152013-06-12 20:52:10 +03005059 /*
5060 * on LL hardware queues are managed entirely by the FW
5061 * so we only advertise to mac we can do the queues thing
5062 */
5063 ar->hw->queues = 4;
5064
Bartosz Markowskif2595092013-12-10 16:20:39 +01005065 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
5066 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
5067 ar->hw->wiphy->n_iface_combinations =
5068 ARRAY_SIZE(ath10k_10x_if_comb);
5069 } else {
5070 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
5071 ar->hw->wiphy->n_iface_combinations =
5072 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03005073
5074 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Bartosz Markowskif2595092013-12-10 16:20:39 +01005075 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03005076
Michal Kazior7c199992013-07-31 10:47:57 +02005077 ar->hw->netdev_features = NETIF_F_HW_CSUM;
5078
Janusz Dziedzic9702c682013-11-20 09:59:41 +02005079 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
5080 /* Init ath dfs pattern detector */
5081 ar->ath_common.debug_mask = ATH_DBG_DFS;
5082 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
5083 NL80211_DFS_UNSET);
5084
5085 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02005086 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02005087 }
5088
Kalle Valo5e3dd152013-06-12 20:52:10 +03005089 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
5090 ath10k_reg_notifier);
5091 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005092 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02005093 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005094 }
5095
5096 ret = ieee80211_register_hw(ar->hw);
5097 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02005098 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02005099 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005100 }
5101
5102 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
5103 ret = regulatory_hint(ar->hw->wiphy,
5104 ar->ath_common.regulatory.alpha2);
5105 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02005106 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03005107 }
5108
5109 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02005110
5111err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03005112 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02005113err_free:
5114 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5115 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5116
Kalle Valo5e3dd152013-06-12 20:52:10 +03005117 return ret;
5118}
5119
5120void ath10k_mac_unregister(struct ath10k *ar)
5121{
5122 ieee80211_unregister_hw(ar->hw);
5123
Janusz Dziedzic9702c682013-11-20 09:59:41 +02005124 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
5125 ar->dfs_detector->exit(ar->dfs_detector);
5126
Kalle Valo5e3dd152013-06-12 20:52:10 +03005127 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
5128 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
5129
5130 SET_IEEE80211_DEV(ar->hw, NULL);
5131}